comparison DEPENDENCIES/generic/include/boost/bimap/bimap.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 // Boost.Bimap
2 //
3 // Copyright (c) 2006-2007 Matias Capeletto
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8
9 /// \file bimap.hpp
10 /// \brief Includes the basic bimap container
11
12 /** \mainpage notitle
13 \n
14 \image html http://matias.capeletto.googlepages.com/boost.bimap.reference.logo.png
15
16 \section Introduction
17
18 This is the complete reference of Boost.Bimap.
19
20 After getting a good understanding of the library from a user perspective
21 the next step will be:
22
23 - Understand the tagged idiom. (boost::bimaps::tags)
24 - Understand the internals of the relation class (boost::bimaps::relation)
25 - Read the container_adaptor toolbox docs (boost::bimaps::container_adaptor)
26 - Understand the internals of the bimap class. (boost::bimaps, boost::bimaps::views
27 and boost::bimaps::detail)
28
29
30 **/
31
32 /** \defgroup mutant_group mutant idiom
33 \brief A safe wrapper around reinterpret_cast
34 **/
35
36 /** \defgroup relation_group relation
37 \brief The relation
38 **/
39
40 /** \defgroup tags_group tagged idiom
41 \brief The tagged idiom
42 **/
43
44
45 #ifndef BOOST_BIMAP_BIMAP_HPP
46 #define BOOST_BIMAP_BIMAP_HPP
47
48 #if defined(_MSC_VER) && (_MSC_VER>=1200)
49 #pragma once
50 #endif
51
52 #include <boost/config.hpp>
53 #include <boost/bimap/detail/user_interface_config.hpp>
54 #include <boost/mpl/aux_/na.hpp>
55
56 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
57 #include <boost/serialization/nvp.hpp>
58 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
59
60 // Boost.Bimap
61 #include <boost/bimap/detail/bimap_core.hpp>
62 #include <boost/bimap/detail/map_view_base.hpp>
63 #include <boost/bimap/detail/modifier_adaptor.hpp>
64 #include <boost/bimap/relation/support/data_extractor.hpp>
65 #include <boost/bimap/relation/support/member_with_tag.hpp>
66
67 #include <boost/bimap/support/map_type_by.hpp>
68 #include <boost/bimap/support/map_by.hpp>
69 #include <boost/bimap/support/iterator_type_by.hpp>
70
71 /// \brief The namespace where all the boost libraries lives.
72
73 namespace boost {
74
75 /// \brief Boost.Bimap library namespace
76 /**
77 All the entities in the library are defined in this namespace.
78 **/
79 namespace bimaps {
80
81 /// \brief The bimap class is the entry point to the library.
82 /**
83 This class manages the instantiation of the desired bimap type.
84 As there are several types of bidirectional maps that can be
85 created using it. the main job of it is to find the desired
86 type. This is done using metaprogramming to obtain the relation
87 type that will be stored, the map_view type of each side and
88 the set_view type of the general relationship. The instantiation
89 is kept simple using an extended standard set theory, where a
90 bidirectional map type is defined by the set types it relates.
91 For example, a bidirectional map that has multimap semantics
92 viewed from both sides is defined by specifying that the two
93 keys sets are of \c multiset_of<Key> type.
94 This allows the bimap class to support seamingless N-N, 1-N,
95 ordered/unordered and even vector-list types of mapping.
96 The three last parameters are used to specify the set type of
97 the relation, an inplace hooked data class and the allocator
98 type. As a help to the bimap user, these parameters support
99 default types but use a special idiom that allow them to be
100 specified without interleaving the usual use_default keyword.
101 The possible bimap instantiation are enumerated here:
102 \c {Side}KeyType can be directly a type, this is default to
103 \c set_of<{Side}KeyType>, or can be a \c {SetType}_of<Type>
104 specification. Additionally this two parameters can be tagged
105 to specify others tags instead of the usual \c member_at::{Side}
106 ones.
107
108
109 \code
110
111 typedef bimap
112 <
113 LeftCollectionType, RightCollectionType
114
115 [ , SetTypeOfRelation ] // Default to left_based
116 [ , info_hook< Info > ] // Default to no info
117 [ , Allocator ] // Default to std::allocator<>
118
119 > bm;
120
121 \endcode
122
123 **/
124
125
126 template
127 <
128 class KeyTypeA, class KeyTypeB,
129 class AP1 = ::boost::mpl::na,
130 class AP2 = ::boost::mpl::na,
131 class AP3 = ::boost::mpl::na
132 >
133 class bimap
134 :
135 // Bimap Core, use mpl magic to find the desired bimap type
136
137 public ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3>,
138
139 // You can use bimap as a collection of relations
140
141 public ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3>
142 ::relation_set,
143
144 // Include extra typedefs (i.e. left_local_iterator for unordered_map)
145
146 public ::boost::bimaps::detail:: left_map_view_extra_typedefs<
147 BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail::left_map_view_type<
148 ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3>
149 >::type
150 >,
151 public ::boost::bimaps::detail::right_map_view_extra_typedefs<
152 BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail::right_map_view_type<
153 ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3>
154 >::type
155 >
156 {
157 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail::
158 bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3> base_;
159
160 BOOST_DEDUCED_TYPENAME base_::core_type core;
161
162 public:
163
164 // metadata --------------------------------------------------------
165
166 /*
167 // The rest is computed in the core, because it is quite difficult to
168 // expose a nice interface with so many metaprogramming stuff.
169
170 // Map by {side} metadata
171
172 typedef -unspecified- {side}_tag;
173 typedef -unspecified- {side}_data_type;
174 typedef -unspecified- {side}_value_type;
175 typedef -unspecified- {side}_key_type;
176
177 // There are other typedefs for definitions of different map views
178
179 ------------------------------------------------------------------*/
180
181 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail::
182 left_map_view_type<base_>::type left_map;
183 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail::
184 right_map_view_type<base_>::type right_map;
185
186 typedef BOOST_DEDUCED_TYPENAME
187 left_map::iterator left_iterator;
188 typedef BOOST_DEDUCED_TYPENAME
189 left_map::const_iterator left_const_iterator;
190
191 typedef BOOST_DEDUCED_TYPENAME
192 right_map::iterator right_iterator;
193 typedef BOOST_DEDUCED_TYPENAME
194 right_map::const_iterator right_const_iterator;
195
196 typedef BOOST_DEDUCED_TYPENAME
197 left_map::reference left_reference;
198 typedef BOOST_DEDUCED_TYPENAME
199 left_map::const_reference left_const_reference;
200
201 typedef BOOST_DEDUCED_TYPENAME
202 right_map::reference right_reference;
203 typedef BOOST_DEDUCED_TYPENAME
204 right_map::const_reference right_const_reference;
205
206 typedef BOOST_DEDUCED_TYPENAME base_::relation::info_type info_type;
207
208 typedef BOOST_DEDUCED_TYPENAME base_::core_type::allocator_type allocator_type;
209
210 /// Left map view
211 left_map left;
212
213 /// Right map view
214 right_map right;
215
216 typedef BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag
217 logic_relation_set_tag;
218 typedef BOOST_DEDUCED_TYPENAME base_::logic_left_tag logic_left_tag;
219 typedef BOOST_DEDUCED_TYPENAME base_::logic_right_tag logic_right_tag;
220 typedef BOOST_DEDUCED_TYPENAME base_::core_type::ctor_args_list
221 ctor_args_list;
222
223 bimap(const allocator_type& al = allocator_type()) :
224
225 base_::relation_set(
226 ::boost::multi_index::get<
227 logic_relation_set_tag
228 >(core)
229 ),
230
231 core(al),
232
233 left (
234 ::boost::multi_index::get<
235 logic_left_tag
236 >(core)
237 ),
238 right (
239 ::boost::multi_index::get<
240 logic_right_tag
241 >(core)
242 )
243
244 {}
245
246 template< class InputIterator >
247 bimap(InputIterator first,InputIterator last,
248 const allocator_type& al = allocator_type()) :
249
250 base_::relation_set(
251 ::boost::multi_index::get<
252 BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(core)
253 ),
254
255 core(first,last,ctor_args_list(),al),
256
257 left (
258 ::boost::multi_index::get<
259 BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(core)
260 ),
261 right (
262 ::boost::multi_index::get<
263 BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(core)
264 )
265
266 {}
267
268 bimap(const bimap& x) :
269
270 base_::relation_set(
271 ::boost::multi_index::get<
272 BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(core)
273 ),
274
275 core(x.core),
276
277 left (
278 ::boost::multi_index::get<
279 BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(core)
280 ),
281 right (
282 ::boost::multi_index::get<
283 BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(core)
284 )
285
286 {}
287
288 bimap& operator=(const bimap& x)
289 {
290 core = x.core;
291 return *this;
292 }
293
294 // Projection of iterators
295
296 template< class IteratorType >
297 left_iterator project_left(IteratorType iter)
298 {
299 return core.template project<
300 BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(iter.base());
301 }
302
303 template< class IteratorType >
304 left_const_iterator project_left(IteratorType iter) const
305 {
306 return core.template project<
307 BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(iter.base());
308 }
309
310 template< class IteratorType >
311 right_iterator project_right(IteratorType iter)
312 {
313 return core.template project<
314 BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(iter.base());
315 }
316
317 template< class IteratorType >
318 right_const_iterator project_right(IteratorType iter) const
319 {
320 return core.template project<
321 BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(iter.base());
322 }
323
324 template< class IteratorType >
325 BOOST_DEDUCED_TYPENAME base_::relation_set::iterator
326 project_up(IteratorType iter)
327 {
328 return core.template project<
329 BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(iter.base());
330 }
331
332 template< class IteratorType >
333 BOOST_DEDUCED_TYPENAME base_::relation_set::const_iterator
334 project_up(IteratorType iter) const
335 {
336 return core.template project<
337 BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(iter.base());
338 }
339
340 // Support for tags
341
342 template< class Tag, class IteratorType >
343 BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
344 iterator_type_by<Tag,bimap>::type
345 project(IteratorType iter
346 BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(Tag))
347 {
348 return core.template project<Tag>(iter.base());
349 }
350
351 template< class Tag, class IteratorType >
352 BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
353 const_iterator_type_by<Tag,bimap>::type
354 project(IteratorType iter
355 BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(Tag)) const
356 {
357 return core.template project<Tag>(iter.base());
358 }
359
360 template< class Tag >
361 struct map_by :
362 public ::boost::bimaps::support::map_type_by<Tag,bimap>::type
363 {
364 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
365 map_type_by<Tag,bimap>::type type;
366
367 private: map_by() {}
368 };
369
370 template< class Tag >
371 BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
372 map_type_by<Tag,bimap>::type &
373 by(BOOST_EXPLICIT_TEMPLATE_TYPE(Tag))
374 {
375 return ::boost::bimaps::support::map_by<Tag>(*this);
376 }
377
378 template< class Tag >
379 const BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::
380 map_type_by<Tag,bimap>::type &
381 by(BOOST_EXPLICIT_TEMPLATE_TYPE(Tag)) const
382 {
383 return ::boost::bimaps::support::map_by<Tag>(*this);
384 }
385
386
387 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
388
389 // Serialization support
390
391 private:
392
393 friend class boost::serialization::access;
394
395 template<class Archive>
396 void serialize(Archive & ar, const unsigned int)
397 {
398 ar & serialization::make_nvp("mi_core",core);
399 }
400
401 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
402 };
403
404 } // namespace bimaps
405 } // namespace boost
406
407
408 /** \namespace boost::bimaps::support
409 \brief Metafunctions to help working with bimaps.
410 **/
411
412 /** \namespace boost::bimaps::views
413 \brief Bimap views.
414 **/
415
416 /** \namespace boost::bimaps::views::detail
417 \brief Bimap views details.
418 **/
419
420
421
422 // Include basic tools for user commodity
423
424 #include <boost/bimap/tags/tagged.hpp>
425 #include <boost/bimap/relation/member_at.hpp>
426 #include <boost/multi_index/detail/unbounded.hpp>
427
428 // Bring the most used namespaces directly to the user main namespace
429 namespace boost {
430 namespace bimaps {
431
432 using ::boost::bimaps::tags::tagged;
433
434 namespace member_at = ::boost::bimaps::relation::member_at;
435
436 using ::boost::multi_index::unbounded;
437
438 } // namespace bimaps
439 } // namespace boost
440
441
442 #endif // BOOST_BIMAP_BIMAP_HPP