vector_set_view.hpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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 views/vector_set_view.hpp
  9. /// \brief View of a side of a bimap that is signature compatible with std::vector.
  10. #ifndef BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP
  11. #define BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP
  12. #if defined(_MSC_VER)
  13. #pragma once
  14. #endif
  15. #include <boost/config.hpp>
  16. #include <boost/bimap/container_adaptor/vector_adaptor.hpp>
  17. #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
  18. #include <boost/bimap/detail/set_view_base.hpp>
  19. #include <boost/bimap/detail/map_view_base.hpp>
  20. namespace boost {
  21. namespace bimaps {
  22. namespace views {
  23. /// \brief View of a bimap that is signature compatible with std::vector.
  24. /**
  25. This class uses container_adaptor and iterator_adaptor to wrapped a index of the
  26. multi_index bimap core so it can be used as a std::vector.
  27. See also const_set_view.
  28. **/
  29. template< class CoreIndex >
  30. class vector_set_view
  31. :
  32. public BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR(
  33. vector_adaptor,
  34. CoreIndex,
  35. reverse_iterator, const_reverse_iterator
  36. ),
  37. public ::boost::bimaps::detail::
  38. set_view_base< vector_set_view< CoreIndex >, CoreIndex >
  39. {
  40. BOOST_BIMAP_SET_VIEW_BASE_FRIEND(vector_set_view,CoreIndex)
  41. typedef BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR(
  42. vector_adaptor,
  43. CoreIndex,
  44. reverse_iterator, const_reverse_iterator
  45. ) base_;
  46. public:
  47. vector_set_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) :
  48. base_(c) {}
  49. vector_set_view & operator=(const vector_set_view & v)
  50. {
  51. this->base() = v.base();
  52. return *this;
  53. }
  54. BOOST_DEDUCED_TYPENAME base_::const_reference
  55. operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const
  56. {
  57. return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
  58. this->base().operator[](n)
  59. );
  60. }
  61. BOOST_DEDUCED_TYPENAME base_::const_reference
  62. at(BOOST_DEDUCED_TYPENAME base_::size_type n) const
  63. {
  64. return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
  65. this->base().at(n)
  66. );
  67. }
  68. BOOST_DEDUCED_TYPENAME base_::reference
  69. operator[](BOOST_DEDUCED_TYPENAME base_::size_type n)
  70. {
  71. return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
  72. const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>(
  73. this->base().operator[](n)
  74. ));
  75. }
  76. BOOST_DEDUCED_TYPENAME base_::reference
  77. at(BOOST_DEDUCED_TYPENAME base_::size_type n)
  78. {
  79. return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
  80. const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>(
  81. this->base().at(n)
  82. ));
  83. }
  84. BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_)
  85. BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_)
  86. // List operations
  87. void splice(BOOST_DEDUCED_TYPENAME base_::iterator position,
  88. vector_set_view & x)
  89. {
  90. this->base().splice(
  91. this->template functor<
  92. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
  93. x.base()
  94. );
  95. }
  96. void splice(BOOST_DEDUCED_TYPENAME base_::iterator position,
  97. vector_set_view & x,
  98. BOOST_DEDUCED_TYPENAME base_::iterator i)
  99. {
  100. this->base().splice(
  101. this->template functor<
  102. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
  103. x.base(),
  104. this->template functor<
  105. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i)
  106. );
  107. }
  108. void splice(BOOST_DEDUCED_TYPENAME base_::iterator position,
  109. vector_set_view & x,
  110. BOOST_DEDUCED_TYPENAME base_::iterator first,
  111. BOOST_DEDUCED_TYPENAME base_::iterator last)
  112. {
  113. this->base().splice(
  114. this->template functor<
  115. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
  116. x.base(),
  117. this->template functor<
  118. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first),
  119. this->template functor<
  120. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last)
  121. );
  122. }
  123. void remove(BOOST_DEDUCED_TYPENAME ::boost::call_traits<
  124. BOOST_DEDUCED_TYPENAME base_::value_type >::param_type value)
  125. {
  126. this->base().remove(
  127. this->template functor<
  128. BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value)
  129. );
  130. }
  131. template<typename Predicate>
  132. void remove_if(Predicate pred)
  133. {
  134. this->base().remove_if(
  135. ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
  136. <
  137. Predicate,
  138. BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
  139. BOOST_DEDUCED_TYPENAME base_::value_from_base
  140. >( pred, this->template functor<
  141. BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
  142. );
  143. }
  144. void unique()
  145. {
  146. this->base().unique(
  147. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  148. <
  149. std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>,
  150. BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
  151. BOOST_DEDUCED_TYPENAME base_::value_from_base
  152. >(
  153. std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>(),
  154. this->template functor<
  155. BOOST_DEDUCED_TYPENAME base_::value_from_base>()
  156. )
  157. );
  158. }
  159. template< class BinaryPredicate >
  160. void unique(BinaryPredicate binary_pred)
  161. {
  162. this->base().unique(
  163. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  164. <
  165. BinaryPredicate,
  166. BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
  167. BOOST_DEDUCED_TYPENAME base_::value_from_base
  168. >( binary_pred,
  169. this->template functor<
  170. BOOST_DEDUCED_TYPENAME base_::value_from_base>()
  171. )
  172. );
  173. }
  174. void merge(vector_set_view & x)
  175. {
  176. this->base().merge(x.base(),
  177. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  178. <
  179. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>,
  180. BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
  181. BOOST_DEDUCED_TYPENAME base_::value_from_base
  182. >(
  183. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(),
  184. this->template functor<
  185. BOOST_DEDUCED_TYPENAME base_::value_from_base>()
  186. )
  187. );
  188. }
  189. template< class Compare >
  190. void merge(vector_set_view & x, Compare comp)
  191. {
  192. this->base().merge(x.base(),
  193. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  194. <
  195. Compare,
  196. BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
  197. BOOST_DEDUCED_TYPENAME base_::value_from_base
  198. >( comp, this->template functor<
  199. BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
  200. );
  201. }
  202. void sort()
  203. {
  204. this->base().sort(
  205. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  206. <
  207. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>,
  208. BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
  209. BOOST_DEDUCED_TYPENAME base_::value_from_base
  210. >(
  211. std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(),
  212. this->template functor<
  213. BOOST_DEDUCED_TYPENAME base_::value_from_base>()
  214. )
  215. );
  216. }
  217. template< class Compare >
  218. void sort(Compare comp)
  219. {
  220. this->base().sort(
  221. ::boost::bimaps::container_adaptor::detail::comparison_adaptor
  222. <
  223. Compare,
  224. BOOST_DEDUCED_TYPENAME base_::base_type::value_type,
  225. BOOST_DEDUCED_TYPENAME base_::value_from_base
  226. >( comp, this->template functor<
  227. BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
  228. );
  229. }
  230. void reverse()
  231. {
  232. this->base().reverse();
  233. }
  234. // Rearrange Operations
  235. void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position,
  236. BOOST_DEDUCED_TYPENAME base_::iterator i)
  237. {
  238. this->base().relocate(
  239. this->template functor<
  240. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
  241. this->template functor<
  242. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i)
  243. );
  244. }
  245. void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position,
  246. BOOST_DEDUCED_TYPENAME base_::iterator first,
  247. BOOST_DEDUCED_TYPENAME base_::iterator last)
  248. {
  249. this->base().relocate(
  250. this->template functor<
  251. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
  252. this->template functor<
  253. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first),
  254. this->template functor<
  255. BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last)
  256. );
  257. }
  258. };
  259. } // namespace views
  260. } // namespace bimaps
  261. } // namespace boost
  262. #endif // BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP