src/lemon/concept/undir_graph.h
changeset 1022 567f392d1d2e
parent 1021 fd1d073b6557
child 1030 c8a41699e613
     1.1 --- a/src/lemon/concept/undir_graph.h	Thu Nov 25 14:48:24 2004 +0000
     1.2 +++ b/src/lemon/concept/undir_graph.h	Sun Nov 28 16:30:10 2004 +0000
     1.3 @@ -31,50 +31,163 @@
     1.4    namespace concept {
     1.5  
     1.6      /// \todo to be done
     1.7 -    class BaseIterableUndirGraph;
     1.8  
     1.9 -    template <typename Graph>
    1.10      struct BaseIterableUndirGraphConcept {
    1.11 -      typedef typename Graph::UndirEdge UndirEdge;
    1.12 -      typedef typename Graph::Edge Edge;
    1.13 -      typedef typename Graph::Node Node;
    1.14  
    1.15 -      void constraints() {
    1.16 -	checkConcept<BaseIterableGraphComponent, Graph>();
    1.17 -	checkConcept<GraphItem<'u'>, UndirEdge >();
    1.18 +      template <typename Graph>
    1.19 +      struct Constraints {
    1.20  
    1.21 -	/// \bug this should be base_and_derived:
    1.22 -	UndirEdge ue = e;
    1.23 -	ue = e;
    1.24 +	typedef typename Graph::UndirEdge UndirEdge;
    1.25 +	typedef typename Graph::Edge Edge;
    1.26 +	typedef typename Graph::Node Node;
    1.27  
    1.28 -	Node n;
    1.29 -	n = graph.target(ue);
    1.30 -	n = graph.source(ue);
    1.31 +	void constraints() {
    1.32 +	  checkConcept<BaseIterableGraphComponent, Graph>();
    1.33 +	  checkConcept<GraphItem<'u'>, UndirEdge >();
    1.34  
    1.35 -	graph.first(ue);
    1.36 -	graph.next(ue);
    1.37 -      }
    1.38 -      const Graph &graph;
    1.39 -      Edge e;
    1.40 +	  /// \bug this should be base_and_derived:
    1.41 +	  UndirEdge ue = e;
    1.42 +	  ue = e;
    1.43 +
    1.44 +	  Node n;
    1.45 +	  n = graph.target(ue);
    1.46 +	  n = graph.source(ue);
    1.47 +
    1.48 +	  graph.first(ue);
    1.49 +	  graph.next(ue);
    1.50 +	}
    1.51 +	const Graph &graph;
    1.52 +	Edge e;
    1.53 +      };
    1.54 +
    1.55      };
    1.56  
    1.57 -    template <typename Graph>
    1.58 +
    1.59      struct IterableUndirGraphConcept {
    1.60 -      void constraints() {
    1.61 -	/// \todo we don't need the iterable component should base iterable	
    1.62 -	//	checkConcept< BaseIterableUndirGraph, Graph > ();
    1.63 -	checkConcept< IterableGraphComponent, Graph > ();
    1.64  
    1.65 -	typedef typename Graph::UndirEdge UndirEdge;
    1.66 -	typedef typename Graph::UndirEdgeIt UndirEdgeIt;
    1.67 -	typedef typename Graph::UndirIncEdgeIt UndirIncEdgeIt;
    1.68 +      template <typename Graph>
    1.69 +      struct Constraints {
    1.70 +	void constraints() {
    1.71 +	  /// \todo we don't need the iterable component to be base iterable
    1.72 +	  /// Don't we really???
    1.73 +	  //checkConcept< BaseIterableUndirGraphConcept, Graph > ();
    1.74  
    1.75 -	checkConcept< GraphIterator<Graph, UndirEdge>, UndirEdgeIt >();
    1.76 +	  checkConcept<IterableGraphComponent, Graph> ();
    1.77  
    1.78 -	checkConcept<
    1.79 -	  GraphIncIterator<Graph, UndirEdge>,
    1.80 -	  UndirIncEdgeIt >();
    1.81 -      }
    1.82 +	  typedef typename Graph::UndirEdge UndirEdge;
    1.83 +	  typedef typename Graph::UndirEdgeIt UndirEdgeIt;
    1.84 +	  typedef typename Graph::UndirIncEdgeIt UndirIncEdgeIt;
    1.85 +
    1.86 +	  checkConcept<GraphIterator<Graph, UndirEdge>, UndirEdgeIt>();
    1.87 +	  checkConcept<GraphIncIterator<Graph, UndirEdge>, UndirIncEdgeIt>();
    1.88 +	}
    1.89 +      };
    1.90 +
    1.91 +    };
    1.92 +
    1.93 +    struct MappableUndirGraphConcept {
    1.94 +
    1.95 +      template <typename Graph>
    1.96 +      struct Constraints {
    1.97 +
    1.98 +	struct Dummy {
    1.99 +	  int value;
   1.100 +	  Dummy() : value(0) {}
   1.101 +	  Dummy(int _v) : value(_v) {}
   1.102 +	};
   1.103 +
   1.104 +	void constraints() {
   1.105 +	  checkConcept<MappableGraphComponent, Graph>();
   1.106 +
   1.107 +	  typedef typename Graph::template UndirEdgeMap<int> IntMap;
   1.108 +	  checkConcept<GraphMap<Graph, typename Graph::UndirEdge, int>,
   1.109 +	    IntMap >();
   1.110 +
   1.111 +	  typedef typename Graph::template UndirEdgeMap<bool> BoolMap;
   1.112 +	  checkConcept<GraphMap<Graph, typename Graph::UndirEdge, bool>,
   1.113 +	    BoolMap >();
   1.114 +
   1.115 +	  typedef typename Graph::template UndirEdgeMap<Dummy> DummyMap;
   1.116 +	  checkConcept<GraphMap<Graph, typename Graph::UndirEdge, Dummy>,
   1.117 +	    DummyMap >();
   1.118 +	}
   1.119 +      };
   1.120 +
   1.121 +    };
   1.122 +
   1.123 +    struct ExtendableUndirGraphConcept {
   1.124 +
   1.125 +      template <typename Graph>
   1.126 +      struct Constraints {
   1.127 +	void constraints() {
   1.128 +	  node_a = graph.addNode();
   1.129 +	  uedge = graph.addEdge(node_a, node_b);
   1.130 +	}
   1.131 +	typename Graph::Node node_a, node_b;
   1.132 +	typename Graph::UndirEdge uedge;
   1.133 +	Graph graph;
   1.134 +      };
   1.135 +
   1.136 +    };
   1.137 +
   1.138 +    struct ErasableUndirGraphConcept {
   1.139 +
   1.140 +      template <typename Graph>
   1.141 +      struct Constraints {
   1.142 +	void constraints() {
   1.143 +	  graph.erase(n);
   1.144 +	  graph.erase(e);
   1.145 +	}
   1.146 +	Graph graph;
   1.147 +	typename Graph::Node n;
   1.148 +	typename Graph::UndirEdge e;
   1.149 +      };
   1.150 +
   1.151 +    };
   1.152 +
   1.153 +    class UndirGraph {
   1.154 +    public:
   1.155 +
   1.156 +      template <typename Graph>
   1.157 +      struct Constraints {
   1.158 +	void constraints() {
   1.159 +	  checkConcept<BaseIterableUndirGraphConcept, Graph>();
   1.160 +	  checkConcept<IterableUndirGraphConcept, Graph>();
   1.161 +	  checkConcept<MappableUndirGraphConcept, Graph>();
   1.162 +	}
   1.163 +      };
   1.164 +
   1.165 +    };
   1.166 +
   1.167 +    class ExtendableUndirGraph : public UndirGraph {
   1.168 +    public:
   1.169 +
   1.170 +      template <typename Graph>
   1.171 +      struct Constraints {
   1.172 +	void constraints() {
   1.173 +	  checkConcept<BaseIterableUndirGraphConcept, Graph>();
   1.174 +	  checkConcept<IterableUndirGraphConcept, Graph>();
   1.175 +	  checkConcept<MappableUndirGraphConcept, Graph>();
   1.176 +
   1.177 +	  checkConcept<UndirGraph, Graph>();
   1.178 +	  checkConcept<ExtendableUndirGraphConcept, Graph>();
   1.179 +	  checkConcept<ClearableGraphComponent, Graph>();
   1.180 +	}
   1.181 +      };
   1.182 +
   1.183 +    };
   1.184 +
   1.185 +    class ErasableUndirGraph : public ExtendableUndirGraph {
   1.186 +    public:
   1.187 +
   1.188 +      template <typename Graph>
   1.189 +      struct Constraints {
   1.190 +	void constraints() {
   1.191 +	  checkConcept<ExtendableUndirGraph, Graph>();
   1.192 +	  checkConcept<ErasableUndirGraphConcept, Graph>();
   1.193 +	}
   1.194 +      };
   1.195 +
   1.196      };
   1.197  
   1.198    }