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 9 /// \file detail/map_view_iterator.hpp 10 /// \brief Iterator adaptors from multi-index to bimap. 11 12 #ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP 13 #define BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP 14 15 #if defined(_MSC_VER) 16 #pragma once 17 #endif 18 19 #include <boost/config.hpp> 20 21 // Boost 22 23 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION 24 #include <boost/serialization/nvp.hpp> 25 #include <boost/serialization/split_member.hpp> 26 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION 27 28 #include <boost/iterator/detail/enable_if.hpp> 29 #include <boost/iterator/iterator_adaptor.hpp> 30 #include <boost/bimap/relation/support/pair_by.hpp> 31 32 // check 33 #include <boost/bimap/relation/detail/metadata_access_builder.hpp> 34 #include <boost/bimap/relation/detail/static_access_builder.hpp> 35 36 namespace boost { 37 namespace bimaps { 38 namespace detail { 39 40 /** \brief Map View Iterator adaptors from multi index to bimap. 41 42 These classes are based on transform iterators from Boost.Iterator. 43 **/ 44 45 template< class Tag, class BimapCore > struct map_view_iterator ; 46 template< class Tag, class BimapCore > struct const_map_view_iterator ; 47 48 template< class Tag, class BimapCore > struct reverse_map_view_iterator ; 49 template< class Tag, class BimapCore > struct const_reverse_map_view_iterator ; 50 51 template< class Tag, class BimapCore > struct local_map_view_iterator ; 52 template< class Tag, class BimapCore > struct const_local_map_view_iterator ; 53 54 55 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES 56 57 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION 58 /*===========================================================================*/ 59 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT \ 60 BOOST_SERIALIZATION_SPLIT_MEMBER() \ 61 \ 62 friend class ::boost::serialization::access; \ 63 \ 64 template< class Archive > \ 65 void save(Archive & ar, const unsigned int) const \ 66 { \ 67 ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); \ 68 } \ 69 \ 70 template< class Archive > \ 71 void load(Archive & ar, const unsigned int) \ 72 { \ 73 BOOST_DEDUCED_TYPENAME base_::base_type iter; \ 74 ar >> ::boost::serialization::make_nvp("mi_iterator",iter); \ 75 this->base_reference() = iter; \ 76 } 77 /*===========================================================================*/ 78 #else 79 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT // None 80 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION 81 82 /*===========================================================================*/ 83 #define BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( METANAME, ITERATOR ) \ 84 BOOST_BIMAP_SYMMETRIC_STATIC_ACCESS_BUILDER( METANAME, BimapCore, \ 85 typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\ 86 index<BOOST_DEDUCED_TYPENAME BimapCore::left_tag> \ 87 ::type::ITERATOR type, \ 88 typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\ 89 index<BOOST_DEDUCED_TYPENAME BimapCore::right_tag> \ 90 ::type::ITERATOR type \ 91 ) 92 /*===========================================================================*/ 93 94 95 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( core_iterator_type_by 96 , iterator ) 97 98 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( reverse_core_iterator_type_by 99 , reverse_iterator ) 100 101 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( local_core_iterator_type_by 102 , local_iterator ) 103 104 105 // map_view_iterator 106 107 template< class Tag, class BimapCore > 108 struct map_view_iterator_adaptor { 109 typedef iterator_adaptor< 110 map_view_iterator<Tag,BimapCore>, 111 BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type, 112 BOOST_DEDUCED_TYPENAME 113 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type 114 > type; 115 }; 116 template< class Tag, class BimapCore > 117 struct map_view_iterator : 118 public map_view_iterator_adaptor<Tag,BimapCore>::type 119 { 120 typedef BOOST_DEDUCED_TYPENAME 121 map_view_iterator_adaptor<Tag,BimapCore>::type base_; 122 public: 123 map_view_iteratorboost::bimaps::detail::map_view_iterator124 map_view_iterator() {} map_view_iteratorboost::bimaps::detail::map_view_iterator125 map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter) 126 : base_(iter) {} 127 dereferenceboost::bimaps::detail::map_view_iterator128 BOOST_DEDUCED_TYPENAME base_::reference dereference() const 129 { 130 return ::boost::bimaps::relation::support::pair_by<Tag>( 131 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( 132 &(*this->base()) 133 ) 134 ); 135 } 136 private: 137 friend class iterator_core_access; 138 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT 139 }; 140 141 142 template< class Tag, class BimapCore > 143 struct const_map_view_iterator_adaptor { 144 typedef iterator_adaptor< 145 const_map_view_iterator<Tag,BimapCore>, 146 BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type, 147 const BOOST_DEDUCED_TYPENAME 148 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type 149 > type; 150 }; 151 template< class Tag, class BimapCore > 152 struct const_map_view_iterator : 153 public const_map_view_iterator_adaptor<Tag,BimapCore>::type 154 { 155 typedef BOOST_DEDUCED_TYPENAME 156 const_map_view_iterator_adaptor<Tag,BimapCore>::type base_; 157 public: 158 const_map_view_iteratorboost::bimaps::detail::const_map_view_iterator159 const_map_view_iterator() {} const_map_view_iteratorboost::bimaps::detail::const_map_view_iterator160 const_map_view_iterator( 161 BOOST_DEDUCED_TYPENAME base_::base_type const& iter) 162 : base_(iter) {} const_map_view_iteratorboost::bimaps::detail::const_map_view_iterator163 const_map_view_iterator(map_view_iterator<Tag,BimapCore> i) 164 : base_(i.base()) {} 165 dereferenceboost::bimaps::detail::const_map_view_iterator166 BOOST_DEDUCED_TYPENAME base_::reference dereference() const 167 { 168 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base()); 169 } 170 private: 171 friend class iterator_core_access; 172 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT 173 }; 174 175 176 // reverse_map_view_iterator 177 178 template< class Tag, class BimapCore > 179 struct reverse_map_view_iterator_adaptor { 180 typedef iterator_adaptor< 181 reverse_map_view_iterator<Tag,BimapCore>, 182 BOOST_DEDUCED_TYPENAME 183 reverse_core_iterator_type_by<Tag,BimapCore>::type, 184 BOOST_DEDUCED_TYPENAME 185 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type 186 > type; 187 }; 188 template< class Tag, class BimapCore > 189 struct reverse_map_view_iterator : 190 public reverse_map_view_iterator_adaptor<Tag,BimapCore>::type 191 { 192 typedef BOOST_DEDUCED_TYPENAME 193 reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_; 194 public: 195 reverse_map_view_iteratorboost::bimaps::detail::reverse_map_view_iterator196 reverse_map_view_iterator() {} reverse_map_view_iteratorboost::bimaps::detail::reverse_map_view_iterator197 reverse_map_view_iterator( 198 BOOST_DEDUCED_TYPENAME base_::base_type const& iter) 199 : base_(iter) {} 200 dereferenceboost::bimaps::detail::reverse_map_view_iterator201 BOOST_DEDUCED_TYPENAME base_::reference dereference() const 202 { 203 return ::boost::bimaps::relation::support::pair_by<Tag>( 204 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( 205 &(*this->base()) 206 ) 207 ); 208 } 209 private: 210 friend class iterator_core_access; 211 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT 212 }; 213 214 template< class Tag, class BimapCore > 215 struct const_reverse_map_view_iterator_adaptor { 216 typedef iterator_adaptor< 217 const_reverse_map_view_iterator<Tag,BimapCore>, 218 BOOST_DEDUCED_TYPENAME 219 reverse_core_iterator_type_by<Tag,BimapCore>::type, 220 const BOOST_DEDUCED_TYPENAME 221 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type 222 > type; 223 }; 224 template< class Tag, class BimapCore > 225 struct const_reverse_map_view_iterator : 226 public const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type 227 { 228 typedef BOOST_DEDUCED_TYPENAME 229 const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_; 230 231 public: 232 const_reverse_map_view_iteratorboost::bimaps::detail::const_reverse_map_view_iterator233 const_reverse_map_view_iterator() {} const_reverse_map_view_iteratorboost::bimaps::detail::const_reverse_map_view_iterator234 const_reverse_map_view_iterator( 235 BOOST_DEDUCED_TYPENAME base_::base_type const& iter) 236 : base_(iter) {} const_reverse_map_view_iteratorboost::bimaps::detail::const_reverse_map_view_iterator237 const_reverse_map_view_iterator(reverse_map_view_iterator<Tag,BimapCore> i) 238 : base_(i.base()) {} 239 dereferenceboost::bimaps::detail::const_reverse_map_view_iterator240 BOOST_DEDUCED_TYPENAME base_::reference dereference() const 241 { 242 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base()); 243 } 244 private: 245 friend class iterator_core_access; 246 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT 247 }; 248 249 250 // local_map_view_iterator 251 252 template< class Tag, class BimapCore > 253 struct local_map_view_iterator_adaptor { 254 typedef iterator_adaptor< 255 local_map_view_iterator<Tag,BimapCore>, 256 BOOST_DEDUCED_TYPENAME 257 local_core_iterator_type_by<Tag,BimapCore>::type, 258 BOOST_DEDUCED_TYPENAME 259 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type 260 > type; 261 }; 262 template< class Tag, class BimapCore > 263 struct local_map_view_iterator : 264 public local_map_view_iterator_adaptor<Tag,BimapCore>::type 265 { 266 typedef BOOST_DEDUCED_TYPENAME 267 local_map_view_iterator_adaptor<Tag,BimapCore>::type base_; 268 public: 269 local_map_view_iteratorboost::bimaps::detail::local_map_view_iterator270 local_map_view_iterator() {} local_map_view_iteratorboost::bimaps::detail::local_map_view_iterator271 local_map_view_iterator( 272 BOOST_DEDUCED_TYPENAME base_::base_type const& iter) 273 : base_(iter) {} 274 dereferenceboost::bimaps::detail::local_map_view_iterator275 BOOST_DEDUCED_TYPENAME base_::reference dereference() const 276 { 277 return ::boost::bimaps::relation::support::pair_by<Tag>( 278 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( 279 &(*this->base()) 280 ) 281 ); 282 } 283 private: 284 friend class iterator_core_access; 285 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT 286 }; 287 288 template< class Tag, class BimapCore > 289 struct const_local_map_view_iterator_adaptor { 290 typedef iterator_adaptor< 291 const_local_map_view_iterator<Tag,BimapCore>, 292 BOOST_DEDUCED_TYPENAME 293 local_core_iterator_type_by<Tag,BimapCore>::type, 294 const BOOST_DEDUCED_TYPENAME 295 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type 296 > type; 297 }; 298 template< class Tag, class BimapCore > 299 struct const_local_map_view_iterator : 300 public const_local_map_view_iterator_adaptor<Tag,BimapCore>::type 301 { 302 typedef BOOST_DEDUCED_TYPENAME 303 const_local_map_view_iterator_adaptor<Tag,BimapCore>::type base_; 304 public: 305 const_local_map_view_iteratorboost::bimaps::detail::const_local_map_view_iterator306 const_local_map_view_iterator() {} const_local_map_view_iteratorboost::bimaps::detail::const_local_map_view_iterator307 const_local_map_view_iterator( 308 BOOST_DEDUCED_TYPENAME base_::base_type const& iter) 309 : base_(iter) {} const_local_map_view_iteratorboost::bimaps::detail::const_local_map_view_iterator310 const_local_map_view_iterator(local_map_view_iterator<Tag,BimapCore> i) 311 : base_(i.base()) {} 312 dereferenceboost::bimaps::detail::const_local_map_view_iterator313 BOOST_DEDUCED_TYPENAME base_::reference dereference() const 314 { 315 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base()); 316 } 317 private: 318 friend class iterator_core_access; 319 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT 320 }; 321 322 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES 323 324 } // namespace detail 325 } // namespace bimaps 326 } // namespace boost 327 328 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP 329 330 331