Chris@16
|
1 // Boost.Bimap
|
Chris@16
|
2 //
|
Chris@16
|
3 // Copyright (c) 2006-2007 Matias Capeletto
|
Chris@16
|
4 //
|
Chris@16
|
5 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
6 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8
|
Chris@16
|
9 /// \file relation/mutant_relation.hpp
|
Chris@16
|
10 /// \brief Defines the mutant_relation class
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_BIMAP_RELATION_MUTANT_RELATION_HPP
|
Chris@16
|
13 #define BOOST_BIMAP_RELATION_MUTANT_RELATION_HPP
|
Chris@16
|
14
|
Chris@101
|
15 #if defined(_MSC_VER)
|
Chris@16
|
16 #pragma once
|
Chris@16
|
17 #endif
|
Chris@16
|
18
|
Chris@16
|
19 #include <boost/config.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 #include <boost/mpl/vector.hpp>
|
Chris@16
|
22 #include <boost/operators.hpp>
|
Chris@16
|
23 #include <boost/call_traits.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
26 #include <boost/serialization/nvp.hpp>
|
Chris@16
|
27 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
28
|
Chris@16
|
29 #include <boost/functional/hash/hash.hpp>
|
Chris@16
|
30
|
Chris@16
|
31 #include <boost/mpl/aux_/na.hpp>
|
Chris@16
|
32
|
Chris@16
|
33 // Boost.Bimap
|
Chris@16
|
34 #include <boost/bimap/tags/tagged.hpp>
|
Chris@16
|
35 #include <boost/bimap/tags/support/default_tagged.hpp>
|
Chris@16
|
36 #include <boost/bimap/tags/support/tag_of.hpp>
|
Chris@16
|
37 #include <boost/bimap/tags/support/value_type_of.hpp>
|
Chris@16
|
38
|
Chris@16
|
39 #include <boost/bimap/relation/member_at.hpp>
|
Chris@16
|
40 #include <boost/bimap/relation/detail/mutant.hpp>
|
Chris@16
|
41 #include <boost/bimap/relation/structured_pair.hpp>
|
Chris@16
|
42 #include <boost/bimap/relation/symmetrical_base.hpp>
|
Chris@16
|
43 #include <boost/bimap/relation/support/get.hpp>
|
Chris@16
|
44
|
Chris@16
|
45 namespace boost {
|
Chris@16
|
46 namespace bimaps {
|
Chris@16
|
47 namespace relation {
|
Chris@16
|
48
|
Chris@16
|
49 namespace detail {
|
Chris@16
|
50
|
Chris@16
|
51 // This class is included so structured_pair and mutant_relation share
|
Chris@16
|
52 // exactly the same class layout
|
Chris@16
|
53
|
Chris@16
|
54 template< class LeftType, class RightType, bool force_mutable >
|
Chris@16
|
55 class relation_storage :
|
Chris@16
|
56 public symmetrical_base<LeftType,RightType,force_mutable>
|
Chris@16
|
57 {
|
Chris@16
|
58 typedef symmetrical_base<LeftType,RightType,force_mutable> base_;
|
Chris@16
|
59
|
Chris@16
|
60 typedef relation_storage storage_;
|
Chris@16
|
61
|
Chris@16
|
62 public:
|
Chris@16
|
63
|
Chris@16
|
64 typedef relation_storage<LeftType,RightType,false> non_mutable_storage;
|
Chris@16
|
65
|
Chris@16
|
66 typedef ::boost::mpl::vector2
|
Chris@16
|
67 <
|
Chris@16
|
68 relation_storage< LeftType, RightType, true >,
|
Chris@16
|
69 relation_storage< LeftType, RightType, false >
|
Chris@16
|
70
|
Chris@16
|
71 > mutant_views;
|
Chris@16
|
72
|
Chris@16
|
73 //@{
|
Chris@16
|
74 /// data
|
Chris@16
|
75 BOOST_DEDUCED_TYPENAME base_::left_value_type left;
|
Chris@16
|
76 BOOST_DEDUCED_TYPENAME base_::right_value_type right;
|
Chris@16
|
77 //@}
|
Chris@16
|
78
|
Chris@16
|
79 relation_storage() {}
|
Chris@16
|
80
|
Chris@16
|
81 relation_storage(BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
82 BOOST_DEDUCED_TYPENAME base_::left_value_type
|
Chris@16
|
83 >::param_type l,
|
Chris@16
|
84 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
85 BOOST_DEDUCED_TYPENAME base_::right_value_type
|
Chris@16
|
86 >::param_type r)
|
Chris@16
|
87
|
Chris@16
|
88 : left(l), right(r) {}
|
Chris@16
|
89
|
Chris@16
|
90 BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left() { return left; }
|
Chris@16
|
91 const BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left()const { return left; }
|
Chris@16
|
92 BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right() { return right; }
|
Chris@16
|
93 const BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right()const { return right; }
|
Chris@16
|
94 };
|
Chris@16
|
95
|
Chris@16
|
96
|
Chris@16
|
97
|
Chris@16
|
98 template< class TA, class TB, class Info, bool force_mutable >
|
Chris@16
|
99 class relation_info_hook : public
|
Chris@16
|
100 ::boost::bimaps::relation::detail::relation_storage<TA,TB,force_mutable>
|
Chris@16
|
101 {
|
Chris@16
|
102 typedef ::boost::bimaps::relation::detail::
|
Chris@16
|
103 relation_storage<TA,TB,force_mutable> base_;
|
Chris@16
|
104
|
Chris@16
|
105 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support::
|
Chris@16
|
106 default_tagged<Info,member_at::info>::type tagged_info_type;
|
Chris@16
|
107
|
Chris@16
|
108 public:
|
Chris@16
|
109 typedef BOOST_DEDUCED_TYPENAME tagged_info_type::value_type info_type;
|
Chris@16
|
110 typedef BOOST_DEDUCED_TYPENAME tagged_info_type::tag info_tag;
|
Chris@16
|
111
|
Chris@16
|
112 info_type info;
|
Chris@16
|
113
|
Chris@16
|
114 protected:
|
Chris@16
|
115
|
Chris@16
|
116 relation_info_hook() {}
|
Chris@16
|
117
|
Chris@16
|
118 relation_info_hook( BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
119 BOOST_DEDUCED_TYPENAME base_::left_value_type
|
Chris@16
|
120 >::param_type l,
|
Chris@16
|
121 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
122 BOOST_DEDUCED_TYPENAME base_::right_value_type
|
Chris@16
|
123 >::param_type r,
|
Chris@16
|
124 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
125 info_type
|
Chris@16
|
126 >::param_type i = info_type() )
|
Chris@16
|
127
|
Chris@16
|
128 : base_(l,r), info(i) {}
|
Chris@16
|
129
|
Chris@16
|
130 template< class Relation >
|
Chris@16
|
131 relation_info_hook( const Relation & rel ) :
|
Chris@16
|
132 base_(rel.left,rel.right),
|
Chris@16
|
133 info(rel.info) {}
|
Chris@16
|
134
|
Chris@16
|
135 template< class Relation >
|
Chris@16
|
136 void change_to( const Relation & rel )
|
Chris@16
|
137 {
|
Chris@16
|
138 base_::left = rel.left ;
|
Chris@16
|
139 base_::right = rel.right;
|
Chris@16
|
140 info = rel.info ;
|
Chris@16
|
141 }
|
Chris@16
|
142
|
Chris@16
|
143 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
144 template< class Archive >
|
Chris@16
|
145 void serialize(Archive & ar, const unsigned int)
|
Chris@16
|
146 {
|
Chris@16
|
147 ar & ::boost::serialization::make_nvp("left" , base_::left );
|
Chris@16
|
148 ar & ::boost::serialization::make_nvp("right", base_::right);
|
Chris@16
|
149 ar & ::boost::serialization::make_nvp("info" , info );
|
Chris@16
|
150 }
|
Chris@16
|
151 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
152 };
|
Chris@16
|
153
|
Chris@16
|
154 template< class TA, class TB, bool force_mutable>
|
Chris@16
|
155 class relation_info_hook<TA,TB,::boost::mpl::na,force_mutable> :
|
Chris@16
|
156 public ::boost::bimaps::relation::detail::relation_storage<TA,TB,force_mutable>
|
Chris@16
|
157 {
|
Chris@16
|
158 typedef ::boost::bimaps::relation::detail::
|
Chris@16
|
159 relation_storage<TA,TB,force_mutable> base_;
|
Chris@16
|
160
|
Chris@16
|
161 public:
|
Chris@16
|
162 typedef ::boost::mpl::na info_type;
|
Chris@16
|
163 typedef member_at::info info_tag;
|
Chris@16
|
164
|
Chris@16
|
165 protected:
|
Chris@16
|
166
|
Chris@16
|
167 relation_info_hook() {}
|
Chris@16
|
168
|
Chris@16
|
169 relation_info_hook( BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
170 BOOST_DEDUCED_TYPENAME base_::left_value_type
|
Chris@16
|
171 >::param_type l,
|
Chris@16
|
172 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
173 BOOST_DEDUCED_TYPENAME base_::right_value_type
|
Chris@16
|
174 >::param_type r)
|
Chris@16
|
175
|
Chris@16
|
176 : base_(l,r) {}
|
Chris@16
|
177
|
Chris@16
|
178 template< class Relation >
|
Chris@16
|
179 relation_info_hook( const Relation & rel ) :
|
Chris@16
|
180 base_(rel.left,rel.right) {}
|
Chris@16
|
181
|
Chris@16
|
182 template< class Relation >
|
Chris@16
|
183 void change_to( const Relation & rel )
|
Chris@16
|
184 {
|
Chris@16
|
185 base_::left = rel.left ;
|
Chris@16
|
186 base_::right = rel.right;
|
Chris@16
|
187 }
|
Chris@16
|
188
|
Chris@16
|
189 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
190 template< class Archive >
|
Chris@16
|
191 void serialize(Archive & ar, const unsigned int)
|
Chris@16
|
192 {
|
Chris@16
|
193 ar & ::boost::serialization::make_nvp("left" , base_::left );
|
Chris@16
|
194 ar & ::boost::serialization::make_nvp("right", base_::right);
|
Chris@16
|
195 }
|
Chris@16
|
196 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
197 };
|
Chris@16
|
198
|
Chris@16
|
199
|
Chris@16
|
200 } // namespace detail
|
Chris@16
|
201
|
Chris@16
|
202 /// \brief Abstraction of a related pair of values, that extends the std::pair class.
|
Chris@16
|
203 /**
|
Chris@16
|
204 The mutant_relation is a mutant class. A mutant class can mutate
|
Chris@16
|
205 with zero overhead in other classes that are called views.
|
Chris@16
|
206 Each view has to be StorageCompatible with the base class
|
Chris@16
|
207 of the mutant. Note that all the views have the following
|
Chris@16
|
208 storage structure:
|
Chris@16
|
209
|
Chris@16
|
210 \verbatim
|
Chris@16
|
211 __________
|
Chris@16
|
212 | |
|
Chris@16
|
213 | TA |
|
Chris@16
|
214 |__________|
|
Chris@16
|
215 | |
|
Chris@16
|
216 | TB |
|
Chris@16
|
217 |__________|
|
Chris@16
|
218
|
Chris@16
|
219 \endverbatim
|
Chris@16
|
220
|
Chris@16
|
221 See also select_relation, standard_relation.
|
Chris@16
|
222 \ingroup relation_group
|
Chris@16
|
223 **/
|
Chris@16
|
224
|
Chris@16
|
225
|
Chris@16
|
226 template< class TA, class TB, class Info = ::boost::mpl::na, bool force_mutable = false >
|
Chris@16
|
227 class mutant_relation : public
|
Chris@16
|
228 ::boost::bimaps::relation::detail::
|
Chris@16
|
229 relation_info_hook<TA,TB,Info,force_mutable>
|
Chris@16
|
230 {
|
Chris@16
|
231 typedef ::boost::bimaps::relation::detail::
|
Chris@16
|
232 relation_info_hook<TA,TB,Info,force_mutable> base_;
|
Chris@16
|
233
|
Chris@16
|
234 public:
|
Chris@16
|
235
|
Chris@16
|
236 // We have to know the type of the base where the types are
|
Chris@16
|
237 // defined because Boost.MultiIndex requires it.
|
Chris@16
|
238
|
Chris@16
|
239 typedef ::boost::bimaps::relation::detail::
|
Chris@16
|
240 relation_storage<TA,TB,force_mutable> storage_base;
|
Chris@16
|
241
|
Chris@16
|
242 /// Above view, non mutable view of the relation
|
Chris@16
|
243
|
Chris@16
|
244 typedef mutant_relation<TA,TB,Info,false> above_view;
|
Chris@16
|
245
|
Chris@16
|
246 //@{
|
Chris@16
|
247 /// A signature compatible std::pair that is a view of the relation.
|
Chris@16
|
248
|
Chris@16
|
249 typedef structured_pair< TA, TB, Info, normal_layout > left_pair;
|
Chris@16
|
250 typedef structured_pair< TB, TA, Info, mirror_layout > right_pair;
|
Chris@16
|
251 //@}
|
Chris@16
|
252
|
Chris@16
|
253 typedef ::boost::mpl::vector4
|
Chris@16
|
254 <
|
Chris@16
|
255 left_pair,
|
Chris@16
|
256 right_pair,
|
Chris@16
|
257
|
Chris@16
|
258 mutant_relation< TA, TB, Info, true >,
|
Chris@16
|
259 mutant_relation< TA, TB, Info, false >
|
Chris@16
|
260
|
Chris@16
|
261 > mutant_views;
|
Chris@16
|
262
|
Chris@16
|
263 mutant_relation() {}
|
Chris@16
|
264
|
Chris@16
|
265 mutant_relation(BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
266 BOOST_DEDUCED_TYPENAME base_:: left_value_type
|
Chris@16
|
267 >::param_type l,
|
Chris@16
|
268 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
269 BOOST_DEDUCED_TYPENAME base_::right_value_type
|
Chris@16
|
270 >::param_type r) :
|
Chris@16
|
271 base_(l,r) {}
|
Chris@16
|
272
|
Chris@16
|
273 mutant_relation(BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
274 BOOST_DEDUCED_TYPENAME base_:: left_value_type
|
Chris@16
|
275 >::param_type l,
|
Chris@16
|
276 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
277 BOOST_DEDUCED_TYPENAME base_::right_value_type
|
Chris@16
|
278 >::param_type r,
|
Chris@16
|
279 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
|
Chris@16
|
280 BOOST_DEDUCED_TYPENAME base_::info_type
|
Chris@16
|
281 >::param_type i) :
|
Chris@16
|
282 base_(l,r,i) {}
|
Chris@16
|
283
|
Chris@16
|
284 mutant_relation(const mutant_relation<TA,TB,Info,false> & rel) :
|
Chris@16
|
285 base_(rel) {}
|
Chris@16
|
286
|
Chris@16
|
287 mutant_relation(const mutant_relation<TA,TB,Info,true> & rel) :
|
Chris@16
|
288 base_(rel) {}
|
Chris@16
|
289
|
Chris@16
|
290 // Operators
|
Chris@16
|
291
|
Chris@16
|
292 template< bool FM >
|
Chris@16
|
293 mutant_relation& operator=(const mutant_relation<TA,TB,Info,FM> & rel)
|
Chris@16
|
294 {
|
Chris@16
|
295 base_::change_to(rel);
|
Chris@16
|
296 return *this;
|
Chris@16
|
297 }
|
Chris@16
|
298
|
Chris@16
|
299 // The following functions are redundant if you only consider this class.
|
Chris@16
|
300 // They are included to make easier the construction of the get and the
|
Chris@16
|
301 // pair_by metafunction. Remember that not all compiler supports the mutant
|
Chris@16
|
302 // idiom.
|
Chris@16
|
303
|
Chris@16
|
304 left_pair & get_left_pair()
|
Chris@16
|
305 {
|
Chris@16
|
306 return ::boost::bimaps::relation::detail::mutate<left_pair>(*this);
|
Chris@16
|
307 }
|
Chris@16
|
308
|
Chris@16
|
309 const left_pair & get_left_pair() const
|
Chris@16
|
310 {
|
Chris@16
|
311 return ::boost::bimaps::relation::detail::mutate<left_pair>(*this);
|
Chris@16
|
312 }
|
Chris@16
|
313
|
Chris@16
|
314 right_pair & get_right_pair()
|
Chris@16
|
315 {
|
Chris@16
|
316 return ::boost::bimaps::relation::detail::mutate<right_pair>(*this);
|
Chris@16
|
317 }
|
Chris@16
|
318
|
Chris@16
|
319 const right_pair & get_right_pair() const
|
Chris@16
|
320 {
|
Chris@16
|
321 return ::boost::bimaps::relation::detail::mutate<right_pair>(*this);
|
Chris@16
|
322 }
|
Chris@16
|
323
|
Chris@16
|
324 above_view & get_view()
|
Chris@16
|
325 {
|
Chris@16
|
326 return ::boost::bimaps::relation::detail::mutate<above_view>(*this);
|
Chris@16
|
327 }
|
Chris@16
|
328
|
Chris@16
|
329 const above_view & get_view() const
|
Chris@16
|
330 {
|
Chris@16
|
331 return ::boost::bimaps::relation::detail::mutate<above_view>(*this);
|
Chris@16
|
332 }
|
Chris@16
|
333
|
Chris@16
|
334 template< class Tag >
|
Chris@16
|
335 const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
336 result_of::get<Tag,const mutant_relation>::type
|
Chris@101
|
337 get() const
|
Chris@16
|
338 {
|
Chris@16
|
339 return ::boost::bimaps::relation::support::get<Tag>(*this);
|
Chris@16
|
340 }
|
Chris@16
|
341
|
Chris@16
|
342 template< class Tag >
|
Chris@16
|
343 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
344 result_of::get<Tag,mutant_relation>::type
|
Chris@101
|
345 get()
|
Chris@16
|
346 {
|
Chris@16
|
347 return ::boost::bimaps::relation::support::get<Tag>(*this);
|
Chris@16
|
348 }
|
Chris@16
|
349
|
Chris@16
|
350 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
351
|
Chris@16
|
352 private:
|
Chris@16
|
353 friend class ::boost::serialization::access;
|
Chris@16
|
354
|
Chris@16
|
355 template<class Archive>
|
Chris@16
|
356 void serialize(Archive & ar, const unsigned int version)
|
Chris@16
|
357 {
|
Chris@16
|
358 base_::serialize(ar,version);
|
Chris@16
|
359 }
|
Chris@16
|
360
|
Chris@16
|
361 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
|
Chris@16
|
362 };
|
Chris@16
|
363
|
Chris@16
|
364 // hash value
|
Chris@16
|
365
|
Chris@16
|
366 template< class FirstType, class SecondType, bool FM >
|
Chris@16
|
367 std::size_t hash_value(const detail::relation_storage<FirstType,SecondType,FM> & r)
|
Chris@16
|
368 {
|
Chris@16
|
369 std::size_t seed = 0;
|
Chris@16
|
370 ::boost::hash_combine(seed, r. left );
|
Chris@16
|
371 ::boost::hash_combine(seed, r.right );
|
Chris@16
|
372
|
Chris@16
|
373 return seed;
|
Chris@16
|
374 }
|
Chris@16
|
375
|
Chris@16
|
376 // mutant_relation - mutant_relation
|
Chris@16
|
377
|
Chris@16
|
378 template< class FirstType, class SecondType, bool FM1, bool FM2 >
|
Chris@16
|
379 bool operator==(const detail::relation_storage<FirstType,SecondType,FM1> & a,
|
Chris@16
|
380 const detail::relation_storage<FirstType,SecondType,FM2> & b)
|
Chris@16
|
381 {
|
Chris@16
|
382 return ( ( a.left == b.left ) &&
|
Chris@16
|
383 ( a.right == b.right ) );
|
Chris@16
|
384 }
|
Chris@16
|
385
|
Chris@16
|
386 template< class FirstType, class SecondType, bool FM1, bool FM2 >
|
Chris@16
|
387 bool operator!=(const detail::relation_storage<FirstType,SecondType,FM1> & a,
|
Chris@16
|
388 const detail::relation_storage<FirstType,SecondType,FM2> & b)
|
Chris@16
|
389 {
|
Chris@16
|
390 return ! ( a == b );
|
Chris@16
|
391 }
|
Chris@16
|
392
|
Chris@16
|
393 template< class FirstType, class SecondType, bool FM1, bool FM2 >
|
Chris@16
|
394 bool operator<(const detail::relation_storage<FirstType,SecondType,FM1> & a,
|
Chris@16
|
395 const detail::relation_storage<FirstType,SecondType,FM2> & b)
|
Chris@16
|
396 {
|
Chris@16
|
397 return ( ( a.left < b.left ) ||
|
Chris@16
|
398 (( a.left == b.left ) && ( a.right < b.right )));
|
Chris@16
|
399 }
|
Chris@16
|
400
|
Chris@16
|
401 template< class FirstType, class SecondType, bool FM1, bool FM2 >
|
Chris@16
|
402 bool operator<=(const detail::relation_storage<FirstType,SecondType,FM1> & a,
|
Chris@16
|
403 const detail::relation_storage<FirstType,SecondType,FM2> & b)
|
Chris@16
|
404 {
|
Chris@16
|
405 return ( ( a.left < b.left ) ||
|
Chris@16
|
406 (( a.left == b.left ) && ( a.right <= b.right )));
|
Chris@16
|
407 }
|
Chris@16
|
408
|
Chris@16
|
409 template< class FirstType, class SecondType, bool FM1, bool FM2 >
|
Chris@16
|
410 bool operator>(const detail::relation_storage<FirstType,SecondType,FM1> & a,
|
Chris@16
|
411 const detail::relation_storage<FirstType,SecondType,FM2> & b)
|
Chris@16
|
412 {
|
Chris@16
|
413 return ( ( a.left > b.left ) ||
|
Chris@16
|
414 (( a.left == b.left ) && ( a.right > b.right )));
|
Chris@16
|
415 }
|
Chris@16
|
416
|
Chris@16
|
417 template< class FirstType, class SecondType, bool FM1, bool FM2 >
|
Chris@16
|
418 bool operator>=(const detail::relation_storage<FirstType,SecondType,FM1> & a,
|
Chris@16
|
419 const detail::relation_storage<FirstType,SecondType,FM2> & b)
|
Chris@16
|
420 {
|
Chris@16
|
421 return ( ( a.left > b.left ) ||
|
Chris@16
|
422 (( a.left == b.left ) && ( a.right >= b.right )));
|
Chris@16
|
423 }
|
Chris@16
|
424
|
Chris@16
|
425 namespace detail {
|
Chris@16
|
426
|
Chris@16
|
427 template< class TA, class TB, class Info, bool force_mutable>
|
Chris@16
|
428 mutant_relation<TA,TB,Info,force_mutable>
|
Chris@16
|
429 copy_with_left_replaced(mutant_relation<TA,TB,Info,force_mutable> const& rel,
|
Chris@16
|
430 BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME
|
Chris@16
|
431 mutant_relation<TA,TB,Info,force_mutable>::left_value_type>
|
Chris@16
|
432 ::param_type l)
|
Chris@16
|
433 {
|
Chris@16
|
434 return mutant_relation<TA,TB,Info,force_mutable>(l,rel.right,rel.info);
|
Chris@16
|
435 }
|
Chris@16
|
436
|
Chris@16
|
437 template< class TA, class TB, bool force_mutable>
|
Chris@16
|
438 mutant_relation<TA,TB,::boost::mpl::na,force_mutable>
|
Chris@16
|
439 copy_with_left_replaced(mutant_relation<TA,TB,::boost::mpl::na,force_mutable> const& rel,
|
Chris@16
|
440 BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME
|
Chris@16
|
441 mutant_relation<TA,TB,::boost::mpl::na,force_mutable>::left_value_type>
|
Chris@16
|
442 ::param_type l)
|
Chris@16
|
443 {
|
Chris@16
|
444 return mutant_relation<TA,TB,::boost::mpl::na,force_mutable>(l,rel.right);
|
Chris@16
|
445 }
|
Chris@16
|
446
|
Chris@16
|
447 template< class TA, class TB, class Info, bool force_mutable>
|
Chris@16
|
448 mutant_relation<TA,TB,Info,force_mutable>
|
Chris@16
|
449 copy_with_right_replaced(mutant_relation<TA,TB,Info,force_mutable> const& rel,
|
Chris@16
|
450 BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME
|
Chris@16
|
451 mutant_relation<TA,TB,Info,force_mutable>::right_value_type>
|
Chris@16
|
452 ::param_type r)
|
Chris@16
|
453 {
|
Chris@16
|
454 return mutant_relation<TA,TB,Info,force_mutable>(rel.left,r,rel.info);
|
Chris@16
|
455 }
|
Chris@16
|
456
|
Chris@16
|
457 template< class TA, class TB, bool force_mutable>
|
Chris@16
|
458 mutant_relation<TA,TB,::boost::mpl::na,force_mutable>
|
Chris@16
|
459 copy_with_right_replaced(mutant_relation<TA,TB,::boost::mpl::na,force_mutable> const& rel,
|
Chris@16
|
460 BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME
|
Chris@16
|
461 mutant_relation<TA,TB,::boost::mpl::na,force_mutable>::right_value_type>
|
Chris@16
|
462 ::param_type r)
|
Chris@16
|
463 {
|
Chris@16
|
464 return mutant_relation<TA,TB,::boost::mpl::na,force_mutable>(rel.left,r);
|
Chris@16
|
465 }
|
Chris@16
|
466
|
Chris@16
|
467 } // namespace detail
|
Chris@16
|
468
|
Chris@16
|
469 } // namespace relation
|
Chris@16
|
470 } // namespace bimaps
|
Chris@16
|
471 } // namespace boost
|
Chris@16
|
472
|
Chris@16
|
473
|
Chris@16
|
474 #endif // BOOST_BIMAP_RELATION_MUTANT_RELATION_HPP
|
Chris@16
|
475
|
Chris@16
|
476
|
Chris@16
|
477
|