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/unordered_associative_container_adaptor.hpp
10 /// \brief Container adaptor to build a type that is compliant to the concept of an unordered associative container.
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_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/mpl/if.hpp>
23 #include <boost/mpl/vector.hpp>
24 #include <boost/mpl/push_front.hpp>
25 #include <boost/mpl/aux_/na.hpp>
26 #include <boost/call_traits.hpp>
30 namespace container_adaptor {
33 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
37 class Base, class Iterator, class ConstIterator,
38 class LocalIterator, class ConstLocalIterator,
40 class IteratorToBaseConverter, class IteratorFromBaseConverter,
41 class LocalIteratorFromBaseConverter,
42 class ValueToBaseConverter, class ValueFromBaseConverter,
43 class KeyToBaseConverter,
44 class FunctorsFromDerivedClasses
46 struct unordered_associative_container_adaptor_base
49 typedef associative_container_adaptor
51 Base, Iterator, ConstIterator, KeyType,
52 IteratorToBaseConverter, IteratorFromBaseConverter,
53 ValueToBaseConverter , ValueFromBaseConverter,
56 BOOST_DEDUCED_TYPENAME mpl::push_front<
58 FunctorsFromDerivedClasses,
60 BOOST_DEDUCED_TYPENAME mpl::if_<
61 ::boost::mpl::is_na<LocalIteratorFromBaseConverter>,
63 detail::iterator_from_base_identity
65 BOOST_DEDUCED_TYPENAME Base::local_iterator,
67 BOOST_DEDUCED_TYPENAME Base::const_local_iterator,
73 LocalIteratorFromBaseConverter
83 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
86 /// \brief Container adaptor to build a type that is compliant to the concept of an unordered associative container.
96 class ConstLocalIterator,
100 class IteratorToBaseConverter = ::boost::mpl::na,
101 class IteratorFromBaseConverter = ::boost::mpl::na,
102 class LocalIteratorFromBaseConverter = ::boost::mpl::na,
103 class ValueToBaseConverter = ::boost::mpl::na,
104 class ValueFromBaseConverter = ::boost::mpl::na,
105 class KeyToBaseConverter = ::boost::mpl::na,
107 class FunctorsFromDerivedClasses = mpl::vector<>
110 class unordered_associative_container_adaptor :
112 public unordered_associative_container_adaptor_base
114 Base, Iterator, ConstIterator,
115 LocalIterator, ConstLocalIterator,
117 IteratorToBaseConverter, IteratorFromBaseConverter,
118 LocalIteratorFromBaseConverter,
119 ValueToBaseConverter, ValueFromBaseConverter,
121 FunctorsFromDerivedClasses
125 typedef BOOST_DEDUCED_TYPENAME unordered_associative_container_adaptor_base
127 Base, Iterator, ConstIterator,
128 LocalIterator, ConstLocalIterator,
130 IteratorToBaseConverter, IteratorFromBaseConverter,
131 LocalIteratorFromBaseConverter,
132 ValueToBaseConverter, ValueFromBaseConverter,
134 FunctorsFromDerivedClasses
138 // Metadata ---------------------------------------------------------------
142 typedef BOOST_DEDUCED_TYPENAME Base::key_equal key_equal;
143 typedef BOOST_DEDUCED_TYPENAME Base::hasher hasher;
145 typedef LocalIterator local_iterator;
146 typedef ConstLocalIterator const_local_iterator;
150 typedef BOOST_DEDUCED_TYPENAME mpl::if_<
151 ::boost::mpl::is_na<LocalIteratorFromBaseConverter>,
153 detail::iterator_from_base_identity
155 BOOST_DEDUCED_TYPENAME Base::local_iterator,
157 BOOST_DEDUCED_TYPENAME Base::const_local_iterator,
163 LocalIteratorFromBaseConverter
166 >::type local_iterator_from_base;
168 // Access -----------------------------------------------------------------
172 explicit unordered_associative_container_adaptor(Base & c)
178 typedef unordered_associative_container_adaptor
179 unordered_associative_container_adaptor_;
181 // Interface --------------------------------------------------------------
187 BOOST_DEDUCED_TYPENAME base_::size_type bucket_count() const
189 return this->base().bucket_count();
192 BOOST_DEDUCED_TYPENAME base_::size_type max_bucket_count() const
194 return this->base().max_bucket_count();
197 BOOST_DEDUCED_TYPENAME base_::size_type bucket_size(
198 BOOST_DEDUCED_TYPENAME base_::size_type n) const
200 return this->base().bucket_size(n);
203 template< class CompatibleKey >
204 BOOST_DEDUCED_TYPENAME base_::size_type bucket(
205 const CompatibleKey & k) const
207 typedef BOOST_DEDUCED_TYPENAME base_::key_to_base key_to_base;
208 return this->base().bucket(
209 this->template functor<key_to_base>()(k)
213 local_iterator begin(BOOST_DEDUCED_TYPENAME base_::size_type n)
215 return this->template functor<
216 local_iterator_from_base
217 >() ( this->base().begin(n) );
220 const_local_iterator begin(BOOST_DEDUCED_TYPENAME base_::size_type n) const
222 return this->template functor<
223 local_iterator_from_base
224 >() ( this->base().begin(n) );
227 local_iterator end(BOOST_DEDUCED_TYPENAME base_::size_type n)
229 return this->template functor<
230 local_iterator_from_base
231 >() ( this->base().end(n) );
234 const_local_iterator end(BOOST_DEDUCED_TYPENAME base_::size_type n) const
236 return this->template functor<
237 local_iterator_from_base
238 >() ( this->base().end(n) );
243 float load_factor() const
245 return this->base().load_factor();
248 float max_load_factor() const
250 return this->base().max_load_factor();
253 void max_load_factor(float z)
255 return this->base().max_load_factor(z);
258 void rehash(BOOST_DEDUCED_TYPENAME base_::size_type n)
260 return this->base().rehash(n);
263 // We have redefined end and begin so we have to manually route the old ones
265 BOOST_DEDUCED_TYPENAME base_::iterator begin()
267 return base_::container_adaptor_::begin();
270 BOOST_DEDUCED_TYPENAME base_::iterator end()
272 return base_::container_adaptor_::end();
275 BOOST_DEDUCED_TYPENAME base_::const_iterator begin() const
277 return base_::container_adaptor_::begin();
280 BOOST_DEDUCED_TYPENAME base_::const_iterator end() const
282 return base_::container_adaptor_::end();
288 } // namespace container_adaptor
289 } // namespace bimaps
293 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP