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