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 container_adaptor/list_map_adaptor.hpp
|
Chris@16
|
10 /// \brief Container adaptor.
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
|
Chris@16
|
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
|
Chris@16
|
14
|
Chris@16
|
15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
|
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/list.hpp>
|
Chris@16
|
22 #include <boost/mpl/push_front.hpp>
|
Chris@16
|
23
|
Chris@16
|
24 #include <boost/bimap/container_adaptor/list_adaptor.hpp>
|
Chris@16
|
25 #include <boost/bimap/container_adaptor/detail/identity_converters.hpp>
|
Chris@16
|
26 #include <boost/bimap/container_adaptor/detail/key_extractor.hpp>
|
Chris@16
|
27 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
|
Chris@16
|
28 #include <boost/mpl/vector.hpp>
|
Chris@16
|
29 #include <boost/mpl/aux_/na.hpp>
|
Chris@16
|
30 #include <boost/mpl/if.hpp>
|
Chris@16
|
31
|
Chris@16
|
32 namespace boost {
|
Chris@16
|
33 namespace bimaps {
|
Chris@16
|
34 namespace container_adaptor {
|
Chris@16
|
35
|
Chris@16
|
36 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
|
Chris@16
|
37
|
Chris@16
|
38 template
|
Chris@16
|
39 <
|
Chris@16
|
40 class Base, class Iterator, class ConstIterator,
|
Chris@16
|
41 class ReverseIterator, class ConstReverseIterator,
|
Chris@16
|
42 class IteratorToBaseConverter, class IteratorFromBaseConverter,
|
Chris@16
|
43 class ReverseIteratorFromBaseConverter,
|
Chris@16
|
44 class ValueToBaseConverter, class ValueFromBaseConverter,
|
Chris@16
|
45 class KeyFromBaseValueConverter,
|
Chris@16
|
46 class FunctorsFromDerivedClasses
|
Chris@16
|
47 >
|
Chris@16
|
48 struct list_map_adaptor_base
|
Chris@16
|
49 {
|
Chris@16
|
50 typedef list_adaptor
|
Chris@16
|
51 <
|
Chris@16
|
52 Base,
|
Chris@16
|
53
|
Chris@16
|
54 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
|
Chris@16
|
55
|
Chris@16
|
56 IteratorToBaseConverter, IteratorFromBaseConverter,
|
Chris@16
|
57
|
Chris@16
|
58 ReverseIteratorFromBaseConverter,
|
Chris@16
|
59
|
Chris@16
|
60 ValueToBaseConverter, ValueFromBaseConverter,
|
Chris@16
|
61
|
Chris@16
|
62 BOOST_DEDUCED_TYPENAME mpl::push_front<
|
Chris@16
|
63
|
Chris@16
|
64 FunctorsFromDerivedClasses,
|
Chris@16
|
65
|
Chris@16
|
66 BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
|
Chris@16
|
67 // {
|
Chris@16
|
68 detail::key_from_pair_extractor
|
Chris@16
|
69 <
|
Chris@16
|
70 BOOST_DEDUCED_TYPENAME Iterator::value_type
|
Chris@16
|
71 >,
|
Chris@16
|
72 // }
|
Chris@16
|
73 // else
|
Chris@16
|
74 // {
|
Chris@16
|
75 KeyFromBaseValueConverter
|
Chris@16
|
76 // }
|
Chris@16
|
77
|
Chris@16
|
78 >::type
|
Chris@16
|
79
|
Chris@16
|
80 >::type
|
Chris@16
|
81
|
Chris@16
|
82 > type;
|
Chris@16
|
83 };
|
Chris@16
|
84
|
Chris@16
|
85 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
|
Chris@16
|
86
|
Chris@16
|
87 /// \brief Container adaptor to easily build a list map container
|
Chris@16
|
88
|
Chris@16
|
89 template
|
Chris@16
|
90 <
|
Chris@16
|
91 class Base,
|
Chris@16
|
92
|
Chris@16
|
93 class Iterator,
|
Chris@16
|
94 class ConstIterator,
|
Chris@16
|
95 class ReverseIterator,
|
Chris@16
|
96 class ConstReverseIterator,
|
Chris@16
|
97
|
Chris@16
|
98 class IteratorToBaseConverter = ::boost::mpl::na,
|
Chris@16
|
99 class IteratorFromBaseConverter = ::boost::mpl::na,
|
Chris@16
|
100 class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
|
Chris@16
|
101 class ValueToBaseConverter = ::boost::mpl::na,
|
Chris@16
|
102 class ValueFromBaseConverter = ::boost::mpl::na,
|
Chris@16
|
103 class KeyFromBaseValueConverter = ::boost::mpl::na,
|
Chris@16
|
104
|
Chris@16
|
105 class FunctorsFromDerivedClasses = mpl::vector<>
|
Chris@16
|
106 >
|
Chris@16
|
107 class list_map_adaptor :
|
Chris@16
|
108
|
Chris@16
|
109 public list_map_adaptor_base
|
Chris@16
|
110 <
|
Chris@16
|
111 Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
|
Chris@16
|
112 IteratorToBaseConverter, IteratorFromBaseConverter,
|
Chris@16
|
113 ReverseIteratorFromBaseConverter,
|
Chris@16
|
114 ValueToBaseConverter, ValueFromBaseConverter,
|
Chris@16
|
115 KeyFromBaseValueConverter,
|
Chris@16
|
116 FunctorsFromDerivedClasses
|
Chris@16
|
117
|
Chris@16
|
118 >::type
|
Chris@16
|
119 {
|
Chris@16
|
120 typedef BOOST_DEDUCED_TYPENAME list_map_adaptor_base
|
Chris@16
|
121 <
|
Chris@16
|
122 Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
|
Chris@16
|
123 IteratorToBaseConverter, IteratorFromBaseConverter,
|
Chris@16
|
124 ReverseIteratorFromBaseConverter,
|
Chris@16
|
125 ValueToBaseConverter, ValueFromBaseConverter,
|
Chris@16
|
126 KeyFromBaseValueConverter,
|
Chris@16
|
127 FunctorsFromDerivedClasses
|
Chris@16
|
128
|
Chris@16
|
129 >::type base_;
|
Chris@16
|
130
|
Chris@16
|
131 // MetaData -------------------------------------------------------------
|
Chris@16
|
132
|
Chris@16
|
133 public:
|
Chris@16
|
134
|
Chris@16
|
135 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type key_type;
|
Chris@16
|
136 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
|
Chris@16
|
137 typedef data_type mapped_type;
|
Chris@16
|
138
|
Chris@16
|
139 protected:
|
Chris@16
|
140
|
Chris@16
|
141 typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
|
Chris@16
|
142 // {
|
Chris@16
|
143 detail::key_from_pair_extractor< BOOST_DEDUCED_TYPENAME Iterator::value_type >,
|
Chris@16
|
144 // }
|
Chris@16
|
145 // else
|
Chris@16
|
146 // {
|
Chris@16
|
147 KeyFromBaseValueConverter
|
Chris@16
|
148 // }
|
Chris@16
|
149
|
Chris@16
|
150 >::type key_from_base_value;
|
Chris@16
|
151
|
Chris@16
|
152 // Access -----------------------------------------------------------------
|
Chris@16
|
153
|
Chris@16
|
154 public:
|
Chris@16
|
155
|
Chris@16
|
156 explicit list_map_adaptor(Base & c) :
|
Chris@16
|
157 base_(c) {}
|
Chris@16
|
158
|
Chris@16
|
159 protected:
|
Chris@16
|
160
|
Chris@16
|
161 typedef list_map_adaptor list_map_adaptor_;
|
Chris@16
|
162
|
Chris@16
|
163 // Functions -------------------------------------------------------------
|
Chris@16
|
164
|
Chris@16
|
165 public:
|
Chris@16
|
166
|
Chris@16
|
167 // The following functions are overwritten in order to work
|
Chris@16
|
168 // with key_type instead of value_type
|
Chris@16
|
169
|
Chris@16
|
170 template< class Predicate >
|
Chris@16
|
171 void remove_if(Predicate pred)
|
Chris@16
|
172 {
|
Chris@16
|
173 this->base().remove_if(
|
Chris@16
|
174 ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
|
Chris@16
|
175 <
|
Chris@16
|
176 Predicate,
|
Chris@16
|
177 BOOST_DEDUCED_TYPENAME Base::value_type,
|
Chris@16
|
178 key_from_base_value
|
Chris@16
|
179
|
Chris@16
|
180 >( pred, this->template functor<key_from_base_value>() )
|
Chris@16
|
181 );
|
Chris@16
|
182 }
|
Chris@16
|
183
|
Chris@16
|
184 void unique()
|
Chris@16
|
185 {
|
Chris@16
|
186 this->base().unique(
|
Chris@16
|
187 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
188 <
|
Chris@16
|
189 std::equal_to<key_type>,
|
Chris@16
|
190 BOOST_DEDUCED_TYPENAME Base::value_type,
|
Chris@16
|
191 key_from_base_value
|
Chris@16
|
192
|
Chris@16
|
193 >(
|
Chris@16
|
194 std::equal_to<key_type>(),
|
Chris@16
|
195 this->template functor<key_from_base_value>()
|
Chris@16
|
196 )
|
Chris@16
|
197 );
|
Chris@16
|
198 }
|
Chris@16
|
199
|
Chris@16
|
200 template< class BinaryPredicate >
|
Chris@16
|
201 void unique(BinaryPredicate binary_pred)
|
Chris@16
|
202 {
|
Chris@16
|
203 this->base().unique(
|
Chris@16
|
204 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
205 <
|
Chris@16
|
206 BinaryPredicate,
|
Chris@16
|
207 BOOST_DEDUCED_TYPENAME Base::value_type,
|
Chris@16
|
208 key_from_base_value
|
Chris@16
|
209
|
Chris@16
|
210 >( binary_pred, this->template functor<key_from_base_value>() )
|
Chris@16
|
211 );
|
Chris@16
|
212 }
|
Chris@16
|
213
|
Chris@16
|
214 void merge(list_map_adaptor & x)
|
Chris@16
|
215 {
|
Chris@16
|
216 this->base().merge(x.base(),
|
Chris@16
|
217 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
218 <
|
Chris@16
|
219 std::less<key_type>,
|
Chris@16
|
220 BOOST_DEDUCED_TYPENAME Base::value_type,
|
Chris@16
|
221 key_from_base_value
|
Chris@16
|
222
|
Chris@16
|
223 >(
|
Chris@16
|
224 std::less<key_type>(),
|
Chris@16
|
225 this->template functor<key_from_base_value>()
|
Chris@16
|
226 )
|
Chris@16
|
227 );
|
Chris@16
|
228 }
|
Chris@16
|
229
|
Chris@16
|
230 template< class Compare >
|
Chris@16
|
231 void merge(list_map_adaptor & x, Compare comp)
|
Chris@16
|
232 {
|
Chris@16
|
233 this->base().merge(x.base(),
|
Chris@16
|
234 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
235 <
|
Chris@16
|
236 Compare,
|
Chris@16
|
237 BOOST_DEDUCED_TYPENAME Base::value_type,
|
Chris@16
|
238 key_from_base_value
|
Chris@16
|
239
|
Chris@16
|
240 >( comp, this->template functor<key_from_base_value>() )
|
Chris@16
|
241 );
|
Chris@16
|
242 }
|
Chris@16
|
243
|
Chris@16
|
244 void sort()
|
Chris@16
|
245 {
|
Chris@16
|
246 this->base().sort(
|
Chris@16
|
247 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
248 <
|
Chris@16
|
249 std::less<key_type>,
|
Chris@16
|
250 BOOST_DEDUCED_TYPENAME Base::value_type,
|
Chris@16
|
251 key_from_base_value
|
Chris@16
|
252
|
Chris@16
|
253 >(
|
Chris@16
|
254 std::less<key_type>(),
|
Chris@16
|
255 this->template functor<key_from_base_value>()
|
Chris@16
|
256 )
|
Chris@16
|
257 );
|
Chris@16
|
258 }
|
Chris@16
|
259
|
Chris@16
|
260 template< class Compare >
|
Chris@16
|
261 void sort(Compare comp)
|
Chris@16
|
262 {
|
Chris@16
|
263 this->base().sort(
|
Chris@16
|
264 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
|
Chris@16
|
265 <
|
Chris@16
|
266 Compare,
|
Chris@16
|
267 BOOST_DEDUCED_TYPENAME Base::value_type,
|
Chris@16
|
268 key_from_base_value
|
Chris@16
|
269
|
Chris@16
|
270 >( comp, this->template functor<key_from_base_value>() )
|
Chris@16
|
271 );
|
Chris@16
|
272 }
|
Chris@16
|
273
|
Chris@16
|
274 };
|
Chris@16
|
275
|
Chris@16
|
276
|
Chris@16
|
277 } // namespace container_adaptor
|
Chris@16
|
278 } // namespace bimaps
|
Chris@16
|
279 } // namespace boost
|
Chris@16
|
280
|
Chris@16
|
281
|
Chris@16
|
282 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
|
Chris@16
|
283
|