27 /// |
26 /// |
28 |
27 |
29 namespace lemon { |
28 namespace lemon { |
30 template <typename _Graph, typename _Item> |
29 template <typename _Graph, typename _Item> |
31 class ItemSetTraits {}; |
30 class ItemSetTraits {}; |
32 |
31 |
33 |
32 |
34 template <typename Graph, typename Enable = void> |
33 template <typename Graph, typename Enable = void> |
35 struct NodeNotifierIndicator { |
34 struct NodeNotifierIndicator { |
36 typedef InvalidType Type; |
35 typedef InvalidType Type; |
37 }; |
36 }; |
38 template <typename Graph> |
37 template <typename Graph> |
39 struct NodeNotifierIndicator< |
38 struct NodeNotifierIndicator< |
40 Graph, |
39 Graph, |
41 typename enable_if<typename Graph::NodeNotifier::Notifier, void>::type |
40 typename enable_if<typename Graph::NodeNotifier::Notifier, void>::type |
42 > { |
41 > { |
43 typedef typename Graph::NodeNotifier Type; |
42 typedef typename Graph::NodeNotifier Type; |
44 }; |
43 }; |
45 |
44 |
46 template <typename _Graph> |
45 template <typename _Graph> |
47 class ItemSetTraits<_Graph, typename _Graph::Node> { |
46 class ItemSetTraits<_Graph, typename _Graph::Node> { |
48 public: |
47 public: |
49 |
48 |
50 typedef _Graph Graph; |
49 typedef _Graph Graph; |
51 |
50 |
52 typedef typename Graph::Node Item; |
51 typedef typename Graph::Node Item; |
53 typedef typename Graph::NodeIt ItemIt; |
52 typedef typename Graph::NodeIt ItemIt; |
54 |
53 |
55 typedef typename NodeNotifierIndicator<Graph>::Type ItemNotifier; |
54 typedef typename NodeNotifierIndicator<Graph>::Type ItemNotifier; |
56 |
55 |
57 template <typename _Value> |
56 template <typename _Value> |
58 class Map : public Graph::template NodeMap<_Value> { |
57 class Map : public Graph::template NodeMap<_Value> { |
59 public: |
58 public: |
60 typedef typename Graph::template NodeMap<_Value> Parent; |
59 typedef typename Graph::template NodeMap<_Value> Parent; |
61 typedef typename Graph::template NodeMap<_Value> Type; |
60 typedef typename Graph::template NodeMap<_Value> Type; |
62 typedef typename Parent::Value Value; |
61 typedef typename Parent::Value Value; |
63 |
62 |
64 Map(const Graph& _digraph) : Parent(_digraph) {} |
63 Map(const Graph& _digraph) : Parent(_digraph) {} |
65 Map(const Graph& _digraph, const Value& _value) |
64 Map(const Graph& _digraph, const Value& _value) |
66 : Parent(_digraph, _value) {} |
65 : Parent(_digraph, _value) {} |
67 |
66 |
68 }; |
67 }; |
69 |
68 |
70 }; |
69 }; |
71 |
70 |
73 struct ArcNotifierIndicator { |
72 struct ArcNotifierIndicator { |
74 typedef InvalidType Type; |
73 typedef InvalidType Type; |
75 }; |
74 }; |
76 template <typename Graph> |
75 template <typename Graph> |
77 struct ArcNotifierIndicator< |
76 struct ArcNotifierIndicator< |
78 Graph, |
77 Graph, |
79 typename enable_if<typename Graph::ArcNotifier::Notifier, void>::type |
78 typename enable_if<typename Graph::ArcNotifier::Notifier, void>::type |
80 > { |
79 > { |
81 typedef typename Graph::ArcNotifier Type; |
80 typedef typename Graph::ArcNotifier Type; |
82 }; |
81 }; |
83 |
82 |
84 template <typename _Graph> |
83 template <typename _Graph> |
85 class ItemSetTraits<_Graph, typename _Graph::Arc> { |
84 class ItemSetTraits<_Graph, typename _Graph::Arc> { |
86 public: |
85 public: |
87 |
86 |
88 typedef _Graph Graph; |
87 typedef _Graph Graph; |
89 |
88 |
90 typedef typename Graph::Arc Item; |
89 typedef typename Graph::Arc Item; |
91 typedef typename Graph::ArcIt ItemIt; |
90 typedef typename Graph::ArcIt ItemIt; |
92 |
91 |
93 typedef typename ArcNotifierIndicator<Graph>::Type ItemNotifier; |
92 typedef typename ArcNotifierIndicator<Graph>::Type ItemNotifier; |
94 |
93 |
95 template <typename _Value> |
94 template <typename _Value> |
96 class Map : public Graph::template ArcMap<_Value> { |
95 class Map : public Graph::template ArcMap<_Value> { |
97 public: |
96 public: |
98 typedef typename Graph::template ArcMap<_Value> Parent; |
97 typedef typename Graph::template ArcMap<_Value> Parent; |
99 typedef typename Graph::template ArcMap<_Value> Type; |
98 typedef typename Graph::template ArcMap<_Value> Type; |
100 typedef typename Parent::Value Value; |
99 typedef typename Parent::Value Value; |
101 |
100 |
102 Map(const Graph& _digraph) : Parent(_digraph) {} |
101 Map(const Graph& _digraph) : Parent(_digraph) {} |
103 Map(const Graph& _digraph, const Value& _value) |
102 Map(const Graph& _digraph, const Value& _value) |
104 : Parent(_digraph, _value) {} |
103 : Parent(_digraph, _value) {} |
105 }; |
104 }; |
106 |
105 |
107 }; |
106 }; |
108 |
107 |
109 template <typename Graph, typename Enable = void> |
108 template <typename Graph, typename Enable = void> |
110 struct EdgeNotifierIndicator { |
109 struct EdgeNotifierIndicator { |
111 typedef InvalidType Type; |
110 typedef InvalidType Type; |
112 }; |
111 }; |
113 template <typename Graph> |
112 template <typename Graph> |
114 struct EdgeNotifierIndicator< |
113 struct EdgeNotifierIndicator< |
115 Graph, |
114 Graph, |
116 typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type |
115 typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type |
117 > { |
116 > { |
118 typedef typename Graph::EdgeNotifier Type; |
117 typedef typename Graph::EdgeNotifier Type; |
119 }; |
118 }; |
120 |
119 |
121 template <typename _Graph> |
120 template <typename _Graph> |
122 class ItemSetTraits<_Graph, typename _Graph::Edge> { |
121 class ItemSetTraits<_Graph, typename _Graph::Edge> { |
123 public: |
122 public: |
124 |
123 |
125 typedef _Graph Graph; |
124 typedef _Graph Graph; |
126 |
125 |
127 typedef typename Graph::Edge Item; |
126 typedef typename Graph::Edge Item; |
128 typedef typename Graph::EdgeIt ItemIt; |
127 typedef typename Graph::EdgeIt ItemIt; |
129 |
128 |
130 typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier; |
129 typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier; |
131 |
130 |
132 template <typename _Value> |
131 template <typename _Value> |
133 class Map : public Graph::template EdgeMap<_Value> { |
132 class Map : public Graph::template EdgeMap<_Value> { |
134 public: |
133 public: |
135 typedef typename Graph::template EdgeMap<_Value> Parent; |
134 typedef typename Graph::template EdgeMap<_Value> Parent; |
136 typedef typename Graph::template EdgeMap<_Value> Type; |
135 typedef typename Graph::template EdgeMap<_Value> Type; |
137 typedef typename Parent::Value Value; |
136 typedef typename Parent::Value Value; |
138 |
137 |
139 Map(const Graph& _digraph) : Parent(_digraph) {} |
138 Map(const Graph& _digraph) : Parent(_digraph) {} |
140 Map(const Graph& _digraph, const Value& _value) |
139 Map(const Graph& _digraph, const Value& _value) |
141 : Parent(_digraph, _value) {} |
140 : Parent(_digraph, _value) {} |
142 }; |
141 }; |
143 |
142 |
144 }; |
143 }; |
145 |
144 |
146 template <typename Map, typename Enable = void> |
145 template <typename Map, typename Enable = void> |
154 typedef Value ReturnValue; |
153 typedef Value ReturnValue; |
155 }; |
154 }; |
156 |
155 |
157 template <typename Map> |
156 template <typename Map> |
158 struct MapTraits< |
157 struct MapTraits< |
159 Map, typename enable_if<typename Map::ReferenceMapTag, void>::type > |
158 Map, typename enable_if<typename Map::ReferenceMapTag, void>::type > |
160 { |
159 { |
161 typedef True ReferenceMapTag; |
160 typedef True ReferenceMapTag; |
162 |
161 |
163 typedef typename Map::Key Key; |
162 typedef typename Map::Key Key; |
164 typedef typename Map::Value Value; |
163 typedef typename Map::Value Value; |
165 |
164 |
166 typedef typename Map::ConstReference ConstReturnValue; |
165 typedef typename Map::ConstReference ConstReturnValue; |
167 typedef typename Map::Reference ReturnValue; |
166 typedef typename Map::Reference ReturnValue; |
168 |
167 |
169 typedef typename Map::ConstReference ConstReference; |
168 typedef typename Map::ConstReference ConstReference; |
170 typedef typename Map::Reference Reference; |
169 typedef typename Map::Reference Reference; |
171 }; |
170 }; |
172 |
171 |
173 template <typename MatrixMap, typename Enable = void> |
172 template <typename MatrixMap, typename Enable = void> |
174 struct MatrixMapTraits { |
173 struct MatrixMapTraits { |
182 typedef Value ReturnValue; |
181 typedef Value ReturnValue; |
183 }; |
182 }; |
184 |
183 |
185 template <typename MatrixMap> |
184 template <typename MatrixMap> |
186 struct MatrixMapTraits< |
185 struct MatrixMapTraits< |
187 MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag, |
186 MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag, |
188 void>::type > |
187 void>::type > |
189 { |
188 { |
190 typedef True ReferenceMapTag; |
189 typedef True ReferenceMapTag; |
191 |
190 |
192 typedef typename MatrixMap::FirstKey FirstKey; |
191 typedef typename MatrixMap::FirstKey FirstKey; |
193 typedef typename MatrixMap::SecondKey SecondKey; |
192 typedef typename MatrixMap::SecondKey SecondKey; |
194 typedef typename MatrixMap::Value Value; |
193 typedef typename MatrixMap::Value Value; |
195 |
194 |
196 typedef typename MatrixMap::ConstReference ConstReturnValue; |
195 typedef typename MatrixMap::ConstReference ConstReturnValue; |
197 typedef typename MatrixMap::Reference ReturnValue; |
196 typedef typename MatrixMap::Reference ReturnValue; |
198 |
197 |
199 typedef typename MatrixMap::ConstReference ConstReference; |
198 typedef typename MatrixMap::ConstReference ConstReference; |
200 typedef typename MatrixMap::Reference Reference; |
199 typedef typename MatrixMap::Reference Reference; |
201 }; |
200 }; |
202 |
201 |
203 // Indicators for the tags |
202 // Indicators for the tags |
204 |
203 |