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 detail/set_view_base.hpp
|
Chris@16
|
10 /// \brief Helper base for the construction of the bimap views types.
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP
|
Chris@16
|
13 #define BOOST_BIMAP_DETAIL_SET_VIEW_BASE_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/bimap/relation/member_at.hpp>
|
Chris@16
|
22 #include <boost/bimap/relation/support/data_extractor.hpp>
|
Chris@16
|
23 #include <boost/bimap/detail/modifier_adaptor.hpp>
|
Chris@16
|
24 #include <boost/bimap/detail/set_view_iterator.hpp>
|
Chris@16
|
25 #include <boost/bimap/relation/support/get_pair_functor.hpp>
|
Chris@16
|
26 #include <boost/bimap/relation/detail/to_mutable_relation_functor.hpp>
|
Chris@16
|
27 #include <boost/bimap/relation/mutant_relation.hpp>
|
Chris@16
|
28 #include <boost/bimap/container_adaptor/support/iterator_facade_converters.hpp>
|
Chris@16
|
29
|
Chris@16
|
30 namespace boost {
|
Chris@16
|
31 namespace bimaps {
|
Chris@16
|
32 namespace detail {
|
Chris@16
|
33
|
Chris@16
|
34 template< class Key, class Value, class KeyToBase >
|
Chris@16
|
35 class set_view_key_to_base
|
Chris@16
|
36 {
|
Chris@16
|
37 public:
|
Chris@16
|
38 const Key operator()( const Value & v ) const
|
Chris@16
|
39 {
|
Chris@16
|
40 return keyToBase( v );
|
Chris@16
|
41 }
|
Chris@16
|
42 private:
|
Chris@16
|
43 KeyToBase keyToBase;
|
Chris@16
|
44 };
|
Chris@16
|
45
|
Chris@16
|
46 template< class MutantRelationStorage, class KeyToBase >
|
Chris@16
|
47 class set_view_key_to_base<MutantRelationStorage,MutantRelationStorage,KeyToBase>
|
Chris@16
|
48 {
|
Chris@16
|
49 typedef BOOST_DEDUCED_TYPENAME MutantRelationStorage::non_mutable_storage non_mutable_storage;
|
Chris@16
|
50 public:
|
Chris@16
|
51 const MutantRelationStorage & operator()( const non_mutable_storage & k ) const
|
Chris@16
|
52 {
|
Chris@16
|
53 return ::boost::bimaps::relation::detail::mutate<MutantRelationStorage>(k);
|
Chris@16
|
54 }
|
Chris@16
|
55 const MutantRelationStorage & operator()( const MutantRelationStorage & k ) const
|
Chris@16
|
56 {
|
Chris@16
|
57 return k;
|
Chris@16
|
58 }
|
Chris@16
|
59 };
|
Chris@16
|
60
|
Chris@16
|
61
|
Chris@16
|
62 // The next macro can be converted in a metafunctor to gain code robustness.
|
Chris@16
|
63 /*===========================================================================*/
|
Chris@16
|
64 #define BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( \
|
Chris@16
|
65 CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \
|
Chris@16
|
66 ) \
|
Chris@16
|
67 ::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \
|
Chris@16
|
68 < \
|
Chris@16
|
69 CORE_INDEX, \
|
Chris@16
|
70 ::boost::bimaps::detail:: \
|
Chris@16
|
71 set_view_iterator< \
|
Chris@16
|
72 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \
|
Chris@16
|
73 ::boost::bimaps::detail:: \
|
Chris@16
|
74 const_set_view_iterator< \
|
Chris@16
|
75 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \
|
Chris@16
|
76 ::boost::bimaps::detail:: \
|
Chris@16
|
77 set_view_iterator< \
|
Chris@16
|
78 BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \
|
Chris@16
|
79 ::boost::bimaps::detail:: \
|
Chris@16
|
80 const_set_view_iterator< \
|
Chris@16
|
81 BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \
|
Chris@16
|
82 ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \
|
Chris@16
|
83 < \
|
Chris@16
|
84 ::boost::bimaps::detail:: set_view_iterator< \
|
Chris@16
|
85 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \
|
Chris@16
|
86 ::boost::bimaps::detail::const_set_view_iterator< \
|
Chris@16
|
87 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \
|
Chris@16
|
88 \
|
Chris@16
|
89 >, \
|
Chris@16
|
90 ::boost::mpl::na, \
|
Chris@16
|
91 ::boost::mpl::na, \
|
Chris@16
|
92 ::boost::bimaps::relation::detail:: \
|
Chris@16
|
93 get_mutable_relation_functor< \
|
Chris@16
|
94 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \
|
Chris@16
|
95 ::boost::bimaps::relation::support:: \
|
Chris@16
|
96 get_above_view_functor< \
|
Chris@16
|
97 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \
|
Chris@16
|
98 ::boost::bimaps::detail::set_view_key_to_base< \
|
Chris@16
|
99 BOOST_DEDUCED_TYPENAME CORE_INDEX::key_type, \
|
Chris@16
|
100 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type, \
|
Chris@16
|
101 BOOST_DEDUCED_TYPENAME CORE_INDEX::key_from_value \
|
Chris@16
|
102 > \
|
Chris@16
|
103 >
|
Chris@16
|
104 /*===========================================================================*/
|
Chris@16
|
105
|
Chris@16
|
106
|
Chris@16
|
107 /*===========================================================================*/
|
Chris@16
|
108 #define BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( \
|
Chris@16
|
109 CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \
|
Chris@16
|
110 ) \
|
Chris@16
|
111 ::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \
|
Chris@16
|
112 < \
|
Chris@16
|
113 CORE_INDEX, \
|
Chris@16
|
114 ::boost::bimaps::detail:: \
|
Chris@16
|
115 set_view_iterator< \
|
Chris@16
|
116 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \
|
Chris@16
|
117 ::boost::bimaps::detail:: \
|
Chris@16
|
118 const_set_view_iterator< \
|
Chris@16
|
119 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \
|
Chris@16
|
120 ::boost::bimaps::detail:: \
|
Chris@16
|
121 set_view_iterator< \
|
Chris@16
|
122 BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \
|
Chris@16
|
123 ::boost::bimaps::detail:: \
|
Chris@16
|
124 const_set_view_iterator< \
|
Chris@16
|
125 BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \
|
Chris@16
|
126 ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \
|
Chris@16
|
127 < \
|
Chris@16
|
128 ::boost::bimaps::detail:: set_view_iterator< \
|
Chris@16
|
129 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \
|
Chris@16
|
130 ::boost::bimaps::detail::const_set_view_iterator< \
|
Chris@16
|
131 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \
|
Chris@16
|
132 \
|
Chris@16
|
133 >, \
|
Chris@16
|
134 ::boost::mpl::na, \
|
Chris@16
|
135 ::boost::mpl::na, \
|
Chris@16
|
136 ::boost::bimaps::relation::detail:: \
|
Chris@16
|
137 get_mutable_relation_functor< \
|
Chris@16
|
138 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \
|
Chris@16
|
139 ::boost::bimaps::relation::support:: \
|
Chris@16
|
140 get_above_view_functor< \
|
Chris@16
|
141 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type > \
|
Chris@16
|
142 >
|
Chris@16
|
143 /*===========================================================================*/
|
Chris@16
|
144
|
Chris@16
|
145
|
Chris@16
|
146 #if defined(BOOST_MSVC)
|
Chris@16
|
147 /*===========================================================================*/
|
Chris@16
|
148 #define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \
|
Chris@16
|
149 typedef ::boost::bimaps::detail::set_view_base< \
|
Chris@16
|
150 TYPE< INDEX_TYPE >, INDEX_TYPE > template_class_friend; \
|
Chris@16
|
151 friend class template_class_friend;
|
Chris@16
|
152 /*===========================================================================*/
|
Chris@16
|
153 #else
|
Chris@16
|
154 /*===========================================================================*/
|
Chris@16
|
155 #define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \
|
Chris@16
|
156 friend class ::boost::bimaps::detail::set_view_base< \
|
Chris@16
|
157 TYPE< INDEX_TYPE >, INDEX_TYPE >;
|
Chris@16
|
158 /*===========================================================================*/
|
Chris@16
|
159 #endif
|
Chris@16
|
160
|
Chris@16
|
161
|
Chris@16
|
162 /// \brief Common base for set views.
|
Chris@16
|
163
|
Chris@16
|
164 template< class Derived, class Index >
|
Chris@16
|
165 class set_view_base
|
Chris@16
|
166 {
|
Chris@16
|
167 typedef ::boost::bimaps::container_adaptor::support::
|
Chris@16
|
168 iterator_facade_to_base
|
Chris@16
|
169 <
|
Chris@16
|
170 ::boost::bimaps::detail::
|
Chris@16
|
171 set_view_iterator<BOOST_DEDUCED_TYPENAME Index:: iterator>,
|
Chris@16
|
172 ::boost::bimaps::detail::
|
Chris@16
|
173 const_set_view_iterator<BOOST_DEDUCED_TYPENAME Index::const_iterator>
|
Chris@16
|
174
|
Chris@16
|
175 > iterator_to_base_;
|
Chris@16
|
176
|
Chris@16
|
177 typedef BOOST_DEDUCED_TYPENAME Index::value_type::left_value_type left_type_;
|
Chris@16
|
178
|
Chris@16
|
179 typedef BOOST_DEDUCED_TYPENAME Index::value_type::right_value_type right_type_;
|
Chris@16
|
180
|
Chris@16
|
181 typedef BOOST_DEDUCED_TYPENAME Index::value_type value_type_;
|
Chris@16
|
182
|
Chris@16
|
183 typedef ::boost::bimaps::detail::
|
Chris@16
|
184 set_view_iterator<BOOST_DEDUCED_TYPENAME Index::iterator> iterator_;
|
Chris@16
|
185
|
Chris@16
|
186 public:
|
Chris@16
|
187
|
Chris@16
|
188 bool replace(iterator_ position,
|
Chris@16
|
189 const value_type_ & x)
|
Chris@16
|
190 {
|
Chris@16
|
191 return derived().base().replace(
|
Chris@16
|
192 derived().template functor<iterator_to_base_>()(position),x
|
Chris@16
|
193 );
|
Chris@16
|
194 }
|
Chris@16
|
195
|
Chris@16
|
196 template< class CompatibleLeftType >
|
Chris@16
|
197 bool replace_left(iterator_ position,
|
Chris@16
|
198 const CompatibleLeftType & l)
|
Chris@16
|
199 {
|
Chris@16
|
200 return derived().base().replace(
|
Chris@16
|
201 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
202 ::boost::bimaps::relation::detail::copy_with_left_replaced(*position,l)
|
Chris@16
|
203 );
|
Chris@16
|
204 }
|
Chris@16
|
205
|
Chris@16
|
206 template< class CompatibleRightType >
|
Chris@16
|
207 bool replace_right(iterator_ position,
|
Chris@16
|
208 const CompatibleRightType & r)
|
Chris@16
|
209 {
|
Chris@16
|
210 return derived().base().replace(
|
Chris@16
|
211 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
212 ::boost::bimaps::relation::detail::copy_with_right_replaced(*position,r)
|
Chris@16
|
213 );
|
Chris@16
|
214 }
|
Chris@16
|
215
|
Chris@16
|
216 /* This function may be provided in the future
|
Chris@16
|
217
|
Chris@16
|
218 template< class Modifier >
|
Chris@16
|
219 bool modify(iterator_ position,
|
Chris@16
|
220 Modifier mod)
|
Chris@16
|
221 {
|
Chris@16
|
222 return derived().base().modify(
|
Chris@16
|
223
|
Chris@16
|
224 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
225
|
Chris@16
|
226 ::boost::bimaps::detail::relation_modifier_adaptor
|
Chris@16
|
227 <
|
Chris@16
|
228 Modifier,
|
Chris@16
|
229 BOOST_DEDUCED_TYPENAME Index::value_type,
|
Chris@16
|
230 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
231 data_extractor
|
Chris@16
|
232 <
|
Chris@16
|
233 ::boost::bimaps::relation::member_at::left,
|
Chris@16
|
234 BOOST_DEDUCED_TYPENAME Index::value_type
|
Chris@16
|
235
|
Chris@16
|
236 >::type,
|
Chris@16
|
237 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
238 data_extractor
|
Chris@16
|
239 <
|
Chris@16
|
240 ::boost::bimaps::relation::member_at::right,
|
Chris@16
|
241 BOOST_DEDUCED_TYPENAME Index::value_type
|
Chris@16
|
242
|
Chris@16
|
243 >::type
|
Chris@16
|
244
|
Chris@16
|
245 >(mod)
|
Chris@16
|
246 );
|
Chris@16
|
247 }
|
Chris@16
|
248 */
|
Chris@16
|
249 /*
|
Chris@16
|
250 template< class Modifier >
|
Chris@16
|
251 bool modify_left(iterator_ position, Modifier mod)
|
Chris@16
|
252 {
|
Chris@16
|
253 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
254 data_extractor
|
Chris@16
|
255 <
|
Chris@16
|
256 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right,
|
Chris@16
|
257 BOOST_DEDUCED_TYPENAME Index::value_type
|
Chris@16
|
258
|
Chris@16
|
259 >::type left_data_extractor_;
|
Chris@16
|
260
|
Chris@16
|
261 return derived().base().modify(
|
Chris@16
|
262
|
Chris@16
|
263 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
264
|
Chris@16
|
265 // this may be replaced later by
|
Chris@16
|
266 // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) )
|
Chris@16
|
267
|
Chris@16
|
268 ::boost::bimaps::detail::unary_modifier_adaptor
|
Chris@16
|
269 <
|
Chris@16
|
270 Modifier,
|
Chris@16
|
271 BOOST_DEDUCED_TYPENAME Index::value_type,
|
Chris@16
|
272 left_data_extractor_
|
Chris@16
|
273
|
Chris@16
|
274 >(mod)
|
Chris@16
|
275 );
|
Chris@16
|
276 }
|
Chris@16
|
277
|
Chris@16
|
278 template< class Modifier >
|
Chris@16
|
279 bool modify_right(iterator_ position, Modifier mod)
|
Chris@16
|
280 {
|
Chris@16
|
281 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
|
Chris@16
|
282 data_extractor
|
Chris@16
|
283 <
|
Chris@16
|
284 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right,
|
Chris@16
|
285 BOOST_DEDUCED_TYPENAME Index::value_type
|
Chris@16
|
286
|
Chris@16
|
287 >::type right_data_extractor_;
|
Chris@16
|
288
|
Chris@16
|
289 return derived().base().modify(
|
Chris@16
|
290
|
Chris@16
|
291 derived().template functor<iterator_to_base_>()(position),
|
Chris@16
|
292
|
Chris@16
|
293 // this may be replaced later by
|
Chris@16
|
294 // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) )
|
Chris@16
|
295
|
Chris@16
|
296 ::boost::bimaps::detail::unary_modifier_adaptor
|
Chris@16
|
297 <
|
Chris@16
|
298 Modifier,
|
Chris@16
|
299 BOOST_DEDUCED_TYPENAME Index::value_type,
|
Chris@16
|
300 right_data_extractor_
|
Chris@16
|
301
|
Chris@16
|
302 >(mod)
|
Chris@16
|
303 );
|
Chris@16
|
304 }
|
Chris@16
|
305 */
|
Chris@16
|
306 protected:
|
Chris@16
|
307
|
Chris@16
|
308 typedef set_view_base set_view_base_;
|
Chris@16
|
309
|
Chris@16
|
310 private:
|
Chris@16
|
311
|
Chris@16
|
312 // Curiously Recurring Template interface.
|
Chris@16
|
313
|
Chris@16
|
314 Derived& derived()
|
Chris@16
|
315 {
|
Chris@16
|
316 return *static_cast<Derived*>(this);
|
Chris@16
|
317 }
|
Chris@16
|
318
|
Chris@16
|
319 Derived const& derived() const
|
Chris@16
|
320 {
|
Chris@16
|
321 return *static_cast<Derived const*>(this);
|
Chris@16
|
322 }
|
Chris@16
|
323 };
|
Chris@16
|
324
|
Chris@16
|
325
|
Chris@16
|
326
|
Chris@16
|
327 } // namespace detail
|
Chris@16
|
328 } // namespace bimaps
|
Chris@16
|
329 } // namespace boost
|
Chris@16
|
330
|
Chris@16
|
331 #endif // BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP
|