Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-21 08:24:35

0001 // Boost.Bimap
0002 //
0003 // Copyright (c) 2006-2007 Matias Capeletto
0004 //
0005 // Distributed under the Boost Software License, Version 1.0.
0006 // (See accompanying file LICENSE_1_0.txt or copy at
0007 // http://www.boost.org/LICENSE_1_0.txt)
0008 
0009 /// \file detail/map_view_iterator.hpp
0010 /// \brief Iterator adaptors from multi-index to bimap.
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 // Boost
0022 
0023 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
0024   #include <boost/core/serialization.hpp>
0025 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
0026 
0027 #include <boost/iterator/iterator_adaptor.hpp>
0028 #include <boost/bimap/relation/support/pair_by.hpp>
0029 
0030 // check
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 /** \brief Map View Iterator adaptors from multi index to bimap.
0039 
0040 These classes are based on transform iterators from Boost.Iterator.
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 // None
0083 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
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 // map_view_iterator
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 // reverse_map_view_iterator
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 // local_map_view_iterator
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 // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
0326 
0327 } // namespace detail
0328 } // namespace bimaps
0329 } // namespace boost
0330 
0331 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
0332 
0333