diff options
Diffstat (limited to 'boost/bimap/detail/set_view_iterator.hpp')
-rw-r--r-- | boost/bimap/detail/set_view_iterator.hpp | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/boost/bimap/detail/set_view_iterator.hpp b/boost/bimap/detail/set_view_iterator.hpp new file mode 100644 index 0000000000..57e6ae3c8b --- /dev/null +++ b/boost/bimap/detail/set_view_iterator.hpp @@ -0,0 +1,193 @@ +// 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) && (_MSC_VER>=1200) +#pragma once +#endif + +#include <boost/config.hpp> + +// Boost +#include <boost/serialization/nvp.hpp> +#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 iterator_core_access; + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + + // Serialization support + + BOOST_SERIALIZATION_SPLIT_MEMBER() + + friend class ::boost::serialization::access; + + template< class Archive > + void save(Archive & ar, const unsigned int version) const + { + ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); + } + + template< class Archive > + void load(Archive & ar, const unsigned int version) + { + 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 iterator_core_access; + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + + // Serialization support + + BOOST_SERIALIZATION_SPLIT_MEMBER() + + friend class ::boost::serialization::access; + + template< class Archive > + void save(Archive & ar, const unsigned int version) const + { + ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); + } + + template< class Archive > + void load(Archive & ar, const unsigned int version) + { + 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 + + |