123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- // Boost.Bimap
- //
- // Copyright (c) 2006-2007 Matias Capeletto
- //
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- /// \file detail/set_view_iterator.hpp
- /// \brief Iterator adaptors from multi-index to bimap.
- #ifndef BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP
- #define BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #include <boost/config.hpp>
- // Boost
- #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
- #include <boost/core/serialization.hpp>
- #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
- #include <boost/iterator/detail/enable_if.hpp>
- #include <boost/iterator/iterator_adaptor.hpp>
- #include <boost/bimap/relation/support/get_pair_functor.hpp>
- namespace boost {
- namespace bimaps {
- namespace detail {
- /** \brief Set View Iterator adaptor from multi index to bimap.
- This is class is based on transform iterator from Boost.Iterator that is
- modified to allow serialization. It has been specialized for this
- library, and EBO optimization was applied to the functor.
- **/
- #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
- template< class CoreIterator > struct set_view_iterator;
- template< class CoreIterator >
- struct set_view_iterator_base
- {
- typedef iterator_adaptor
- <
- set_view_iterator< CoreIterator >,
- CoreIterator,
- BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
- > type;
- };
- #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
- template< class CoreIterator >
- struct set_view_iterator : public set_view_iterator_base<CoreIterator>::type
- {
- typedef BOOST_DEDUCED_TYPENAME set_view_iterator_base<CoreIterator>::type base_;
- public:
- set_view_iterator() {}
- set_view_iterator(CoreIterator const& iter)
- : base_(iter) {}
- set_view_iterator(set_view_iterator const & iter)
- : base_(iter.base()) {}
- typename base_::reference dereference() const
- {
- return const_cast<
- BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
- &(*this->base())
- )->get_view();
- }
- private:
- friend class boost::iterators::iterator_core_access;
- #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
- // Serialization support
- template< class Archive >
- void serialize(Archive & ar, const unsigned int v)
- {
- boost::core::split_member(ar, *this, v);
- }
- friend class ::boost::serialization::access;
- template< class Archive >
- void save(Archive & ar, const unsigned int) const
- {
- ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
- }
- template< class Archive >
- void load(Archive & ar, const unsigned int)
- {
- CoreIterator iter;
- ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
- this->base_reference() = iter;
- }
- #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
- };
- #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
- template< class CoreIterator > struct const_set_view_iterator;
- template< class CoreIterator >
- struct const_set_view_iterator_base
- {
- typedef iterator_adaptor
- <
- const_set_view_iterator< CoreIterator >,
- CoreIterator,
- const BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
- > type;
- };
- #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
- /** \brief Const Set View Iterator adaptor from multi index to bimap.
- See also set_view_iterator.
- **/
- template< class CoreIterator >
- struct const_set_view_iterator : public const_set_view_iterator_base<CoreIterator>::type
- {
- typedef BOOST_DEDUCED_TYPENAME const_set_view_iterator_base<CoreIterator>::type base_;
- public:
- const_set_view_iterator() {}
- const_set_view_iterator(CoreIterator const& iter)
- : base_(iter) {}
- const_set_view_iterator(const_set_view_iterator const & iter)
- : base_(iter.base()) {}
- const_set_view_iterator(set_view_iterator<CoreIterator> i)
- : base_(i.base()) {}
- BOOST_DEDUCED_TYPENAME base_::reference dereference() const
- {
- return this->base()->get_view();
- }
- private:
- friend class boost::iterators::iterator_core_access;
- #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
- // Serialization support
- template< class Archive >
- void serialize(Archive & ar, const unsigned int v)
- {
- boost::core::split_member(ar, *this, v);
- }
- friend class ::boost::serialization::access;
- template< class Archive >
- void save(Archive & ar, const unsigned int) const
- {
- ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
- }
- template< class Archive >
- void load(Archive & ar, const unsigned int)
- {
- CoreIterator iter;
- ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
- this->base_reference() = iter;
- }
- #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
- };
- } // namespace detail
- } // namespace bimaps
- } // namespace boost
- #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
|