list_map_adaptor.hpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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/list_map_adaptor.hpp
  9. /// \brief Container adaptor.
  10. #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
  11. #define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
  12. #if defined(_MSC_VER)
  13. #pragma once
  14. #endif
  15. #include <boost/config.hpp>
  16. #include <boost/mpl/list.hpp>
  17. #include <boost/mpl/push_front.hpp>
  18. #include <boost/bimap/container_adaptor/list_adaptor.hpp>
  19. #include <boost/bimap/container_adaptor/detail/identity_converters.hpp>
  20. #include <boost/bimap/container_adaptor/detail/key_extractor.hpp>
  21. #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
  22. #include <boost/mpl/vector.hpp>
  23. #include <boost/mpl/aux_/na.hpp>
  24. #include <boost/mpl/if.hpp>
  25. namespace boost {
  26. namespace bimaps {
  27. namespace container_adaptor {
  28. #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  29. template
  30. <
  31. class Base, class Iterator, class ConstIterator,
  32. class ReverseIterator, class ConstReverseIterator,
  33. class IteratorToBaseConverter, class IteratorFromBaseConverter,
  34. class ReverseIteratorFromBaseConverter,
  35. class ValueToBaseConverter, class ValueFromBaseConverter,
  36. class KeyFromBaseValueConverter,
  37. class FunctorsFromDerivedClasses
  38. >
  39. struct list_map_adaptor_base
  40. {
  41. typedef list_adaptor
  42. <
  43. Base,
  44. Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
  45. IteratorToBaseConverter, IteratorFromBaseConverter,
  46. ReverseIteratorFromBaseConverter,
  47. ValueToBaseConverter, ValueFromBaseConverter,
  48. BOOST_DEDUCED_TYPENAME mpl::push_front<
  49. FunctorsFromDerivedClasses,
  50. BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
  51. // {
  52. detail::key_from_pair_extractor
  53. <
  54. BOOST_DEDUCED_TYPENAME Iterator::value_type
  55. >,
  56. // }
  57. // else
  58. // {
  59. KeyFromBaseValueConverter
  60. // }
  61. >::type
  62. >::type
  63. > type;
  64. };
  65. #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  66. /// \brief Container adaptor to easily build a list map container
  67. template
  68. <
  69. class Base,
  70. class Iterator,
  71. class ConstIterator,
  72. class ReverseIterator,
  73. class ConstReverseIterator,
  74. class IteratorToBaseConverter = ::boost::mpl::na,
  75. class IteratorFromBaseConverter = ::boost::mpl::na,
  76. class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
  77. class ValueToBaseConverter = ::boost::mpl::na,
  78. class ValueFromBaseConverter = ::boost::mpl::na,
  79. class KeyFromBaseValueConverter = ::boost::mpl::na,
  80. class FunctorsFromDerivedClasses = mpl::vector<>
  81. >
  82. class list_map_adaptor :
  83. public list_map_adaptor_base
  84. <
  85. Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
  86. IteratorToBaseConverter, IteratorFromBaseConverter,
  87. ReverseIteratorFromBaseConverter,
  88. ValueToBaseConverter, ValueFromBaseConverter,
  89. KeyFromBaseValueConverter,
  90. FunctorsFromDerivedClasses
  91. >::type
  92. {
  93. typedef BOOST_DEDUCED_TYPENAME list_map_adaptor_base
  94. <
  95. Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
  96. IteratorToBaseConverter, IteratorFromBaseConverter,
  97. ReverseIteratorFromBaseConverter,
  98. ValueToBaseConverter, ValueFromBaseConverter,
  99. KeyFromBaseValueConverter,
  100. FunctorsFromDerivedClasses
  101. >::type base_;
  102. // MetaData -------------------------------------------------------------
  103. public:
  104. typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type key_type;
  105. typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
  106. typedef data_type mapped_type;
  107. protected:
  108. typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
  109. // {
  110. detail::key_from_pair_extractor< BOOST_DEDUCED_TYPENAME Iterator::value_type >,
  111. // }
  112. // else
  113. // {
  114. KeyFromBaseValueConverter
  115. // }
  116. >::type key_from_base_value;
  117. // Access -----------------------------------------------------------------
  118. public:
  119. explicit list_map_adaptor(Base & c) :
  120. base_(c) {}
  121. protected:
  122. typedef list_map_adaptor list_map_adaptor_;
  123. // Functions -------------------------------------------------------------
  124. public:
  125. // The following functions are overwritten in order to work
  126. // with key_type instead of value_type
  127. template< class Predicate >
  128. void remove_if(Predicate pred)
  129. {
  130. this->base().remove_if(
  131. ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
  132. <
  133. Predicate,
  134. BOOST_DEDUCED_TYPENAME Base::value_type,
  135. key_from_base_value
  136. >( pred, this->template functor<key_from_base_value>() )
  137. );
  138. }
  139. void unique()
  140. {
  141. this->base().unique(
  142. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  143. <
  144. std::equal_to<key_type>,
  145. BOOST_DEDUCED_TYPENAME Base::value_type,
  146. key_from_base_value
  147. >(
  148. std::equal_to<key_type>(),
  149. this->template functor<key_from_base_value>()
  150. )
  151. );
  152. }
  153. template< class BinaryPredicate >
  154. void unique(BinaryPredicate binary_pred)
  155. {
  156. this->base().unique(
  157. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  158. <
  159. BinaryPredicate,
  160. BOOST_DEDUCED_TYPENAME Base::value_type,
  161. key_from_base_value
  162. >( binary_pred, this->template functor<key_from_base_value>() )
  163. );
  164. }
  165. void merge(list_map_adaptor & x)
  166. {
  167. this->base().merge(x.base(),
  168. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  169. <
  170. std::less<key_type>,
  171. BOOST_DEDUCED_TYPENAME Base::value_type,
  172. key_from_base_value
  173. >(
  174. std::less<key_type>(),
  175. this->template functor<key_from_base_value>()
  176. )
  177. );
  178. }
  179. template< class Compare >
  180. void merge(list_map_adaptor & x, Compare comp)
  181. {
  182. this->base().merge(x.base(),
  183. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  184. <
  185. Compare,
  186. BOOST_DEDUCED_TYPENAME Base::value_type,
  187. key_from_base_value
  188. >( comp, this->template functor<key_from_base_value>() )
  189. );
  190. }
  191. void sort()
  192. {
  193. this->base().sort(
  194. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  195. <
  196. std::less<key_type>,
  197. BOOST_DEDUCED_TYPENAME Base::value_type,
  198. key_from_base_value
  199. >(
  200. std::less<key_type>(),
  201. this->template functor<key_from_base_value>()
  202. )
  203. );
  204. }
  205. template< class Compare >
  206. void sort(Compare comp)
  207. {
  208. this->base().sort(
  209. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  210. <
  211. Compare,
  212. BOOST_DEDUCED_TYPENAME Base::value_type,
  213. key_from_base_value
  214. >( comp, this->template functor<key_from_base_value>() )
  215. );
  216. }
  217. };
  218. } // namespace container_adaptor
  219. } // namespace bimaps
  220. } // namespace boost
  221. #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP