File indexing completed on 2025-09-18 09:04:17
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
0011 #define BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
0012
0013 #include <boost/mpl/if.hpp>
0014 #include <boost/range/detail/any_iterator_buffer.hpp>
0015 #include <boost/iterator/iterator_categories.hpp>
0016 #include <boost/type_traits/is_convertible.hpp>
0017 #include <boost/type_traits/is_reference.hpp>
0018 #include <boost/type_traits/remove_const.hpp>
0019 #include <boost/type_traits/remove_reference.hpp>
0020
0021 namespace boost
0022 {
0023 namespace range_detail
0024 {
0025 template<class T>
0026 struct const_reference_type_generator
0027 {
0028 typedef typename mpl::if_<
0029 typename is_reference<T>::type,
0030 typename add_const<
0031 typename remove_reference<T>::type
0032 >::type&,
0033 T
0034 >::type type;
0035 };
0036
0037 template<class T>
0038 struct reference_as_value_type_generator
0039 {
0040 typedef typename remove_reference<
0041 typename remove_const<T>::type
0042 >::type value_type;
0043
0044 typedef typename mpl::if_<
0045 typename is_convertible<const value_type&, value_type>::type,
0046 value_type,
0047 T
0048 >::type type;
0049 };
0050
0051 template<
0052 class Reference
0053 , class Buffer
0054 >
0055 struct any_incrementable_iterator_interface
0056 {
0057 typedef Reference reference;
0058 typedef typename const_reference_type_generator<
0059 Reference
0060 >::type const_reference;
0061 typedef typename reference_as_value_type_generator<
0062 Reference
0063 >::type reference_as_value_type;
0064
0065 typedef Buffer buffer_type;
0066
0067 virtual ~any_incrementable_iterator_interface() {}
0068
0069 virtual any_incrementable_iterator_interface*
0070 clone(buffer_type& buffer) const = 0;
0071
0072 virtual any_incrementable_iterator_interface<const_reference, Buffer>*
0073 clone_const_ref(buffer_type& buffer) const = 0;
0074
0075 virtual any_incrementable_iterator_interface<reference_as_value_type, Buffer>*
0076 clone_reference_as_value(buffer_type& buffer) const = 0;
0077
0078 virtual void increment() = 0;
0079 };
0080
0081 template<
0082 class Reference
0083 , class Buffer
0084 >
0085 struct any_single_pass_iterator_interface
0086 : any_incrementable_iterator_interface<Reference, Buffer>
0087 {
0088 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference reference;
0089 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::const_reference const_reference;
0090 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0091 typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0092
0093 virtual any_single_pass_iterator_interface*
0094 clone(buffer_type& buffer) const = 0;
0095
0096 virtual any_single_pass_iterator_interface<const_reference, Buffer>*
0097 clone_const_ref(buffer_type& buffer) const = 0;
0098
0099 virtual any_single_pass_iterator_interface<reference_as_value_type, Buffer>*
0100 clone_reference_as_value(buffer_type& buffer) const = 0;
0101
0102 virtual reference dereference() const = 0;
0103
0104 virtual bool equal(const any_single_pass_iterator_interface& other) const = 0;
0105 };
0106
0107 template<
0108 class Reference
0109 , class Buffer
0110 >
0111 struct any_forward_iterator_interface
0112 : any_single_pass_iterator_interface<Reference, Buffer>
0113 {
0114 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference reference;
0115 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::const_reference const_reference;
0116 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0117 typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0118
0119 virtual any_forward_iterator_interface*
0120 clone(buffer_type& buffer) const = 0;
0121
0122 virtual any_forward_iterator_interface<const_reference, Buffer>*
0123 clone_const_ref(buffer_type& buffer) const = 0;
0124
0125 virtual any_forward_iterator_interface<reference_as_value_type, Buffer>*
0126 clone_reference_as_value(buffer_type& buffer) const = 0;
0127 };
0128
0129 template<
0130 class Reference
0131 , class Buffer
0132 >
0133 struct any_bidirectional_iterator_interface
0134 : any_forward_iterator_interface<Reference, Buffer>
0135 {
0136 typedef typename any_forward_iterator_interface<Reference, Buffer>::reference reference;
0137 typedef typename any_forward_iterator_interface<Reference, Buffer>::const_reference const_reference;
0138 typedef typename any_forward_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0139 typedef typename any_forward_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0140
0141 virtual any_bidirectional_iterator_interface*
0142 clone(buffer_type& buffer) const = 0;
0143
0144 virtual any_bidirectional_iterator_interface<const_reference, Buffer>*
0145 clone_const_ref(buffer_type& buffer) const = 0;
0146
0147 virtual any_bidirectional_iterator_interface<reference_as_value_type, Buffer>*
0148 clone_reference_as_value(buffer_type& buffer) const = 0;
0149
0150 virtual void decrement() = 0;
0151 };
0152
0153 template<
0154 class Reference
0155 , class Difference
0156 , class Buffer
0157 >
0158 struct any_random_access_iterator_interface
0159 : any_bidirectional_iterator_interface<
0160 Reference
0161 , Buffer
0162 >
0163 {
0164 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference reference;
0165 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::const_reference const_reference;
0166 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0167 typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0168 typedef Difference difference_type;
0169
0170 virtual any_random_access_iterator_interface*
0171 clone(buffer_type& buffer) const = 0;
0172
0173 virtual any_random_access_iterator_interface<const_reference, Difference, Buffer>*
0174 clone_const_ref(buffer_type& buffer) const = 0;
0175
0176 virtual any_random_access_iterator_interface<reference_as_value_type, Difference, Buffer>*
0177 clone_reference_as_value(buffer_type& buffer) const = 0;
0178
0179 virtual void advance(Difference offset) = 0;
0180
0181 virtual Difference distance_to(const any_random_access_iterator_interface& other) const = 0;
0182 };
0183
0184 template<
0185 class Traversal
0186 , class Reference
0187 , class Difference
0188 , class Buffer
0189 >
0190 struct any_iterator_interface_type_generator;
0191
0192 template<
0193 class Reference
0194 , class Difference
0195 , class Buffer
0196 >
0197 struct any_iterator_interface_type_generator<
0198 incrementable_traversal_tag
0199 , Reference
0200 , Difference
0201 , Buffer
0202 >
0203 {
0204 typedef any_incrementable_iterator_interface<Reference, Buffer> type;
0205 };
0206
0207 template<
0208 class Reference
0209 , class Difference
0210 , class Buffer
0211 >
0212 struct any_iterator_interface_type_generator<
0213 single_pass_traversal_tag
0214 , Reference
0215 , Difference
0216 , Buffer
0217 >
0218 {
0219 typedef any_single_pass_iterator_interface<Reference, Buffer> type;
0220 };
0221
0222 template<
0223 class Reference
0224 , class Difference
0225 , class Buffer
0226 >
0227 struct any_iterator_interface_type_generator<
0228 forward_traversal_tag
0229 , Reference
0230 , Difference
0231 , Buffer
0232 >
0233 {
0234 typedef any_forward_iterator_interface<Reference, Buffer> type;
0235 };
0236
0237 template<
0238 class Reference
0239 , class Difference
0240 , class Buffer
0241 >
0242 struct any_iterator_interface_type_generator<
0243 bidirectional_traversal_tag
0244 , Reference
0245 , Difference
0246 , Buffer
0247 >
0248 {
0249 typedef any_bidirectional_iterator_interface<Reference, Buffer> type;
0250 };
0251
0252 template<
0253 class Reference
0254 , class Difference
0255 , class Buffer
0256 >
0257 struct any_iterator_interface_type_generator<
0258 random_access_traversal_tag
0259 , Reference
0260 , Difference
0261 , Buffer
0262 >
0263 {
0264 typedef any_random_access_iterator_interface<
0265 Reference
0266 , Difference
0267 , Buffer
0268 > type;
0269 };
0270
0271 }
0272 }
0273
0274 #endif