#ifndef _STLP_USE_OLD_HP_ITERATOR_QUERIES #define _STLP_ITERATOR_CATEGORY(_It, _Tp) __iterator_category(_It, _IsPtrType <_Tp> ::_Ret()) // _IsPtrType<_Tp>::_Ret() checks if pointer type // return __true_type if is or // __false_type if not template <class _Iter> inline random_access_iterator_tag __iterator_category( const _Iter&, const __true_type&) ... { return random_access_iterator_tag();} template <class _Iter> inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits <_Iter> ::iterator_category__iterator_category(const _Iter&, const __false_type&) ... { typedef typename iterator_traits<_Iter>::iterator_category _Category; return _Category();} #else /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */ template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference> inline _Category _STLP_CALL iterator_category( const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>& ) ...{ return _Category(); } /**//* overloaded function to support poiiter type iterator e.g. vector<T>::iterator */ template <class _Tp> inline random_access_iterator_tag _STLP_CALL iterator_category( const _Tp* ) ...{ return random_access_iterator_tag(); } #endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */