199 lines
4.9 KiB
C++
199 lines
4.9 KiB
C++
|
// 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/serialization/nvp.hpp>
|
||
|
#include <boost/serialization/split_member.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 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) 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 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) 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
|
||
|
|
||
|
|