map_view_iterator.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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 detail/map_view_iterator.hpp
  9. /// \brief Iterator adaptors from multi-index to bimap.
  10. #ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
  11. #define BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
  12. #if defined(_MSC_VER)
  13. #pragma once
  14. #endif
  15. #include <boost/config.hpp>
  16. // Boost
  17. #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
  18. #include <boost/core/serialization.hpp>
  19. #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
  20. #include <boost/iterator/detail/enable_if.hpp>
  21. #include <boost/iterator/iterator_adaptor.hpp>
  22. #include <boost/bimap/relation/support/pair_by.hpp>
  23. // check
  24. #include <boost/bimap/relation/detail/metadata_access_builder.hpp>
  25. #include <boost/bimap/relation/detail/static_access_builder.hpp>
  26. namespace boost {
  27. namespace bimaps {
  28. namespace detail {
  29. /** \brief Map View Iterator adaptors from multi index to bimap.
  30. These classes are based on transform iterators from Boost.Iterator.
  31. **/
  32. template< class Tag, class BimapCore > struct map_view_iterator ;
  33. template< class Tag, class BimapCore > struct const_map_view_iterator ;
  34. template< class Tag, class BimapCore > struct reverse_map_view_iterator ;
  35. template< class Tag, class BimapCore > struct const_reverse_map_view_iterator ;
  36. template< class Tag, class BimapCore > struct local_map_view_iterator ;
  37. template< class Tag, class BimapCore > struct const_local_map_view_iterator ;
  38. #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  39. #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
  40. /*===========================================================================*/
  41. #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT \
  42. \
  43. template< class Archive > \
  44. void serialize(Archive & ar, const unsigned int v) \
  45. { \
  46. ::boost::core::split_member( ar, *this, v ); \
  47. } \
  48. \
  49. friend class ::boost::serialization::access; \
  50. \
  51. template< class Archive > \
  52. void save(Archive & ar, const unsigned int) const \
  53. { \
  54. ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); \
  55. } \
  56. \
  57. template< class Archive > \
  58. void load(Archive & ar, const unsigned int) \
  59. { \
  60. BOOST_DEDUCED_TYPENAME base_::base_type iter; \
  61. ar >> ::boost::serialization::make_nvp("mi_iterator",iter); \
  62. this->base_reference() = iter; \
  63. }
  64. /*===========================================================================*/
  65. #else
  66. #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT // None
  67. #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
  68. /*===========================================================================*/
  69. #define BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( METANAME, ITERATOR ) \
  70. BOOST_BIMAP_SYMMETRIC_STATIC_ACCESS_BUILDER( METANAME, BimapCore, \
  71. typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\
  72. index<BOOST_DEDUCED_TYPENAME BimapCore::left_tag> \
  73. ::type::ITERATOR type, \
  74. typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\
  75. index<BOOST_DEDUCED_TYPENAME BimapCore::right_tag> \
  76. ::type::ITERATOR type \
  77. )
  78. /*===========================================================================*/
  79. BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( core_iterator_type_by
  80. , iterator )
  81. BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( reverse_core_iterator_type_by
  82. , reverse_iterator )
  83. BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( local_core_iterator_type_by
  84. , local_iterator )
  85. // map_view_iterator
  86. template< class Tag, class BimapCore >
  87. struct map_view_iterator_adaptor {
  88. typedef iterator_adaptor<
  89. map_view_iterator<Tag,BimapCore>,
  90. BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type,
  91. BOOST_DEDUCED_TYPENAME
  92. ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
  93. > type;
  94. };
  95. template< class Tag, class BimapCore >
  96. struct map_view_iterator :
  97. public map_view_iterator_adaptor<Tag,BimapCore>::type
  98. {
  99. typedef BOOST_DEDUCED_TYPENAME
  100. map_view_iterator_adaptor<Tag,BimapCore>::type base_;
  101. public:
  102. map_view_iterator() {}
  103. map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
  104. : base_(iter) {}
  105. BOOST_DEDUCED_TYPENAME base_::reference dereference() const
  106. {
  107. return ::boost::bimaps::relation::support::pair_by<Tag>(
  108. *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
  109. &(*this->base())
  110. )
  111. );
  112. }
  113. private:
  114. friend class boost::iterators::iterator_core_access;
  115. BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
  116. };
  117. template< class Tag, class BimapCore >
  118. struct const_map_view_iterator_adaptor {
  119. typedef iterator_adaptor<
  120. const_map_view_iterator<Tag,BimapCore>,
  121. BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type,
  122. const BOOST_DEDUCED_TYPENAME
  123. ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
  124. > type;
  125. };
  126. template< class Tag, class BimapCore >
  127. struct const_map_view_iterator :
  128. public const_map_view_iterator_adaptor<Tag,BimapCore>::type
  129. {
  130. typedef BOOST_DEDUCED_TYPENAME
  131. const_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
  132. public:
  133. const_map_view_iterator() {}
  134. const_map_view_iterator(
  135. BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
  136. : base_(iter) {}
  137. const_map_view_iterator(map_view_iterator<Tag,BimapCore> i)
  138. : base_(i.base()) {}
  139. BOOST_DEDUCED_TYPENAME base_::reference dereference() const
  140. {
  141. return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
  142. }
  143. private:
  144. friend class boost::iterators::iterator_core_access;
  145. BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
  146. };
  147. // reverse_map_view_iterator
  148. template< class Tag, class BimapCore >
  149. struct reverse_map_view_iterator_adaptor {
  150. typedef iterator_adaptor<
  151. reverse_map_view_iterator<Tag,BimapCore>,
  152. BOOST_DEDUCED_TYPENAME
  153. reverse_core_iterator_type_by<Tag,BimapCore>::type,
  154. BOOST_DEDUCED_TYPENAME
  155. ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
  156. > type;
  157. };
  158. template< class Tag, class BimapCore >
  159. struct reverse_map_view_iterator :
  160. public reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
  161. {
  162. typedef BOOST_DEDUCED_TYPENAME
  163. reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
  164. public:
  165. reverse_map_view_iterator() {}
  166. reverse_map_view_iterator(
  167. BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
  168. : base_(iter) {}
  169. BOOST_DEDUCED_TYPENAME base_::reference dereference() const
  170. {
  171. return ::boost::bimaps::relation::support::pair_by<Tag>(
  172. *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
  173. &(*this->base())
  174. )
  175. );
  176. }
  177. private:
  178. friend class boost::iterators::iterator_core_access;
  179. BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
  180. };
  181. template< class Tag, class BimapCore >
  182. struct const_reverse_map_view_iterator_adaptor {
  183. typedef iterator_adaptor<
  184. const_reverse_map_view_iterator<Tag,BimapCore>,
  185. BOOST_DEDUCED_TYPENAME
  186. reverse_core_iterator_type_by<Tag,BimapCore>::type,
  187. const BOOST_DEDUCED_TYPENAME
  188. ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
  189. > type;
  190. };
  191. template< class Tag, class BimapCore >
  192. struct const_reverse_map_view_iterator :
  193. public const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
  194. {
  195. typedef BOOST_DEDUCED_TYPENAME
  196. const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
  197. public:
  198. const_reverse_map_view_iterator() {}
  199. const_reverse_map_view_iterator(
  200. BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
  201. : base_(iter) {}
  202. const_reverse_map_view_iterator(reverse_map_view_iterator<Tag,BimapCore> i)
  203. : base_(i.base()) {}
  204. BOOST_DEDUCED_TYPENAME base_::reference dereference() const
  205. {
  206. return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
  207. }
  208. private:
  209. friend class boost::iterators::iterator_core_access;
  210. BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
  211. };
  212. // local_map_view_iterator
  213. template< class Tag, class BimapCore >
  214. struct local_map_view_iterator_adaptor {
  215. typedef iterator_adaptor<
  216. local_map_view_iterator<Tag,BimapCore>,
  217. BOOST_DEDUCED_TYPENAME
  218. local_core_iterator_type_by<Tag,BimapCore>::type,
  219. BOOST_DEDUCED_TYPENAME
  220. ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
  221. > type;
  222. };
  223. template< class Tag, class BimapCore >
  224. struct local_map_view_iterator :
  225. public local_map_view_iterator_adaptor<Tag,BimapCore>::type
  226. {
  227. typedef BOOST_DEDUCED_TYPENAME
  228. local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
  229. public:
  230. local_map_view_iterator() {}
  231. local_map_view_iterator(
  232. BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
  233. : base_(iter) {}
  234. BOOST_DEDUCED_TYPENAME base_::reference dereference() const
  235. {
  236. return ::boost::bimaps::relation::support::pair_by<Tag>(
  237. *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
  238. &(*this->base())
  239. )
  240. );
  241. }
  242. private:
  243. friend class boost::iterators::iterator_core_access;
  244. BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
  245. };
  246. template< class Tag, class BimapCore >
  247. struct const_local_map_view_iterator_adaptor {
  248. typedef iterator_adaptor<
  249. const_local_map_view_iterator<Tag,BimapCore>,
  250. BOOST_DEDUCED_TYPENAME
  251. local_core_iterator_type_by<Tag,BimapCore>::type,
  252. const BOOST_DEDUCED_TYPENAME
  253. ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
  254. > type;
  255. };
  256. template< class Tag, class BimapCore >
  257. struct const_local_map_view_iterator :
  258. public const_local_map_view_iterator_adaptor<Tag,BimapCore>::type
  259. {
  260. typedef BOOST_DEDUCED_TYPENAME
  261. const_local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
  262. public:
  263. const_local_map_view_iterator() {}
  264. const_local_map_view_iterator(
  265. BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
  266. : base_(iter) {}
  267. const_local_map_view_iterator(local_map_view_iterator<Tag,BimapCore> i)
  268. : base_(i.base()) {}
  269. BOOST_DEDUCED_TYPENAME base_::reference dereference() const
  270. {
  271. return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
  272. }
  273. private:
  274. friend class boost::iterators::iterator_core_access;
  275. BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
  276. };
  277. #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
  278. } // namespace detail
  279. } // namespace bimaps
  280. } // namespace boost
  281. #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP