0
15
2
3
15
49
8
2
20
57
12
12
1 |
/* -*- mode: C++; indent-tabs-mode: nil; -*- |
|
2 |
* |
|
3 |
* This file is a part of LEMON, a generic C++ optimization library. |
|
4 |
* |
|
5 |
* Copyright (C) 2003-2008 |
|
6 |
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
|
7 |
* (Egervary Research Group on Combinatorial Optimization, EGRES). |
|
8 |
* |
|
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. |
|
12 |
* |
|
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 |
|
15 |
* purpose. |
|
16 |
* |
|
17 |
*/ |
|
18 |
|
|
19 |
/*! |
|
20 |
|
|
21 |
\page named-param Named Parameters |
|
22 |
|
|
23 |
\section named-func-param Named Function Parameters |
|
24 |
|
|
25 |
Several modern languages provide a convenient way to refer the |
|
26 |
function parameters by name also when you call the function. It is |
|
27 |
especially comfortable in case of a function having tons of parameters |
|
28 |
with natural default values. Sadly, C++ lack this amenity. |
|
29 |
|
|
30 |
However, with a crafty trick and with some little |
|
31 |
inconvenience, it is possible to emulate is. |
|
32 |
The example below shows how to do it. |
|
33 |
|
|
34 |
\code |
|
35 |
class namedFn |
|
36 |
{ |
|
37 |
int _id; |
|
38 |
double _val; |
|
39 |
int _dim; |
|
40 |
|
|
41 |
public: |
|
42 |
namedFn() : _id(0), _val(1), _dim(2) {} |
|
43 |
namedFn& id(int p) { _id = p ; return *this; } |
|
44 |
namedFn& val(double p) { _val = p ; return *this; } |
|
45 |
namedFn& dim(int p) { _dim = p ; return *this; } |
|
46 |
|
|
47 |
run() { |
|
48 |
std::cout << "Here comes the function itself\n" << |
|
49 |
<< "With parameters " |
|
50 |
<< _id << ", " << _val << ", " << _dim << std::endl; |
|
51 |
} |
|
52 |
}; |
|
53 |
\endcode |
|
54 |
|
|
55 |
Then you can use it like this. |
|
56 |
|
|
57 |
\code |
|
58 |
namedFn().id(3).val(2).run(); |
|
59 |
\endcode |
|
60 |
|
|
61 |
The trick is obvious, each "named parameter" changes one component of |
|
62 |
the underlying class, then gives back a reference to it. Finally, |
|
63 |
<tt>run()</tt> executes the algorithm itself. |
|
64 |
|
|
65 |
\note Although it is a class, namedFn is used pretty much like as it were |
|
66 |
a function. That it why we called it namedFn instead of \c NamedFn. |
|
67 |
|
|
68 |
\note In fact, the final <tt>.run()</tt> could be made unnecessary, |
|
69 |
because the algorithm could also be implemented in the destructor of |
|
70 |
\c namedFn instead. This however would make it impossible to implement |
|
71 |
functions with return values, and would also cause serious problems when |
|
72 |
implementing \ref named-templ-func-param "named template parameters". |
|
73 |
<b>Therefore, by convention, <tt>.run()</tt> must be used |
|
74 |
explicitly to execute a function having named parameters |
|
75 |
everywhere in LEMON.</b> |
|
76 |
|
|
77 |
\section named-templ-func-param Named Function Template Parameters |
|
78 |
|
|
79 |
A named parameter can also be a template function. The usage is |
|
80 |
exactly the same, but the implementation behind is a kind of black |
|
81 |
magic and they are the dirtiest part of the LEMON code. |
|
82 |
|
|
83 |
You will probably never need to know how it works, but if you really |
|
84 |
committed, have a look at \ref lemon/graph_to_eps.h for an example. |
|
85 |
|
|
86 |
\section traits-classes Traits Classes |
|
87 |
|
|
88 |
A similar game can also be played when defining classes. In this case |
|
89 |
the type of the class attributes can be changed. Initially we have to |
|
90 |
define a special class called <em>Traits Class</em> defining the |
|
91 |
default type of the attributes. Then the types of these attributes can |
|
92 |
be changed in the same way as described in the next section. |
|
93 |
|
|
94 |
See \ref lemon::DijkstraDefaultTraits for an |
|
95 |
example how a traits class implementation looks like. |
|
96 |
|
|
97 |
\section named-templ-param Named Class Template Parameters |
|
98 |
|
|
99 |
If we would like to change the type of an attribute in a class that |
|
100 |
was instantiated by using a traits class as a template parameter, and |
|
101 |
the class contains named parameters, we do not have to instantiate again |
|
102 |
the class with new traits class, but instead adaptor classes can |
|
103 |
be used as shown in the following example. |
|
104 |
|
|
105 |
\code |
|
106 |
Dijkstra<>::SetPredMap<NullMap<Node,Arc> >::Create |
|
107 |
\endcode |
|
108 |
|
|
109 |
It can also be used in conjunction with other named template |
|
110 |
parameters in arbitrary order. |
|
111 |
|
|
112 |
\code |
|
113 |
Dijkstra<>::SetDistMap<MyMap>::SetPredMap<NullMap<Node,Arc> >::Create |
|
114 |
\endcode |
|
115 |
|
|
116 |
The result will be an instantiated Dijkstra class, in which the |
|
117 |
DistMap and the PredMap is modified. |
|
118 |
|
|
119 |
*/ |
1 |
#! /usr/bin/env python |
|
2 |
|
|
3 |
import sys |
|
4 |
import os |
|
5 |
|
|
6 |
if len(sys.argv)>1 and sys.argv[1] in ["-h","--help"]: |
|
7 |
print """ |
|
8 |
This utility just prints the length of the longest path |
|
9 |
in the revision graph from revison 0 to the current one. |
|
10 |
""" |
|
11 |
exit(0) |
|
12 |
plist = os.popen("hg parents --template='{rev}\n'").readlines() |
|
13 |
if len(plist)>1: |
|
14 |
print "You are in the process of merging" |
|
15 |
exit(1) |
|
16 |
PAR = int(plist[0]) |
|
17 |
|
|
18 |
f = os.popen("hg log -r 0:tip --template='{rev} {parents}\n'").readlines() |
|
19 |
REV = -1 |
|
20 |
lengths=[] |
|
21 |
for l in f: |
|
22 |
REV+=1 |
|
23 |
s = l.split() |
|
24 |
rev = int(s[0]) |
|
25 |
if REV != rev: |
|
26 |
print "Something is seriously wrong" |
|
27 |
exit(1) |
|
28 |
if len(s) == 1: |
|
29 |
par1 = par2 = rev - 1 |
|
30 |
elif len(s) == 2: |
|
31 |
par1 = par2 = int(s[1].split(":")[0]) |
|
32 |
else: |
|
33 |
par1 = int(s[1].split(":")[0]) |
|
34 |
par2 = int(s[2].split(":")[0]) |
|
35 |
if rev == 0: |
|
36 |
lengths.append(0) |
|
37 |
else: |
|
38 |
lengths.append(max(lengths[par1],lengths[par2])+1) |
|
39 |
print lengths[PAR] |
... | ... |
@@ -2,13 +2,4 @@ |
2 | 2 |
|
3 |
#EXECUTE_PROCESS( |
|
4 |
# COMMAND hg id -i |
|
5 |
# OUTPUT_VARIABLE HG_REVISION |
|
6 |
# OUTPUT_STRIP_TRAILING_WHITESPACE) |
|
7 |
|
|
8 | 3 |
SET(PROJECT_NAME "LEMON") |
9 |
SET(PROJECT_VERSION_MAJOR "0") |
|
10 |
SET(PROJECT_VERSION_MINOR "99") |
|
11 |
SET(PROJECT_VERSION_PATCH "0") |
|
12 |
SET(PROJECT_VERSION |
|
13 |
|
|
4 |
SET(PROJECT_VERSION "hg-tip" CACHE STRING "The version string.") |
|
14 | 5 |
|
... | ... |
@@ -41,5 +32,2 @@ |
41 | 32 |
|
42 |
SET(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) |
|
43 |
SET(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) |
|
44 |
SET(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) |
|
45 | 33 |
SET(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) |
... | ... |
@@ -47,5 +35,5 @@ |
47 | 35 |
SET(CPACK_PACKAGE_INSTALL_DIRECTORY |
48 |
"${PROJECT_NAME} ${ |
|
36 |
"${PROJECT_NAME} ${PROJECT_VERSION}") |
|
49 | 37 |
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY |
50 |
"${PROJECT_NAME} ${ |
|
38 |
"${PROJECT_NAME} ${PROJECT_VERSION}") |
|
51 | 39 |
1 |
20XX-XX-XX Version 1.0 released |
|
2 |
|
|
3 |
This is the first stable release of LEMON. Compared to the 0.x |
|
4 |
release series, it features a considerably smaller but more |
|
5 |
matured set of tools. The API has also completely revised and |
|
6 |
changed in several places. |
|
7 |
|
|
8 |
* The major name changes compared to the 0.x series |
|
9 |
* Graph -> Digraph, UGraph -> Graph |
|
10 |
* Edge -> Arc, UEdge -> Edge |
|
11 |
* source(UEdge)/target(UEdge) -> u(Edge)/v(Edge) |
|
12 |
* Other improvements |
|
13 |
* Better documentation |
|
14 |
* Reviewed and cleaned up codebase |
|
15 |
* CMake based build system (along with the autotools based one) |
|
16 |
* Contents of the library (ported from 0.x) |
|
17 |
* Algorithms |
|
18 |
* breadth-first search (bfs.h) |
|
19 |
* depth-first search (dfs.h) |
|
20 |
* Dijkstra's algorithm (dijkstra.h) |
|
21 |
* Kruskal's algorithm (kruskal.h) |
|
22 |
* Data structures |
|
23 |
* graph data structures (list_graph.h, smart_graph.h) |
|
24 |
* path data structures (path.h) |
|
25 |
* binary heap data structure (bin_heap.h) |
|
26 |
* union-find data structures (unionfind.h) |
|
27 |
* miscellaneous property maps (maps.h) |
|
28 |
* two dimensional vector and bounding box (dim2.h) |
|
29 |
* Concepts |
|
30 |
* graph structure concepts (concepts/digraph.h, concepts/graph.h, |
|
31 |
concepts/graph_components.h) |
|
32 |
* concepts for other structures (concepts/heap.h, concepts/maps.h, |
|
33 |
concepts/path.h) |
|
34 |
* Tools |
|
35 |
* Mersenne twister random number generator (random.h) |
|
36 |
* tools for measuring cpu and wall clock time (time_measure.h) |
|
37 |
* tools for counting steps and events (counter.h) |
|
38 |
* tool for parsing command line arguments (arg_parser.h) |
|
39 |
* tool for visualizing graphs (graph_to_eps.h) |
|
40 |
* tools for reading and writing data in LEMON Graph Format |
|
41 |
(lgf_reader.h, lgf_writer.h) |
|
42 |
* tools to handle the anomalies of calculations with |
|
43 |
floating point numbers (tolerance.h) |
|
44 |
* tools to manage RGB colors (color.h) |
|
45 |
* Infrastructure |
|
46 |
* extended assertion handling (assert.h) |
|
47 |
* exception classes and error handling (error.h) |
|
48 |
* concept checking (concept_check.h) |
|
49 |
* commonly used mathematical constants (math.h) |
... | ... |
@@ -3,5 +3,11 @@ |
3 | 3 |
dnl Version information. |
4 |
m4_define([lemon_version_number], |
|
4 |
m4_define([lemon_version_number], |
|
5 |
[m4_normalize(esyscmd([echo ${LEMON_VERSION}]))]) |
|
6 |
dnl m4_define([lemon_version_number], []) |
|
7 |
m4_define([lemon_hg_path], [m4_normalize(esyscmd([./scripts/chg-len.py]))]) |
|
5 | 8 |
m4_define([lemon_hg_revision], [m4_normalize(esyscmd([hg id -i]))]) |
6 |
m4_define([lemon_version], [ifelse(lemon_version_number(), |
|
9 |
m4_define([lemon_version], [ifelse(lemon_version_number(), |
|
10 |
[], |
|
11 |
[lemon_hg_path().lemon_hg_revision()], |
|
12 |
[lemon_version_number()])]) |
|
7 | 13 |
... | ... |
@@ -29,4 +29,5 @@ |
29 | 29 |
|
30 |
inline void assert_fail_log(const char *file, int line, const char *function, |
|
31 |
const char *message, const char *assertion) |
|
30 |
inline void assert_fail_abort(const char *file, int line, |
|
31 |
const char *function, const char* message, |
|
32 |
const char *assertion) |
|
32 | 33 |
{ |
... | ... |
@@ -39,9 +40,2 @@ |
39 | 40 |
std::cerr << std::endl; |
40 |
} |
|
41 |
|
|
42 |
inline void assert_fail_abort(const char *file, int line, |
|
43 |
const char *function, const char* message, |
|
44 |
const char *assertion) |
|
45 |
{ |
|
46 |
assert_fail_log(file, line, function, message, assertion); |
|
47 | 41 |
std::abort(); |
... | ... |
@@ -65,7 +59,5 @@ |
65 | 59 |
#undef LEMON_ASSERT |
66 |
#undef LEMON_FIXME |
|
67 | 60 |
#undef LEMON_DEBUG |
68 | 61 |
|
69 |
#if (defined(LEMON_ASSERT_LOG) ? 1 : 0) + \ |
|
70 |
(defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
|
62 |
#if (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
|
71 | 63 |
(defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1 |
... | ... |
@@ -74,4 +66,3 @@ |
74 | 66 |
|
75 |
#if ((defined(LEMON_ASSERT_LOG) ? 1 : 0) + \ |
|
76 |
(defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
|
67 |
#if ((defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
|
77 | 68 |
(defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 || \ |
... | ... |
@@ -84,6 +75,3 @@ |
84 | 75 |
|
85 |
#if defined LEMON_ASSERT_LOG |
|
86 |
# undef LEMON_ASSERT_HANDLER |
|
87 |
# define LEMON_ASSERT_HANDLER ::lemon::assert_fail_log |
|
88 |
#elif defined LEMON_ASSERT_ABORT |
|
76 |
#if defined LEMON_ASSERT_ABORT |
|
89 | 77 |
# undef LEMON_ASSERT_HANDLER |
... | ... |
@@ -109,4 +97,6 @@ |
109 | 97 |
# define LEMON_FUNCTION_NAME (__FUNCSIG__) |
98 |
# elif __STDC_VERSION__ >= 199901L |
|
99 |
# define LEMON_FUNCTION_NAME (__func__) |
|
110 | 100 |
# else |
111 |
# define LEMON_FUNCTION_NAME ( |
|
101 |
# define LEMON_FUNCTION_NAME ("<unknown>") |
|
112 | 102 |
# endif |
... | ... |
@@ -120,8 +110,8 @@ |
120 | 110 |
/// |
121 |
/// Macro for assertion with customizable message. \param exp An |
|
122 |
/// expression that must be convertible to \c bool. If it is \c |
|
123 |
/// false, then an assertion is raised. The concrete behaviour depends |
|
124 |
/// on the settings of the assertion system. \param msg A <tt>const |
|
125 |
/// char*</tt> parameter, which can be used to provide information |
|
126 |
/// about the circumstances of the failed assertion. |
|
111 |
/// Macro for assertion with customizable message. |
|
112 |
/// \param exp An expression that must be convertible to \c bool. If it is \c |
|
113 |
/// false, then an assertion is raised. The concrete behaviour depends on the |
|
114 |
/// settings of the assertion system. |
|
115 |
/// \param msg A <tt>const char*</tt> parameter, which can be used to provide |
|
116 |
/// information about the circumstances of the failed assertion. |
|
127 | 117 |
/// |
... | ... |
@@ -139,13 +129,8 @@ |
139 | 129 |
/// |
140 |
/// The LEMON assertion system has a wide range of customization |
|
141 |
/// properties. As a default behaviour the failed assertion prints a |
|
142 |
/// short log message to |
|
130 |
/// As a default behaviour the failed assertion prints a short log message to |
|
131 |
/// the standard error and aborts the execution. |
|
143 | 132 |
/// |
144 |
/// The following modes can be used in the assertion system: |
|
145 |
/// |
|
146 |
/// - \c LEMON_ASSERT_LOG The failed assertion prints a short log |
|
147 |
/// message to the standard error and continues the execution. |
|
148 |
/// - \c LEMON_ASSERT_ABORT This mode is similar to the \c |
|
149 |
/// LEMON_ASSERT_LOG, but it aborts the program. It is the default |
|
150 |
/// |
|
133 |
/// However, the following modes can be used in the assertion system: |
|
134 |
/// - \c LEMON_ASSERT_ABORT The failed assertion prints a short log message to |
|
135 |
/// the standard error and aborts the program. It is the default behaviour. |
|
151 | 136 |
/// - \c LEMON_ASSERT_CUSTOM The user can define own assertion handler |
... | ... |
@@ -177,18 +162,2 @@ |
177 | 162 |
/// |
178 |
/// \brief Macro for mark not yet implemented features. |
|
179 |
/// |
|
180 |
/// Macro for mark not yet implemented features and outstanding bugs. |
|
181 |
/// It is close to be the shortcut of the following code: |
|
182 |
/// \code |
|
183 |
/// LEMON_ASSERT(false, msg); |
|
184 |
/// \endcode |
|
185 |
/// |
|
186 |
/// \see LEMON_ASSERT |
|
187 |
# define LEMON_FIXME(msg) \ |
|
188 |
(LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \ |
|
189 |
::lemon::_assert_bits::cstringify(msg), \ |
|
190 |
static_cast<const char*>(0))) |
|
191 |
|
|
192 |
/// \ingroup exceptions |
|
193 |
/// |
|
194 | 163 |
/// \brief Macro for internal assertions |
... | ... |
@@ -224,3 +193,2 @@ |
224 | 193 |
# define LEMON_ASSERT(exp, msg) (static_cast<void>(0)) |
225 |
# define LEMON_FIXME(msg) (static_cast<void>(0)) |
|
226 | 194 |
# define LEMON_DEBUG(exp, msg) (static_cast<void>(0)) |
... | ... |
@@ -233,7 +201,2 @@ |
233 | 201 |
#exp), 0))) |
234 |
# define LEMON_FIXME(msg) \ |
|
235 |
(LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \ |
|
236 |
::lemon::_assert_bits::cstringify(msg), \ |
|
237 |
static_cast<const char*>(0))) |
|
238 |
|
|
239 | 202 |
# if LEMON_ENABLE_DEBUG |
... | ... |
@@ -229,2 +229,3 @@ |
229 | 229 |
|
230 |
private: |
|
230 | 231 |
NodeMap& operator=(const NodeMap& cmap) { |
... | ... |
@@ -253,2 +254,3 @@ |
253 | 254 |
|
255 |
private: |
|
254 | 256 |
ArcMap& operator=(const ArcMap& cmap) { |
... | ... |
@@ -610,2 +612,3 @@ |
610 | 612 |
|
613 |
private: |
|
611 | 614 |
NodeMap& operator=(const NodeMap& cmap) { |
... | ... |
@@ -634,2 +637,3 @@ |
634 | 637 |
|
638 |
private: |
|
635 | 639 |
ArcMap& operator=(const ArcMap& cmap) { |
... | ... |
@@ -659,2 +663,3 @@ |
659 | 663 |
|
664 |
private: |
|
660 | 665 |
EdgeMap& operator=(const EdgeMap& cmap) { |
... | ... |
@@ -64,2 +64,3 @@ |
64 | 64 |
|
65 |
private: |
|
65 | 66 |
MapExtender& operator=(const MapExtender& cmap) { |
... | ... |
@@ -74,2 +75,3 @@ |
74 | 75 |
|
76 |
public: |
|
75 | 77 |
class MapIt : public Item { |
... | ... |
@@ -202,2 +204,3 @@ |
202 | 204 |
|
205 |
private: |
|
203 | 206 |
SubMapExtender& operator=(const SubMapExtender& cmap) { |
... | ... |
@@ -216,2 +219,3 @@ |
216 | 219 |
|
220 |
public: |
|
217 | 221 |
class MapIt : public Item { |
... | ... |
@@ -1007,2 +1007,4 @@ |
1007 | 1007 |
GraphMap(const Graph&, const Value&) {} |
1008 |
|
|
1009 |
private: |
|
1008 | 1010 |
/// \brief Copy constructor. |
... | ... |
@@ -1023,2 +1025,3 @@ |
1023 | 1025 |
|
1026 |
public: |
|
1024 | 1027 |
template<typename _Map> |
... | ... |
@@ -1032,9 +1035,10 @@ |
1032 | 1035 |
// Copy constructor. |
1033 |
_Map b(c); |
|
1036 |
// _Map b(c); |
|
1034 | 1037 |
|
1035 |
ReadMap<Key, Value> cmap; |
|
1036 |
b = cmap; |
|
1038 |
// ReadMap<Key, Value> cmap; |
|
1039 |
// b = cmap; |
|
1037 | 1040 |
|
1041 |
ignore_unused_variable_warning(a); |
|
1038 | 1042 |
ignore_unused_variable_warning(a2); |
1039 |
ignore_unused_variable_warning(b); |
|
1043 |
// ignore_unused_variable_warning(b); |
|
1040 | 1044 |
} |
... | ... |
@@ -1084,2 +1088,3 @@ |
1084 | 1088 |
|
1089 |
private: |
|
1085 | 1090 |
/// \brief Copy constructor. |
... | ... |
@@ -1121,2 +1126,3 @@ |
1121 | 1126 |
|
1127 |
private: |
|
1122 | 1128 |
/// \brief Copy constructor. |
... | ... |
@@ -1217,2 +1223,3 @@ |
1217 | 1223 |
|
1224 |
private: |
|
1218 | 1225 |
/// \brief Copy constructor. |
... | ... |
@@ -49,6 +49,2 @@ |
49 | 49 |
|
50 |
void fixme_disable() { |
|
51 |
LEMON_FIXME("fixme_disable() is fixme!"); |
|
52 |
} |
|
53 |
|
|
54 | 50 |
void check_assertion_disable() { |
... | ... |
@@ -56,3 +52,2 @@ |
56 | 52 |
assertion_text_disable(); |
57 |
fixme_disable(); |
|
58 | 53 |
} |
... | ... |
@@ -80,6 +75,2 @@ |
80 | 75 |
|
81 |
void fixme_custom() { |
|
82 |
LEMON_FIXME("fixme_custom() is fixme!"); |
|
83 |
} |
|
84 |
|
|
85 | 76 |
void check_assertion_custom() { |
... | ... |
@@ -87,4 +78,3 @@ |
87 | 78 |
assertion_text_custom(); |
88 |
fixme_custom(); |
|
89 |
check(cnt == 2, "The custom assert handler does not work"); |
|
79 |
check(cnt == 1, "The custom assert handler does not work"); |
|
90 | 80 |
} |
... | ... |
@@ -214,6 +214,6 @@ |
214 | 214 |
|
215 |
map = constMap<Node>(12); |
|
216 |
for (NodeIt it(G); it != INVALID; ++it) { |
|
217 |
check(map[it] == 12, "Wrong operator[]."); |
|
218 |
} |
|
215 |
// map = constMap<Node>(12); |
|
216 |
// for (NodeIt it(G); it != INVALID; ++it) { |
|
217 |
// check(map[it] == 12, "Wrong operator[]."); |
|
218 |
// } |
|
219 | 219 |
} |
... | ... |
@@ -244,6 +244,6 @@ |
244 | 244 |
|
245 |
map = constMap<Arc>(12); |
|
246 |
for (ArcIt it(G); it != INVALID; ++it) { |
|
247 |
check(map[it] == 12, "Wrong operator[]."); |
|
248 |
} |
|
245 |
// map = constMap<Arc>(12); |
|
246 |
// for (ArcIt it(G); it != INVALID; ++it) { |
|
247 |
// check(map[it] == 12, "Wrong operator[]."); |
|
248 |
// } |
|
249 | 249 |
} |
... | ... |
@@ -274,6 +274,6 @@ |
274 | 274 |
|
275 |
map = constMap<Edge>(12); |
|
276 |
for (EdgeIt it(G); it != INVALID; ++it) { |
|
277 |
check(map[it] == 12, "Wrong operator[]."); |
|
278 |
} |
|
275 |
// map = constMap<Edge>(12); |
|
276 |
// for (EdgeIt it(G); it != INVALID; ++it) { |
|
277 |
// check(map[it] == 12, "Wrong operator[]."); |
|
278 |
// } |
|
279 | 279 |
} |
0 comments (0 inline)