3 // Copyright (c) 2006-2007 Matias Capeletto
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)
9 /// \file container_adaptor/ordered_associative_container_adaptor.hpp
10 /// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container.
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
19 #include <boost/config.hpp>
21 #include <boost/bimap/container_adaptor/associative_container_adaptor.hpp>
22 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
23 #include <boost/mpl/if.hpp>
24 #include <boost/mpl/vector.hpp>
25 #include <boost/mpl/push_front.hpp>
26 #include <boost/mpl/aux_/na.hpp>
27 #include <boost/operators.hpp>
28 #include <boost/call_traits.hpp>
32 namespace container_adaptor {
34 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
38 class Base, class Iterator, class ConstIterator,
39 class ReverseIterator, class ConstReverseIterator, class KeyType,
40 class IteratorToBaseConverter, class IteratorFromBaseConverter,
41 class ReverseIteratorFromBaseConverter,
42 class ValueToBaseConverter, class ValueFromBaseConverter,
43 class KeyToBaseConverter,
44 class FunctorsFromDerivedClasses
46 struct ordered_associative_container_adaptor_base
48 typedef associative_container_adaptor<
49 Base, Iterator, ConstIterator, KeyType,
50 IteratorToBaseConverter, IteratorFromBaseConverter,
51 ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
53 BOOST_DEDUCED_TYPENAME mpl::push_front<
55 FunctorsFromDerivedClasses,
57 BOOST_DEDUCED_TYPENAME mpl::if_<
58 ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
60 detail::iterator_from_base_identity
62 BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
64 BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
70 ReverseIteratorFromBaseConverter
80 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
82 /// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container.
90 class ReverseIterator,
91 class ConstReverseIterator,
95 class IteratorToBaseConverter = ::boost::mpl::na,
96 class IteratorFromBaseConverter = ::boost::mpl::na,
97 class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
98 class ValueToBaseConverter = ::boost::mpl::na,
99 class ValueFromBaseConverter = ::boost::mpl::na,
100 class KeyToBaseConverter = ::boost::mpl::na,
102 class FunctorsFromDerivedClasses = mpl::vector<>
104 class ordered_associative_container_adaptor :
106 public ordered_associative_container_adaptor_base
108 Base, Iterator, ConstIterator,
109 ReverseIterator, ConstReverseIterator, KeyType,
110 IteratorToBaseConverter, IteratorFromBaseConverter,
111 ReverseIteratorFromBaseConverter,
112 ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
113 FunctorsFromDerivedClasses
117 ::boost::totally_ordered
119 ordered_associative_container_adaptor
121 Base, Iterator, ConstIterator,
122 ReverseIterator, ConstReverseIterator,
123 KeyType, IteratorToBaseConverter, IteratorFromBaseConverter,
124 ReverseIteratorFromBaseConverter,
125 ValueToBaseConverter, ValueFromBaseConverter,
126 KeyToBaseConverter, FunctorsFromDerivedClasses
130 // MetaData -------------------------------------------------------------
132 typedef BOOST_DEDUCED_TYPENAME ordered_associative_container_adaptor_base
134 Base, Iterator, ConstIterator,
135 ReverseIterator, ConstReverseIterator, KeyType,
136 IteratorToBaseConverter, IteratorFromBaseConverter,
137 ReverseIteratorFromBaseConverter,
138 ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
139 FunctorsFromDerivedClasses
145 typedef detail::compatible_comparison_adaptor
147 BOOST_DEDUCED_TYPENAME Base::key_compare,
148 BOOST_DEDUCED_TYPENAME base_::key_type,
149 BOOST_DEDUCED_TYPENAME base_::key_to_base
153 typedef detail::comparison_adaptor
155 BOOST_DEDUCED_TYPENAME Base::value_compare,
156 BOOST_DEDUCED_TYPENAME base_::value_type,
157 BOOST_DEDUCED_TYPENAME base_::value_to_base
161 typedef ReverseIterator reverse_iterator;
162 typedef ConstReverseIterator const_reverse_iterator;
166 typedef BOOST_DEDUCED_TYPENAME mpl::if_<
167 ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
169 detail::iterator_from_base_identity
171 BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
173 BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
174 const_reverse_iterator
179 ReverseIteratorFromBaseConverter
182 >::type reverse_iterator_from_base;
184 // Access -----------------------------------------------------------------
188 explicit ordered_associative_container_adaptor(Base & c)
193 typedef ordered_associative_container_adaptor
194 ordered_associative_container_adaptor_;
196 // Interface --------------------------------------------------------------
200 reverse_iterator rbegin()
202 return this->template functor<
203 reverse_iterator_from_base
204 >() ( this->base().rbegin() );
208 reverse_iterator rend()
210 return this->template functor<
211 reverse_iterator_from_base
212 >() ( this->base().rend() );
215 const_reverse_iterator rbegin() const
217 return this->template functor<
218 reverse_iterator_from_base
219 >() ( this->base().rbegin() );
222 const_reverse_iterator rend() const
224 return this->template functor<
225 reverse_iterator_from_base
226 >() ( this->base().rend() );
229 key_compare key_comp() const
231 typedef BOOST_DEDUCED_TYPENAME base_::key_to_base key_to_base_;
234 this->base().key_comp(),
235 this->template functor<key_to_base_>()
239 value_compare value_comp() const
241 typedef BOOST_DEDUCED_TYPENAME base_::value_to_base value_to_base_;
243 return value_compare(
244 this->base().value_comp(),
245 this->template functor<value_to_base_>()
249 template< class CompatibleKey >
250 BOOST_DEDUCED_TYPENAME base_::iterator lower_bound(const CompatibleKey & k)
252 return this->template functor<
253 BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
254 this->base().lower_bound(
255 this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
260 template< class CompatibleKey >
261 BOOST_DEDUCED_TYPENAME base_::const_iterator lower_bound(const CompatibleKey & k) const
263 return this->template functor<
264 BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
265 this->base().lower_bound(
266 this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
271 template< class CompatibleKey >
272 BOOST_DEDUCED_TYPENAME base_::iterator upper_bound(const CompatibleKey & k)
274 return this->template functor<
275 BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
276 this->base().upper_bound(
277 this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
282 template< class CompatibleKey >
283 BOOST_DEDUCED_TYPENAME base_::const_iterator upper_bound(const CompatibleKey & k) const
285 return this->template functor<
286 BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
287 this->base().upper_bound(
288 this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
293 // Totally ordered implementation
295 bool operator==(const ordered_associative_container_adaptor & c) const
297 return ( this->base() == c.base() );
300 bool operator<(const ordered_associative_container_adaptor & c) const
302 return ( this->base() < c.base() );
307 } // namespace container_adaptor
308 } // namespace bimaps
312 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP