3 // Copyright (c) 2006-2007 Matias Capeletto
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 /// \file detail/set_view_iterator.hpp
10 /// \brief Iterator adaptors from multi-index to bimap.
12 #ifndef BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP
13 #define BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP
15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
19 #include <boost/config.hpp>
22 // #include <boost/serialization/nvp.hpp>
23 #include <boost/iterator/detail/enable_if.hpp>
24 #include <boost/iterator/iterator_adaptor.hpp>
25 #include <boost/bimap/relation/support/get_pair_functor.hpp>
32 /** \brief Set View Iterator adaptor from multi index to bimap.
34 This is class is based on transform iterator from Boost.Iterator that is
35 modified to allow serialization. It has been specialized for this
36 library, and EBO optimization was applied to the functor.
40 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
42 template< class CoreIterator > struct set_view_iterator;
44 template< class CoreIterator >
45 struct set_view_iterator_base
47 typedef iterator_adaptor
49 set_view_iterator< CoreIterator >,
51 BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
56 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
58 template< class CoreIterator >
59 struct set_view_iterator : public set_view_iterator_base<CoreIterator>::type
61 typedef BOOST_DEDUCED_TYPENAME set_view_iterator_base<CoreIterator>::type base_;
65 set_view_iterator() {}
67 set_view_iterator(CoreIterator const& iter)
70 set_view_iterator(set_view_iterator const & iter)
71 : base_(iter.base()) {}
73 typename base_::reference dereference() const
76 BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
83 friend class iterator_core_access;
85 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
87 // Serialization support
89 BOOST_SERIALIZATION_SPLIT_MEMBER()
91 friend class ::boost::serialization::access;
93 template< class Archive >
94 void save(Archive & ar, const unsigned int version) const
96 ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
99 template< class Archive >
100 void load(Archive & ar, const unsigned int version)
103 ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
104 this->base_reference() = iter;
107 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
110 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
112 template< class CoreIterator > struct const_set_view_iterator;
114 template< class CoreIterator >
115 struct const_set_view_iterator_base
117 typedef iterator_adaptor
119 const_set_view_iterator< CoreIterator >,
121 const BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
126 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
129 /** \brief Const Set View Iterator adaptor from multi index to bimap.
131 See also set_view_iterator.
134 template< class CoreIterator >
135 struct const_set_view_iterator : public const_set_view_iterator_base<CoreIterator>::type
137 typedef BOOST_DEDUCED_TYPENAME const_set_view_iterator_base<CoreIterator>::type base_;
141 const_set_view_iterator() {}
143 const_set_view_iterator(CoreIterator const& iter)
146 const_set_view_iterator(const_set_view_iterator const & iter)
147 : base_(iter.base()) {}
149 const_set_view_iterator(set_view_iterator<CoreIterator> i)
152 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
154 return this->base()->get_view();
159 friend class iterator_core_access;
161 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
163 // Serialization support
165 BOOST_SERIALIZATION_SPLIT_MEMBER()
167 friend class ::boost::serialization::access;
169 template< class Archive >
170 void save(Archive & ar, const unsigned int version) const
172 ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
175 template< class Archive >
176 void load(Archive & ar, const unsigned int version)
179 ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
180 this->base_reference() = iter;
183 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
187 } // namespace detail
188 } // namespace bimaps
191 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP