3 #include <lemon/bits/undir_graph_extender.h>
 
     4 #include <lemon/concept/undir_graph.h>
 
     5 #include <lemon/list_graph.h>
 
     6 #include <lemon/smart_graph.h>
 
     7 #include <lemon/full_graph.h>
 
     9 #include <lemon/graph_utils.h>
 
    11 #include "test_tools.h"
 
    14 using namespace lemon;
 
    15 using namespace lemon::concept;
 
    17 void check_concepts() {
 
    18   typedef UndirGraphExtender<ListGraphBase> UndirListGraphBase;
 
    20   typedef IterableUndirGraphExtender<
 
    21     AlterableUndirGraphExtender<UndirListGraphBase> > IterableUndirListGraph;
 
    23   typedef MappableUndirGraphExtender<IterableUndirListGraph>
 
    24     MappableUndirListGraph;
 
    26   typedef ErasableUndirGraphExtender<
 
    27     ClearableUndirGraphExtender<
 
    28     ExtendableUndirGraphExtender<MappableUndirListGraph> > > Graph;
 
    30   checkConcept<BaseIterableUndirGraphConcept, Graph>();
 
    31   checkConcept<IterableUndirGraphConcept, Graph>();
 
    32   checkConcept<MappableUndirGraphConcept, Graph>();
 
    34   checkConcept<UndirGraph, Graph>();
 
    35   checkConcept<ErasableUndirGraph, Graph>();
 
    37   checkConcept<UndirGraph, UndirListGraph>();
 
    38   checkConcept<ErasableUndirGraph, UndirListGraph>();
 
    40   checkConcept<UndirGraph, UndirSmartGraph>();
 
    41   checkConcept<ExtendableUndirGraph, UndirSmartGraph>();
 
    43   checkConcept<UndirGraph, UndirGraph>();
 
    46 template <typename Graph>
 
    47 void check_item_counts(Graph &g, int n, int e) {
 
    48   check(countNodes(g)==n, "Wrong node number.");
 
    49   check(countEdges(g)==2*e, "Wrong edge number.");
 
    52 template <typename Graph>
 
    53 void print_items(Graph &g) {
 
    55   typedef typename Graph::NodeIt NodeIt;
 
    56   typedef typename Graph::UndirEdgeIt UEdgeIt;
 
    57   typedef typename Graph::EdgeIt EdgeIt;
 
    59   std::cout << "Nodes" << std::endl;
 
    61   for(NodeIt it(g); it!=INVALID; ++it, ++i) {
 
    62     std::cout << "  " << i << ": " << g.id(it) << std::endl;
 
    65   std::cout << "UndirEdge" << std::endl;
 
    67   for(UEdgeIt it(g); it!=INVALID; ++it, ++i) {
 
    68     std::cout << "  " << i << ": " << g.id(it) 
 
    69 	 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) 
 
    73   std::cout << "Edge" << std::endl;
 
    75   for(EdgeIt it(g); it!=INVALID; ++it, ++i) {
 
    76     std::cout << "  " << i << ": " << g.id(it)
 
    77 	 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) 
 
    83 template <typename Graph>
 
    86   typedef typename Graph::Node Node;
 
    87   typedef typename Graph::UndirEdge UEdge;
 
    88   typedef typename Graph::Edge Edge;
 
    89   typedef typename Graph::NodeIt NodeIt;
 
    90   typedef typename Graph::UndirEdgeIt UEdgeIt;
 
    91   typedef typename Graph::EdgeIt EdgeIt;
 
    95   check_item_counts(g,0,0);
 
   103     e1 = g.addEdge(n1, n2),
 
   104     e2 = g.addEdge(n2, n3);
 
   108   check_item_counts(g,3,2);
 
   116   check_graph<UndirListGraph>();
 
   117   check_graph<UndirSmartGraph>();