test/maps_test.cc
changeset 723 acdd0bd75a55
parent 721 99124ea4f048
child 724 d8073df341f6
equal deleted inserted replaced
18:e591948109cf 19:6a7abfd5f598
    22 #include <lemon/concept_check.h>
    22 #include <lemon/concept_check.h>
    23 #include <lemon/concepts/maps.h>
    23 #include <lemon/concepts/maps.h>
    24 #include <lemon/maps.h>
    24 #include <lemon/maps.h>
    25 #include <lemon/list_graph.h>
    25 #include <lemon/list_graph.h>
    26 #include <lemon/smart_graph.h>
    26 #include <lemon/smart_graph.h>
       
    27 #include <lemon/adaptors.h>
       
    28 #include <lemon/dfs.h>
    27 
    29 
    28 #include "test_tools.h"
    30 #include "test_tools.h"
    29 
    31 
    30 using namespace lemon;
    32 using namespace lemon;
    31 using namespace lemon::concepts;
    33 using namespace lemon::concepts;
    59 typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
    61 typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
    60 
    62 
    61 typedef ReadMap<A, bool> BoolMap;
    63 typedef ReadMap<A, bool> BoolMap;
    62 typedef ReadWriteMap<A, bool> BoolWriteMap;
    64 typedef ReadWriteMap<A, bool> BoolWriteMap;
    63 typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
    65 typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
       
    66 
       
    67 template<typename Map1, typename Map2, typename ItemIt>
       
    68 void compareMap(const Map1& map1, const Map2& map2, ItemIt it) {
       
    69   for (; it != INVALID; ++it)
       
    70     check(map1[it] == map2[it], "The maps are not equal");
       
    71 }
    64 
    72 
    65 int main()
    73 int main()
    66 {
    74 {
    67   // Map concepts
    75   // Map concepts
    68   checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
    76   checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
   351 
   359 
   352     int i = 0;
   360     int i = 0;
   353     for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
   361     for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
   354           it != map2.end(); ++it )
   362           it != map2.end(); ++it )
   355       check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
   363       check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
       
   364     
       
   365     typedef ListDigraph Graph;
       
   366     DIGRAPH_TYPEDEFS(Graph);
       
   367     Graph gr;
       
   368 
       
   369     Node n0 = gr.addNode();
       
   370     Node n1 = gr.addNode();
       
   371     Node n2 = gr.addNode();
       
   372     Node n3 = gr.addNode();
       
   373     
       
   374     gr.addArc(n3, n0);
       
   375     gr.addArc(n3, n2);
       
   376     gr.addArc(n0, n2);
       
   377     gr.addArc(n2, n1);
       
   378     gr.addArc(n0, n1);
       
   379     
       
   380     {
       
   381       std::vector<Node> v;
       
   382       dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
       
   383 
       
   384       check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
       
   385             "Something is wrong with LoggerBoolMap");
       
   386     }
       
   387     {
       
   388       std::vector<Node> v(countNodes(gr));
       
   389       dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
       
   390       
       
   391       check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
       
   392             "Something is wrong with LoggerBoolMap");
       
   393     }
   356   }
   394   }
   357   
   395   
   358   // IdMap, RangeIdMap
   396   // IdMap, RangeIdMap
   359   {
   397   {
   360     typedef ListDigraph Graph;
   398     typedef ListDigraph Graph;
   423     check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
   461     check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
   424     check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
   462     check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
   425 
   463 
   426     check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
   464     check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
   427     check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
   465     check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
       
   466   }
       
   467   
       
   468   // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
       
   469   {
       
   470     typedef ListGraph Graph;
       
   471     GRAPH_TYPEDEFS(Graph);
       
   472     
       
   473     checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
       
   474     checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
       
   475     checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
       
   476     checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
       
   477     checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
       
   478     checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
       
   479 
       
   480     Graph gr;
       
   481     Node n0 = gr.addNode();
       
   482     Node n1 = gr.addNode();
       
   483     Node n2 = gr.addNode();
       
   484     
       
   485     gr.addEdge(n0,n1);
       
   486     gr.addEdge(n1,n2);
       
   487     gr.addEdge(n0,n2);
       
   488     gr.addEdge(n2,n1);
       
   489     gr.addEdge(n1,n2);
       
   490     gr.addEdge(n0,n1);
       
   491     
       
   492     for (EdgeIt e(gr); e != INVALID; ++e) {
       
   493       check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
       
   494       check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
       
   495     }
       
   496     
       
   497     compareMap(sourceMap(orienter(gr, constMap<Edge, bool>(true))),
       
   498                targetMap(orienter(gr, constMap<Edge, bool>(false))),
       
   499                EdgeIt(gr));
       
   500 
       
   501     typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
       
   502     Digraph dgr(gr, constMap<Edge, bool>(true));
       
   503     OutDegMap<Digraph> odm(dgr);
       
   504     InDegMap<Digraph> idm(dgr);
       
   505     
       
   506     check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
       
   507     check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
       
   508    
       
   509     gr.addEdge(n2, n0);
       
   510 
       
   511     check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
       
   512     check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
   428   }
   513   }
   429   
   514   
   430   // CrossRefMap
   515   // CrossRefMap
   431   {
   516   {
   432     typedef ListDigraph Graph;
   517     typedef ListDigraph Graph;