File indexing completed on 2025-10-21 08:24:35
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
0013 #define BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
0014
0015 #if defined(_MSC_VER)
0016 #pragma once
0017 #endif
0018
0019 #include <boost/config.hpp>
0020
0021
0022
0023 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
0024 #include <boost/core/serialization.hpp>
0025 #endif
0026
0027 #include <boost/iterator/iterator_adaptor.hpp>
0028 #include <boost/bimap/relation/support/pair_by.hpp>
0029
0030
0031 #include <boost/bimap/relation/detail/metadata_access_builder.hpp>
0032 #include <boost/bimap/relation/detail/static_access_builder.hpp>
0033
0034 namespace boost {
0035 namespace bimaps {
0036 namespace detail {
0037
0038
0039
0040
0041
0042
0043 template< class Tag, class BimapCore > struct map_view_iterator ;
0044 template< class Tag, class BimapCore > struct const_map_view_iterator ;
0045
0046 template< class Tag, class BimapCore > struct reverse_map_view_iterator ;
0047 template< class Tag, class BimapCore > struct const_reverse_map_view_iterator ;
0048
0049 template< class Tag, class BimapCore > struct local_map_view_iterator ;
0050 template< class Tag, class BimapCore > struct const_local_map_view_iterator ;
0051
0052
0053 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
0054
0055 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
0056
0057 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT \
0058 \
0059 template< class Archive > \
0060 void serialize(Archive & ar, const unsigned int v) \
0061 { \
0062 ::boost::core::split_member( ar, *this, v ); \
0063 } \
0064 \
0065 friend class ::boost::serialization::access; \
0066 \
0067 template< class Archive > \
0068 void save(Archive & ar, const unsigned int) const \
0069 { \
0070 ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); \
0071 } \
0072 \
0073 template< class Archive > \
0074 void load(Archive & ar, const unsigned int) \
0075 { \
0076 BOOST_DEDUCED_TYPENAME base_::base_type iter; \
0077 ar >> ::boost::serialization::make_nvp("mi_iterator",iter); \
0078 this->base_reference() = iter; \
0079 }
0080
0081 #else
0082 #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
0083 #endif
0084
0085
0086 #define BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( METANAME, ITERATOR ) \
0087 BOOST_BIMAP_SYMMETRIC_STATIC_ACCESS_BUILDER( METANAME, BimapCore, \
0088 typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\
0089 index<BOOST_DEDUCED_TYPENAME BimapCore::left_tag> \
0090 ::type::ITERATOR type, \
0091 typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\
0092 index<BOOST_DEDUCED_TYPENAME BimapCore::right_tag> \
0093 ::type::ITERATOR type \
0094 )
0095
0096
0097
0098 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( core_iterator_type_by
0099 , iterator )
0100
0101 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( reverse_core_iterator_type_by
0102 , reverse_iterator )
0103
0104 BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( local_core_iterator_type_by
0105 , local_iterator )
0106
0107
0108
0109
0110 template< class Tag, class BimapCore >
0111 struct map_view_iterator_adaptor {
0112 typedef iterator_adaptor<
0113 map_view_iterator<Tag,BimapCore>,
0114 BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type,
0115 BOOST_DEDUCED_TYPENAME
0116 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
0117 > type;
0118 };
0119 template< class Tag, class BimapCore >
0120 struct map_view_iterator :
0121 public map_view_iterator_adaptor<Tag,BimapCore>::type
0122 {
0123 typedef BOOST_DEDUCED_TYPENAME
0124 map_view_iterator_adaptor<Tag,BimapCore>::type base_;
0125 public:
0126
0127 map_view_iterator() {}
0128 map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
0129 : base_(iter) {}
0130
0131 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
0132 {
0133 return ::boost::bimaps::relation::support::pair_by<Tag>(
0134 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
0135 &(*this->base())
0136 )
0137 );
0138 }
0139 private:
0140 friend class boost::iterators::iterator_core_access;
0141 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
0142 };
0143
0144
0145 template< class Tag, class BimapCore >
0146 struct const_map_view_iterator_adaptor {
0147 typedef iterator_adaptor<
0148 const_map_view_iterator<Tag,BimapCore>,
0149 BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type,
0150 const BOOST_DEDUCED_TYPENAME
0151 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
0152 > type;
0153 };
0154 template< class Tag, class BimapCore >
0155 struct const_map_view_iterator :
0156 public const_map_view_iterator_adaptor<Tag,BimapCore>::type
0157 {
0158 typedef BOOST_DEDUCED_TYPENAME
0159 const_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
0160 public:
0161
0162 const_map_view_iterator() {}
0163 const_map_view_iterator(
0164 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
0165 : base_(iter) {}
0166 const_map_view_iterator(map_view_iterator<Tag,BimapCore> i)
0167 : base_(i.base()) {}
0168
0169 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
0170 {
0171 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
0172 }
0173 private:
0174 friend class boost::iterators::iterator_core_access;
0175 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
0176 };
0177
0178
0179
0180
0181 template< class Tag, class BimapCore >
0182 struct reverse_map_view_iterator_adaptor {
0183 typedef iterator_adaptor<
0184 reverse_map_view_iterator<Tag,BimapCore>,
0185 BOOST_DEDUCED_TYPENAME
0186 reverse_core_iterator_type_by<Tag,BimapCore>::type,
0187 BOOST_DEDUCED_TYPENAME
0188 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
0189 > type;
0190 };
0191 template< class Tag, class BimapCore >
0192 struct reverse_map_view_iterator :
0193 public reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
0194 {
0195 typedef BOOST_DEDUCED_TYPENAME
0196 reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
0197 public:
0198
0199 reverse_map_view_iterator() {}
0200 reverse_map_view_iterator(
0201 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
0202 : base_(iter) {}
0203
0204 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
0205 {
0206 return ::boost::bimaps::relation::support::pair_by<Tag>(
0207 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
0208 &(*this->base())
0209 )
0210 );
0211 }
0212 private:
0213 friend class boost::iterators::iterator_core_access;
0214 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
0215 };
0216
0217 template< class Tag, class BimapCore >
0218 struct const_reverse_map_view_iterator_adaptor {
0219 typedef iterator_adaptor<
0220 const_reverse_map_view_iterator<Tag,BimapCore>,
0221 BOOST_DEDUCED_TYPENAME
0222 reverse_core_iterator_type_by<Tag,BimapCore>::type,
0223 const BOOST_DEDUCED_TYPENAME
0224 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
0225 > type;
0226 };
0227 template< class Tag, class BimapCore >
0228 struct const_reverse_map_view_iterator :
0229 public const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type
0230 {
0231 typedef BOOST_DEDUCED_TYPENAME
0232 const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
0233
0234 public:
0235
0236 const_reverse_map_view_iterator() {}
0237 const_reverse_map_view_iterator(
0238 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
0239 : base_(iter) {}
0240 const_reverse_map_view_iterator(reverse_map_view_iterator<Tag,BimapCore> i)
0241 : base_(i.base()) {}
0242
0243 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
0244 {
0245 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
0246 }
0247 private:
0248 friend class boost::iterators::iterator_core_access;
0249 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
0250 };
0251
0252
0253
0254
0255 template< class Tag, class BimapCore >
0256 struct local_map_view_iterator_adaptor {
0257 typedef iterator_adaptor<
0258 local_map_view_iterator<Tag,BimapCore>,
0259 BOOST_DEDUCED_TYPENAME
0260 local_core_iterator_type_by<Tag,BimapCore>::type,
0261 BOOST_DEDUCED_TYPENAME
0262 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
0263 > type;
0264 };
0265 template< class Tag, class BimapCore >
0266 struct local_map_view_iterator :
0267 public local_map_view_iterator_adaptor<Tag,BimapCore>::type
0268 {
0269 typedef BOOST_DEDUCED_TYPENAME
0270 local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
0271 public:
0272
0273 local_map_view_iterator() {}
0274 local_map_view_iterator(
0275 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
0276 : base_(iter) {}
0277
0278 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
0279 {
0280 return ::boost::bimaps::relation::support::pair_by<Tag>(
0281 *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
0282 &(*this->base())
0283 )
0284 );
0285 }
0286 private:
0287 friend class boost::iterators::iterator_core_access;
0288 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
0289 };
0290
0291 template< class Tag, class BimapCore >
0292 struct const_local_map_view_iterator_adaptor {
0293 typedef iterator_adaptor<
0294 const_local_map_view_iterator<Tag,BimapCore>,
0295 BOOST_DEDUCED_TYPENAME
0296 local_core_iterator_type_by<Tag,BimapCore>::type,
0297 const BOOST_DEDUCED_TYPENAME
0298 ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type
0299 > type;
0300 };
0301 template< class Tag, class BimapCore >
0302 struct const_local_map_view_iterator :
0303 public const_local_map_view_iterator_adaptor<Tag,BimapCore>::type
0304 {
0305 typedef BOOST_DEDUCED_TYPENAME
0306 const_local_map_view_iterator_adaptor<Tag,BimapCore>::type base_;
0307 public:
0308
0309 const_local_map_view_iterator() {}
0310 const_local_map_view_iterator(
0311 BOOST_DEDUCED_TYPENAME base_::base_type const& iter)
0312 : base_(iter) {}
0313 const_local_map_view_iterator(local_map_view_iterator<Tag,BimapCore> i)
0314 : base_(i.base()) {}
0315
0316 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
0317 {
0318 return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base());
0319 }
0320 private:
0321 friend class boost::iterators::iterator_core_access;
0322 BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT
0323 };
0324
0325 #endif
0326
0327 }
0328 }
0329 }
0330
0331 #endif
0332
0333