111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1994
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hewlett-Packard Company
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996-1998
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1997
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Moscow Center for SPARC Technology
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk.
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies.
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted,
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice.
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* NOTE: This is an internal header file, included by other STL headers.
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *   You should not attempt to use it directly.
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_INTERNAL_ITERATOR_BASE_H
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_CSTDDEF
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/_cstddef.h>
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//# if defined  (_STLP_IMPORT_VENDOR_CSTD) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//_STLP_BEGIN_NAMESPACE
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//using namespace _STLP_VENDOR_CSTD;
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//_STLP_END_NAMESPACE
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//#endif /* _STLP_IMPORT_VENDOR_CSTD */
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(_STLP_USE_OLD_HP_ITERATOR_QUERIES) && !defined(_STLP_CLASS_PARTIAL_SPECIALIZATION)
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  ifndef _STLP_TYPE_TRAITS_H
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    include <stl/type_traits.h>
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct input_iterator_tag {};
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct output_iterator_tag {};
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct forward_iterator_tag : public input_iterator_tag {};
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bidirectional_iterator_tag : public forward_iterator_tag {};
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct random_access_iterator_tag : public bidirectional_iterator_tag {};
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Category, class _Tp, _STLP_DFL_TMPL_PARAM(_Distance,ptrdiff_t),
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          _STLP_DFL_TMPL_PARAM(_Pointer,_Tp*), _STLP_DFL_TMPL_PARAM(_Reference,_Tp&) >
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct iterator {
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Category  iterator_category;
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp        value_type;
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Distance  difference_type;
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Pointer   pointer;
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Reference reference;
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct iterator<output_iterator_tag, void, void, void, void> {
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef output_iterator_tag  iterator_category;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef void                value_type;
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef void                difference_type;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef void                pointer;
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef void                reference;
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define _STLP_ITERATOR_CATEGORY(_It, _Tp) _STLP_STD::iterator_category(_It)
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define _STLP_DISTANCE_TYPE(_It, _Tp)     _STLP_STD::distance_type(_It)
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define _STLP_VALUE_TYPE(_It, _Tp)        _STLP_STD::value_type(_It)
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//Old HP iterator queries do not give information about the iterator
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//associated reference type so we consider that it is not a real reference.
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define _STLP_IS_REF_TYPE_REAL_REF(_It, _Tp) __false_type()
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    define _STLP_VALUE_TYPE(_It, _Tp)        (_STLP_TYPENAME _STLP_STD::iterator_traits< _Tp >::value_type*)0
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    define _STLP_DISTANCE_TYPE(_It, _Tp)     (_STLP_TYPENAME _STLP_STD::iterator_traits< _Tp >::difference_type*)0
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || \
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       (defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#      define _STLP_ITERATOR_CATEGORY(_It, _Tp) _STLP_STD::iterator_traits< _Tp >::iterator_category()
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    else
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#      define _STLP_ITERATOR_CATEGORY(_It, _Tp) _STLP_TYPENAME _STLP_STD::iterator_traits< _Tp >::iterator_category()
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    endif
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    define _STLP_IS_REF_TYPE_REAL_REF(_It, _Tp) _STLP_STD::_IsRefType< _STLP_TYPENAME _STLP_STD::iterator_traits< _Tp >::reference >::_Ret()
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  else
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    define _STLP_ITERATOR_CATEGORY(_It, _Tp)   _STLP_STD::__iterator_category(_It, _STLP_STD::_IsPtrType<_Tp>::_Ret())
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    define _STLP_DISTANCE_TYPE(_It, _Tp)       _STLP_STD::__distance_type(_It, _STLP_STD::_IsPtrType<_Tp>::_Ret())
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    define _STLP_VALUE_TYPE(_It, _Tp)          _STLP_STD::__value_type(_It, _STLP_STD::_IsPtrType<_Tp>::_Ret())
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    define _STLP_IS_REF_TYPE_REAL_REF(_It, _Tp) __false_type()
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DONT_REDEFINE_STD) && defined (_STLP_WHOLE_NATIVE_STD)
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* In this mode we will see both STLport implementation and native
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * one. To allow some interaction between both implementations through
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * iterators we have to map std iterator categories to stlport ones. This
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * way we will be able to initialize STLport containers with native
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * iterators, the other side won't work except when STLport iterators are
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * simple pointers. */
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_HAS_INCLUDE_NEXT)
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    include_next <iterator>
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  else
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#    include _STLP_NATIVE_HEADER(iterator)
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _IteCat>
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _CategoryMapping
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef _IteCat _Tag; };
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _CategoryMapping<::std::input_iterator_tag>
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef input_iterator_tag _Tag; };
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _CategoryMapping<::std::output_iterator_tag>
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef output_iterator_tag _Tag; };
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _CategoryMapping<::std::forward_iterator_tag>
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef forward_iterator_tag _Tag; };
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _CategoryMapping<::std::bidirectional_iterator_tag>
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef bidirectional_iterator_tag _Tag; };
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _CategoryMapping<::std::random_access_iterator_tag>
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef random_access_iterator_tag _Tag; };
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Iterator>
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct iterator_traits {
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _Iterator::iterator_category _OriginalTag;
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _CategoryMapping<_OriginalTag>::_Tag iterator_category;
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Iterator>
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct iterator_traits {
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _Iterator::iterator_category iterator_category;
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _Iterator::value_type        value_type;
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _Iterator::difference_type   difference_type;
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _Iterator::pointer           pointer;
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _Iterator::reference         reference;
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (__SUNPRO_CC)
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define _STLP_DIFFERENCE_TYPE(_Iterator) typename iterator_traits<_Iterator>::difference_type
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define _STLP_DIFFERENCE_TYPE(_Iterator) ptrdiff_t
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// fbp : this order keeps gcc happy
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct iterator_traits<const _Tp*> {
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef random_access_iterator_tag  iterator_category;
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp                         value_type;
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef ptrdiff_t                   difference_type;
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp*                  pointer;
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp&                  reference;
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct iterator_traits<_Tp*> {
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef random_access_iterator_tag  iterator_category;
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp                         value_type;
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef ptrdiff_t                   difference_type;
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp*                        pointer;
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp&                        reference;
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (__BORLANDC__)
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct iterator_traits<_Tp* const> {
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef random_access_iterator_tag  iterator_category;
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp                         value_type;
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef ptrdiff_t                   difference_type;
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp*                  pointer;
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp&                  reference;
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stl/_ptrs_specialize.h>
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_USE_OLD_HP_ITERATOR_QUERIES
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The overloaded functions iterator_category, distance_type, and
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// value_type are not part of the C++ standard.  (They have been
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// replaced by struct iterator_traits.)  They are included for
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// backward compatibility with the HP STL.
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// We introduce internal names for these functions.
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  ifndef _STLP_CLASS_PARTIAL_SPECIALIZATION
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_STD::random_access_iterator_tag
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator_category(const _Tp*, const __true_type&)
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _STLP_STD::random_access_iterator_tag(); }
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Iter>
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_TYPENAME_ON_RETURN_TYPE _STLP_STD::iterator_traits<_Iter>::iterator_category
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator_category(const _Iter&, const __false_type&) {
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _STLP_TYPENAME _STLP_STD::iterator_traits<_Iter>::iterator_category _Category;
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return _Category();
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline ptrdiff_t*
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__distance_type(const _Tp*, const __true_type&)
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __STATIC_CAST(ptrdiff_t*, 0); }
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Iter>
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_TYPENAME_ON_RETURN_TYPE _STLP_STD::iterator_traits<_Iter>::difference_type*
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__distance_type(const _Iter&, const __false_type&) {
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _STLP_TYPENAME _STLP_STD::iterator_traits<_Iter>::difference_type _diff_type;
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __STATIC_CAST(_diff_type*,0);
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp*
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__value_type(const _Tp*, const __true_type&)
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __STATIC_CAST(_Tp*, 0); }
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Iter>
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_TYPENAME_ON_RETURN_TYPE _STLP_STD::iterator_traits<_Iter>::value_type*
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__value_type(const _Iter&, const __false_type&) {
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _STLP_TYPENAME _STLP_STD::iterator_traits<_Iter>::value_type _value_type;
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __STATIC_CAST(_value_type*,0);
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Category _STLP_CALL iterator_category(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return _Category(); }
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp* _STLP_CALL value_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return __STATIC_CAST(_Tp*, 0); }
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Distance* _STLP_CALL distance_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return __STATIC_CAST(_Distance*, 0); }
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline random_access_iterator_tag _STLP_CALL iterator_category(const _Tp*) { return random_access_iterator_tag(); }
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp* _STLP_CALL value_type(const _Tp*) { return __STATIC_CAST(_Tp*, 0); }
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline ptrdiff_t* _STLP_CALL distance_type(const _Tp*) { return __STATIC_CAST(ptrdiff_t*, 0); }
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_ANACHRONISMS)
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The base classes input_iterator, output_iterator, forward_iterator,
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// bidirectional_iterator, and random_access_iterator are not part of
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the C++ standard.  (They have been replaced by struct iterator.)
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// They are included for backward compatibility with the HP STL.
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance> struct input_iterator :
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public iterator <input_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct output_iterator : public iterator <output_iterator_tag, void, void, void, void> {};
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance> struct forward_iterator :
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public iterator<forward_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance> struct bidirectional_iterator :
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public iterator<bidirectional_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance> struct random_access_iterator :
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public iterator<random_access_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_BASE_MATCH_BUG) && defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline input_iterator_tag _STLP_CALL
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertiterator_category(const input_iterator<_Tp, _Distance>&) { return input_iterator_tag(); }
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline output_iterator_tag _STLP_CALL
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertiterator_category(const output_iterator&) { return output_iterator_tag(); }
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline forward_iterator_tag _STLP_CALL
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertiterator_category(const forward_iterator<_Tp, _Distance>&) { return forward_iterator_tag(); }
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline bidirectional_iterator_tag _STLP_CALL
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertiterator_category(const bidirectional_iterator<_Tp, _Distance>&) { return bidirectional_iterator_tag(); }
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline random_access_iterator_tag _STLP_CALL
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertiterator_category(const random_access_iterator<_Tp, _Distance>&) { return random_access_iterator_tag(); }
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp*  _STLP_CALL value_type(const input_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp* _STLP_CALL value_type(const forward_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0);}
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Distance>
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InputIterator>
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__distance(const _InputIterator& __first, const _InputIterator& __last,
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           const input_iterator_tag &) {
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_DIFFERENCE_TYPE(_InputIterator) __n = 0;
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _InputIterator __it(__first);
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  while (__it != __last) {
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ++__it; ++__n;
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __n;
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _ForwardIterator>
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_DIFFERENCE_TYPE(_ForwardIterator) _STLP_CALL
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           const forward_iterator_tag &) {
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_DIFFERENCE_TYPE(_ForwardIterator) __n = 0;
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _ForwardIterator __it(__first);
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  while (__it != __last) {
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ++__it; ++__n;
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __n;
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _BidirectionalIterator>
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) _STLP_CALL
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__distance(const _BidirectionalIterator& __first, const _BidirectionalIterator& __last,
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           const bidirectional_iterator_tag &) {
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) __n = 0;
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _BidirectionalIterator __it(__first);
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  while (__it != __last) {
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ++__it; ++__n;
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __n;
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _RandomAccessIterator>
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_DIFFERENCE_TYPE(_RandomAccessIterator) _STLP_CALL
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last,
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert           const random_access_iterator_tag &)
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return __last - __first; }
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InputIterator>
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdistance(_InputIterator __first, _InputIterator __last)
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _STLP_PRIV __distance(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator)); }
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_ANACHRONISMS)
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InputIterator, class _Distance>
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline void _STLP_CALL distance(const _InputIterator& __first,
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                const _InputIterator& __last, _Distance& __n)
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ __n += _STLP_STD::distance(__first, __last); }
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_MSVC)
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MSVC specific
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InputIterator, class _Dist>
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline void  _STLP_CALL _Distance(_InputIterator __first,
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                  _InputIterator __last, _Dist& __n)
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ __n += _STLP_STD::distance(__first, __last); }
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// fbp: those are being used for iterator/const_iterator definitions everywhere
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Nonconst_traits;
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Const_traits {
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp value_type;
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp&  reference;
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp*  pointer;
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Const_traits<_Tp> _ConstTraits;
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Nonconst_traits<_Tp> _NonConstTraits;
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Nonconst_traits {
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp value_type;
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp& reference;
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp* pointer;
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Const_traits<_Tp> _ConstTraits;
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Nonconst_traits<_Tp> _NonConstTraits;
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * dums: A special iterator/const_iterator traits for set and multiset for which even
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the iterator is not mutable
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Nonconst_Const_traits;
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Const_Const_traits {
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp value_type;
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp&  reference;
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp*  pointer;
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Const_Const_traits<_Tp> _ConstTraits;
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Nonconst_Const_traits<_Tp> _NonConstTraits;
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Nonconst_Const_traits {
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Tp value_type;
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp& reference;
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef const _Tp* pointer;
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Const_Const_traits<_Tp> _ConstTraits;
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Nonconst_Const_traits<_Tp> _NonConstTraits;
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A macro to generate a new iterator traits from one of the
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * previous one. Changing the iterator traits type make iterators
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * from different containers not comparable.
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_CREATE_ITERATOR_TRAITS_BASE(Motif, Traits)        \
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>                                            \
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _##Motif;                                                \
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>                                            \
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _Const##Motif : public _STLP_STD::_Const_##Traits<_Tp> {  \
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Const##Motif<_Tp> _ConstTraits;                      \
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _##Motif<_Tp> _NonConstTraits;                        \
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};                                                              \
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>                                            \
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _##Motif : public _STLP_STD::_Nonconst_##Traits<_Tp> {    \
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Const##Motif<_Tp> _ConstTraits;                      \
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _##Motif<_Tp> _NonConstTraits;                        \
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_CREATE_ITERATOR_TRAITS(Motif, Traits)             \
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE                                    \
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_CREATE_ITERATOR_TRAITS_BASE(Motif, Traits)                \
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_CREATE_HASH_ITERATOR_TRAITS(Motif, Traits)        \
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE                                    \
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_CREATE_ITERATOR_TRAITS_BASE(NonLocal##Motif, Traits)      \
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_CREATE_ITERATOR_TRAITS_BASE(Local##Motif, Traits)         \
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp>                                            \
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _##Motif {                                               \
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _ConstNonLocal##Motif<_Tp> _ConstTraits;              \
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _NonLocal##Motif<_Tp> _NonConstTraits;                \
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _ConstLocal##Motif<_Tp> _ConstLocalTraits;            \
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _Local##Motif<_Tp> _NonConstLocalTraits;              \
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};                                                              \
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_BASE_TYPEDEF_BUG)
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// this workaround is needed for SunPro 4.0.1
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Traits>
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __cnst_traits_aux : private _Traits {
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename _Traits::value_type value_type;
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define __TRAITS_VALUE_TYPE(_Traits) __cnst_traits_aux<_Traits>::value_type
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  else
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define __TRAITS_VALUE_TYPE(_Traits) _Traits::value_type
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert*/
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InputIter, class _Distance>
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_INLINE_LOOP void _STLP_CALL
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__advance(_InputIter& __i, _Distance __n, const input_iterator_tag &)
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ while (__n--) ++__i; }
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// fbp : added output iterator tag variant
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InputIter, class _Distance>
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_INLINE_LOOP void _STLP_CALL
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__advance(_InputIter& __i, _Distance __n, const output_iterator_tag &)
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ while (__n--) ++__i; }
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _ForwardIterator, class _Distance>
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_INLINE_LOOP void _STLP_CALL
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__advance(_ForwardIterator& i, _Distance n, const forward_iterator_tag &)
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ while (n--) ++i; }
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _BidirectionalIterator, class _Distance>
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_INLINE_LOOP void _STLP_CALL
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__advance(_BidirectionalIterator& __i, _Distance __n,
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          const bidirectional_iterator_tag &) {
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__n > 0)
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    while (__n--) ++__i;
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    while (__n++) --__i;
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _RandomAccessIterator, class _Distance>
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline void _STLP_CALL
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__advance(_RandomAccessIterator& __i, _Distance __n,
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          const random_access_iterator_tag &)
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ __i += __n; }
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _InputIterator, class _Distance>
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline void _STLP_CALL advance(_InputIterator& __i, _Distance __n)
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ _STLP_PRIV __advance(__i, __n, _STLP_ITERATOR_CATEGORY(__i, _InputIterator)); }
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_INTERNAL_ITERATOR_BASE_H */
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables:
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End:
526