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; |