unordered_associative_container_adaptor.hpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. /// \file container_adaptor/unordered_associative_container_adaptor.hpp
  9. /// \brief Container adaptor to build a type that is compliant to the concept of an unordered associative container.
  10. #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
  11. #define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
  12. #if defined(_MSC_VER)
  13. #pragma once
  14. #endif
  15. #include <boost/config.hpp>
  16. #include <boost/bimap/container_adaptor/associative_container_adaptor.hpp>
  17. #include <boost/mpl/if.hpp>
  18. #include <boost/mpl/vector.hpp>
  19. #include <boost/mpl/push_front.hpp>
  20. #include <boost/mpl/aux_/na.hpp>
  21. #include <boost/call_traits.hpp>
  22. namespace boost {
  23. namespace bimaps {
  24. namespace container_adaptor {
  25. #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  26. template
  27. <
  28. class Base, class Iterator, class ConstIterator,
  29. class LocalIterator, class ConstLocalIterator,
  30. class KeyType,
  31. class IteratorToBaseConverter, class IteratorFromBaseConverter,
  32. class LocalIteratorFromBaseConverter,
  33. class ValueToBaseConverter, class ValueFromBaseConverter,
  34. class KeyToBaseConverter,
  35. class FunctorsFromDerivedClasses
  36. >
  37. struct unordered_associative_container_adaptor_base
  38. {
  39. typedef associative_container_adaptor
  40. <
  41. Base, Iterator, ConstIterator, KeyType,
  42. IteratorToBaseConverter, IteratorFromBaseConverter,
  43. ValueToBaseConverter , ValueFromBaseConverter,
  44. KeyToBaseConverter,
  45. BOOST_DEDUCED_TYPENAME mpl::push_front<
  46. FunctorsFromDerivedClasses,
  47. BOOST_DEDUCED_TYPENAME mpl::if_<
  48. ::boost::mpl::is_na<LocalIteratorFromBaseConverter>,
  49. // {
  50. detail::iterator_from_base_identity
  51. <
  52. BOOST_DEDUCED_TYPENAME Base::local_iterator,
  53. LocalIterator,
  54. BOOST_DEDUCED_TYPENAME Base::const_local_iterator,
  55. ConstLocalIterator
  56. >,
  57. // }
  58. // else
  59. // {
  60. LocalIteratorFromBaseConverter
  61. // }
  62. >::type
  63. >::type
  64. > type;
  65. };
  66. #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  67. /// \brief Container adaptor to build a type that is compliant to the concept of an unordered associative container.
  68. template
  69. <
  70. class Base,
  71. class Iterator,
  72. class ConstIterator,
  73. class LocalIterator,
  74. class ConstLocalIterator,
  75. class KeyType,
  76. class IteratorToBaseConverter = ::boost::mpl::na,
  77. class IteratorFromBaseConverter = ::boost::mpl::na,
  78. class LocalIteratorFromBaseConverter = ::boost::mpl::na,
  79. class ValueToBaseConverter = ::boost::mpl::na,
  80. class ValueFromBaseConverter = ::boost::mpl::na,
  81. class KeyToBaseConverter = ::boost::mpl::na,
  82. class FunctorsFromDerivedClasses = mpl::vector<>
  83. >
  84. class unordered_associative_container_adaptor :
  85. public unordered_associative_container_adaptor_base
  86. <
  87. Base, Iterator, ConstIterator,
  88. LocalIterator, ConstLocalIterator,
  89. KeyType,
  90. IteratorToBaseConverter, IteratorFromBaseConverter,
  91. LocalIteratorFromBaseConverter,
  92. ValueToBaseConverter, ValueFromBaseConverter,
  93. KeyToBaseConverter,
  94. FunctorsFromDerivedClasses
  95. >::type
  96. {
  97. typedef BOOST_DEDUCED_TYPENAME unordered_associative_container_adaptor_base
  98. <
  99. Base, Iterator, ConstIterator,
  100. LocalIterator, ConstLocalIterator,
  101. KeyType,
  102. IteratorToBaseConverter, IteratorFromBaseConverter,
  103. LocalIteratorFromBaseConverter,
  104. ValueToBaseConverter, ValueFromBaseConverter,
  105. KeyToBaseConverter,
  106. FunctorsFromDerivedClasses
  107. >::type base_;
  108. // Metadata ---------------------------------------------------------------
  109. public:
  110. typedef BOOST_DEDUCED_TYPENAME Base::key_equal key_equal;
  111. typedef BOOST_DEDUCED_TYPENAME Base::hasher hasher;
  112. typedef LocalIterator local_iterator;
  113. typedef ConstLocalIterator const_local_iterator;
  114. protected:
  115. typedef BOOST_DEDUCED_TYPENAME mpl::if_<
  116. ::boost::mpl::is_na<LocalIteratorFromBaseConverter>,
  117. // {
  118. detail::iterator_from_base_identity
  119. <
  120. BOOST_DEDUCED_TYPENAME Base::local_iterator,
  121. local_iterator,
  122. BOOST_DEDUCED_TYPENAME Base::const_local_iterator,
  123. const_local_iterator
  124. >,
  125. // }
  126. // else
  127. // {
  128. LocalIteratorFromBaseConverter
  129. // }
  130. >::type local_iterator_from_base;
  131. // Access -----------------------------------------------------------------
  132. public:
  133. explicit unordered_associative_container_adaptor(Base & c)
  134. : base_(c) {}
  135. protected:
  136. typedef unordered_associative_container_adaptor
  137. unordered_associative_container_adaptor_;
  138. // Interface --------------------------------------------------------------
  139. public:
  140. // bucket interface:
  141. BOOST_DEDUCED_TYPENAME base_::size_type bucket_count() const
  142. {
  143. return this->base().bucket_count();
  144. }
  145. BOOST_DEDUCED_TYPENAME base_::size_type max_bucket_count() const
  146. {
  147. return this->base().max_bucket_count();
  148. }
  149. BOOST_DEDUCED_TYPENAME base_::size_type bucket_size(
  150. BOOST_DEDUCED_TYPENAME base_::size_type n) const
  151. {
  152. return this->base().bucket_size(n);
  153. }
  154. template< class CompatibleKey >
  155. BOOST_DEDUCED_TYPENAME base_::size_type bucket(
  156. const CompatibleKey & k) const
  157. {
  158. typedef BOOST_DEDUCED_TYPENAME base_::key_to_base key_to_base;
  159. return this->base().bucket(
  160. this->template functor<key_to_base>()(k)
  161. );
  162. }
  163. local_iterator begin(BOOST_DEDUCED_TYPENAME base_::size_type n)
  164. {
  165. return this->template functor<
  166. local_iterator_from_base
  167. >() ( this->base().begin(n) );
  168. }
  169. const_local_iterator begin(BOOST_DEDUCED_TYPENAME base_::size_type n) const
  170. {
  171. return this->template functor<
  172. local_iterator_from_base
  173. >() ( this->base().begin(n) );
  174. }
  175. local_iterator end(BOOST_DEDUCED_TYPENAME base_::size_type n)
  176. {
  177. return this->template functor<
  178. local_iterator_from_base
  179. >() ( this->base().end(n) );
  180. }
  181. const_local_iterator end(BOOST_DEDUCED_TYPENAME base_::size_type n) const
  182. {
  183. return this->template functor<
  184. local_iterator_from_base
  185. >() ( this->base().end(n) );
  186. }
  187. // hash policy
  188. float load_factor() const
  189. {
  190. return this->base().load_factor();
  191. }
  192. float max_load_factor() const
  193. {
  194. return this->base().max_load_factor();
  195. }
  196. void max_load_factor(float z)
  197. {
  198. return this->base().max_load_factor(z);
  199. }
  200. void rehash(BOOST_DEDUCED_TYPENAME base_::size_type n)
  201. {
  202. return this->base().rehash(n);
  203. }
  204. // We have redefined end and begin so we have to manually route the old ones
  205. BOOST_DEDUCED_TYPENAME base_::iterator begin()
  206. {
  207. return base_::container_adaptor_::begin();
  208. }
  209. BOOST_DEDUCED_TYPENAME base_::iterator end()
  210. {
  211. return base_::container_adaptor_::end();
  212. }
  213. BOOST_DEDUCED_TYPENAME base_::const_iterator begin() const
  214. {
  215. return base_::container_adaptor_::begin();
  216. }
  217. BOOST_DEDUCED_TYPENAME base_::const_iterator end() const
  218. {
  219. return base_::container_adaptor_::end();
  220. }
  221. };
  222. } // namespace container_adaptor
  223. } // namespace bimaps
  224. } // namespace boost
  225. #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP