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/map_adaptor.hpp
|
Chris@16
|
10 /// \brief Container adaptor to easily build a std::map signature compatible container.
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP
|
Chris@16
|
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_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/bimap/container_adaptor/ordered_associative_container_adaptor.hpp>
|
Chris@16
|
22 #include <boost/mpl/vector.hpp>
|
Chris@16
|
23 #include <boost/mpl/aux_/na.hpp>
|
Chris@16
|
24 #include <boost/call_traits.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 namespace boost {
|
Chris@16
|
27 namespace bimaps {
|
Chris@16
|
28 namespace container_adaptor {
|
Chris@16
|
29
|
Chris@16
|
30 /// \brief Container adaptor to easily build a std::map signature compatible container.
|
Chris@16
|
31
|
Chris@16
|
32 template
|
Chris@16
|
33 <
|
Chris@16
|
34 class Base,
|
Chris@16
|
35
|
Chris@16
|
36 class Iterator,
|
Chris@16
|
37 class ConstIterator,
|
Chris@16
|
38 class ReverseIterator,
|
Chris@16
|
39 class ConstReverseIterator,
|
Chris@16
|
40
|
Chris@16
|
41 class IteratorToBaseConverter = ::boost::mpl::na,
|
Chris@16
|
42 class IteratorFromBaseConverter = ::boost::mpl::na,
|
Chris@16
|
43 class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
|
Chris@16
|
44 class ValueToBaseConverter = ::boost::mpl::na,
|
Chris@16
|
45 class ValueFromBaseConverter = ::boost::mpl::na,
|
Chris@16
|
46 class KeyToBaseConverter = ::boost::mpl::na,
|
Chris@16
|
47
|
Chris@16
|
48 class FunctorsFromDerivedClasses = mpl::vector<>
|
Chris@16
|
49 >
|
Chris@16
|
50 class map_adaptor :
|
Chris@16
|
51
|
Chris@16
|
52 public ::boost::bimaps::container_adaptor::
|
Chris@16
|
53 ordered_associative_container_adaptor
|
Chris@16
|
54 <
|
Chris@16
|
55 Base,
|
Chris@16
|
56 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
|
Chris@16
|
57 BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type,
|
Chris@16
|
58 IteratorToBaseConverter, IteratorFromBaseConverter,
|
Chris@16
|
59 ReverseIteratorFromBaseConverter,
|
Chris@16
|
60 ValueToBaseConverter, ValueFromBaseConverter,
|
Chris@16
|
61 KeyToBaseConverter,
|
Chris@16
|
62 FunctorsFromDerivedClasses
|
Chris@16
|
63 >
|
Chris@16
|
64 {
|
Chris@16
|
65
|
Chris@16
|
66 typedef ::boost::bimaps::container_adaptor::
|
Chris@16
|
67 ordered_associative_container_adaptor
|
Chris@16
|
68 <
|
Chris@16
|
69 Base,
|
Chris@16
|
70 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
|
Chris@16
|
71 BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type,
|
Chris@16
|
72 IteratorToBaseConverter, IteratorFromBaseConverter,
|
Chris@16
|
73 ReverseIteratorFromBaseConverter,
|
Chris@16
|
74 ValueToBaseConverter, ValueFromBaseConverter,
|
Chris@16
|
75 KeyToBaseConverter,
|
Chris@16
|
76 FunctorsFromDerivedClasses
|
Chris@16
|
77
|
Chris@16
|
78 > base_;
|
Chris@16
|
79
|
Chris@16
|
80 // MetaData -------------------------------------------------------------
|
Chris@16
|
81
|
Chris@16
|
82 public:
|
Chris@16
|
83
|
Chris@16
|
84 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
|
Chris@16
|
85 typedef data_type mapped_type;
|
Chris@16
|
86
|
Chris@16
|
87 // Access -----------------------------------------------------------------
|
Chris@16
|
88
|
Chris@16
|
89 public:
|
Chris@16
|
90
|
Chris@16
|
91 explicit map_adaptor(Base & c) :
|
Chris@16
|
92 base_(c) {}
|
Chris@16
|
93
|
Chris@16
|
94 protected:
|
Chris@16
|
95
|
Chris@16
|
96 typedef map_adaptor map_adaptor_;
|
Chris@16
|
97
|
Chris@16
|
98 // Interface --------------------------------------------------------------
|
Chris@16
|
99
|
Chris@16
|
100 public:
|
Chris@16
|
101
|
Chris@16
|
102 template< class CompatibleKey >
|
Chris@16
|
103 data_type& operator[](const CompatibleKey & k)
|
Chris@16
|
104 {
|
Chris@16
|
105 return this->base()
|
Chris@16
|
106 [this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)];
|
Chris@16
|
107 }
|
Chris@16
|
108
|
Chris@16
|
109 template< class CompatibleKey >
|
Chris@16
|
110 data_type& at(const CompatibleKey & k)
|
Chris@16
|
111 {
|
Chris@16
|
112 return this->base().
|
Chris@16
|
113 at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k));
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 template< class CompatibleKey >
|
Chris@16
|
117 const data_type& at(const CompatibleKey & k) const
|
Chris@16
|
118 {
|
Chris@16
|
119 return this->base().
|
Chris@16
|
120 at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k));
|
Chris@16
|
121 }
|
Chris@16
|
122
|
Chris@16
|
123 };
|
Chris@16
|
124
|
Chris@16
|
125
|
Chris@16
|
126 } // namespace container_adaptor
|
Chris@16
|
127 } // namespace bimaps
|
Chris@16
|
128 } // namespace boost
|
Chris@16
|
129
|
Chris@16
|
130
|
Chris@16
|
131 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP
|
Chris@16
|
132
|