list_adaptor.hpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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_adaptor.hpp
  9. /// \brief Container adaptor to easily build a std::list signature compatible container.
  10. #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_ADAPTOR_HPP
  11. #define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_ADAPTOR_HPP
  12. #if defined(_MSC_VER)
  13. #pragma once
  14. #endif
  15. #include <boost/config.hpp>
  16. #include <boost/bimap/container_adaptor/sequence_container_adaptor.hpp>
  17. #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
  18. #include <boost/mpl/aux_/na.hpp>
  19. #include <boost/mpl/vector.hpp>
  20. #include <boost/call_traits.hpp>
  21. #include <functional>
  22. namespace boost {
  23. namespace bimaps {
  24. namespace container_adaptor {
  25. /// \brief Container adaptor to easily build a std::list signature compatible container.
  26. template
  27. <
  28. class Base,
  29. class Iterator,
  30. class ConstIterator,
  31. class ReverseIterator,
  32. class ConstReverseIterator,
  33. class IteratorToBaseConverter = ::boost::mpl::na,
  34. class IteratorFromBaseConverter = ::boost::mpl::na,
  35. class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
  36. class ValueToBaseConverter = ::boost::mpl::na,
  37. class ValueFromBaseConverter = ::boost::mpl::na,
  38. class FunctorsFromDerivedClasses = mpl::vector<>
  39. >
  40. class list_adaptor :
  41. public ::boost::bimaps::container_adaptor::sequence_container_adaptor
  42. <
  43. Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
  44. IteratorToBaseConverter, IteratorFromBaseConverter,
  45. ReverseIteratorFromBaseConverter,
  46. ValueToBaseConverter, ValueFromBaseConverter,
  47. FunctorsFromDerivedClasses
  48. >
  49. {
  50. typedef ::boost::bimaps::container_adaptor::sequence_container_adaptor
  51. <
  52. Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
  53. IteratorToBaseConverter, IteratorFromBaseConverter,
  54. ReverseIteratorFromBaseConverter,
  55. ValueToBaseConverter, ValueFromBaseConverter,
  56. FunctorsFromDerivedClasses
  57. > base_;
  58. // Access -----------------------------------------------------------------
  59. public:
  60. explicit list_adaptor(Base & c) :
  61. base_(c) {}
  62. protected:
  63. typedef list_adaptor list_adaptor_;
  64. // Interface -------------------------------------------------------------
  65. public:
  66. void splice(Iterator position, list_adaptor & x)
  67. {
  68. this->base().splice(
  69. this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()
  70. (position),
  71. x.base()
  72. );
  73. }
  74. void splice(Iterator position, list_adaptor & x, Iterator i)
  75. {
  76. this->base().splice(
  77. this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()
  78. (position),
  79. x.base(),
  80. this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i)
  81. );
  82. }
  83. void splice(Iterator position, list_adaptor & x,
  84. Iterator first, Iterator last)
  85. {
  86. this->base().splice(
  87. this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()
  88. (position),
  89. x.base(),
  90. this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first),
  91. this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last)
  92. );
  93. }
  94. void remove(
  95. BOOST_DEDUCED_TYPENAME ::boost::call_traits<
  96. BOOST_DEDUCED_TYPENAME base_::value_type
  97. >::param_type value
  98. )
  99. {
  100. this->base().remove(
  101. this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value)
  102. );
  103. }
  104. template< class Predicate >
  105. void remove_if(Predicate pred)
  106. {
  107. this->base().remove_if(
  108. ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
  109. <
  110. Predicate,
  111. BOOST_DEDUCED_TYPENAME Base::value_type,
  112. BOOST_DEDUCED_TYPENAME base_::value_from_base
  113. >( pred, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
  114. );
  115. }
  116. void unique()
  117. {
  118. this->base().unique(
  119. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  120. <
  121. std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>,
  122. BOOST_DEDUCED_TYPENAME Base::value_type,
  123. BOOST_DEDUCED_TYPENAME base_::value_from_base
  124. >(
  125. std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>(),
  126. this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()
  127. )
  128. );
  129. }
  130. template< class BinaryPredicate >
  131. void unique(BinaryPredicate binary_pred)
  132. {
  133. this->base().unique(
  134. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  135. <
  136. BinaryPredicate,
  137. BOOST_DEDUCED_TYPENAME Base::value_type,
  138. BOOST_DEDUCED_TYPENAME base_::value_from_base
  139. >( binary_pred,
  140. this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
  141. );
  142. }
  143. void merge(list_adaptor & x)
  144. {
  145. this->base().merge(x.base(),
  146. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  147. <
  148. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>,
  149. BOOST_DEDUCED_TYPENAME Base::value_type,
  150. BOOST_DEDUCED_TYPENAME base_::value_from_base
  151. >(
  152. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(),
  153. this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()
  154. )
  155. );
  156. }
  157. template< class Compare >
  158. void merge(list_adaptor & x, Compare comp)
  159. {
  160. this->base().merge(x.base(),
  161. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  162. <
  163. Compare,
  164. BOOST_DEDUCED_TYPENAME Base::value_type,
  165. BOOST_DEDUCED_TYPENAME base_::value_from_base
  166. >( comp, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
  167. );
  168. }
  169. void sort()
  170. {
  171. this->base().sort(
  172. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  173. <
  174. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>,
  175. BOOST_DEDUCED_TYPENAME Base::value_type,
  176. BOOST_DEDUCED_TYPENAME base_::value_from_base
  177. >(
  178. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(),
  179. this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()
  180. )
  181. );
  182. }
  183. template< class Compare >
  184. void sort(Compare comp)
  185. {
  186. this->base().sort(
  187. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  188. <
  189. Compare,
  190. BOOST_DEDUCED_TYPENAME Base::value_type,
  191. BOOST_DEDUCED_TYPENAME base_::value_from_base
  192. >( comp, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
  193. );
  194. }
  195. void reverse()
  196. {
  197. this->base().reverse();
  198. }
  199. };
  200. } // namespace container_adaptor
  201. } // namespace bimaps
  202. } // namespace boost
  203. #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SET_ADAPTOR_HPP