Chris@16: // Boost.Bimap Chris@16: // Chris@16: // Copyright (c) 2006-2007 Matias Capeletto Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: /// \file detail/map_view_iterator.hpp Chris@16: /// \brief Iterator adaptors from multi-index to bimap. Chris@16: Chris@16: #ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP Chris@16: #define BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP Chris@16: Chris@101: #if defined(_MSC_VER) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: Chris@16: #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: #include Chris@16: #endif // BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // check Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace bimaps { Chris@16: namespace detail { Chris@16: Chris@16: /** \brief Map View Iterator adaptors from multi index to bimap. Chris@16: Chris@16: These classes are based on transform iterators from Boost.Iterator. Chris@16: **/ Chris@16: Chris@16: template< class Tag, class BimapCore > struct map_view_iterator ; Chris@16: template< class Tag, class BimapCore > struct const_map_view_iterator ; Chris@16: Chris@16: template< class Tag, class BimapCore > struct reverse_map_view_iterator ; Chris@16: template< class Tag, class BimapCore > struct const_reverse_map_view_iterator ; Chris@16: Chris@16: template< class Tag, class BimapCore > struct local_map_view_iterator ; Chris@16: template< class Tag, class BimapCore > struct const_local_map_view_iterator ; Chris@16: Chris@16: Chris@16: #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES Chris@16: Chris@16: #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT \ Chris@16: BOOST_SERIALIZATION_SPLIT_MEMBER() \ Chris@16: \ Chris@16: friend class ::boost::serialization::access; \ Chris@16: \ Chris@16: template< class Archive > \ Chris@16: void save(Archive & ar, const unsigned int) const \ Chris@16: { \ Chris@16: ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); \ Chris@16: } \ Chris@16: \ Chris@16: template< class Archive > \ Chris@16: void load(Archive & ar, const unsigned int) \ Chris@16: { \ Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type iter; \ Chris@16: ar >> ::boost::serialization::make_nvp("mi_iterator",iter); \ Chris@16: this->base_reference() = iter; \ Chris@16: } Chris@16: /*===========================================================================*/ Chris@16: #else Chris@16: #define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT // None Chris@16: #endif // BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( METANAME, ITERATOR ) \ Chris@16: BOOST_BIMAP_SYMMETRIC_STATIC_ACCESS_BUILDER( METANAME, BimapCore, \ Chris@16: typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\ Chris@16: index \ Chris@16: ::type::ITERATOR type, \ Chris@16: typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\ Chris@16: index \ Chris@16: ::type::ITERATOR type \ Chris@16: ) Chris@16: /*===========================================================================*/ Chris@16: Chris@16: Chris@16: BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( core_iterator_type_by Chris@16: , iterator ) Chris@16: Chris@16: BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( reverse_core_iterator_type_by Chris@16: , reverse_iterator ) Chris@16: Chris@16: BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( local_core_iterator_type_by Chris@16: , local_iterator ) Chris@16: Chris@16: Chris@16: // map_view_iterator Chris@16: Chris@16: template< class Tag, class BimapCore > Chris@16: struct map_view_iterator_adaptor { Chris@16: typedef iterator_adaptor< Chris@16: map_view_iterator, Chris@16: BOOST_DEDUCED_TYPENAME core_iterator_type_by::type, Chris@16: BOOST_DEDUCED_TYPENAME Chris@16: ::boost::bimaps::support::value_type_by::type Chris@16: > type; Chris@16: }; Chris@16: template< class Tag, class BimapCore > Chris@16: struct map_view_iterator : Chris@16: public map_view_iterator_adaptor::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME Chris@16: map_view_iterator_adaptor::type base_; Chris@16: public: Chris@16: Chris@16: map_view_iterator() {} Chris@16: map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter) Chris@16: : base_(iter) {} Chris@16: map_view_iterator(map_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference dereference() const Chris@16: { Chris@16: return ::boost::bimaps::relation::support::pair_by( Chris@16: *const_cast( Chris@16: &(*this->base()) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: private: Chris@16: friend class iterator_core_access; Chris@16: BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Tag, class BimapCore > Chris@16: struct const_map_view_iterator_adaptor { Chris@16: typedef iterator_adaptor< Chris@16: const_map_view_iterator, Chris@16: BOOST_DEDUCED_TYPENAME core_iterator_type_by::type, Chris@16: const BOOST_DEDUCED_TYPENAME Chris@16: ::boost::bimaps::support::value_type_by::type Chris@16: > type; Chris@16: }; Chris@16: template< class Tag, class BimapCore > Chris@16: struct const_map_view_iterator : Chris@16: public const_map_view_iterator_adaptor::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME Chris@16: const_map_view_iterator_adaptor::type base_; Chris@16: public: Chris@16: Chris@16: const_map_view_iterator() {} Chris@16: const_map_view_iterator( Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type const& iter) Chris@16: : base_(iter) {} Chris@16: const_map_view_iterator(const_map_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: const_map_view_iterator(map_view_iterator i) Chris@16: : base_(i.base()) {} Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference dereference() const Chris@16: { Chris@16: return ::boost::bimaps::relation::support::pair_by(*this->base()); Chris@16: } Chris@16: private: Chris@16: friend class iterator_core_access; Chris@16: BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT Chris@16: }; Chris@16: Chris@16: Chris@16: // reverse_map_view_iterator Chris@16: Chris@16: template< class Tag, class BimapCore > Chris@16: struct reverse_map_view_iterator_adaptor { Chris@16: typedef iterator_adaptor< Chris@16: reverse_map_view_iterator, Chris@16: BOOST_DEDUCED_TYPENAME Chris@16: reverse_core_iterator_type_by::type, Chris@16: BOOST_DEDUCED_TYPENAME Chris@16: ::boost::bimaps::support::value_type_by::type Chris@16: > type; Chris@16: }; Chris@16: template< class Tag, class BimapCore > Chris@16: struct reverse_map_view_iterator : Chris@16: public reverse_map_view_iterator_adaptor::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME Chris@16: reverse_map_view_iterator_adaptor::type base_; Chris@16: public: Chris@16: Chris@16: reverse_map_view_iterator() {} Chris@16: reverse_map_view_iterator( Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type const& iter) Chris@16: : base_(iter) {} Chris@16: reverse_map_view_iterator(reverse_map_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference dereference() const Chris@16: { Chris@16: return ::boost::bimaps::relation::support::pair_by( Chris@16: *const_cast( Chris@16: &(*this->base()) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: private: Chris@16: friend class iterator_core_access; Chris@16: BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT Chris@16: }; Chris@16: Chris@16: template< class Tag, class BimapCore > Chris@16: struct const_reverse_map_view_iterator_adaptor { Chris@16: typedef iterator_adaptor< Chris@16: const_reverse_map_view_iterator, Chris@16: BOOST_DEDUCED_TYPENAME Chris@16: reverse_core_iterator_type_by::type, Chris@16: const BOOST_DEDUCED_TYPENAME Chris@16: ::boost::bimaps::support::value_type_by::type Chris@16: > type; Chris@16: }; Chris@16: template< class Tag, class BimapCore > Chris@16: struct const_reverse_map_view_iterator : Chris@16: public const_reverse_map_view_iterator_adaptor::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME Chris@16: const_reverse_map_view_iterator_adaptor::type base_; Chris@16: Chris@16: public: Chris@16: Chris@16: const_reverse_map_view_iterator() {} Chris@16: const_reverse_map_view_iterator( Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type const& iter) Chris@16: : base_(iter) {} Chris@16: const_reverse_map_view_iterator(const_reverse_map_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: const_reverse_map_view_iterator(reverse_map_view_iterator i) Chris@16: : base_(i.base()) {} Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference dereference() const Chris@16: { Chris@16: return ::boost::bimaps::relation::support::pair_by(*this->base()); Chris@16: } Chris@16: private: Chris@16: friend class iterator_core_access; Chris@16: BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT Chris@16: }; Chris@16: Chris@16: Chris@16: // local_map_view_iterator Chris@16: Chris@16: template< class Tag, class BimapCore > Chris@16: struct local_map_view_iterator_adaptor { Chris@16: typedef iterator_adaptor< Chris@16: local_map_view_iterator, Chris@16: BOOST_DEDUCED_TYPENAME Chris@16: local_core_iterator_type_by::type, Chris@16: BOOST_DEDUCED_TYPENAME Chris@16: ::boost::bimaps::support::value_type_by::type Chris@16: > type; Chris@16: }; Chris@16: template< class Tag, class BimapCore > Chris@16: struct local_map_view_iterator : Chris@16: public local_map_view_iterator_adaptor::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME Chris@16: local_map_view_iterator_adaptor::type base_; Chris@16: public: Chris@16: Chris@16: local_map_view_iterator() {} Chris@16: local_map_view_iterator( Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type const& iter) Chris@16: : base_(iter) {} Chris@16: local_map_view_iterator(local_map_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference dereference() const Chris@16: { Chris@16: return ::boost::bimaps::relation::support::pair_by( Chris@16: *const_cast( Chris@16: &(*this->base()) Chris@16: ) Chris@16: ); Chris@16: } Chris@16: private: Chris@16: friend class iterator_core_access; Chris@16: BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT Chris@16: }; Chris@16: Chris@16: template< class Tag, class BimapCore > Chris@16: struct const_local_map_view_iterator_adaptor { Chris@16: typedef iterator_adaptor< Chris@16: const_local_map_view_iterator, Chris@16: BOOST_DEDUCED_TYPENAME Chris@16: local_core_iterator_type_by::type, Chris@16: const BOOST_DEDUCED_TYPENAME Chris@16: ::boost::bimaps::support::value_type_by::type Chris@16: > type; Chris@16: }; Chris@16: template< class Tag, class BimapCore > Chris@16: struct const_local_map_view_iterator : Chris@16: public const_local_map_view_iterator_adaptor::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME Chris@16: const_local_map_view_iterator_adaptor::type base_; Chris@16: public: Chris@16: Chris@16: const_local_map_view_iterator() {} Chris@16: const_local_map_view_iterator( Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type const& iter) Chris@16: : base_(iter) {} Chris@16: const_local_map_view_iterator(const_local_map_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: const_local_map_view_iterator(local_map_view_iterator i) Chris@16: : base_(i.base()) {} Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference dereference() const Chris@16: { Chris@16: return ::boost::bimaps::relation::support::pair_by(*this->base()); Chris@16: } Chris@16: private: Chris@16: friend class iterator_core_access; Chris@16: BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT Chris@16: }; Chris@16: Chris@16: #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace bimaps Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP Chris@16: Chris@16: