00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00048 #ifndef STLSOFT_INCL_STLSOFT_ITERATORS_HPP_ADAPTED_ITERATOR_TRAITS
00049 #define STLSOFT_INCL_STLSOFT_ITERATORS_HPP_ADAPTED_ITERATOR_TRAITS
00050
00051 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00052 # define STLSOFT_VER_STLSOFT_ITERATORS_HPP_ADAPTED_ITERATOR_TRAITS_MAJOR 2
00053 # define STLSOFT_VER_STLSOFT_ITERATORS_HPP_ADAPTED_ITERATOR_TRAITS_MINOR 5
00054 # define STLSOFT_VER_STLSOFT_ITERATORS_HPP_ADAPTED_ITERATOR_TRAITS_REVISION 4
00055 # define STLSOFT_VER_STLSOFT_ITERATORS_HPP_ADAPTED_ITERATOR_TRAITS_EDIT 48
00056 #endif
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00075 # include <stlsoft/stlsoft.h>
00076 #endif
00077 #ifndef STLSOFT_INCL_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER
00078 # include <stlsoft/util/std/iterator_helper.hpp>
00079 #endif
00080 #ifndef STLSOFT_INCL_STLSOFT_META_HPP_CAPABILITIES
00081 # include <stlsoft/meta/capabilities.hpp>
00082 #endif
00083 #ifndef STLSOFT_INCL_STLSOFT_META_HPP_SELECT_FIRST_TYPE_IF
00084 # include <stlsoft/meta/select_first_type_if.hpp>
00085 #endif
00086 #if !defined(STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED)
00087 # error This file is not compatible with compilers that do not support member type detection
00088 #else
00089 # ifndef STLSOFT_INCL_STLSOFT_META_HPP_MEMBER_TRAITS
00090 # include <stlsoft/meta/member_traits.hpp>
00091 # endif
00092 # ifndef STLSOFT_INCL_STLSOFT_META_HPP_IS_SAME_TYPE
00093 # include <stlsoft/meta/is_same_type.hpp>
00094 # endif
00095 # ifndef STLSOFT_INCL_STLSOFT_META_HPP_BASE_TYPE_TRAITS
00096 # include <stlsoft/meta/base_type_traits.hpp>
00097 # endif
00098 # ifndef STLSOFT_INCL_STLSOFT_META_HPP_ADD_QUALIFIER
00099 # include <stlsoft/meta/add_qualifier.hpp>
00100 # endif
00101 # ifndef STLSOFT_INCL_STLSOFT_META_TYPEFIXER_HPP_DIFFERENCE_TYPE
00102 # include <stlsoft/meta/typefixer/difference_type.hpp>
00103 # endif
00104 # ifndef STLSOFT_INCL_STLSOFT_META_TYPEFIXER_HPP_POINTER
00105 # include <stlsoft/meta/typefixer/pointer.hpp>
00106 # endif
00107 # ifndef STLSOFT_INCL_STLSOFT_META_TYPEFIXER_HPP_REFERENCE
00108 # include <stlsoft/meta/typefixer/reference.hpp>
00109 # endif
00110 #endif
00111
00112 #if defined(STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT) && \
00113 defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC) && \
00114 STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION < STLSOFT_CF_DINKUMWARE_VC_VERSION_7_1
00115 # ifndef STLSOFT_INCL_STLSOFT_UTIL_STD_DINKUMWARE_ITERATOR_TRAITS
00116 # include <stlsoft/util/std/dinkumware_iterator_traits.hpp>
00117 # endif
00118 #endif
00119
00120
00121
00122
00123
00124 #ifndef _STLSOFT_NO_NAMESPACE
00125 namespace stlsoft
00126 {
00127 #endif
00128
00129
00130
00131
00132
00133 #ifdef STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
00134
00139 template <ss_typename_param_k I>
00140 struct adapted_iterator_traits
00141 {
00142 private:
00143
00144
00145
00146
00147 enum { HAS_MEMBER_DIFFERENCE_TYPE = 0 != member_traits<I>::has_member_difference_type };
00148 enum { HAS_MEMBER_POINTER = 0 != member_traits<I>::has_member_pointer };
00149 #if defined(STLSOFT_COMPILER_IS_MWERKS)
00150 enum { HAS_MEMBER_REFERENCE = 0 != member_traits<I>::has_member_reference };
00151 #else
00152 enum { HAS_MEMBER_REFERENCE = HAS_MEMBER_POINTER };
00153 #endif
00154
00155 public:
00156 enum { IS_DINKUMWARE_OLD_FORM = 0 != member_traits<I>::has_member_distance_type &&
00157 0 == HAS_MEMBER_DIFFERENCE_TYPE };
00158 private:
00159
00160 public:
00164 typedef ss_typename_type_k I::iterator_category iterator_category;
00168 typedef ss_typename_type_k I::value_type value_type;
00172 typedef ss_typename_type_k select_first_type_if<ss_typename_type_k typefixer::fixer_difference_type<I, HAS_MEMBER_DIFFERENCE_TYPE>::difference_type
00173 , ss_ptrdiff_t
00174 , HAS_MEMBER_DIFFERENCE_TYPE
00175 >::type difference_type;
00176 private:
00177 # if defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC) && \
00178 STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION < STLSOFT_CF_DINKUMWARE_VC_VERSION_7_1
00180 typedef ss_typename_type_k select_first_type_if<value_type const*
00181 , value_type*
00182 , Dinkumware_iterator_test<I, IS_DINKUMWARE_OLD_FORM>::is_const
00183 >::type putative_dinkumware_pointer_;
00185 typedef ss_typename_type_k select_first_type_if<value_type const&
00186 , value_type&
00187 , Dinkumware_iterator_test<I, IS_DINKUMWARE_OLD_FORM>::is_const
00188 >::type putative_dinkumware_reference_;
00189
00193 typedef ss_typename_type_k select_first_type_if<putative_dinkumware_pointer_
00194 , ss_typename_type_k typefixer::fixer_pointer<I, HAS_MEMBER_POINTER>::pointer
00195 , IS_DINKUMWARE_OLD_FORM
00196 >::type putative_pointer_;
00200 typedef ss_typename_type_k select_first_type_if<putative_dinkumware_reference_
00201 , ss_typename_type_k typefixer::fixer_reference<I, HAS_MEMBER_POINTER>::reference
00202 , IS_DINKUMWARE_OLD_FORM
00203 >::type putative_reference_;
00204 # else
00205 typedef ss_typename_type_k typefixer::fixer_pointer<I, HAS_MEMBER_POINTER>::pointer putative_pointer_;
00206 typedef ss_typename_type_k typefixer::fixer_reference<I, HAS_MEMBER_REFERENCE>::reference putative_reference_;
00207 # endif
00208 public:
00214 typedef ss_typename_type_k select_first_type_if<putative_pointer_
00215 , void
00216 , HAS_MEMBER_POINTER || IS_DINKUMWARE_OLD_FORM
00217 >::type pointer;
00218
00219
00220
00221
00222 public:
00228 typedef ss_typename_type_k select_first_type_if<putative_reference_
00229 , void
00230 , HAS_MEMBER_REFERENCE || IS_DINKUMWARE_OLD_FORM
00231 >::type reference;
00232 private:
00233
00234
00235
00236
00237
00238
00239
00240 public:
00241 enum { REF_CAT_IS_VOID = 0 != is_same_type<value_type, void>::value && (0 == IS_DINKUMWARE_OLD_FORM) };
00242 enum { REF_CAT_IS_BVT = 0 == REF_CAT_IS_VOID && 0 != is_same_type<pointer, void>::value && (0 == IS_DINKUMWARE_OLD_FORM) };
00243 private:
00244
00245 ~adapted_iterator_traits()
00246 {
00247 void (*p)() = constraints;
00248
00249 STLSOFT_SUPPRESS_UNUSED(p);
00250 }
00251
00252
00253 protected:
00254 static void constraints()
00255 {
00256
00257
00258 STLSOFT_STATIC_ASSERT((is_same_type<pointer, void>::value == is_same_type<reference, void>::value));
00259 }
00260 private:
00261
00262
00263 typedef ss_typename_type_k base_type_traits<pointer>::base_type pointer_base_type_;
00264 typedef ss_typename_type_k base_type_traits<reference>::base_type reference_base_type_;
00265
00266
00267
00268
00269
00270
00271
00272
00273 public:
00279 typedef ss_typename_type_k select_first_type_if<void
00280 , pointer_base_type_ const*
00281 , REF_CAT_IS_VOID || REF_CAT_IS_BVT
00282 >::type const_pointer;
00283
00289 typedef ss_typename_type_k select_first_type_if<void
00290 , ss_typename_type_k add_const_ref<reference_base_type_>::type
00291 , REF_CAT_IS_VOID || REF_CAT_IS_BVT
00292 >::type const_reference;
00293
00294 public:
00300 typedef ss_typename_type_k select_first_type_if<value_type
00301 , reference
00302 , REF_CAT_IS_BVT
00303 >::type effective_reference;
00309 typedef ss_typename_type_k select_first_type_if<ss_typename_type_k add_const<value_type>::type
00310 , const_reference
00311 , REF_CAT_IS_BVT
00312 >::type effective_const_reference;
00313
00319 typedef ss_typename_type_k select_first_type_if<void
00320 , pointer
00321 , REF_CAT_IS_BVT
00322 >::type effective_pointer;
00328 typedef ss_typename_type_k select_first_type_if<void
00329 , const_pointer
00330 , REF_CAT_IS_BVT
00331 >::type effective_const_pointer;
00332 };
00333
00334 # ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00335
00336 template <ss_typename_param_k T>
00337 struct adapted_iterator_traits<T*>
00338 {
00339 typedef stlsoft_ns_qual_std(random_access_iterator_tag) iterator_category;
00340 typedef T value_type;
00341 typedef ss_ptrdiff_t difference_type;
00342 typedef value_type* pointer;
00343 typedef value_type const* const_pointer;
00344 typedef value_type& reference;
00345 typedef value_type const& const_reference;
00346 typedef reference effective_reference;
00347 typedef const_reference effective_const_reference;
00348 typedef pointer effective_pointer;
00349 typedef const_pointer effective_const_pointer;
00350 };
00351
00352 template <ss_typename_param_k T>
00353 struct adapted_iterator_traits<T const*>
00354 {
00355 typedef stlsoft_ns_qual_std(random_access_iterator_tag) iterator_category;
00356 typedef T value_type;
00357 typedef ss_ptrdiff_t difference_type;
00358 typedef value_type const* pointer;
00359 typedef value_type const* const_pointer;
00360 typedef value_type const& reference;
00361 typedef value_type const& const_reference;
00362 typedef reference effective_reference;
00363 typedef const_reference effective_const_reference;
00364 typedef pointer effective_pointer;
00365 typedef const_pointer effective_const_pointer;
00366 };
00367
00368 template <ss_typename_param_k T>
00369 struct adapted_iterator_traits<T volatile*>
00370 {
00371 typedef stlsoft_ns_qual_std(random_access_iterator_tag) iterator_category;
00372 typedef T value_type;
00373 typedef ss_ptrdiff_t difference_type;
00374 typedef value_type volatile* pointer;
00375 typedef value_type volatile const* const_pointer;
00376 typedef value_type volatile& reference;
00377 typedef value_type volatile const& const_reference;
00378 typedef reference effective_reference;
00379 typedef const_reference effective_const_reference;
00380 typedef pointer effective_pointer;
00381 typedef const_pointer effective_const_pointer;
00382 };
00383
00384 template <ss_typename_param_k T>
00385 struct adapted_iterator_traits<T const volatile*>
00386 {
00387 typedef stlsoft_ns_qual_std(random_access_iterator_tag) iterator_category;
00388 typedef T value_type;
00389 typedef ss_ptrdiff_t difference_type;
00390 typedef value_type volatile const* pointer;
00391 typedef value_type volatile const* const_pointer;
00392 typedef value_type volatile const& reference;
00393 typedef value_type volatile const& const_reference;
00394 typedef reference effective_reference;
00395 typedef const_reference effective_const_reference;
00396 typedef pointer effective_pointer;
00397 typedef const_pointer effective_const_pointer;
00398 };
00399
00400 # endif
00401
00402 #else
00403
00404 #endif
00405
00406
00407
00408 #ifndef _STLSOFT_NO_NAMESPACE
00409 }
00410 #endif
00411
00412
00413
00414 #endif
00415
00416