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 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
27 #include <boost/iterator/detail/enable_if.hpp>
28 #include <boost/iterator/iterator_adaptor.hpp>
29 #include <boost/bimap/relation/support/get_pair_functor.hpp>
36 /** \brief Set View Iterator adaptor from multi index to bimap.
38 This is class is based on transform iterator from Boost.Iterator that is
39 modified to allow serialization. It has been specialized for this
40 library, and EBO optimization was applied to the functor.
44 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
46 template< class CoreIterator > struct set_view_iterator;
48 template< class CoreIterator >
49 struct set_view_iterator_base
51 typedef iterator_adaptor
53 set_view_iterator< CoreIterator >,
55 BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
60 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
62 template< class CoreIterator >
63 struct set_view_iterator : public set_view_iterator_base<CoreIterator>::type
65 typedef BOOST_DEDUCED_TYPENAME set_view_iterator_base<CoreIterator>::type base_;
69 set_view_iterator() {}
71 set_view_iterator(CoreIterator const& iter)
74 set_view_iterator(set_view_iterator const & iter)
75 : base_(iter.base()) {}
77 typename base_::reference dereference() const
80 BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
87 friend class iterator_core_access;
89 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
91 // Serialization support
93 BOOST_SERIALIZATION_SPLIT_MEMBER()
95 friend class ::boost::serialization::access;
97 template< class Archive >
98 void save(Archive & ar, const unsigned int) const
100 ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
103 template< class Archive >
104 void load(Archive & ar, const unsigned int)
107 ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
108 this->base_reference() = iter;
111 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
114 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
116 template< class CoreIterator > struct const_set_view_iterator;
118 template< class CoreIterator >
119 struct const_set_view_iterator_base
121 typedef iterator_adaptor
123 const_set_view_iterator< CoreIterator >,
125 const BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
130 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
133 /** \brief Const Set View Iterator adaptor from multi index to bimap.
135 See also set_view_iterator.
138 template< class CoreIterator >
139 struct const_set_view_iterator : public const_set_view_iterator_base<CoreIterator>::type
141 typedef BOOST_DEDUCED_TYPENAME const_set_view_iterator_base<CoreIterator>::type base_;
145 const_set_view_iterator() {}
147 const_set_view_iterator(CoreIterator const& iter)
150 const_set_view_iterator(const_set_view_iterator const & iter)
151 : base_(iter.base()) {}
153 const_set_view_iterator(set_view_iterator<CoreIterator> i)
156 BOOST_DEDUCED_TYPENAME base_::reference dereference() const
158 return this->base()->get_view();
163 friend class iterator_core_access;
165 #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
167 // Serialization support
169 BOOST_SERIALIZATION_SPLIT_MEMBER()
171 friend class ::boost::serialization::access;
173 template< class Archive >
174 void save(Archive & ar, const unsigned int) const
176 ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
179 template< class Archive >
180 void load(Archive & ar, const unsigned int)
183 ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
184 this->base_reference() = iter;
187 #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
191 } // namespace detail
192 } // namespace bimaps
195 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP