123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- /*
- *
- * Copyright (c) 1997
- * Moscow Center for SPARC Technology
- *
- * Copyright (c) 1999
- * Boris Fomitchev
- *
- * This material is provided "as is", with absolutely no warranty expressed
- * or implied. Any use is at your own risk.
- *
- * Permission to use or copy this software for any purpose is hereby granted
- * without fee, provided the above notices are retained on all copies.
- * Permission to modify the code and to distribute modified code is granted,
- * provided the above notices are retained, and a notice that the code was
- * modified is included with the above copyright notice.
- *
- */
- #ifndef _STLP_DBG_ITERATOR_H
- #define _STLP_DBG_ITERATOR_H
- #ifndef _STLP_INTERNAL_PAIR_H
- # include <stl/_pair.h>
- #endif
- #ifndef _STLP_INTERNAL_ALLOC_H
- # include <stl/_alloc.h>
- #endif
- _STLP_BEGIN_NAMESPACE
- _STLP_MOVE_TO_PRIV_NAMESPACE
- //============================================================
- template <class _Iterator>
- void _Decrement(_Iterator& __it, const bidirectional_iterator_tag &)
- { --__it; }
- template <class _Iterator>
- void _Decrement(_Iterator& __it, const random_access_iterator_tag &)
- { --__it; }
- template <class _Iterator>
- void _Decrement(_Iterator& __it, const forward_iterator_tag &)
- { _STLP_ASSERT(0) }
- template <class _Iterator>
- void _Advance(_Iterator&, ptrdiff_t, const forward_iterator_tag &)
- { _STLP_ASSERT(0) }
- template <class _Iterator>
- void _Advance(_Iterator& __it, ptrdiff_t, const bidirectional_iterator_tag &)
- { _STLP_ASSERT(0) }
- template <class _Iterator>
- void _Advance(_Iterator& __it, ptrdiff_t __n, const random_access_iterator_tag &)
- { __it += __n; }
- template <class _Iterator>
- ptrdiff_t _DBG_distance(const _Iterator& __x, const _Iterator& __y, const random_access_iterator_tag &)
- { return __x - __y; }
- template <class _Iterator>
- ptrdiff_t _DBG_distance(const _Iterator&, const _Iterator&, const forward_iterator_tag &) {
- _STLP_ASSERT(0)
- return 0;
- }
- template <class _Iterator>
- ptrdiff_t _DBG_distance(const _Iterator&, const _Iterator&, const bidirectional_iterator_tag &) {
- _STLP_ASSERT(0)
- return 0;
- }
- template <class _Iterator>
- bool _CompareIt(const _Iterator&, const _Iterator&, const forward_iterator_tag &) {
- _STLP_ASSERT(0)
- return false;
- }
- template <class _Iterator>
- bool _CompareIt(const _Iterator&, const _Iterator&, const bidirectional_iterator_tag &) {
- _STLP_ASSERT(0)
- return false;
- }
- template <class _Iterator>
- bool _CompareIt(const _Iterator& __x, const _Iterator& __y, const random_access_iterator_tag &)
- { return __x < __y; }
- template <class _Iterator>
- bool _Dereferenceable(const _Iterator& __it)
- { return (__it._Get_container_ptr() != 0) && !(__it._M_iterator == (__it._Get_container_ptr())->end()); }
- template <class _Iterator>
- bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const forward_iterator_tag &)
- { return (__n == 1) && _Dereferenceable(__it); }
- template <class _Iterator>
- bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const bidirectional_iterator_tag &) {
- typedef typename _Iterator::_Container_type __container_type;
- __container_type* __c = __it._Get_container_ptr();
- return (__c != 0) && ((__n == 1 && __it._M_iterator != __c->end() ) ||
- (__n == -1 && __it._M_iterator != __c->begin()));
- }
- template <class _Iterator>
- bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const random_access_iterator_tag &) {
- typedef typename _Iterator::_Container_type __container_type;
- __container_type* __c = __it._Get_container_ptr();
- if (__c == 0) return false;
- ptrdiff_t __new_pos = (__it._M_iterator - __c->begin()) + __n;
- return (__new_pos >= 0) && (__STATIC_CAST(typename __container_type::size_type, __new_pos) <= __c->size());
- }
- template <class _Container>
- struct _DBG_iter_base : public __owned_link {
- public:
- typedef typename _Container::value_type value_type;
- typedef typename _Container::reference reference;
- typedef typename _Container::pointer pointer;
- typedef ptrdiff_t difference_type;
- //private:
- typedef typename _Container::iterator _Nonconst_iterator;
- typedef typename _Container::const_iterator _Const_iterator;
- typedef _Container _Container_type;
- #ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
- typedef typename iterator_traits<_Const_iterator>::iterator_category _Iterator_category;
- #else
- typedef typename _Container::_Iterator_category _Iterator_category;
- #endif
- typedef _Iterator_category iterator_category;
- _DBG_iter_base() : __owned_link(0) {}
- _DBG_iter_base(const __owned_list* __c, const _Const_iterator& __it) :
- #if defined(__HP_aCC) && (__HP_aCC < 60000)
- __owned_link(__c), _M_iterator(*__REINTERPRET_CAST(const _Nonconst_iterator *, &__it)) {}
- #else
- __owned_link(__c), _M_iterator(*(const _Nonconst_iterator*)&__it) {}
- #endif
- _Container* _Get_container_ptr() const {
- return (_Container*)__stl_debugger::_Get_container_ptr(this);
- }
- void __increment();
- void __decrement();
- void __advance(ptrdiff_t __n);
- // protected:
- _Nonconst_iterator _M_iterator;
- };
- template <class _Container>
- inline void _DBG_iter_base<_Container>::__increment() {
- _STLP_DEBUG_CHECK(_Incrementable(*this, 1, _Iterator_category()))
- ++_M_iterator;
- }
- template <class _Container>
- inline void _DBG_iter_base<_Container>::__decrement() {
- _STLP_DEBUG_CHECK(_Incrementable(*this, -1, _Iterator_category()))
- _Decrement(_M_iterator, _Iterator_category());
- }
- template <class _Container>
- inline void _DBG_iter_base<_Container>::__advance(ptrdiff_t __n) {
- _STLP_DEBUG_CHECK(_Incrementable(*this, __n, _Iterator_category()))
- _Advance(_M_iterator, __n, _Iterator_category());
- }
- template <class _Container>
- ptrdiff_t operator-(const _DBG_iter_base<_Container>& __x,
- const _DBG_iter_base<_Container>& __y ) {
- typedef typename _DBG_iter_base<_Container>::_Iterator_category _Iterator_category;
- _STLP_DEBUG_CHECK(__check_same_owner(__x, __y))
- return _DBG_distance(__x._M_iterator,__y._M_iterator, _Iterator_category());
- }
- template <class _Container, class _Traits>
- struct _DBG_iter_mid : public _DBG_iter_base<_Container> {
- typedef _DBG_iter_mid<_Container, typename _Traits::_NonConstTraits> _Nonconst_self;
- typedef typename _Container::iterator _Nonconst_iterator;
- typedef typename _Container::const_iterator _Const_iterator;
- _DBG_iter_mid() {}
- explicit _DBG_iter_mid(const _Nonconst_self& __it) :
- _DBG_iter_base<_Container>(__it) {}
- _DBG_iter_mid(const __owned_list* __c, const _Const_iterator& __it) :
- _DBG_iter_base<_Container>(__c, __it) {}
- };
- template <class _Container, class _Traits>
- struct _DBG_iter : public _DBG_iter_mid<_Container, _Traits> {
- typedef _DBG_iter_base<_Container> _Base;
- public:
- typedef typename _Base::value_type value_type;
- typedef typename _Base::difference_type difference_type;
- typedef typename _Traits::reference reference;
- typedef typename _Traits::pointer pointer;
- typedef typename _Base::_Nonconst_iterator _Nonconst_iterator;
- typedef typename _Base::_Const_iterator _Const_iterator;
- private:
- typedef _DBG_iter<_Container, _Traits> _Self;
- typedef _DBG_iter_mid<_Container, typename _Traits::_NonConstTraits> _Nonconst_mid;
- public:
- #ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
- typedef typename _Base::iterator_category iterator_category;
- #endif
- typedef typename _Base::_Iterator_category _Iterator_category;
- public:
- _DBG_iter() {}
- // boris : real type of iter would be nice
- _DBG_iter(const __owned_list* __c, const _Const_iterator& __it) :
- _DBG_iter_mid<_Container, _Traits>(__c, __it) {}
- // This allows conversions from iterator to const_iterator without being
- // redundant with the copy constructor below.
- _DBG_iter(const _Nonconst_mid& __rhs) :
- _DBG_iter_mid<_Container, _Traits>(__rhs) {}
- _DBG_iter(const _Self& __rhs) :
- _DBG_iter_mid<_Container, _Traits>(__rhs) {}
- // This allows conversions from iterator to const_iterator without being
- // redundant with the copy assignment operator below.
- _Self& operator=(const _Nonconst_mid& __rhs) {
- (_Base&)*this = __rhs;
- return *this;
- }
- _Self& operator=(const _Self& __rhs) {
- (_Base&)*this = __rhs;
- return *this;
- }
- reference operator*() const;
- _STLP_DEFINE_ARROW_OPERATOR
- _Self& operator++() {
- this->__increment();
- return *this;
- }
- _Self operator++(int) {
- _Self __tmp = *this;
- this->__increment();
- return __tmp;
- }
- _Self& operator--() {
- this->__decrement();
- return *this;
- }
- _Self operator--(int) {
- _Self __tmp = *this;
- this->__decrement();
- return __tmp;
- }
- _Self& operator+=(difference_type __n) {
- this->__advance(__n);
- return *this;
- }
- _Self& operator-=(difference_type __n) {
- this->__advance(-__n);
- return *this;
- }
- _Self operator+(difference_type __n) const {
- _Self __tmp(*this);
- __tmp.__advance(__n);
- return __tmp;
- }
- _Self operator-(difference_type __n) const {
- _Self __tmp(*this);
- __tmp.__advance(-__n);
- return __tmp;
- }
- reference operator[](difference_type __n) const { return *(*this + __n); }
- };
- template <class _Container, class _Traits>
- inline
- #if defined (_STLP_NESTED_TYPE_PARAM_BUG)
- _STLP_TYPENAME_ON_RETURN_TYPE _Traits::reference
- #else
- _STLP_TYPENAME_ON_RETURN_TYPE _DBG_iter<_Container, _Traits>::reference
- #endif
- _DBG_iter<_Container, _Traits>::operator*() const {
- _STLP_DEBUG_CHECK(_Dereferenceable(*this))
- _STLP_DEBUG_CHECK(_Traits::_Check(*this))
- return *this->_M_iterator;
- }
- template <class _Container>
- inline bool
- operator==(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
- _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
- return __x._M_iterator == __y._M_iterator;
- }
- template <class _Container>
- inline bool
- operator<(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
- _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
- typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
- return _CompareIt(__x._M_iterator , __y._M_iterator, _Category());
- }
- template <class _Container>
- inline bool
- operator>(const _DBG_iter_base<_Container>& __x,
- const _DBG_iter_base<_Container>& __y) {
- typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
- return _CompareIt(__y._M_iterator , __x._M_iterator, _Category());
- }
- template <class _Container>
- inline bool
- operator>=(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
- _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
- typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
- return !_CompareIt(__x._M_iterator , __y._M_iterator, _Category());
- }
- template <class _Container>
- inline bool
- operator<=(const _DBG_iter_base<_Container>& __x,
- const _DBG_iter_base<_Container>& __y) {
- typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
- return !_CompareIt(__y._M_iterator , __x._M_iterator, _Category());
- }
- template <class _Container>
- inline bool
- operator!=(const _DBG_iter_base<_Container>& __x,
- const _DBG_iter_base<_Container>& __y) {
- _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
- return __x._M_iterator != __y._M_iterator;
- }
- //------------------------------------------
- template <class _Container, class _Traits>
- inline _DBG_iter<_Container, _Traits>
- operator+(ptrdiff_t __n, const _DBG_iter<_Container, _Traits>& __it) {
- _DBG_iter<_Container, _Traits> __tmp(__it);
- return __tmp += __n;
- }
- template <class _Iterator>
- inline _Iterator _Non_Dbg_iter(_Iterator __it)
- { return __it; }
- #if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
- template <class _Container, class _Traits>
- inline typename _DBG_iter<_Container, _Traits>::_Nonconst_iterator
- _Non_Dbg_iter(const _DBG_iter<_Container, _Traits>& __it)
- { return __it._M_iterator; }
- #endif
- /*
- * Helper classes to check iterator range or pointer validity
- * at construction time.
- */
- template <class _Container>
- class __construct_checker {
- typedef typename _Container::value_type value_type;
- protected:
- __construct_checker() {}
- __construct_checker(const value_type* __p) {
- _STLP_VERBOSE_ASSERT((__p != 0), _StlMsg_INVALID_ARGUMENT)
- }
- #if defined (_STLP_MEMBER_TEMPLATES)
- template <class _InputIter>
- __construct_checker(const _InputIter& __f, const _InputIter& __l) {
- typedef typename _IsIntegral<_InputIter>::_Ret _Integral;
- _M_check_dispatch(__f, __l, _Integral());
- }
- template <class _Integer>
- void _M_check_dispatch(_Integer , _Integer, const __true_type& /*IsIntegral*/) {}
- template <class _InputIter>
- void _M_check_dispatch(const _InputIter& __f, const _InputIter& __l, const __false_type& /*IsIntegral*/) {
- _STLP_DEBUG_CHECK(__check_range(__f,__l))
- }
- #endif
- #if !defined (_STLP_MEMBER_TEMPLATES) || !defined (_STLP_NO_METHOD_SPECIALIZATION)
- __construct_checker(const value_type* __f, const value_type* __l) {
- _STLP_DEBUG_CHECK(__check_ptr_range(__f,__l))
- }
- typedef _DBG_iter_base<_Container> _IteType;
- __construct_checker(const _IteType& __f, const _IteType& __l) {
- _STLP_DEBUG_CHECK(__check_range(__f,__l))
- }
- #endif
- #if defined (__BORLANDC__)
- ~__construct_checker(){}
- #endif
- };
- #if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
- # if defined (_STLP_NESTED_TYPE_PARAM_BUG) ||\
- (defined (__SUNPRO_CC) && __SUNPRO_CC < 0x600)
- # define _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS 1
- # endif
- _STLP_MOVE_TO_STD_NAMESPACE
- template <class _Container>
- inline ptrdiff_t*
- distance_type(const _STLP_PRIV _DBG_iter_base<_Container>&) { return (ptrdiff_t*) 0; }
- # if !defined (_STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS)
- template <class _Container>
- inline _STLP_TYPENAME_ON_RETURN_TYPE _STLP_PRIV _DBG_iter_base<_Container>::value_type*
- value_type(const _STLP_PRIV _DBG_iter_base<_Container>&) {
- typedef _STLP_TYPENAME _STLP_PRIV _DBG_iter_base<_Container>::value_type _Val;
- return (_Val*)0;
- }
- template <class _Container>
- inline _STLP_TYPENAME_ON_RETURN_TYPE _STLP_PRIV _DBG_iter_base<_Container>::_Iterator_category
- iterator_category(const _STLP_PRIV _DBG_iter_base<_Container>&) {
- typedef _STLP_TYPENAME _STLP_PRIV _DBG_iter_base<_Container>::_Iterator_category _Category;
- return _Category();
- }
- # endif
- _STLP_MOVE_TO_PRIV_NAMESPACE
- #endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
- _STLP_MOVE_TO_STD_NAMESPACE
- _STLP_END_NAMESPACE
- #endif /* INTERNAL_H */
- // Local Variables:
- // mode:C++
- // End:
|