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
19 #include <boost/config.hpp>
23 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
24 #include <boost/serialization/nvp.hpp>
25 #include <boost/serialization/split_member.hpp>
26 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
28 #include <boost/iterator/detail/enable_if.hpp>
29 #include <boost/iterator/iterator_adaptor.hpp>
30 #include <boost/bimap/relation/support/get_pair_functor.hpp>
37 /** \brief Set View Iterator adaptor from multi index to bimap.
39 This is class is based on transform iterator from Boost.Iterator that is
40 modified to allow serialization. It has been specialized for this
41 library, and EBO optimization was applied to the functor.
45 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
47 template< class CoreIterator > struct set_view_iterator;
49 template< class CoreIterator >
50 struct set_view_iterator_base
52 typedef iterator_adaptor
54 set_view_iterator< CoreIterator >,
56 BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
61 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
63 template< class CoreIterator >
64 struct set_view_iterator : public set_view_iterator_base<CoreIterator>::type
66 typedef BOOST_DEDUCED_TYPENAME set_view_iterator_base<CoreIterator>::type base_;
70 set_view_iterator() {}
72 set_view_iterator(CoreIterator const& iter)
75 set_view_iterator(set_view_iterator const & iter)
76 : base_(iter.base()) {}
78 typename base_::reference dereference() const
81 BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
88 friend class iterator_core_access;
90 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
92 // Serialization support
94 BOOST_SERIALIZATION_SPLIT_MEMBER()
96 friend class ::boost::serialization::access;
98 template< class Archive >
99 void save(Archive & ar, const unsigned int) const
101 ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
104 template< class Archive >
105 void load(Archive & ar, const unsigned int)
108 ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
109 this->base_reference() = iter;
112 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
115 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
117 template< class CoreIterator > struct const_set_view_iterator;
119 template< class CoreIterator >
120 struct const_set_view_iterator_base
122 typedef iterator_adaptor
124 const_set_view_iterator< CoreIterator >,
126 const BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
131 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
134 /** \brief Const Set View Iterator adaptor from multi index to bimap.
136 See also set_view_iterator.
139 template< class CoreIterator >
140 struct const_set_view_iterator : public const_set_view_iterator_base<CoreIterator>::type
142 typedef BOOST_DEDUCED_TYPENAME const_set_view_iterator_base<CoreIterator>::type base_;
146 const_set_view_iterator() {}
148 const_set_view_iterator(CoreIterator const& iter)
151 const_set_view_iterator(const_set_view_iterator const & iter)
152 : base_(iter.base()) {}
154 const_set_view_iterator(set_view_iterator<CoreIterator> i)
157 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
159 return this->base()->get_view();
164 friend class iterator_core_access;
166 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
168 // Serialization support
170 BOOST_SERIALIZATION_SPLIT_MEMBER()
172 friend class ::boost::serialization::access;
174 template< class Archive >
175 void save(Archive & ar, const unsigned int) const
177 ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
180 template< class Archive >
181 void load(Archive & ar, const unsigned int)
184 ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
185 this->base_reference() = iter;
188 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
192 } // namespace detail
193 } // namespace bimaps
196 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP