Correcting the structure of the graph's and adaptor's map.
The template assign operators and map iterators can be used for adaptors also.
Some bugfix in the adaptors
New class SwapBpUGraphAdaptor which swaps the two nodeset of the graph.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 #include <lemon/bits/graph_extender.h>
20 #include <lemon/concept/ugraph.h>
21 #include <lemon/list_graph.h>
22 #include <lemon/smart_graph.h>
23 #include <lemon/full_graph.h>
24 #include <lemon/grid_ugraph.h>
26 #include <lemon/graph_utils.h>
28 #include "test_tools.h"
31 using namespace lemon;
32 using namespace lemon::concept;
34 void check_concepts() {
35 checkConcept<UGraph, ListUGraph>();
36 checkConcept<ErasableUGraph, ListUGraph>();
38 checkConcept<UGraph, SmartUGraph>();
39 checkConcept<ExtendableUGraph, SmartUGraph>();
41 checkConcept<UGraph, FullUGraph>();
43 checkConcept<UGraph, UGraph>();
45 checkConcept<UGraph, GridUGraph>();
48 template <typename Graph>
49 void check_item_counts(Graph &g, int n, int e) {
51 for (typename Graph::NodeIt it(g); it != INVALID; ++it) {
55 check(nn == n, "Wrong node number.");
56 check(countNodes(g) == n, "Wrong node number.");
59 for (typename Graph::EdgeIt it(g); it != INVALID; ++it) {
63 check(ee == 2*e, "Wrong edge number.");
64 check(countEdges(g) == 2*e, "Wrong edge number.");
67 for (typename Graph::UEdgeIt it(g); it != INVALID; ++it) {
71 check(uee == e, "Wrong uedge number.");
72 check(countUEdges(g) == e, "Wrong uedge number.");
75 template <typename Graph>
76 void print_items(Graph &g) {
78 typedef typename Graph::NodeIt NodeIt;
79 typedef typename Graph::UEdgeIt UEdgeIt;
80 typedef typename Graph::EdgeIt EdgeIt;
82 std::cout << "Nodes" << std::endl;
84 for(NodeIt it(g); it!=INVALID; ++it, ++i) {
85 std::cout << " " << i << ": " << g.id(it) << std::endl;
88 std::cout << "UEdge" << std::endl;
90 for(UEdgeIt it(g); it!=INVALID; ++it, ++i) {
91 std::cout << " " << i << ": " << g.id(it)
92 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it))
96 std::cout << "Edge" << std::endl;
98 for(EdgeIt it(g); it!=INVALID; ++it, ++i) {
99 std::cout << " " << i << ": " << g.id(it)
100 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it))
106 template <typename Graph>
109 typedef typename Graph::Node Node;
110 typedef typename Graph::UEdge UEdge;
111 typedef typename Graph::Edge Edge;
112 typedef typename Graph::NodeIt NodeIt;
113 typedef typename Graph::UEdgeIt UEdgeIt;
114 typedef typename Graph::EdgeIt EdgeIt;
118 check_item_counts(g,0,0);
126 e1 = g.addEdge(n1, n2),
127 e2 = g.addEdge(n2, n3);
131 check_item_counts(g,3,2);
134 void checkGridUGraph(const GridUGraph& g, int w, int h) {
135 check(g.width() == w, "Wrong width");
136 check(g.height() == h, "Wrong height");
138 for (int i = 0; i < w; ++i) {
139 for (int j = 0; j < h; ++j) {
140 check(g.col(g(i, j)) == i, "Wrong col");
141 check(g.row(g(i, j)) == j, "Wrong row");
145 for (int i = 0; i < w; ++i) {
146 for (int j = 0; j < h - 1; ++j) {
147 check(g.source(g.down(g(i, j))) == g(i, j), "Wrong down");
148 check(g.target(g.down(g(i, j))) == g(i, j + 1), "Wrong down");
150 check(g.down(g(i, h - 1)) == INVALID, "Wrong down");
153 for (int i = 0; i < w; ++i) {
154 for (int j = 1; j < h; ++j) {
155 check(g.source(g.up(g(i, j))) == g(i, j), "Wrong up");
156 check(g.target(g.up(g(i, j))) == g(i, j - 1), "Wrong up");
158 check(g.up(g(i, 0)) == INVALID, "Wrong up");
161 for (int j = 0; j < h; ++j) {
162 for (int i = 0; i < w - 1; ++i) {
163 check(g.source(g.right(g(i, j))) == g(i, j), "Wrong right");
164 check(g.target(g.right(g(i, j))) == g(i + 1, j), "Wrong right");
166 check(g.right(g(w - 1, j)) == INVALID, "Wrong right");
169 for (int j = 0; j < h; ++j) {
170 for (int i = 1; i < w; ++i) {
171 check(g.source(g.left(g(i, j))) == g(i, j), "Wrong left");
172 check(g.target(g.left(g(i, j))) == g(i - 1, j), "Wrong left");
174 check(g.left(g(0, j)) == INVALID, "Wrong left");
181 check_graph<ListUGraph>();
182 check_graph<SmartUGraph>();
186 check_item_counts(g, 5, 10);
191 check_item_counts(g, 30, 49);
192 checkGridUGraph(g, 5, 6);
195 std::cout << __FILE__ ": All tests passed.\n";