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 }