COIN-OR::LEMON - Graph Library

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/maps_test.cc

    r789 r726  
    2727#include <lemon/adaptors.h>
    2828#include <lemon/dfs.h>
    29 #include <algorithm>
    3029
    3130#include "test_tools.h"
     
    3938
    4039class C {
    41   int _x;
     40  int x;
    4241public:
    43   C(int x) : _x(x) {}
    44   int get() const { return _x; }
    45 };
    46 inline bool operator<(C c1, C c2) { return c1.get() < c2.get(); }
    47 inline bool operator==(C c1, C c2) { return c1.get() == c2.get(); }
    48 
    49 C createC(int x) { return C(x); }
    50 
    51 template <typename T>
    52 class Less {
    53   T _t;
    54 public:
    55   Less(T t): _t(t) {}
    56   bool operator()(const T& t) const { return t < _t; }
     42  C(int _x) : x(_x) {}
    5743};
    5844
     
    7157int binc(int a, B) { return a+1; }
    7258
    73 template <typename T>
    74 class Sum {
    75   T& _sum;
    76 public:
    77   Sum(T& sum) : _sum(sum) {}
    78   void operator()(const T& t) { _sum += t; }
    79 };
    80 
    8159typedef ReadMap<A, double> DoubleMap;
    8260typedef ReadWriteMap<A, double> DoubleWriteMap;
     
    8664typedef ReadWriteMap<A, bool> BoolWriteMap;
    8765typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
     66
     67template<typename Map1, typename Map2, typename ItemIt>
     68void 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}
    8872
    8973int main()
     
    511495    }
    512496   
    513     check(mapCompare(gr,
    514           sourceMap(orienter(gr, constMap<Edge, bool>(true))),
    515           targetMap(orienter(gr, constMap<Edge, bool>(false)))),
    516           "Wrong SourceMap or TargetMap");
     497    compareMap(sourceMap(orienter(gr, constMap<Edge, bool>(true))),
     498               targetMap(orienter(gr, constMap<Edge, bool>(false))),
     499               EdgeIt(gr));
    517500
    518501    typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
     
    818801
    819802  }
    820  
    821   // Graph map utilities:
    822   // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
    823   // mapFind(), mapFindIf(), mapCount(), mapCountIf()
    824   // mapCopy(), mapCompare(), mapFill()
    825   {
    826     DIGRAPH_TYPEDEFS(SmartDigraph);
    827 
    828     SmartDigraph g;
    829     Node n1 = g.addNode();
    830     Node n2 = g.addNode();
    831     Node n3 = g.addNode();
    832    
    833     SmartDigraph::NodeMap<int> map1(g);
    834     SmartDigraph::ArcMap<char> map2(g);
    835     ConstMap<Node, A> cmap1 = A();
    836     ConstMap<Arc, C> cmap2 = C(0);
    837    
    838     map1[n1] = 10;
    839     map1[n2] = 5;
    840     map1[n3] = 12;
    841    
    842     // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
    843     check(mapMin(g, map1) == n2, "Wrong mapMin()");
    844     check(mapMax(g, map1) == n3, "Wrong mapMax()");
    845     check(mapMin(g, map1, std::greater<int>()) == n3, "Wrong mapMin()");
    846     check(mapMax(g, map1, std::greater<int>()) == n2, "Wrong mapMax()");
    847     check(mapMinValue(g, map1) == 5, "Wrong mapMinValue()");
    848     check(mapMaxValue(g, map1) == 12, "Wrong mapMaxValue()");
    849 
    850     check(mapMin(g, map2) == INVALID, "Wrong mapMin()");
    851     check(mapMax(g, map2) == INVALID, "Wrong mapMax()");
    852 
    853     check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
    854     check(mapMax(g, cmap2) == INVALID, "Wrong mapMax()");
    855 
    856     Arc a1 = g.addArc(n1, n2);
    857     Arc a2 = g.addArc(n1, n3);
    858     Arc a3 = g.addArc(n2, n3);
    859     Arc a4 = g.addArc(n3, n1);
    860    
    861     map2[a1] = 'b';
    862     map2[a2] = 'a';
    863     map2[a3] = 'b';
    864     map2[a4] = 'c';
    865 
    866     // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
    867     check(mapMin(g, map2) == a2, "Wrong mapMin()");
    868     check(mapMax(g, map2) == a4, "Wrong mapMax()");
    869     check(mapMin(g, map2, std::greater<int>()) == a4, "Wrong mapMin()");
    870     check(mapMax(g, map2, std::greater<int>()) == a2, "Wrong mapMax()");
    871     check(mapMinValue(g, map2, std::greater<int>()) == 'c',
    872           "Wrong mapMinValue()");
    873     check(mapMaxValue(g, map2, std::greater<int>()) == 'a',
    874           "Wrong mapMaxValue()");
    875 
    876     check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
    877     check(mapMax(g, cmap2) != INVALID, "Wrong mapMax()");
    878     check(mapMaxValue(g, cmap2) == C(0), "Wrong mapMaxValue()");
    879 
    880     check(mapMin(g, composeMap(functorToMap(&createC), map2)) == a2,
    881           "Wrong mapMin()");
    882     check(mapMax(g, composeMap(functorToMap(&createC), map2)) == a4,
    883           "Wrong mapMax()");
    884     check(mapMinValue(g, composeMap(functorToMap(&createC), map2)) == C('a'),
    885           "Wrong mapMinValue()");
    886     check(mapMaxValue(g, composeMap(functorToMap(&createC), map2)) == C('c'),
    887           "Wrong mapMaxValue()");
    888 
    889     // mapFind(), mapFindIf()
    890     check(mapFind(g, map1, 5) == n2, "Wrong mapFind()");
    891     check(mapFind(g, map1, 6) == INVALID, "Wrong mapFind()");
    892     check(mapFind(g, map2, 'a') == a2, "Wrong mapFind()");
    893     check(mapFind(g, map2, 'e') == INVALID, "Wrong mapFind()");
    894     check(mapFind(g, cmap2, C(0)) == ArcIt(g), "Wrong mapFind()");
    895     check(mapFind(g, cmap2, C(1)) == INVALID, "Wrong mapFind()");
    896 
    897     check(mapFindIf(g, map1, Less<int>(7)) == n2,
    898           "Wrong mapFindIf()");
    899     check(mapFindIf(g, map1, Less<int>(5)) == INVALID,
    900           "Wrong mapFindIf()");
    901     check(mapFindIf(g, map2, Less<char>('d')) == ArcIt(g),
    902           "Wrong mapFindIf()");
    903     check(mapFindIf(g, map2, Less<char>('a')) == INVALID,
    904           "Wrong mapFindIf()");
    905 
    906     // mapCount(), mapCountIf()
    907     check(mapCount(g, map1, 5) == 1, "Wrong mapCount()");
    908     check(mapCount(g, map1, 6) == 0, "Wrong mapCount()");
    909     check(mapCount(g, map2, 'a') == 1, "Wrong mapCount()");
    910     check(mapCount(g, map2, 'b') == 2, "Wrong mapCount()");
    911     check(mapCount(g, map2, 'e') == 0, "Wrong mapCount()");
    912     check(mapCount(g, cmap2, C(0)) == 4, "Wrong mapCount()");
    913     check(mapCount(g, cmap2, C(1)) == 0, "Wrong mapCount()");
    914 
    915     check(mapCountIf(g, map1, Less<int>(11)) == 2,
    916           "Wrong mapCountIf()");
    917     check(mapCountIf(g, map1, Less<int>(13)) == 3,
    918           "Wrong mapCountIf()");
    919     check(mapCountIf(g, map1, Less<int>(5)) == 0,
    920           "Wrong mapCountIf()");
    921     check(mapCountIf(g, map2, Less<char>('d')) == 4,
    922           "Wrong mapCountIf()");
    923     check(mapCountIf(g, map2, Less<char>('c')) == 3,
    924           "Wrong mapCountIf()");
    925     check(mapCountIf(g, map2, Less<char>('a')) == 0,
    926           "Wrong mapCountIf()");
    927      
    928     // MapIt, ConstMapIt
    929 /*
    930 These tests can be used after applying bugfix #330
    931     typedef SmartDigraph::NodeMap<int>::MapIt MapIt;
    932     typedef SmartDigraph::NodeMap<int>::ConstMapIt ConstMapIt;
    933     check(*std::min_element(MapIt(map1), MapIt(INVALID)) == 5,
    934           "Wrong NodeMap<>::MapIt");
    935     check(*std::max_element(ConstMapIt(map1), ConstMapIt(INVALID)) == 12,
    936           "Wrong NodeMap<>::MapIt");
    937    
    938     int sum = 0;
    939     std::for_each(MapIt(map1), MapIt(INVALID), Sum<int>(sum));
    940     check(sum == 27, "Wrong NodeMap<>::MapIt");
    941     std::for_each(ConstMapIt(map1), ConstMapIt(INVALID), Sum<int>(sum));
    942     check(sum == 54, "Wrong NodeMap<>::ConstMapIt");
    943 */
    944 
    945     // mapCopy(), mapCompare(), mapFill()
    946     check(mapCompare(g, map1, map1), "Wrong mapCompare()");
    947     check(mapCompare(g, cmap2, cmap2), "Wrong mapCompare()");
    948     check(mapCompare(g, map1, shiftMap(map1, 0)), "Wrong mapCompare()");
    949     check(mapCompare(g, map2, scaleMap(map2, 1)), "Wrong mapCompare()");
    950     check(!mapCompare(g, map1, shiftMap(map1, 1)), "Wrong mapCompare()");
    951 
    952     SmartDigraph::NodeMap<int> map3(g, 0);
    953     SmartDigraph::ArcMap<char> map4(g, 'a');
    954    
    955     check(!mapCompare(g, map1, map3), "Wrong mapCompare()");
    956     check(!mapCompare(g, map2, map4), "Wrong mapCompare()");   
    957    
    958     mapCopy(g, map1, map3);
    959     mapCopy(g, map2, map4);
    960 
    961     check(mapCompare(g, map1, map3), "Wrong mapCompare() or mapCopy()");
    962     check(mapCompare(g, map2, map4), "Wrong mapCompare() or mapCopy()");   
    963    
    964     Undirector<SmartDigraph> ug(g);
    965     Undirector<SmartDigraph>::EdgeMap<char> umap1(ug, 'x');
    966     Undirector<SmartDigraph>::ArcMap<double> umap2(ug, 3.14);
    967    
    968     check(!mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
    969     check(!mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
    970     check(!mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
    971     check(!mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
    972    
    973     mapCopy(g, map2, umap1);
    974 
    975     check(mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
    976     check(mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
    977     check(mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
    978     check(mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
    979    
    980     mapCopy(g, map2, umap1);
    981     mapCopy(g, umap1, map2);
    982     mapCopy(ug, map2, umap1);
    983     mapCopy(ug, umap1, map2);
    984    
    985     check(!mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
    986     mapCopy(ug, umap1, umap2);
    987     check(mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
    988    
    989     check(!mapCompare(g, map1, constMap<Node>(2)), "Wrong mapCompare()");
    990     mapFill(g, map1, 2);
    991     check(mapCompare(g, constMap<Node>(2), map1), "Wrong mapFill()");
    992 
    993     check(!mapCompare(g, map2, constMap<Arc>('z')), "Wrong mapCompare()");
    994     mapCopy(g, constMap<Arc>('z'), map2);
    995     check(mapCompare(g, constMap<Arc>('z'), map2), "Wrong mapCopy()");
    996   }
    997  
    998803  return 0;
    999804}
Note: See TracChangeset for help on using the changeset viewer.