Add Boost.Test karmic valgrind suppressions
[senf.git] / boost / bimap / detail / set_view_iterator.hpp
1 // Boost.Bimap
2 //
3 // Copyright (c) 2006-2007 Matias Capeletto
4 //
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)
8
9 /// \file detail/set_view_iterator.hpp
10 /// \brief Iterator adaptors from multi-index to bimap.
11
12 #ifndef BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP
13 #define BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP
14
15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
16 #pragma once
17 #endif
18
19 #include <boost/config.hpp>
20
21 // Boost
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>
26
27 namespace boost {
28 namespace bimaps {
29 namespace detail {
30
31
32 /** \brief Set View Iterator adaptor from multi index to bimap.
33
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.
37
38                                                                       **/
39
40 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
41
42 template< class CoreIterator > struct set_view_iterator;
43
44 template< class CoreIterator >
45 struct set_view_iterator_base
46 {
47     typedef iterator_adaptor
48     <
49         set_view_iterator< CoreIterator >,
50         CoreIterator,
51         BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
52
53     > type;
54 };
55
56 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
57
58 template< class CoreIterator >
59 struct set_view_iterator : public set_view_iterator_base<CoreIterator>::type
60 {
61     typedef BOOST_DEDUCED_TYPENAME set_view_iterator_base<CoreIterator>::type base_;
62
63     public:
64
65     set_view_iterator() {}
66
67     set_view_iterator(CoreIterator const& iter)
68       : base_(iter) {}
69
70     set_view_iterator(set_view_iterator const & iter)
71       : base_(iter.base()) {}
72
73     typename base_::reference dereference() const
74     {
75         return const_cast<
76             BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>(
77                 &(*this->base())
78             )->get_view();
79     }
80
81     private:
82
83     friend class iterator_core_access;
84
85     #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
86
87     // Serialization support
88
89     BOOST_SERIALIZATION_SPLIT_MEMBER()
90
91     friend class ::boost::serialization::access;
92
93     template< class Archive >
94     void save(Archive & ar, const unsigned int version) const
95     {
96         ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
97     }
98
99     template< class Archive >
100     void load(Archive & ar, const unsigned int version)
101     {
102         CoreIterator iter;
103         ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
104         this->base_reference() = iter;
105     }
106
107     #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
108 };
109
110 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
111
112 template< class CoreIterator > struct const_set_view_iterator;
113
114 template< class CoreIterator >
115 struct const_set_view_iterator_base
116 {
117     typedef iterator_adaptor
118     <
119         const_set_view_iterator< CoreIterator >,
120         CoreIterator,
121         const BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view
122
123     > type;
124 };
125
126 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
127
128
129 /** \brief Const Set View Iterator adaptor from multi index to bimap.
130
131 See also set_view_iterator.
132                                                                       **/
133
134 template< class CoreIterator >
135 struct const_set_view_iterator : public const_set_view_iterator_base<CoreIterator>::type
136 {
137     typedef BOOST_DEDUCED_TYPENAME const_set_view_iterator_base<CoreIterator>::type base_;
138
139     public:
140
141     const_set_view_iterator() {}
142
143     const_set_view_iterator(CoreIterator const& iter)
144       : base_(iter) {}
145
146     const_set_view_iterator(const_set_view_iterator const & iter)
147       : base_(iter.base()) {}
148
149     const_set_view_iterator(set_view_iterator<CoreIterator> i)
150       : base_(i.base()) {}
151
152     BOOST_DEDUCED_TYPENAME base_::reference dereference() const
153     {
154         return this->base()->get_view();
155     }
156
157     private:
158
159     friend class iterator_core_access;
160
161     #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION
162
163     // Serialization support
164
165     BOOST_SERIALIZATION_SPLIT_MEMBER()
166
167     friend class ::boost::serialization::access;
168
169     template< class Archive >
170     void save(Archive & ar, const unsigned int version) const
171     {
172         ar << ::boost::serialization::make_nvp("mi_iterator",this->base());
173     }
174
175     template< class Archive >
176     void load(Archive & ar, const unsigned int version)
177     {
178         CoreIterator iter;
179         ar >> ::boost::serialization::make_nvp("mi_iterator",iter);
180         this->base_reference() = iter;
181     }
182
183     #endif // BOOST_BIMAP_DISABLE_SERIALIZATION
184 };
185
186
187 } // namespace detail
188 } // namespace bimaps
189 } // namespace boost
190
191 #endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP
192
193