1
// (C) Copyright Thomas Becker 2005. Permission to copy, use, modify, sell and
2
// distribute this software is granted provided this copyright notice appears
3
// in all copies. This software is provided "as is" without express or implied
4
// warranty, and with no claim as to its suitability for any purpose.
9
// 27 Dec 2006 (Thomas Becker) Created
11
#ifndef ANY_ITERATOR_ABSTRACT_BASE_01102007TMB_HPP
12
#define ANY_ITERATOR_ABSTRACT_BASE_01102007TMB_HPP
17
#include "any_iterator_metafunctions.hpp"
19
#include <boost/iterator/iterator_categories.hpp>
20
#include <boost/type_traits/add_const.hpp>
21
#include <boost/type_traits/remove_const.hpp>
23
namespace IteratorTypeErasure
29
///////////////////////////////////////////////////////////////////////
31
// The partial specializations of any_iterator_abstract_base (which is
32
// the equivalent of boost::any::placeholder) mirror the hierarchy of
33
// boost's iterator traversal tags.
35
// The first four template arguments are as in boost::iterator_facade.
36
// The last template argument is the traversal tag of the most
37
// derived class of the current instantiation of the hierarchy. This
38
// is a slight variant of the CRTP where the derived class passes
39
// itself as a template argument to the base class(es). Here, it seemed
40
// more convenient to pass up just the traversal tag of the most
48
class UsedAsBaseForTraversal = Traversal
50
class any_iterator_abstract_base;
52
///////////////////////////////////////////////////////////////////////
58
class UsedAsBaseForTraversal
60
class any_iterator_abstract_base<
62
boost::incrementable_traversal_tag,
65
UsedAsBaseForTraversal
70
typedef any_iterator_abstract_base<
72
UsedAsBaseForTraversal,
77
typedef most_derived_type clone_result_type;
79
typedef any_iterator_abstract_base<
80
typename boost::add_const<Value>::type,
81
UsedAsBaseForTraversal,
82
typename make_iterator_reference_const<Reference>::type,
84
> const_clone_with_const_value_type_result_type;
86
typedef any_iterator_abstract_base<
87
typename boost::remove_const<Value>::type,
88
UsedAsBaseForTraversal,
89
typename make_iterator_reference_const<Reference>::type,
91
> const_clone_with_non_const_value_type_result_type;
95
// Plain clone function for copy construction and assignment.
96
virtual clone_result_type * clone() const=0;
98
// Clone functions for conversion to a const iterator
99
virtual const_clone_with_const_value_type_result_type * make_const_clone_with_const_value_type() const=0;
100
virtual const_clone_with_non_const_value_type_result_type * make_const_clone_with_non_const_value_type() const=0;
102
// gcc 3.4.2 does not like pure virtual declaration with inline definition,
103
// so I make the destructor non-pure just to spite them.
104
virtual ~any_iterator_abstract_base()
107
virtual Reference dereference() const=0;
108
virtual void increment() = 0;
112
///////////////////////////////////////////////////////////////////////
118
class UsedAsBaseForTraversal
120
class any_iterator_abstract_base<
122
boost::single_pass_traversal_tag,
125
UsedAsBaseForTraversal
126
> : public any_iterator_abstract_base<
128
boost::incrementable_traversal_tag,
131
UsedAsBaseForTraversal
137
// gcc 3.4.2 insists on qualification of most_derived_type.
138
virtual bool equal(typename any_iterator_abstract_base::most_derived_type const &) const = 0;
140
virtual any_iterator_abstract_base<
142
boost::incrementable_traversal_tag,
145
>* make_incrementable_version() const=0;
148
///////////////////////////////////////////////////////////////////////
154
class UsedAsBaseForTraversal
156
class any_iterator_abstract_base<
158
boost::forward_traversal_tag,
161
UsedAsBaseForTraversal
162
> : public any_iterator_abstract_base<
164
boost::single_pass_traversal_tag,
167
UsedAsBaseForTraversal
171
virtual any_iterator_abstract_base<
173
boost::single_pass_traversal_tag,
176
>* make_single_pass_version() const=0;
179
///////////////////////////////////////////////////////////////////////
185
class UsedAsBaseForTraversal
187
class any_iterator_abstract_base<
189
boost::bidirectional_traversal_tag,
192
UsedAsBaseForTraversal
193
> : public any_iterator_abstract_base<
195
boost::forward_traversal_tag,
198
UsedAsBaseForTraversal
204
virtual void decrement() = 0;
206
virtual any_iterator_abstract_base<
208
boost::forward_traversal_tag,
211
>* make_forward_version() const=0;
214
///////////////////////////////////////////////////////////////////////
220
class UsedAsBaseForTraversal
222
class any_iterator_abstract_base<
224
boost::random_access_traversal_tag,
227
UsedAsBaseForTraversal
228
> : public any_iterator_abstract_base<
230
boost::bidirectional_traversal_tag,
233
UsedAsBaseForTraversal
239
virtual void advance(Difference) = 0;
241
// gcc 3.4.2 insists on qualification of most_derived_type.
242
virtual Difference distance_to(typename any_iterator_abstract_base::most_derived_type const &) const= 0;
244
virtual any_iterator_abstract_base<
246
boost::bidirectional_traversal_tag,
249
>* make_bidirectional_version() const=0;
252
} // end namespace detail
254
} // end namespace IteratorTypeErasure
256
#endif // ANY_ITERATOR_ABSTRACT_BASE_01102007TMB_HPP