map_view_iterator.hpp 12 KB

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