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/set_view_iterator.hpp Chris@16: /// \brief Iterator adaptors from multi-index to bimap. Chris@16: Chris@16: #ifndef BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP Chris@16: #define BOOST_BIMAP_DETAIL_SET_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: namespace boost { Chris@16: namespace bimaps { Chris@16: namespace detail { Chris@16: Chris@16: Chris@16: /** \brief Set View Iterator adaptor from multi index to bimap. Chris@16: Chris@16: This is class is based on transform iterator from Boost.Iterator that is Chris@16: modified to allow serialization. It has been specialized for this Chris@16: library, and EBO optimization was applied to the functor. Chris@16: Chris@16: **/ Chris@16: Chris@16: #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES Chris@16: Chris@16: template< class CoreIterator > struct set_view_iterator; Chris@16: Chris@16: template< class CoreIterator > Chris@16: struct set_view_iterator_base Chris@16: { Chris@16: typedef iterator_adaptor Chris@16: < Chris@16: set_view_iterator< CoreIterator >, Chris@16: CoreIterator, Chris@16: BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view Chris@16: Chris@16: > type; Chris@16: }; Chris@16: Chris@16: #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES Chris@16: Chris@16: template< class CoreIterator > Chris@16: struct set_view_iterator : public set_view_iterator_base::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME set_view_iterator_base::type base_; Chris@16: Chris@16: public: Chris@16: Chris@16: set_view_iterator() {} Chris@16: Chris@16: set_view_iterator(CoreIterator const& iter) Chris@16: : base_(iter) {} Chris@16: Chris@16: set_view_iterator(set_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: Chris@16: typename base_::reference dereference() const Chris@16: { Chris@16: return const_cast< Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( Chris@16: &(*this->base()) Chris@16: )->get_view(); Chris@16: } Chris@16: Chris@16: private: Chris@16: Chris@16: friend class iterator_core_access; Chris@16: Chris@16: #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: Chris@16: // Serialization support Chris@16: 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: CoreIterator iter; Chris@16: ar >> ::boost::serialization::make_nvp("mi_iterator",iter); Chris@16: this->base_reference() = iter; Chris@16: } Chris@16: Chris@16: #endif // BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: }; Chris@16: Chris@16: #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES Chris@16: Chris@16: template< class CoreIterator > struct const_set_view_iterator; Chris@16: Chris@16: template< class CoreIterator > Chris@16: struct const_set_view_iterator_base Chris@16: { Chris@16: typedef iterator_adaptor Chris@16: < Chris@16: const_set_view_iterator< CoreIterator >, Chris@16: CoreIterator, Chris@16: const BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view Chris@16: Chris@16: > type; Chris@16: }; Chris@16: Chris@16: #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES Chris@16: Chris@16: Chris@16: /** \brief Const Set View Iterator adaptor from multi index to bimap. Chris@16: Chris@16: See also set_view_iterator. Chris@16: **/ Chris@16: Chris@16: template< class CoreIterator > Chris@16: struct const_set_view_iterator : public const_set_view_iterator_base::type Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME const_set_view_iterator_base::type base_; Chris@16: Chris@16: public: Chris@16: Chris@16: const_set_view_iterator() {} Chris@16: Chris@16: const_set_view_iterator(CoreIterator const& iter) Chris@16: : base_(iter) {} Chris@16: Chris@16: const_set_view_iterator(const_set_view_iterator const & iter) Chris@16: : base_(iter.base()) {} Chris@16: Chris@16: const_set_view_iterator(set_view_iterator i) Chris@16: : base_(i.base()) {} Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference dereference() const Chris@16: { Chris@16: return this->base()->get_view(); Chris@16: } Chris@16: Chris@16: private: Chris@16: Chris@16: friend class iterator_core_access; Chris@16: Chris@16: #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: Chris@16: // Serialization support Chris@16: 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: CoreIterator iter; Chris@16: ar >> ::boost::serialization::make_nvp("mi_iterator",iter); Chris@16: this->base_reference() = iter; Chris@16: } Chris@16: Chris@16: #endif // BOOST_BIMAP_DISABLE_SERIALIZATION Chris@16: }; Chris@16: 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: