ordered_associative_container_adaptor.hpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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/ordered_associative_container_adaptor.hpp
  9. /// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container.
  10. #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
  11. #define BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_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/bimap/container_adaptor/detail/comparison_adaptor.hpp>
  18. #include <boost/mpl/if.hpp>
  19. #include <boost/mpl/vector.hpp>
  20. #include <boost/mpl/push_front.hpp>
  21. #include <boost/mpl/aux_/na.hpp>
  22. #include <boost/operators.hpp>
  23. #include <boost/call_traits.hpp>
  24. namespace boost {
  25. namespace bimaps {
  26. namespace container_adaptor {
  27. #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  28. template
  29. <
  30. class Base, class Iterator, class ConstIterator,
  31. class ReverseIterator, class ConstReverseIterator, class KeyType,
  32. class IteratorToBaseConverter, class IteratorFromBaseConverter,
  33. class ReverseIteratorFromBaseConverter,
  34. class ValueToBaseConverter, class ValueFromBaseConverter,
  35. class KeyToBaseConverter,
  36. class FunctorsFromDerivedClasses
  37. >
  38. struct ordered_associative_container_adaptor_base
  39. {
  40. typedef associative_container_adaptor<
  41. Base, Iterator, ConstIterator, KeyType,
  42. IteratorToBaseConverter, IteratorFromBaseConverter,
  43. ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
  44. BOOST_DEDUCED_TYPENAME mpl::push_front<
  45. FunctorsFromDerivedClasses,
  46. BOOST_DEDUCED_TYPENAME mpl::if_<
  47. ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
  48. // {
  49. detail::iterator_from_base_identity
  50. <
  51. BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
  52. ReverseIterator,
  53. BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
  54. ConstReverseIterator
  55. >,
  56. // }
  57. // else
  58. // {
  59. ReverseIteratorFromBaseConverter
  60. // }
  61. >::type
  62. >::type
  63. > type;
  64. };
  65. #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  66. /// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container.
  67. template
  68. <
  69. class Base,
  70. class Iterator,
  71. class ConstIterator,
  72. class ReverseIterator,
  73. class ConstReverseIterator,
  74. class KeyType,
  75. class IteratorToBaseConverter = ::boost::mpl::na,
  76. class IteratorFromBaseConverter = ::boost::mpl::na,
  77. class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
  78. class ValueToBaseConverter = ::boost::mpl::na,
  79. class ValueFromBaseConverter = ::boost::mpl::na,
  80. class KeyToBaseConverter = ::boost::mpl::na,
  81. class FunctorsFromDerivedClasses = mpl::vector<>
  82. >
  83. class ordered_associative_container_adaptor :
  84. public ordered_associative_container_adaptor_base
  85. <
  86. Base, Iterator, ConstIterator,
  87. ReverseIterator, ConstReverseIterator, KeyType,
  88. IteratorToBaseConverter, IteratorFromBaseConverter,
  89. ReverseIteratorFromBaseConverter,
  90. ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
  91. FunctorsFromDerivedClasses
  92. >::type,
  93. ::boost::totally_ordered
  94. <
  95. ordered_associative_container_adaptor
  96. <
  97. Base, Iterator, ConstIterator,
  98. ReverseIterator, ConstReverseIterator,
  99. KeyType, IteratorToBaseConverter, IteratorFromBaseConverter,
  100. ReverseIteratorFromBaseConverter,
  101. ValueToBaseConverter, ValueFromBaseConverter,
  102. KeyToBaseConverter, FunctorsFromDerivedClasses
  103. >
  104. >
  105. {
  106. // MetaData -------------------------------------------------------------
  107. typedef BOOST_DEDUCED_TYPENAME ordered_associative_container_adaptor_base
  108. <
  109. Base, Iterator, ConstIterator,
  110. ReverseIterator, ConstReverseIterator, KeyType,
  111. IteratorToBaseConverter, IteratorFromBaseConverter,
  112. ReverseIteratorFromBaseConverter,
  113. ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
  114. FunctorsFromDerivedClasses
  115. >::type base_;
  116. public:
  117. typedef detail::compatible_comparison_adaptor
  118. <
  119. BOOST_DEDUCED_TYPENAME Base::key_compare,
  120. BOOST_DEDUCED_TYPENAME base_::key_type,
  121. BOOST_DEDUCED_TYPENAME base_::key_to_base
  122. > key_compare;
  123. typedef detail::comparison_adaptor
  124. <
  125. BOOST_DEDUCED_TYPENAME Base::value_compare,
  126. BOOST_DEDUCED_TYPENAME base_::value_type,
  127. BOOST_DEDUCED_TYPENAME base_::value_to_base
  128. > value_compare;
  129. typedef ReverseIterator reverse_iterator;
  130. typedef ConstReverseIterator const_reverse_iterator;
  131. protected:
  132. typedef BOOST_DEDUCED_TYPENAME mpl::if_<
  133. ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
  134. // {
  135. detail::iterator_from_base_identity
  136. <
  137. BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
  138. reverse_iterator,
  139. BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
  140. const_reverse_iterator
  141. >,
  142. // }
  143. // else
  144. // {
  145. ReverseIteratorFromBaseConverter
  146. // }
  147. >::type reverse_iterator_from_base;
  148. // Access -----------------------------------------------------------------
  149. public:
  150. explicit ordered_associative_container_adaptor(Base & c)
  151. : base_(c) {}
  152. protected:
  153. typedef ordered_associative_container_adaptor
  154. ordered_associative_container_adaptor_;
  155. // Interface --------------------------------------------------------------
  156. public:
  157. reverse_iterator rbegin()
  158. {
  159. return this->template functor<
  160. reverse_iterator_from_base
  161. >() ( this->base().rbegin() );
  162. }
  163. reverse_iterator rend()
  164. {
  165. return this->template functor<
  166. reverse_iterator_from_base
  167. >() ( this->base().rend() );
  168. }
  169. const_reverse_iterator rbegin() const
  170. {
  171. return this->template functor<
  172. reverse_iterator_from_base
  173. >() ( this->base().rbegin() );
  174. }
  175. const_reverse_iterator rend() const
  176. {
  177. return this->template functor<
  178. reverse_iterator_from_base
  179. >() ( this->base().rend() );
  180. }
  181. key_compare key_comp() const
  182. {
  183. typedef BOOST_DEDUCED_TYPENAME base_::key_to_base key_to_base_;
  184. return key_compare(
  185. this->base().key_comp(),
  186. this->template functor<key_to_base_>()
  187. );
  188. }
  189. value_compare value_comp() const
  190. {
  191. typedef BOOST_DEDUCED_TYPENAME base_::value_to_base value_to_base_;
  192. return value_compare(
  193. this->base().value_comp(),
  194. this->template functor<value_to_base_>()
  195. );
  196. }
  197. template< class CompatibleKey >
  198. BOOST_DEDUCED_TYPENAME base_::iterator lower_bound(const CompatibleKey & k)
  199. {
  200. return this->template functor<
  201. BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
  202. this->base().lower_bound(
  203. this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
  204. )
  205. );
  206. }
  207. template< class CompatibleKey >
  208. BOOST_DEDUCED_TYPENAME base_::const_iterator lower_bound(const CompatibleKey & k) const
  209. {
  210. return this->template functor<
  211. BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
  212. this->base().lower_bound(
  213. this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
  214. )
  215. );
  216. }
  217. template< class CompatibleKey >
  218. BOOST_DEDUCED_TYPENAME base_::iterator upper_bound(const CompatibleKey & k)
  219. {
  220. return this->template functor<
  221. BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
  222. this->base().upper_bound(
  223. this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
  224. )
  225. );
  226. }
  227. template< class CompatibleKey >
  228. BOOST_DEDUCED_TYPENAME base_::const_iterator upper_bound(const CompatibleKey & k) const
  229. {
  230. return this->template functor<
  231. BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
  232. this->base().upper_bound(
  233. this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
  234. )
  235. );
  236. }
  237. // Totally ordered implementation
  238. bool operator==(const ordered_associative_container_adaptor & c) const
  239. {
  240. return ( this->base() == c.base() );
  241. }
  242. bool operator<(const ordered_associative_container_adaptor & c) const
  243. {
  244. return ( this->base() < c.base() );
  245. }
  246. };
  247. } // namespace container_adaptor
  248. } // namespace bimaps
  249. } // namespace boost
  250. #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP