1.1 --- a/lemon/concepts/digraph.h Mon Jan 12 23:11:39 2009 +0100
1.2 +++ b/lemon/concepts/digraph.h Thu Nov 05 15:48:01 2009 +0100
1.3 @@ -16,8 +16,8 @@
1.4 *
1.5 */
1.6
1.7 -#ifndef LEMON_CONCEPT_DIGRAPH_H
1.8 -#define LEMON_CONCEPT_DIGRAPH_H
1.9 +#ifndef LEMON_CONCEPTS_DIGRAPH_H
1.10 +#define LEMON_CONCEPTS_DIGRAPH_H
1.11
1.12 ///\ingroup graph_concepts
1.13 ///\file
1.14 @@ -35,46 +35,40 @@
1.15 ///
1.16 /// \brief Class describing the concept of directed graphs.
1.17 ///
1.18 - /// This class describes the \ref concept "concept" of the
1.19 - /// immutable directed digraphs.
1.20 + /// This class describes the common interface of all directed
1.21 + /// graphs (digraphs).
1.22 ///
1.23 - /// Note that actual digraph implementation like @ref ListDigraph or
1.24 - /// @ref SmartDigraph may have several additional functionality.
1.25 + /// Like all concept classes, it only provides an interface
1.26 + /// without any sensible implementation. So any general algorithm for
1.27 + /// directed graphs should compile with this class, but it will not
1.28 + /// run properly, of course.
1.29 + /// An actual digraph implementation like \ref ListDigraph or
1.30 + /// \ref SmartDigraph may have additional functionality.
1.31 ///
1.32 - /// \sa concept
1.33 + /// \sa Graph
1.34 class Digraph {
1.35 private:
1.36 - ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
1.37 + /// Diraphs are \e not copy constructible. Use DigraphCopy instead.
1.38 + Digraph(const Digraph &) {}
1.39 + /// \brief Assignment of a digraph to another one is \e not allowed.
1.40 + /// Use DigraphCopy instead.
1.41 + void operator=(const Digraph &) {}
1.42
1.43 - ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
1.44 - ///
1.45 - Digraph(const Digraph &) {};
1.46 - ///\brief Assignment of \ref Digraph "Digraph"s to another ones are
1.47 - ///\e not allowed. Use DigraphCopy() instead.
1.48 + public:
1.49 + /// Default constructor.
1.50 + Digraph() { }
1.51
1.52 - ///Assignment of \ref Digraph "Digraph"s to another ones are
1.53 - ///\e not allowed. Use DigraphCopy() instead.
1.54 -
1.55 - void operator=(const Digraph &) {}
1.56 - public:
1.57 - ///\e
1.58 -
1.59 - /// Defalult constructor.
1.60 -
1.61 - /// Defalult constructor.
1.62 - ///
1.63 - Digraph() { }
1.64 - /// Class for identifying a node of the digraph
1.65 + /// The node type of the digraph
1.66
1.67 /// This class identifies a node of the digraph. It also serves
1.68 /// as a base class of the node iterators,
1.69 - /// thus they will convert to this type.
1.70 + /// thus they convert to this type.
1.71 class Node {
1.72 public:
1.73 /// Default constructor
1.74
1.75 - /// @warning The default constructor sets the iterator
1.76 - /// to an undefined value.
1.77 + /// Default constructor.
1.78 + /// \warning It sets the object to an undefined value.
1.79 Node() { }
1.80 /// Copy constructor.
1.81
1.82 @@ -82,40 +76,39 @@
1.83 ///
1.84 Node(const Node&) { }
1.85
1.86 - /// Invalid constructor \& conversion.
1.87 + /// %Invalid constructor \& conversion.
1.88
1.89 - /// This constructor initializes the iterator to be invalid.
1.90 + /// Initializes the object to be invalid.
1.91 /// \sa Invalid for more details.
1.92 Node(Invalid) { }
1.93 /// Equality operator
1.94
1.95 + /// Equality operator.
1.96 + ///
1.97 /// Two iterators are equal if and only if they point to the
1.98 - /// same object or both are invalid.
1.99 + /// same object or both are \c INVALID.
1.100 bool operator==(Node) const { return true; }
1.101
1.102 /// Inequality operator
1.103
1.104 - /// \sa operator==(Node n)
1.105 - ///
1.106 + /// Inequality operator.
1.107 bool operator!=(Node) const { return true; }
1.108
1.109 /// Artificial ordering operator.
1.110
1.111 - /// To allow the use of digraph descriptors as key type in std::map or
1.112 - /// similar associative container we require this.
1.113 + /// Artificial ordering operator.
1.114 ///
1.115 - /// \note This operator only have to define some strict ordering of
1.116 - /// the items; this order has nothing to do with the iteration
1.117 - /// ordering of the items.
1.118 + /// \note This operator only has to define some strict ordering of
1.119 + /// the nodes; this order has nothing to do with the iteration
1.120 + /// ordering of the nodes.
1.121 bool operator<(Node) const { return false; }
1.122 -
1.123 };
1.124
1.125 - /// This iterator goes through each node.
1.126 + /// Iterator class for the nodes.
1.127
1.128 - /// This iterator goes through each node.
1.129 + /// This iterator goes through each node of the digraph.
1.130 /// Its usage is quite simple, for example you can count the number
1.131 - /// of nodes in digraph \c g of type \c Digraph like this:
1.132 + /// of nodes in a digraph \c g of type \c %Digraph like this:
1.133 ///\code
1.134 /// int count=0;
1.135 /// for (Digraph::NodeIt n(g); n!=INVALID; ++n) ++count;
1.136 @@ -124,30 +117,28 @@
1.137 public:
1.138 /// Default constructor
1.139
1.140 - /// @warning The default constructor sets the iterator
1.141 - /// to an undefined value.
1.142 + /// Default constructor.
1.143 + /// \warning It sets the iterator to an undefined value.
1.144 NodeIt() { }
1.145 /// Copy constructor.
1.146
1.147 /// Copy constructor.
1.148 ///
1.149 NodeIt(const NodeIt& n) : Node(n) { }
1.150 - /// Invalid constructor \& conversion.
1.151 + /// %Invalid constructor \& conversion.
1.152
1.153 - /// Initialize the iterator to be invalid.
1.154 + /// Initializes the iterator to be invalid.
1.155 /// \sa Invalid for more details.
1.156 NodeIt(Invalid) { }
1.157 /// Sets the iterator to the first node.
1.158
1.159 - /// Sets the iterator to the first node of \c g.
1.160 + /// Sets the iterator to the first node of the given digraph.
1.161 ///
1.162 - NodeIt(const Digraph&) { }
1.163 - /// Node -> NodeIt conversion.
1.164 + explicit NodeIt(const Digraph&) { }
1.165 + /// Sets the iterator to the given node.
1.166
1.167 - /// Sets the iterator to the node of \c the digraph pointed by
1.168 - /// the trivial iterator.
1.169 - /// This feature necessitates that each time we
1.170 - /// iterate the arc-set, the iteration order is the same.
1.171 + /// Sets the iterator to the given node of the given digraph.
1.172 + ///
1.173 NodeIt(const Digraph&, const Node&) { }
1.174 /// Next node.
1.175
1.176 @@ -157,7 +148,7 @@
1.177 };
1.178
1.179
1.180 - /// Class for identifying an arc of the digraph
1.181 + /// The arc type of the digraph
1.182
1.183 /// This class identifies an arc of the digraph. It also serves
1.184 /// as a base class of the arc iterators,
1.185 @@ -166,207 +157,214 @@
1.186 public:
1.187 /// Default constructor
1.188
1.189 - /// @warning The default constructor sets the iterator
1.190 - /// to an undefined value.
1.191 + /// Default constructor.
1.192 + /// \warning It sets the object to an undefined value.
1.193 Arc() { }
1.194 /// Copy constructor.
1.195
1.196 /// Copy constructor.
1.197 ///
1.198 Arc(const Arc&) { }
1.199 - /// Initialize the iterator to be invalid.
1.200 + /// %Invalid constructor \& conversion.
1.201
1.202 - /// Initialize the iterator to be invalid.
1.203 - ///
1.204 + /// Initializes the object to be invalid.
1.205 + /// \sa Invalid for more details.
1.206 Arc(Invalid) { }
1.207 /// Equality operator
1.208
1.209 + /// Equality operator.
1.210 + ///
1.211 /// Two iterators are equal if and only if they point to the
1.212 - /// same object or both are invalid.
1.213 + /// same object or both are \c INVALID.
1.214 bool operator==(Arc) const { return true; }
1.215 /// Inequality operator
1.216
1.217 - /// \sa operator==(Arc n)
1.218 - ///
1.219 + /// Inequality operator.
1.220 bool operator!=(Arc) const { return true; }
1.221
1.222 /// Artificial ordering operator.
1.223
1.224 - /// To allow the use of digraph descriptors as key type in std::map or
1.225 - /// similar associative container we require this.
1.226 + /// Artificial ordering operator.
1.227 ///
1.228 - /// \note This operator only have to define some strict ordering of
1.229 - /// the items; this order has nothing to do with the iteration
1.230 - /// ordering of the items.
1.231 + /// \note This operator only has to define some strict ordering of
1.232 + /// the arcs; this order has nothing to do with the iteration
1.233 + /// ordering of the arcs.
1.234 bool operator<(Arc) const { return false; }
1.235 };
1.236
1.237 - /// This iterator goes trough the outgoing arcs of a node.
1.238 + /// Iterator class for the outgoing arcs of a node.
1.239
1.240 /// This iterator goes trough the \e outgoing arcs of a certain node
1.241 /// of a digraph.
1.242 /// Its usage is quite simple, for example you can count the number
1.243 /// of outgoing arcs of a node \c n
1.244 - /// in digraph \c g of type \c Digraph as follows.
1.245 + /// in a digraph \c g of type \c %Digraph as follows.
1.246 ///\code
1.247 /// int count=0;
1.248 - /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
1.249 + /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
1.250 ///\endcode
1.251 -
1.252 class OutArcIt : public Arc {
1.253 public:
1.254 /// Default constructor
1.255
1.256 - /// @warning The default constructor sets the iterator
1.257 - /// to an undefined value.
1.258 + /// Default constructor.
1.259 + /// \warning It sets the iterator to an undefined value.
1.260 OutArcIt() { }
1.261 /// Copy constructor.
1.262
1.263 /// Copy constructor.
1.264 ///
1.265 OutArcIt(const OutArcIt& e) : Arc(e) { }
1.266 - /// Initialize the iterator to be invalid.
1.267 + /// %Invalid constructor \& conversion.
1.268
1.269 - /// Initialize the iterator to be invalid.
1.270 + /// Initializes the iterator to be invalid.
1.271 + /// \sa Invalid for more details.
1.272 + OutArcIt(Invalid) { }
1.273 + /// Sets the iterator to the first outgoing arc.
1.274 +
1.275 + /// Sets the iterator to the first outgoing arc of the given node.
1.276 ///
1.277 - OutArcIt(Invalid) { }
1.278 - /// This constructor sets the iterator to the first outgoing arc.
1.279 + OutArcIt(const Digraph&, const Node&) { }
1.280 + /// Sets the iterator to the given arc.
1.281
1.282 - /// This constructor sets the iterator to the first outgoing arc of
1.283 - /// the node.
1.284 - OutArcIt(const Digraph&, const Node&) { }
1.285 - /// Arc -> OutArcIt conversion
1.286 -
1.287 - /// Sets the iterator to the value of the trivial iterator.
1.288 - /// This feature necessitates that each time we
1.289 - /// iterate the arc-set, the iteration order is the same.
1.290 + /// Sets the iterator to the given arc of the given digraph.
1.291 + ///
1.292 OutArcIt(const Digraph&, const Arc&) { }
1.293 - ///Next outgoing arc
1.294 + /// Next outgoing arc
1.295
1.296 /// Assign the iterator to the next
1.297 /// outgoing arc of the corresponding node.
1.298 OutArcIt& operator++() { return *this; }
1.299 };
1.300
1.301 - /// This iterator goes trough the incoming arcs of a node.
1.302 + /// Iterator class for the incoming arcs of a node.
1.303
1.304 /// This iterator goes trough the \e incoming arcs of a certain node
1.305 /// of a digraph.
1.306 /// Its usage is quite simple, for example you can count the number
1.307 - /// of outgoing arcs of a node \c n
1.308 - /// in digraph \c g of type \c Digraph as follows.
1.309 + /// of incoming arcs of a node \c n
1.310 + /// in a digraph \c g of type \c %Digraph as follows.
1.311 ///\code
1.312 /// int count=0;
1.313 - /// for(Digraph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
1.314 + /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
1.315 ///\endcode
1.316 -
1.317 class InArcIt : public Arc {
1.318 public:
1.319 /// Default constructor
1.320
1.321 - /// @warning The default constructor sets the iterator
1.322 - /// to an undefined value.
1.323 + /// Default constructor.
1.324 + /// \warning It sets the iterator to an undefined value.
1.325 InArcIt() { }
1.326 /// Copy constructor.
1.327
1.328 /// Copy constructor.
1.329 ///
1.330 InArcIt(const InArcIt& e) : Arc(e) { }
1.331 - /// Initialize the iterator to be invalid.
1.332 + /// %Invalid constructor \& conversion.
1.333
1.334 - /// Initialize the iterator to be invalid.
1.335 + /// Initializes the iterator to be invalid.
1.336 + /// \sa Invalid for more details.
1.337 + InArcIt(Invalid) { }
1.338 + /// Sets the iterator to the first incoming arc.
1.339 +
1.340 + /// Sets the iterator to the first incoming arc of the given node.
1.341 ///
1.342 - InArcIt(Invalid) { }
1.343 - /// This constructor sets the iterator to first incoming arc.
1.344 + InArcIt(const Digraph&, const Node&) { }
1.345 + /// Sets the iterator to the given arc.
1.346
1.347 - /// This constructor set the iterator to the first incoming arc of
1.348 - /// the node.
1.349 - InArcIt(const Digraph&, const Node&) { }
1.350 - /// Arc -> InArcIt conversion
1.351 -
1.352 - /// Sets the iterator to the value of the trivial iterator \c e.
1.353 - /// This feature necessitates that each time we
1.354 - /// iterate the arc-set, the iteration order is the same.
1.355 + /// Sets the iterator to the given arc of the given digraph.
1.356 + ///
1.357 InArcIt(const Digraph&, const Arc&) { }
1.358 /// Next incoming arc
1.359
1.360 - /// Assign the iterator to the next inarc of the corresponding node.
1.361 - ///
1.362 + /// Assign the iterator to the next
1.363 + /// incoming arc of the corresponding node.
1.364 InArcIt& operator++() { return *this; }
1.365 };
1.366 - /// This iterator goes through each arc.
1.367
1.368 - /// This iterator goes through each arc of a digraph.
1.369 + /// Iterator class for the arcs.
1.370 +
1.371 + /// This iterator goes through each arc of the digraph.
1.372 /// Its usage is quite simple, for example you can count the number
1.373 - /// of arcs in a digraph \c g of type \c Digraph as follows:
1.374 + /// of arcs in a digraph \c g of type \c %Digraph as follows:
1.375 ///\code
1.376 /// int count=0;
1.377 - /// for(Digraph::ArcIt e(g); e!=INVALID; ++e) ++count;
1.378 + /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count;
1.379 ///\endcode
1.380 class ArcIt : public Arc {
1.381 public:
1.382 /// Default constructor
1.383
1.384 - /// @warning The default constructor sets the iterator
1.385 - /// to an undefined value.
1.386 + /// Default constructor.
1.387 + /// \warning It sets the iterator to an undefined value.
1.388 ArcIt() { }
1.389 /// Copy constructor.
1.390
1.391 /// Copy constructor.
1.392 ///
1.393 ArcIt(const ArcIt& e) : Arc(e) { }
1.394 - /// Initialize the iterator to be invalid.
1.395 + /// %Invalid constructor \& conversion.
1.396
1.397 - /// Initialize the iterator to be invalid.
1.398 + /// Initializes the iterator to be invalid.
1.399 + /// \sa Invalid for more details.
1.400 + ArcIt(Invalid) { }
1.401 + /// Sets the iterator to the first arc.
1.402 +
1.403 + /// Sets the iterator to the first arc of the given digraph.
1.404 ///
1.405 - ArcIt(Invalid) { }
1.406 - /// This constructor sets the iterator to the first arc.
1.407 + explicit ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
1.408 + /// Sets the iterator to the given arc.
1.409
1.410 - /// This constructor sets the iterator to the first arc of \c g.
1.411 - ///@param g the digraph
1.412 - ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
1.413 - /// Arc -> ArcIt conversion
1.414 -
1.415 - /// Sets the iterator to the value of the trivial iterator \c e.
1.416 - /// This feature necessitates that each time we
1.417 - /// iterate the arc-set, the iteration order is the same.
1.418 + /// Sets the iterator to the given arc of the given digraph.
1.419 + ///
1.420 ArcIt(const Digraph&, const Arc&) { }
1.421 - ///Next arc
1.422 + /// Next arc
1.423
1.424 /// Assign the iterator to the next arc.
1.425 + ///
1.426 ArcIt& operator++() { return *this; }
1.427 };
1.428 - ///Gives back the target node of an arc.
1.429
1.430 - ///Gives back the target node of an arc.
1.431 + /// \brief The source node of the arc.
1.432 ///
1.433 - Node target(Arc) const { return INVALID; }
1.434 - ///Gives back the source node of an arc.
1.435 -
1.436 - ///Gives back the source node of an arc.
1.437 - ///
1.438 + /// Returns the source node of the given arc.
1.439 Node source(Arc) const { return INVALID; }
1.440
1.441 - /// \brief Returns the ID of the node.
1.442 + /// \brief The target node of the arc.
1.443 + ///
1.444 + /// Returns the target node of the given arc.
1.445 + Node target(Arc) const { return INVALID; }
1.446 +
1.447 + /// \brief The ID of the node.
1.448 + ///
1.449 + /// Returns the ID of the given node.
1.450 int id(Node) const { return -1; }
1.451
1.452 - /// \brief Returns the ID of the arc.
1.453 + /// \brief The ID of the arc.
1.454 + ///
1.455 + /// Returns the ID of the given arc.
1.456 int id(Arc) const { return -1; }
1.457
1.458 - /// \brief Returns the node with the given ID.
1.459 + /// \brief The node with the given ID.
1.460 ///
1.461 - /// \pre The argument should be a valid node ID in the graph.
1.462 + /// Returns the node with the given ID.
1.463 + /// \pre The argument should be a valid node ID in the digraph.
1.464 Node nodeFromId(int) const { return INVALID; }
1.465
1.466 - /// \brief Returns the arc with the given ID.
1.467 + /// \brief The arc with the given ID.
1.468 ///
1.469 - /// \pre The argument should be a valid arc ID in the graph.
1.470 + /// Returns the arc with the given ID.
1.471 + /// \pre The argument should be a valid arc ID in the digraph.
1.472 Arc arcFromId(int) const { return INVALID; }
1.473
1.474 - /// \brief Returns an upper bound on the node IDs.
1.475 + /// \brief An upper bound on the node IDs.
1.476 + ///
1.477 + /// Returns an upper bound on the node IDs.
1.478 int maxNodeId() const { return -1; }
1.479
1.480 - /// \brief Returns an upper bound on the arc IDs.
1.481 + /// \brief An upper bound on the arc IDs.
1.482 + ///
1.483 + /// Returns an upper bound on the arc IDs.
1.484 int maxArcId() const { return -1; }
1.485
1.486 void first(Node&) const {}
1.487 @@ -392,51 +390,52 @@
1.488 // Dummy parameter.
1.489 int maxId(Arc) const { return -1; }
1.490
1.491 + /// \brief The opposite node on the arc.
1.492 + ///
1.493 + /// Returns the opposite node on the given arc.
1.494 + Node oppositeNode(Node, Arc) const { return INVALID; }
1.495 +
1.496 /// \brief The base node of the iterator.
1.497 ///
1.498 - /// Gives back the base node of the iterator.
1.499 - /// It is always the target of the pointed arc.
1.500 - Node baseNode(const InArcIt&) const { return INVALID; }
1.501 + /// Returns the base node of the given outgoing arc iterator
1.502 + /// (i.e. the source node of the corresponding arc).
1.503 + Node baseNode(OutArcIt) const { return INVALID; }
1.504
1.505 /// \brief The running node of the iterator.
1.506 ///
1.507 - /// Gives back the running node of the iterator.
1.508 - /// It is always the source of the pointed arc.
1.509 - Node runningNode(const InArcIt&) const { return INVALID; }
1.510 + /// Returns the running node of the given outgoing arc iterator
1.511 + /// (i.e. the target node of the corresponding arc).
1.512 + Node runningNode(OutArcIt) const { return INVALID; }
1.513
1.514 /// \brief The base node of the iterator.
1.515 ///
1.516 - /// Gives back the base node of the iterator.
1.517 - /// It is always the source of the pointed arc.
1.518 - Node baseNode(const OutArcIt&) const { return INVALID; }
1.519 + /// Returns the base node of the given incomming arc iterator
1.520 + /// (i.e. the target node of the corresponding arc).
1.521 + Node baseNode(InArcIt) const { return INVALID; }
1.522
1.523 /// \brief The running node of the iterator.
1.524 ///
1.525 - /// Gives back the running node of the iterator.
1.526 - /// It is always the target of the pointed arc.
1.527 - Node runningNode(const OutArcIt&) const { return INVALID; }
1.528 + /// Returns the running node of the given incomming arc iterator
1.529 + /// (i.e. the source node of the corresponding arc).
1.530 + Node runningNode(InArcIt) const { return INVALID; }
1.531
1.532 - /// \brief The opposite node on the given arc.
1.533 + /// \brief Standard graph map type for the nodes.
1.534 ///
1.535 - /// Gives back the opposite node on the given arc.
1.536 - Node oppositeNode(const Node&, const Arc&) const { return INVALID; }
1.537 -
1.538 - /// \brief Read write map of the nodes to type \c T.
1.539 - ///
1.540 - /// ReadWrite map of the nodes to type \c T.
1.541 - /// \sa Reference
1.542 + /// Standard graph map type for the nodes.
1.543 + /// It conforms to the ReferenceMap concept.
1.544 template<class T>
1.545 - class NodeMap : public ReadWriteMap< Node, T > {
1.546 + class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
1.547 public:
1.548
1.549 - ///\e
1.550 - NodeMap(const Digraph&) { }
1.551 - ///\e
1.552 + /// Constructor
1.553 + explicit NodeMap(const Digraph&) { }
1.554 + /// Constructor with given initial value
1.555 NodeMap(const Digraph&, T) { }
1.556
1.557 private:
1.558 ///Copy constructor
1.559 - NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
1.560 + NodeMap(const NodeMap& nm) :
1.561 + ReferenceMap<Node, T, T&, const T&>(nm) { }
1.562 ///Assignment operator
1.563 template <typename CMap>
1.564 NodeMap& operator=(const CMap&) {
1.565 @@ -445,21 +444,23 @@
1.566 }
1.567 };
1.568
1.569 - /// \brief Read write map of the arcs to type \c T.
1.570 + /// \brief Standard graph map type for the arcs.
1.571 ///
1.572 - /// Reference map of the arcs to type \c T.
1.573 - /// \sa Reference
1.574 + /// Standard graph map type for the arcs.
1.575 + /// It conforms to the ReferenceMap concept.
1.576 template<class T>
1.577 - class ArcMap : public ReadWriteMap<Arc,T> {
1.578 + class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
1.579 public:
1.580
1.581 - ///\e
1.582 - ArcMap(const Digraph&) { }
1.583 - ///\e
1.584 + /// Constructor
1.585 + explicit ArcMap(const Digraph&) { }
1.586 + /// Constructor with given initial value
1.587 ArcMap(const Digraph&, T) { }
1.588 +
1.589 private:
1.590 ///Copy constructor
1.591 - ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { }
1.592 + ArcMap(const ArcMap& em) :
1.593 + ReferenceMap<Arc, T, T&, const T&>(em) { }
1.594 ///Assignment operator
1.595 template <typename CMap>
1.596 ArcMap& operator=(const CMap&) {
1.597 @@ -471,6 +472,7 @@
1.598 template <typename _Digraph>
1.599 struct Constraints {
1.600 void constraints() {
1.601 + checkConcept<BaseDigraphComponent, _Digraph>();
1.602 checkConcept<IterableDigraphComponent<>, _Digraph>();
1.603 checkConcept<IDableDigraphComponent<>, _Digraph>();
1.604 checkConcept<MappableDigraphComponent<>, _Digraph>();
1.605 @@ -484,4 +486,4 @@
1.606
1.607
1.608
1.609 -#endif // LEMON_CONCEPT_DIGRAPH_H
1.610 +#endif