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/list_map_adaptor.hpp
10 /// \brief Container adaptor.
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
19 #include <boost/config.hpp>
21 #include <boost/mpl/list.hpp>
22 #include <boost/mpl/push_front.hpp>
24 #include <boost/bimap/container_adaptor/list_adaptor.hpp>
25 #include <boost/bimap/container_adaptor/detail/identity_converters.hpp>
26 #include <boost/bimap/container_adaptor/detail/key_extractor.hpp>
27 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
28 #include <boost/mpl/vector.hpp>
29 #include <boost/mpl/aux_/na.hpp>
30 #include <boost/mpl/if.hpp>
34 namespace container_adaptor {
36 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
40 class Base, class Iterator, class ConstIterator,
41 class ReverseIterator, class ConstReverseIterator,
42 class IteratorToBaseConverter, class IteratorFromBaseConverter,
43 class ReverseIteratorFromBaseConverter,
44 class ValueToBaseConverter, class ValueFromBaseConverter,
45 class KeyFromBaseValueConverter,
46 class FunctorsFromDerivedClasses
48 struct list_map_adaptor_base
54 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
56 IteratorToBaseConverter, IteratorFromBaseConverter,
58 ReverseIteratorFromBaseConverter,
60 ValueToBaseConverter, ValueFromBaseConverter,
62 BOOST_DEDUCED_TYPENAME mpl::push_front<
64 FunctorsFromDerivedClasses,
66 BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
68 detail::key_from_pair_extractor
70 BOOST_DEDUCED_TYPENAME Iterator::value_type
75 KeyFromBaseValueConverter
85 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
87 /// \brief Container adaptor to easily build a list map container
95 class ReverseIterator,
96 class ConstReverseIterator,
98 class IteratorToBaseConverter = ::boost::mpl::na,
99 class IteratorFromBaseConverter = ::boost::mpl::na,
100 class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
101 class ValueToBaseConverter = ::boost::mpl::na,
102 class ValueFromBaseConverter = ::boost::mpl::na,
103 class KeyFromBaseValueConverter = ::boost::mpl::na,
105 class FunctorsFromDerivedClasses = mpl::vector<>
107 class list_map_adaptor :
109 public list_map_adaptor_base
111 Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
112 IteratorToBaseConverter, IteratorFromBaseConverter,
113 ReverseIteratorFromBaseConverter,
114 ValueToBaseConverter, ValueFromBaseConverter,
115 KeyFromBaseValueConverter,
116 FunctorsFromDerivedClasses
120 typedef BOOST_DEDUCED_TYPENAME list_map_adaptor_base
122 Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
123 IteratorToBaseConverter, IteratorFromBaseConverter,
124 ReverseIteratorFromBaseConverter,
125 ValueToBaseConverter, ValueFromBaseConverter,
126 KeyFromBaseValueConverter,
127 FunctorsFromDerivedClasses
131 // MetaData -------------------------------------------------------------
135 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type key_type;
136 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
137 typedef data_type mapped_type;
141 typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
143 detail::key_from_pair_extractor< BOOST_DEDUCED_TYPENAME Iterator::value_type >,
147 KeyFromBaseValueConverter
150 >::type key_from_base_value;
152 // Access -----------------------------------------------------------------
156 explicit list_map_adaptor(Base & c) :
161 typedef list_map_adaptor list_map_adaptor_;
163 // Functions -------------------------------------------------------------
167 // The following functions are overwritten in order to work
168 // with key_type instead of value_type
170 template< class Predicate >
171 void remove_if(Predicate pred)
173 this->base().remove_if(
174 ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
177 BOOST_DEDUCED_TYPENAME Base::value_type,
180 >( pred, this->template functor<key_from_base_value>() )
187 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
189 std::equal_to<key_type>,
190 BOOST_DEDUCED_TYPENAME Base::value_type,
194 std::equal_to<key_type>(),
195 this->template functor<key_from_base_value>()
200 template< class BinaryPredicate >
201 void unique(BinaryPredicate binary_pred)
204 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
207 BOOST_DEDUCED_TYPENAME Base::value_type,
210 >( binary_pred, this->template functor<key_from_base_value>() )
214 void merge(list_map_adaptor & x)
216 this->base().merge(x.base(),
217 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
220 BOOST_DEDUCED_TYPENAME Base::value_type,
224 std::less<key_type>(),
225 this->template functor<key_from_base_value>()
230 template< class Compare >
231 void merge(list_map_adaptor & x, Compare comp)
233 this->base().merge(x.base(),
234 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
237 BOOST_DEDUCED_TYPENAME Base::value_type,
240 >( comp, this->template functor<key_from_base_value>() )
247 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
250 BOOST_DEDUCED_TYPENAME Base::value_type,
254 std::less<key_type>(),
255 this->template functor<key_from_base_value>()
260 template< class Compare >
261 void sort(Compare comp)
264 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
267 BOOST_DEDUCED_TYPENAME Base::value_type,
270 >( comp, this->template functor<key_from_base_value>() )
277 } // namespace container_adaptor
278 } // namespace bimaps
282 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP