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