diff -r d8475431bbbb -r 8e85e6bbefdf lemon/concept/graph.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lemon/concept/graph.h Mon May 23 04:48:14 2005 +0000 @@ -0,0 +1,578 @@ +/* -*- C++ -*- + * lemon/concept/graph.h - Part of LEMON, a generic C++ optimization library + * + * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport + * (Egervary Research Group on Combinatorial Optimization, EGRES). + * + * Permission to use, modify and distribute this software is granted + * provided that this copyright notice appears in all copies. For + * precise terms see the accompanying LICENSE file. + * + * This software is provided "AS IS" with no warranty of any kind, + * express or implied, and with no claim as to its suitability for any + * purpose. + * + */ + +#ifndef LEMON_CONCEPT_GRAPH_H +#define LEMON_CONCEPT_GRAPH_H + +///\ingroup graph_concepts +///\file +///\brief Declaration of Graph. + +#include +#include +#include +#include + +namespace lemon { + namespace concept { + + + /// \addtogroup graph_concepts + /// @{ + + /**************** The full-featured graph concepts ****************/ + + + /// \brief Modular static graph class. + /// + /// It should be the same as the \c StaticGraph class. + class _StaticGraph + : virtual public BaseGraphComponent, + public IterableGraphComponent, public MappableGraphComponent { + public: + typedef BaseGraphComponent::Node Node; + typedef BaseGraphComponent::Edge Edge; + + template + struct Constraints { + void constraints() { + checkConcept(); + checkConcept(); + } + }; + }; + + /// \brief Modular extendable graph class. + /// + /// It should be the same as the \c ExtendableGraph class. + class _ExtendableGraph + : virtual public BaseGraphComponent, public _StaticGraph, + public ExtendableGraphComponent, public ClearableGraphComponent { + public: + typedef BaseGraphComponent::Node Node; + typedef BaseGraphComponent::Edge Edge; + + template + struct Constraints { + void constraints() { + checkConcept<_StaticGraph, _Graph >(); + checkConcept(); + checkConcept(); + } + }; + }; + + /// \brief Modular erasable graph class. + /// + /// It should be the same as the \c ErasableGraph class. + class _ErasableGraph + : virtual public BaseGraphComponent, public _ExtendableGraph, + public ErasableGraphComponent { + public: + typedef BaseGraphComponent::Node Node; + typedef BaseGraphComponent::Edge Edge; + + template + struct Constraints { + void constraints() { + checkConcept<_ExtendableGraph, _Graph >(); + checkConcept(); + } + }; + }; + + /// An empty static graph class. + + /// This class provides all the common features of a graph structure, + /// however completely without implementations and real data structures + /// behind the interface. + /// All graph algorithms should compile with this class, but it will not + /// run properly, of course. + /// + /// It can be used for checking the interface compatibility, + /// or it can serve as a skeleton of a new graph structure. + /// + /// Also, you will find here the full documentation of a certain graph + /// feature, the documentation of a real graph imlementation + /// like @ref ListGraph or + /// @ref SmartGraph will just refer to this structure. + /// + /// \todo A pages describing the concept of concept description would + /// be nice. + class StaticGraph + { + public: + /// Defalult constructor. + + /// Defalult constructor. + /// + StaticGraph() { } + ///Copy consructor. + +// ///\todo It is not clear, what we expect from a copy constructor. +// ///E.g. How to assign the nodes/edges to each other? What about maps? +// StaticGraph(const StaticGraph& g) { } + + /// The base type of node iterators, + /// or in other words, the trivial node iterator. + + /// This is the base type of each node iterator, + /// thus each kind of node iterator converts to this. + /// More precisely each kind of node iterator should be inherited + /// from the trivial node iterator. + class Node { + public: + /// Default constructor + + /// @warning The default constructor sets the iterator + /// to an undefined value. + Node() { } + /// Copy constructor. + + /// Copy constructor. + /// + Node(const Node&) { } + + /// Invalid constructor \& conversion. + + /// This constructor initializes the iterator to be invalid. + /// \sa Invalid for more details. + Node(Invalid) { } + /// Equality operator + + /// Two iterators are equal if and only if they point to the + /// same object or both are invalid. + bool operator==(Node) const { return true; } + + /// Inequality operator + + /// \sa operator==(Node n) + /// + bool operator!=(Node) const { return true; } + + }; + + /// This iterator goes through each node. + + /// This iterator goes through each node. + /// Its usage is quite simple, for example you can count the number + /// of nodes in graph \c g of type \c Graph like this: + /// \code + /// int count=0; + /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count; + /// \endcode + class NodeIt : public Node { + public: + /// Default constructor + + /// @warning The default constructor sets the iterator + /// to an undefined value. + NodeIt() { } + /// Copy constructor. + + /// Copy constructor. + /// + NodeIt(const NodeIt& n) : Node(n) { } + /// Invalid constructor \& conversion. + + /// Initialize the iterator to be invalid. + /// \sa Invalid for more details. + NodeIt(Invalid) { } + /// Sets the iterator to the first node. + + /// Sets the iterator to the first node of \c g. + /// + NodeIt(const StaticGraph&) { } + /// Node -> NodeIt conversion. + + /// Sets the iterator to the node of \c g pointed by the trivial + /// iterator n. + /// This feature necessitates that each time we + /// iterate the edge-set, the iteration order is the same. + NodeIt(const StaticGraph& g, const Node& n) { } + /// Next node. + + /// Assign the iterator to the next node. + /// + NodeIt& operator++() { return *this; } + }; + + + /// The base type of the edge iterators. + + /// The base type of the edge iterators. + /// + class Edge { + public: + /// Default constructor + + /// @warning The default constructor sets the iterator + /// to an undefined value. + Edge() { } + /// Copy constructor. + + /// Copy constructor. + /// + Edge(const Edge&) { } + /// Initialize the iterator to be invalid. + + /// Initialize the iterator to be invalid. + /// + Edge(Invalid) { } + /// Equality operator + + /// Two iterators are equal if and only if they point to the + /// same object or both are invalid. + bool operator==(Edge) const { return true; } + /// Inequality operator + + /// \sa operator==(Node n) + /// + bool operator!=(Edge) const { return true; } + }; + + /// This iterator goes trough the outgoing edges of a node. + + /// This iterator goes trough the \e outgoing edges of a certain node + /// of a graph. + /// Its usage is quite simple, for example you can count the number + /// of outgoing edges of a node \c n + /// in graph \c g of type \c Graph as follows. + /// \code + /// int count=0; + /// for (Graph::OutEdgeIt e(g, n); e!=INVALID; ++e) ++count; + /// \endcode + + class OutEdgeIt : public Edge { + public: + /// Default constructor + + /// @warning The default constructor sets the iterator + /// to an undefined value. + OutEdgeIt() { } + /// Copy constructor. + + /// Copy constructor. + /// + OutEdgeIt(const OutEdgeIt& e) : Edge(e) { } + /// Initialize the iterator to be invalid. + + /// Initialize the iterator to be invalid. + /// + OutEdgeIt(Invalid) { } + /// This constructor sets the iterator to the first outgoing edge. + + /// This constructor sets the iterator to the first outgoing edge of + /// the node. + ///@param n the node + ///@param g the graph + OutEdgeIt(const StaticGraph&, const Node&) { } + /// Edge -> OutEdgeIt conversion + + /// Sets the iterator to the value of the trivial iterator \c e. + /// This feature necessitates that each time we + /// iterate the edge-set, the iteration order is the same. + OutEdgeIt(const StaticGraph& g, const Edge& e) { } + ///Next outgoing edge + + /// Assign the iterator to the next + /// outgoing edge of the corresponding node. + OutEdgeIt& operator++() { return *this; } + }; + + /// This iterator goes trough the incoming edges of a node. + + /// This iterator goes trough the \e incoming edges of a certain node + /// of a graph. + /// Its usage is quite simple, for example you can count the number + /// of outgoing edges of a node \c n + /// in graph \c g of type \c Graph as follows. + /// \code + /// int count=0; + /// for(Graph::InEdgeIt e(g, n); e!=INVALID; ++e) ++count; + /// \endcode + + class InEdgeIt : public Edge { + public: + /// Default constructor + + /// @warning The default constructor sets the iterator + /// to an undefined value. + InEdgeIt() { } + /// Copy constructor. + + /// Copy constructor. + /// + InEdgeIt(const InEdgeIt& e) : Edge(e) { } + /// Initialize the iterator to be invalid. + + /// Initialize the iterator to be invalid. + /// + InEdgeIt(Invalid) { } + /// This constructor sets the iterator to first incoming edge. + + /// This constructor set the iterator to the first incoming edge of + /// the node. + ///@param n the node + ///@param g the graph + InEdgeIt(const StaticGraph&, const Node&) { } + /// Edge -> InEdgeIt conversion + + /// Sets the iterator to the value of the trivial iterator \c e. + /// This feature necessitates that each time we + /// iterate the edge-set, the iteration order is the same. + InEdgeIt(const StaticGraph&, const Edge&) { } + /// Next incoming edge + + /// Assign the iterator to the next inedge of the corresponding node. + /// + InEdgeIt& operator++() { return *this; } + }; + /// This iterator goes through each edge. + + /// This iterator goes through each edge of a graph. + /// Its usage is quite simple, for example you can count the number + /// of edges in a graph \c g of type \c Graph as follows: + /// \code + /// int count=0; + /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count; + /// \endcode + class EdgeIt : public Edge { + public: + /// Default constructor + + /// @warning The default constructor sets the iterator + /// to an undefined value. + EdgeIt() { } + /// Copy constructor. + + /// Copy constructor. + /// + EdgeIt(const EdgeIt& e) : Edge(e) { } + /// Initialize the iterator to be invalid. + + /// Initialize the iterator to be invalid. + /// + EdgeIt(Invalid) { } + /// This constructor sets the iterator to the first edge. + + /// This constructor sets the iterator to the first edge of \c g. + ///@param g the graph + EdgeIt(const StaticGraph&) { } + /// Edge -> EdgeIt conversion + + /// Sets the iterator to the value of the trivial iterator \c e. + /// This feature necessitates that each time we + /// iterate the edge-set, the iteration order is the same. + EdgeIt(const StaticGraph&, const Edge&) { } + ///Next edge + + /// Assign the iterator to the next edge. + EdgeIt& operator++() { return *this; } + }; + ///Gives back the target node of an edge. + + ///Gives back the target node of an edge. + /// + Node target(Edge) const { return INVALID; } + ///Gives back the source node of an edge. + + ///Gives back the source node of an edge. + /// + Node source(Edge) const { return INVALID; } + /// Read write map of the nodes to type \c T. + + /// \ingroup concept + /// ReadWrite map of the nodes to type \c T. + /// \sa Reference + /// \warning Making maps that can handle bool type (NodeMap) + /// needs some extra attention! + template + class NodeMap : public ReadWriteMap< Node, T > + { + public: + + ///\e + NodeMap(const StaticGraph&) { } + ///\e + NodeMap(const StaticGraph&, T) { } + + ///Copy constructor + NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { } + ///Assignment operator + NodeMap& operator=(const NodeMap&) { return *this; } + // \todo fix this concept + }; + + /// Read write map of the edges to type \c T. + + /// \ingroup concept + ///Reference map of the edges to type \c T. + /// \sa Reference + /// \warning Making maps that can handle bool type (EdgeMap) + /// needs some extra attention! + template + class EdgeMap : public ReadWriteMap + { + public: + + ///\e + EdgeMap(const StaticGraph&) { } + ///\e + EdgeMap(const StaticGraph&, T) { } + ///Copy constructor + EdgeMap(const EdgeMap& em) : ReadWriteMap(em) { } + ///Assignment operator + EdgeMap& operator=(const EdgeMap&) { return *this; } + // \todo fix this concept + }; + + template + struct Constraints : public _StaticGraph::Constraints<_Graph> {}; + + }; + + /// An empty non-static graph class. + + /// This class provides everything that \ref StaticGraph does. + /// Additionally it enables building graphs from scratch. + class ExtendableGraph : public StaticGraph + { + public: + /// Defalult constructor. + + /// Defalult constructor. + /// + ExtendableGraph() { } + ///Add a new node to the graph. + + /// \return the new node. + /// + Node addNode() { return INVALID; } + ///Add a new edge to the graph. + + ///Add a new edge to the graph with source node \c s + ///and target node \c t. + ///\return the new edge. + Edge addEdge(Node, Node) { return INVALID; } + + /// Resets the graph. + + /// This function deletes all edges and nodes of the graph. + /// It also frees the memory allocated to store them. + /// \todo It might belong to \ref ErasableGraph. + void clear() { } + + template + struct Constraints : public _ExtendableGraph::Constraints<_Graph> {}; + + }; + + /// An empty erasable graph class. + + /// This class is an extension of \ref ExtendableGraph. It makes it + /// possible to erase edges or nodes. + class ErasableGraph : public ExtendableGraph + { + public: + /// Defalult constructor. + + /// Defalult constructor. + /// + ErasableGraph() { } + /// Deletes a node. + + /// Deletes node \c n node. + /// + void erase(Node) { } + /// Deletes an edge. + + /// Deletes edge \c e edge. + /// + void erase(Edge) { } + + template + struct Constraints : public _ErasableGraph::Constraints<_Graph> {}; + + }; + + + /************* New GraphBase stuff **************/ + + +// /// A minimal GraphBase concept + +// /// This class describes a minimal concept which can be extended to a +// /// full-featured graph with \ref GraphFactory. +// class GraphBase { +// public: + +// GraphBase() {} + +// /// \bug Should we demand that Node and Edge be subclasses of the +// /// Graph class??? + +// typedef GraphItem<'n'> Node; +// typedef GraphItem<'e'> Edge; + +// // class Node : public BaseGraphItem<'n'> {}; +// // class Edge : public BaseGraphItem<'e'> {}; + +// // Graph operation +// void firstNode(Node &n) const { } +// void firstEdge(Edge &e) const { } + +// void firstOutEdge(Edge &e, Node) const { } +// void firstInEdge(Edge &e, Node) const { } + +// void nextNode(Node &n) const { } +// void nextEdge(Edge &e) const { } + + +// // Question: isn't it reasonable if this methods have a Node +// // parameter? Like this: +// // Edge& nextOut(Edge &e, Node) const { return e; } +// void nextOutEdge(Edge &e) const { } +// void nextInEdge(Edge &e) const { } + +// Node target(Edge) const { return Node(); } +// Node source(Edge) const { return Node(); } + + +// // Do we need id, nodeNum, edgeNum and co. in this basic graphbase +// // concept? + + +// // Maps. +// // +// // We need a special slimer concept which does not provide maps (it +// // wouldn't be strictly slimer, cause for map-factory id() & friends +// // a required...) + +// template +// class NodeMap : public GraphMap {}; + +// template +// class EdgeMap : public GraphMap {}; +// }; + + // @} + } //namespace concept +} //namespace lemon + + + +#endif // LEMON_CONCEPT_GRAPH_H