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 
00041 
00049 #ifndef STLSOFT_INCL_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER
00050 #define STLSOFT_INCL_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER
00051 
00052 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00053 # define STLSOFT_VER_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER_MAJOR     5
00054 # define STLSOFT_VER_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER_MINOR     3
00055 # define STLSOFT_VER_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER_REVISION  1
00056 # define STLSOFT_VER_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER_EDIT      109
00057 #endif 
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_LIBRARY_DISCRIMINATOR
00078 # include <stlsoft/util/std/library_discriminator.hpp>
00079 #endif 
00080 
00081 #ifndef STLSOFT_INCL_ITERATOR
00082 # define STLSOFT_INCL_ITERATOR
00083 # include <iterator>    
00084 #endif 
00085 
00086 #ifdef STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED_XXXX
00087 # ifndef STLSOFT_INCL_STLSOFT_META_TYPEFIXER_HPP_POINTER
00088 #  include <stlsoft/meta/typefixer/pointer.hpp>
00089 # endif 
00090 # ifndef STLSOFT_INCL_STLSOFT_META_TYPEFIXER_HPP_POINTER_TYPE
00091 #  include <stlsoft/meta/typefixer/pointer_type.hpp>
00092 # endif 
00093 # ifndef STLSOFT_INCL_STLSOFT_META_TYPEFIXER_HPP_REFERENCE
00094 #  include <stlsoft/meta/typefixer/reference.hpp>
00095 # endif 
00096 # ifndef STLSOFT_INCL_STLSOFT_META_TYPEFIXER_HPP_REFERENCE_TYPE
00097 #  include <stlsoft/meta/typefixer/reference_type.hpp>
00098 # endif 
00099 #endif 
00100 
00101 
00102 
00103 
00104 
00105 
00106 #ifdef STLSOFT_COMPILER_IS_MSVC
00107 # pragma warning(disable : 4097)    // suppresses: typedef-name 'identifier1' used as synonym for class-name 'identifier2'
00108 #endif 
00109 
00110 
00111 
00112 
00113 
00114 #ifndef _STLSOFT_NO_NAMESPACE
00115 namespace stlsoft
00116 {
00117 #endif 
00118 
00119 
00120 
00121 
00122 
00123 #if !defined(STLSOFT_OVERRIDE_COMPILER_STD_LIBRARY_CHECK)
00124 
00125 # if 0
00126     
00127 
00128 
00129 #    if (   defined(STLSOFT_COMPILER_IS_INTEL) || \
00130             (   defined(STLSOFT_COMPILER_IS_MSVC) && \
00131                 _MSC_VER >= 1200 && \
00132                 _MSC_VER < 1310)) && \
00133         (   !defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC) && \
00134             !defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT))
00135 #     error When compiling with Intel C/C++ or Microsoft Visual C++, only the Dinkumware or STLport STL implementations are currently supported.
00136 #     error  Please contact Synesis Software (www.synesis.com.au) if you need to support a different STL implementation with these compilers.
00137 #    endif 
00138 # endif 
00139 
00140 #endif 
00141 
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 #ifdef STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00186 # undef STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00187 #endif 
00188 
00189 #ifdef STLSOFT_ITERATOR_ITERATOR_FORM2_SUPPORT
00190 # undef STLSOFT_ITERATOR_ITERATOR_FORM2_SUPPORT
00191 #endif 
00192 
00193 #ifdef STLSOFT_ITERATOR_ITERATOR_FORM3_SUPPORT
00194 # undef STLSOFT_ITERATOR_ITERATOR_FORM3_SUPPORT
00195 #endif 
00196 
00197 
00198 #if defined(STLSOFT_COMPILER_IS_GCC) && \
00199     __GNUC__ < 3
00200  
00201 # define STLSOFT_ITERATOR_ITERATOR_FORM3_SUPPORT
00202 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_BORLAND)
00203 #  define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00204 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC)
00205 # if  STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_4_2 || \
00206       STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_5_0 || \
00207       STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_6_0
00208  
00209 #  define STLSOFT_ITERATOR_ITERATOR_FORM2_SUPPORT
00210 # else
00211 #  define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00212 # endif 
00213 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_MSL)
00214 # define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00215 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
00216 # define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00217 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_HP_SGI)
00218 # if defined(__STL_USE_NAMESPACES)
00219 #  define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00220 # else 
00221 #  define STLSOFT_ITERATOR_ITERATOR_FORM3_SUPPORT
00222 # endif 
00223 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_HP_SGI_GNU)
00224 # define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00225 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_HP_RW)
00226 # define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00227 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_SUNPRO_RW)
00228 # define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00229 #elif defined(STLSOFT_CF_STD_LIBRARY_IS_WATCOM_PATCH)
00230 # define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00231 #else
00232 # error Library version not recognised
00233 #endif 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273 
00274 
00275 
00276 
00277 
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 #ifdef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00329 # undef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00330 #endif 
00331 
00332 #ifdef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM2_SUPPORT
00333 # undef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM2_SUPPORT
00334 #endif 
00335 
00336 #ifdef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM3_SUPPORT
00337 # undef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM3_SUPPORT
00338 #endif 
00339 
00340 #ifdef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM4_SUPPORT
00341 # undef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM4_SUPPORT
00342 #endif 
00343 
00344 #ifdef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM5_SUPPORT
00345 # undef STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM5_SUPPORT
00346 #endif 
00347 
00348 
00349 
00350 
00351 
00352 
00353 
00354 
00355 
00356 
00357 
00358 #if defined(STLSOFT_COMPILER_IS_BORLAND)
00359 # define STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00360 #elif defined(STLSOFT_COMPILER_IS_COMO)
00361 # define STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00362 #elif defined(STLSOFT_COMPILER_IS_DMC)
00363 # if (__DMC__ >= 0x0829)
00364 #  define STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00365 # endif 
00366 #elif defined(STLSOFT_COMPILER_IS_GCC)
00367 # define STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00368 #elif defined(STLSOFT_COMPILER_IS_INTEL)
00369 # define STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00370 #elif defined(STLSOFT_COMPILER_IS_MSVC)
00371 # if _MSC_VER >= 1200
00372 #  define STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00373 # endif 
00374 #elif defined(STLSOFT_COMPILER_IS_MWERKS)
00375 # define STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00376 #elif defined(STLSOFT_COMPILER_IS_SUNPRO)
00377 # if !defined(STLSOFT_CF_STD_LIBRARY_IS_SUNPRO_RW)
00378 #  define STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT
00379 # endif 
00380 
00381 
00382 #elif defined(STLSOFT_COMPILER_IS_VECTORC)
00383 
00384 #elif defined(STLSOFT_COMPILER_IS_WATCOM)
00385 
00386 #else 
00387 # error Compiler/library configuration not recognised. Contact Synesis Software
00388 #endif 
00389 
00390 
00391 
00392 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00393 # define STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT
00394 #else 
00395 # ifdef STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT
00396 #  undef STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT
00397 # endif 
00398 #endif 
00399 
00400 
00401 #if defined(STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT)
00402 
00403 
00404 
00405 # if defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
00406  
00407 #  if 
00408 defined(_STLP_CLASS_PARTIAL_SPECIALIZATION)
00409 #   define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00410 #  else 
00411 #   define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM5_SUPPORT
00412 #  endif 
00413 # elif defined(STLSOFT_CF_STD_LIBRARY_IS_HP_RW)
00414  
00415 #  define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00416 # elif defined(STLSOFT_CF_STD_LIBRARY_IS_HP_SGI_GNU)
00417  
00418 #  define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00419 # elif defined(STLSOFT_CF_STD_LIBRARY_IS_MSL)
00420  
00421 #  define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00422 # elif defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_BORLAND)
00423  
00424 #  define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00425 # elif defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC) && \
00426        ( \
00427            STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_7_0 || \
00428            STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_7_1 || \
00429            STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_8_0 || \
00430            STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_9_0 || \
00431            STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_10_0 || \
00432            0 \
00433        )
00434  
00435 #  define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT
00436 # endif 
00437 
00438 
00439 # if defined(STLSOFT_CF_STD_LIBRARY_IS_HP_SGI)
00440  
00441 #  if defined(__STL_CLASS_PARTIAL_SPECIALIZATION)
00442 #   define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM2_SUPPORT
00443 #  else 
00444 #   define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM5_SUPPORT
00445 #  endif 
00446 # endif 
00447 
00448 
00449 # if defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC) && \
00450      ( \
00451          STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_4_2 || \
00452          STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_5_0 || \
00453          STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_6_0 || \
00454          0 \
00455      )
00456  
00457 #  define STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM3_SUPPORT
00458 # endif 
00459 
00460 
00461 
00462 
00463 
00464 # if defined(STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM1_SUPPORT) || \
00465      defined(STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM2_SUPPORT)
00466 #  define stlsoft_reverse_iterator(I, V, R, P, D)       stlsoft_ns_qual_std(reverse_iterator)<I>
00467 # elif defined(STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM3_SUPPORT)
00468 #  define stlsoft_reverse_iterator(I, V, R, P, D)       stlsoft_ns_qual_std(reverse_iterator)<I, V, R, P, D>
00469 
00470 
00471 # elif defined(STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM5_SUPPORT)
00472 #  define stlsoft_reverse_iterator(I, V, R, P, D)       stlsoft_ns_qual_std(reverse_iterator)<I, V, R, D>
00473 # else
00474 #  error reverse_iterator form not recognised
00475 # endif 
00476 
00477 
00478 
00479 # if defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC) && \
00480      (   STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_4_2 || \
00481          STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_5_0 || \
00482          STLSOFT_CF_STD_LIBRARY_DINKUMWARE_VC_VERSION == STLSOFT_CF_DINKUMWARE_VC_VERSION_6_0)
00483 #  define stlsoft_reverse_bidirectional_iterator(I, V, R, P, D)      stlsoft_ns_qual_std(reverse_bidirectional_iterator)<I, V, R, P, D>
00484 # elif defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT) && \
00485        !defined(_STLP_CLASS_PARTIAL_SPECIALIZATION)
00486 #  define stlsoft_reverse_bidirectional_iterator(I, V, R, P, D)      stlsoft_ns_qual_std(reverse_bidirectional_iterator)<I, V, R, P, D>
00487 # else
00488 #  define stlsoft_reverse_bidirectional_iterator(I, V, R, P, D)      stlsoft_reverse_iterator(I, V, R, P, D)
00489 # endif 
00490 
00491 #endif 
00492 
00493 
00494 
00495 
00496 
00497 
00502 
00515 template<   ss_typename_param_k C   
00516         ,   ss_typename_param_k V   
00517         ,   ss_typename_param_k D   
00518         ,   ss_typename_param_k P   
00519         ,   ss_typename_param_k R   
00520         >
00521 struct iterator_base
00522 #if defined(STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT)
00523     : public stlsoft_ns_qual_std(iterator)<C, V, D, P, R>
00524 #elif defined(STLSOFT_ITERATOR_ITERATOR_FORM2_SUPPORT)
00525     : public stlsoft_ns_qual_std(iterator)<C, V, D>
00526 #elif defined(STLSOFT_ITERATOR_ITERATOR_FORM3_SUPPORT)
00527     
00528 #else
00529 # error Further iterator form discrimination required
00530 #endif 
00531 {
00532 private:
00533 #if defined(STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT)
00534     typedef stlsoft_ns_qual_std(iterator)<C, V, D, P, R>    parent_class_type;
00535 #elif defined(STLSOFT_ITERATOR_ITERATOR_FORM2_SUPPORT)
00536     typedef stlsoft_ns_qual_std(iterator)<C, V, D>          parent_class_type;
00537 #elif defined(STLSOFT_ITERATOR_ITERATOR_FORM3_SUPPORT)
00538     
00539     typedef void                                            parent_class_type;
00540 #else
00541 # error Further iterator form discrimination required
00542 #endif 
00543 
00544 
00545 # ifdef STLSOFT_CF_HAS_MEMBER_TYPE_SUPPORTED_XXXX
00546 private:
00547     
00548     enum { has_member_iterator_category     =   0 != has_iterator_category<parent_class_type>::value    };
00549 
00550     
00551     enum { has_member_value_type            =   0 != has_value_type<parent_class_type>::value           };
00552 
00553     
00554     enum { has_member_distance_type         =   0 != has_distance_type<parent_class_type>::value        };
00555 
00556     
00557     enum { has_member_pointer               =   0 != has_pointer<parent_class_type>::value              };
00558     enum { has_member_pointer_type          =   0 != has_pointer_type<parent_class_type>::value         };
00559 
00560     
00561     enum { has_member_reference             =   0 != has_reference<parent_class_type>::value            };
00562     enum { has_member_reference_type        =   0 != has_reference_type<parent_class_type>::value       };
00563 
00564     typedef C               iterator_category_candidate;
00565     typedef V               value_type_candidate;
00566     typedef D               distance_candidate;
00567     typedef P               pointer_candidate;
00568     typedef R               reference_candidate;
00569 
00570 public:
00572     typedef ss_typename_type_k select_first_type_if<ss_typename_type_k fixer_pointer_type<parent_class_type, has_member_pointer_type>::pointer_type
00573                                                 ,   ss_typename_type_k fixer_pointer<parent_class_type, has_member_pointer>::pointer
00574                                                 ,   has_member_pointer_type
00575                                                 >::type             pointer;
00577     typedef ss_typename_type_k select_first_type_if<ss_typename_type_k fixer_reference_type<parent_class_type, has_member_reference_type>::reference_type
00578                                                 ,   ss_typename_type_k fixer_reference<parent_class_type, has_member_reference>::reference
00579                                                 ,   has_member_reference_type
00580                                                 >::type             reference;
00581 
00582 # else 
00583 
00584 public:
00585 #if defined(STLSOFT_ITERATOR_ITERATOR_FORM3_SUPPORT)
00586     typedef C                                                       iterator_category;
00587     typedef V                                                       value_type;
00588     typedef D                                                       difference_type;
00589     typedef P                                                       pointer;
00590     typedef R                                                       reference;
00591 #else
00592   
00593     typedef ss_typename_type_k parent_class_type::iterator_category iterator_category;
00594     typedef ss_typename_type_k parent_class_type::value_type        value_type;
00595 # if defined(STLSOFT_ITERATOR_ITERATOR_FORM1_SUPPORT)
00596     typedef ss_typename_type_k parent_class_type::difference_type   difference_type;
00597     typedef ss_typename_type_k parent_class_type::pointer           pointer;
00598     typedef ss_typename_type_k parent_class_type::reference         reference;
00599 # elif defined(STLSOFT_ITERATOR_ITERATOR_FORM2_SUPPORT)
00600     typedef ss_typename_type_k parent_class_type::distance_type     difference_type;
00601     typedef P                                                       pointer;
00602     typedef R                                                       reference;
00603 # else
00604 #  error Further iterator form discrimination required
00605 # endif 
00606 #endif 
00607 
00608 # endif 
00609 
00610     
00611 
00612 
00613     typedef pointer                                                 pointer_type;
00614     typedef reference                                               reference_type;
00615 };
00616 
00617 
00618 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00619 
00620 
00621 
00622 
00623 
00624 
00625 
00626 
00627 
00632 
00645 template<   ss_typename_param_k I   
00646         ,   ss_typename_param_k V   
00647         ,   ss_typename_param_k R   
00648         ,   ss_typename_param_k P   
00649         ,   ss_typename_param_k D   
00650         >
00651 struct reverse_iterator_base
00652     : public stlsoft_reverse_iterator(I, V, R, P, D)
00653 {
00654 public:
00655     typedef stlsoft_reverse_iterator(I, V, R, P, D)                 parent_class_type;
00656 
00657     typedef ss_typename_type_k parent_class_type::iterator_category iterator_category;
00658     typedef ss_typename_type_k parent_class_type::value_type        value_type;
00659 # if defined(STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM3_SUPPORT)
00660     typedef ss_typename_type_k parent_class_type::distance_type     difference_type;
00661     typedef ss_typename_type_k parent_class_type::pointer_type      pointer;
00662     typedef ss_typename_type_k parent_class_type::reference_type    reference;
00663 # else 
00664     typedef ss_typename_type_k parent_class_type::difference_type   difference_type;
00665     typedef ss_typename_type_k parent_class_type::pointer           pointer;
00666     typedef ss_typename_type_k parent_class_type::reference         reference;
00667 # endif 
00668 
00669     
00670 
00671 
00672     typedef pointer                                                 pointer_type;
00673     typedef reference                                               reference_type;
00674 
00675 
00676 public:
00678     ss_explicit_k reverse_iterator_base(I i)
00679         : parent_class_type(i)
00680     {}
00681 };
00682 
00683 
00688 
00701 template<   ss_typename_param_k I   
00702         ,   ss_typename_param_k V   
00703         ,   ss_typename_param_k R   
00704         ,   ss_typename_param_k P   
00705         ,   ss_typename_param_k D   
00706         >
00707 struct const_reverse_iterator_base                  
00708     : public reverse_iterator_base<I, V, R, P, D>   
00709 {
00710 public:
00711     typedef reverse_iterator_base<I, V, R, P, D>                    parent_class_type;
00712 
00714     typedef ss_typename_type_k parent_class_type::iterator_category iterator_category;
00716     typedef ss_typename_type_k parent_class_type::value_type        value_type;
00718     typedef ss_typename_type_k parent_class_type::difference_type   difference_type;
00720     typedef ss_typename_type_k parent_class_type::pointer           pointer;
00722     typedef ss_typename_type_k parent_class_type::reference         reference;
00723 
00724     
00725 
00726 
00728     typedef ss_typename_type_k parent_class_type::pointer_type      pointer_type;
00730     typedef ss_typename_type_k parent_class_type::reference_type    reference_type;
00731 
00732 
00733 public:
00735     ss_explicit_k const_reverse_iterator_base(I i)
00736         : parent_class_type(i)
00737     {}
00738 
00739     
00740     
00741     template<   ss_typename_param_k I2
00742             ,   ss_typename_param_k V2
00743             ,   ss_typename_param_k R2
00744             ,   ss_typename_param_k P2
00745             ,   ss_typename_param_k D2
00746             >
00747     const_reverse_iterator_base(reverse_iterator_base<I2, V2, R2, P2, D2> const& rhs)
00748         : parent_class_type(rhs.base())
00749     {}
00750 };
00751 
00752 template<   ss_typename_param_k I1, ss_typename_param_k V1, ss_typename_param_k R1, ss_typename_param_k P1, ss_typename_param_k D
00753         ,   ss_typename_param_k I2, ss_typename_param_k V2, ss_typename_param_k R2, ss_typename_param_k P2
00754         >
00755 inline bool operator !=(
00756     const_reverse_iterator_base<I1, V1, R1, P1, D> const&   lhs
00757 ,   reverse_iterator_base<I2, V2, R2, P2, D> const&         rhs
00758 )
00759 {
00760     return lhs.base() != rhs.base();
00761 }
00762 
00763 template<   ss_typename_param_k I1, ss_typename_param_k V1, ss_typename_param_k R1, ss_typename_param_k P1, ss_typename_param_k D
00764         ,   ss_typename_param_k I2, ss_typename_param_k V2, ss_typename_param_k R2, ss_typename_param_k P2
00765         >
00766 inline bool operator !=(
00767     reverse_iterator_base<I1, V1, R1, P1, D> const&         lhs
00768 ,   const_reverse_iterator_base<I2, V2, R2, P2, D> const&   rhs
00769 )
00770 {
00771     return lhs.base() != rhs.base();
00772 }
00773 
00774 template<   ss_typename_param_k I1, ss_typename_param_k V1, ss_typename_param_k R1, ss_typename_param_k P1, ss_typename_param_k D
00775         >
00776 inline bool operator !=(
00777     const_reverse_iterator_base<I1, V1, R1, P1, D> const&   lhs
00778 ,   const_reverse_iterator_base<I1, V1, R1, P1, D> const&   rhs
00779 )
00780 {
00781     return lhs.base() != rhs.base();
00782 }
00783 
00784 
00785 
00790 
00803 template<   ss_typename_param_k I   
00804         ,   ss_typename_param_k V   
00805         ,   ss_typename_param_k R   
00806         ,   ss_typename_param_k P   
00807         ,   ss_typename_param_k D   
00808         >
00809 struct reverse_bidirectional_iterator_base
00810     : public stlsoft_reverse_bidirectional_iterator(I, V, R, P, D)
00811 {
00812 public:
00813     typedef stlsoft_reverse_bidirectional_iterator(I, V, R, P, D)               parent_class_type;
00814 
00815     typedef ss_typename_type_k parent_class_type::iterator_category             iterator_category;
00816     typedef ss_typename_type_k parent_class_type::value_type                    value_type;
00817 
00818 # if defined(STLSOFT_ITERATOR_REVERSE_ITERATOR_FORM3_SUPPORT)
00819     typedef ss_typename_type_k parent_class_type::distance_type                 difference_type;
00820     typedef ss_typename_type_k parent_class_type::pointer_type                  pointer;
00821     typedef ss_typename_type_k parent_class_type::reference_type                reference;
00822 #else 
00823     typedef ss_typename_type_k parent_class_type::difference_type               difference_type;
00824     typedef ss_typename_type_k parent_class_type::pointer                       pointer;
00825     typedef ss_typename_type_k parent_class_type::reference                     reference;
00826 #endif 
00827 
00828     
00829 
00830 
00831     typedef pointer                                                             pointer_type;
00832     typedef reference                                                           reference_type;
00833 
00834 
00835 public:
00837     ss_explicit_k reverse_bidirectional_iterator_base(I i)
00838         : parent_class_type(i)
00839     {}
00840 };
00841 
00842 
00847 
00860 template<   ss_typename_param_k I   
00861         ,   ss_typename_param_k V   
00862         ,   ss_typename_param_k R   
00863         ,   ss_typename_param_k P   
00864         ,   ss_typename_param_k D   
00865         >
00866 struct const_reverse_bidirectional_iterator_base                
00867     : public reverse_bidirectional_iterator_base<I, V, R, P, D> 
00868 {
00869 public:
00870     typedef reverse_bidirectional_iterator_base<I, V, R, P, D>                  parent_class_type;
00871 
00872     typedef ss_typename_type_k parent_class_type::iterator_category             iterator_category;
00873     typedef ss_typename_type_k parent_class_type::value_type                    value_type;
00874     typedef ss_typename_type_k parent_class_type::difference_type               difference_type;
00875     typedef ss_typename_type_k parent_class_type::pointer_type                  pointer;
00876     typedef ss_typename_type_k parent_class_type::reference_type                reference;
00877 
00878     
00879 
00880 
00881     typedef ss_typename_type_k parent_class_type::pointer                       pointer_type;
00882     typedef ss_typename_type_k parent_class_type::reference                     reference_type;
00883 
00884 
00885 public:
00887     ss_explicit_k const_reverse_bidirectional_iterator_base(I i)
00888         : parent_class_type(i)
00889     {}
00890 };
00891 
00892 #endif 
00893 
00894 
00895 
00896 
00897 
00898 
00899 
00900 
00901 
00902 
00903 
00904 #ifdef _STLSOFT_CF_MIGHT_BE_DINKUMWARE_MS_NAUGHTIES
00905 
00906 #ifndef _STLSOFT_NO_NAMESPACE
00907 } 
00908 #endif 
00909 
00910 template<   ss_typename_param_k _Ty
00911         ,   ss_typename_param_k _Diff
00912         ,   ss_typename_param_k _Pointer
00913         ,   ss_typename_param_k _Reference
00914         ,   ss_typename_param_k _Pointer2
00915         ,   ss_typename_param_k _Reference2
00916         >
00917 class _Ptrit
00918 {
00919 public:
00920     typedef _Pointer    iterator_type;
00921 
00922 private:
00923     char    x[1024];
00924 };
00925 
00926 namespace std
00927 {
00928     namespace test_dinkumware
00929     {
00930         template<   ss_typename_param_k T1
00931                 ,   ss_typename_param_k T2
00932                 ,   bool S
00933                 >
00934         struct select_type
00935         {
00936             typedef T1  selected_type;
00937         };
00938 
00939 #ifdef STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
00940         template<   ss_typename_param_k T1
00941                 ,   ss_typename_param_k T2
00942                 >
00943         struct select_type<T1, T2, false>
00944         {
00945             typedef T2  selected_type;
00946         };
00947 #endif // STLSOFT_CF_TEMPLATE_PARTIAL_SPECIALISATION_SUPPORT
00948 
00949         template<   class V
00950                 ,   class P
00951                 ,   class R
00952                 >
00953         class _Ptrit_tdkw
00954         {
00955             typedef _Ptrit<V, stlsoft_ns_qual(ss_ptrdiff_t), P, R, P, R>    _Ptrit_type;
00956 
00957         public:
00958             typedef ss_typename_type_k select_type<_Ptrit_type, P, sizeof(_Ptrit_type) < 1024>::selected_type  iterator_type;
00959         };
00960 
00961     } 
00962 
00963 } 
00964 
00965 #ifndef _STLSOFT_NO_NAMESPACE
00966 namespace stlsoft
00967 {
00968 #endif 
00969 
00970 #endif 
00971 
00980 template<   ss_typename_param_k V
00981         ,   ss_typename_param_k P
00982         ,   ss_typename_param_k R
00983         >
00984 struct pointer_iterator
00985 {
00986 #if defined(_STLSOFT_CF_MIGHT_BE_DINKUMWARE_MS_NAUGHTIES) && \
00987     !defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
00988 # if defined(_STLSOFT_CF_MIGHT_BE_DINKUMWARE_MS_NAUGHTIES_1300)
00989     typedef std::test_dinkumware::_Ptrit_tdkw<V, P, R>::iterator_type   type;
00990 # else
00991     typedef P                                                           type;
00992 # endif 
00993 #elif defined(STLSOFT_COMPILER_IS_MSVC) && \
00994       !defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT) && \
00995       defined(_XUTILITY_) && \
00996       _MSC_VER == 1300
00997     typedef std::_Ptrit<V, stlsoft_ns_qual(ss_ptrdiff_t), P, R, P, R>   type;
00998 #else
00999     typedef P                                                           type;
01000 #endif 
01001 
01002 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
01003 public:
01004     
01005     typedef type                                                        iterator_type;
01006 #endif 
01007 };
01008 
01009 
01010 
01011 #if defined(STLSOFT_COMPILER_IS_DMC) && \
01012     !defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
01013 template<   ss_typename_param_k V
01014         ,   ss_typename_param_k P
01015         ,   ss_typename_param_k R
01016         >
01017 inline random_access_iterator_tag iterator_category(pointer_iterator<V, P, R>::type const&)
01018 {
01019     return random_access_iterator_tag();
01020 }
01021 
01022 template<   ss_typename_param_k V
01023         ,   ss_typename_param_k P
01024         ,   ss_typename_param_k R
01025         >
01026 inline stlsoft_ns_qual(ss_ptrdiff_t) *distance_type(pointer_iterator<V, P, R>::type const&)
01027 {
01028     return static_cast<stlsoft_ns_qual(ss_ptrdiff_t)*>(0);
01029 }
01030 #endif 
01031 
01032 
01033 
01042 #if defined(STLSOFT_CF_STD_LIBRARY_IS_DINKUMWARE_VC)
01043 # define stlsoft_iterator_query_category(I, i)      (stlsoft_ns_qual_std(_Iter_cat)(i))
01044 # define stlsoft_iterator_query_category_ptr(I, i)  (&stlsoft_ns_qual_std(_Iter_cat)(i))
01045 
01046 
01047 
01048 
01049 
01050 
01051 
01052 #else 
01053 
01054 
01055 # define stlsoft_iterator_query_category(I, i)      (*static_cast<ss_typename_type_k std::iterator_traits<I>::iterator_category*>(0))
01056 # define stlsoft_iterator_query_category_ptr(I, i)  (static_cast<ss_typename_type_k std::iterator_traits<I>::iterator_category*>(0))
01057 
01058 
01059 
01060 #endif 
01061 
01062 #if 0
01063 #    if defined(STLSOFT_COMPILER_IS_DMC)
01064 #     if defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
01065 #      define stlsoft_iterator_query_category(I, i)     (stlsoft_ns_qual_std(iterator_traits)<I>::iterator_category())
01066     
01067 #     else
01068 #      define stlsoft_iterator_query_category(I, i)     (stlsoft_ns_qual_std(iterator_category)(i))
01069 #     endif 
01070 #    elif defined(STLSOFT_COMPILER_IS_COMO) || \
01071           defined(STLSOFT_COMPILER_IS_INTEL)
01072 #     if defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
01073 #      define stlsoft_iterator_query_category(I, i)     (stlsoft_ns_qual_std(iterator_traits)<I>::iterator_category())
01074 #     elif defined(_STLSOFT_CF_MIGHT_BE_DINKUMWARE_MS_NAUGHTIES)
01075 #      define stlsoft_iterator_query_category(I, i)     (stlsoft_ns_qual_std(_Iter_cat)(i))
01076 #     else
01077 #      error
01078 #     endif 
01079 #    elif defined(STLSOFT_COMPILER_IS_MSVC)
01080 #     if defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
01081 #      if _MSC_VER < 1300
01082 #       define stlsoft_iterator_query_category(I, i)    (stlsoft_ns_qual_std(iterator_category)(i))
01083 #      else
01084 #       define stlsoft_iterator_query_category(I, i)    (stlsoft_ns_qual_std(iterator_category)(i))
01085 #      endif 
01086 #     elif defined(_STLSOFT_CF_MIGHT_BE_DINKUMWARE_MS_NAUGHTIES)
01087 #      define stlsoft_iterator_query_category(I, i)     (stlsoft_ns_qual_std(_Iter_cat)(i))
01088 #     elif(_MSC_VER >= 1310)
01089 #      define stlsoft_iterator_query_category(I, i)     (stlsoft_ns_qual_std(iterator_traits)<I>::iterator_category())
01090 #     elif(_MSC_VER >= 1200)
01091 #      error
01092 #     endif 
01093 #    else
01094 #     define stlsoft_iterator_query_category(I, i)      (stlsoft_ns_qual_std(iterator_traits)<I>::iterator_category())
01095 #    endif 
01096 #endif 
01097 
01098 #if 0
01099 template <ss_typename_param_k T>
01100 struct queried_iterator_category
01101 {
01102 };
01103 
01104 template <ss_typename_param_k T>
01105 query_iterator_category
01106 #endif 
01107 
01108 
01109 
01110 #ifndef _STLSOFT_NO_NAMESPACE
01111 } 
01112 #endif 
01113 
01114 
01115 
01116 #endif 
01117 
01118