vector_map_view.hpp 11 KB

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