williamr@2: /* williamr@2: * williamr@2: * Copyright (c) 1994 williamr@2: * Hewlett-Packard Company williamr@2: * williamr@2: * Copyright (c) 1996,1997 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1997 williamr@2: * Moscow Center for SPARC Technology williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: /* NOTE: This is an internal header file, included by other STL headers. williamr@2: * You should not attempt to use it directly. williamr@2: */ williamr@2: williamr@2: #ifndef _STLP_INTERNAL_DBG_TREE_H williamr@2: #define _STLP_INTERNAL_DBG_TREE_H williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: # undef _DBG_Rb_tree williamr@2: # define _DBG_Rb_tree _Rb_tree williamr@2: williamr@2: # define _STLP_DBG_TREE_SUPER __WORKAROUND_DBG_RENAME(Rb_tree) <_Key, _Value, _KeyOfValue, _Compare, _Alloc> williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: # ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS williamr@2: template williamr@2: inline _Value* williamr@2: value_type(const _DBG_iter_base< _STLP_DBG_TREE_SUPER >&) { williamr@2: return (_Value*)0; williamr@2: } williamr@2: template williamr@2: inline bidirectional_iterator_tag williamr@2: iterator_category(const _DBG_iter_base< _STLP_DBG_TREE_SUPER >&) { williamr@2: return bidirectional_iterator_tag(); williamr@2: } williamr@2: # endif williamr@2: williamr@2: template williamr@2: class _DBG_Rb_tree : public _STLP_DBG_TREE_SUPER { williamr@2: typedef _STLP_DBG_TREE_SUPER _Base; williamr@2: typedef _DBG_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> _Self; williamr@2: protected: williamr@2: friend class __owned_link; williamr@2: mutable __owned_list _M_iter_list; williamr@2: williamr@2: public: williamr@2: __IMPORT_CONTAINER_TYPEDEFS(_Base) williamr@2: typedef typename _Base::key_type key_type; williamr@2: williamr@2: typedef _DBG_iter<_Base, _Nonconst_traits > iterator; williamr@2: typedef _DBG_iter<_Base, _Const_traits > const_iterator; williamr@2: williamr@2: _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS; williamr@2: williamr@2: protected: williamr@2: williamr@2: //typedef typename _Base::key_param_type key_param_type; williamr@2: //typedef typename _Base::val_param_type val_param_type; williamr@2: williamr@2: void _Invalidate_all() {_M_iter_list._Invalidate_all();} williamr@2: williamr@2: void _Invalidate_iterator(const iterator& __it) { williamr@2: __invalidate_iterator(&_M_iter_list,__it); williamr@2: } williamr@2: void _Invalidate_iterators(const iterator& __first, const iterator& __last) { williamr@2: iterator __cur = __first; williamr@2: while (__cur != __last) __invalidate_iterator(&_M_iter_list, __cur++); williamr@2: } williamr@2: williamr@2: const _Base* _Get_base() const { return (const _Base*)this; } williamr@2: _Base* _Get_base() { return (_Base*)this; } williamr@2: williamr@2: public: williamr@2: _DBG_Rb_tree() : _STLP_DBG_TREE_SUPER(), williamr@2: _M_iter_list(_Get_base()) {} williamr@2: _DBG_Rb_tree(const _Compare& __comp) : williamr@2: _STLP_DBG_TREE_SUPER(__comp), _M_iter_list(_Get_base()) {} williamr@2: _DBG_Rb_tree(const _Compare& __comp, const allocator_type& __a): williamr@2: _STLP_DBG_TREE_SUPER(__comp, __a), _M_iter_list(_Get_base()) {} williamr@2: _DBG_Rb_tree(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x): williamr@2: _STLP_DBG_TREE_SUPER(__x), _M_iter_list(_Get_base()) {} williamr@2: ~_DBG_Rb_tree() { _Invalidate_all(); } williamr@2: williamr@2: _Self& operator=(const _Self& __x) { williamr@2: _Invalidate_all(); williamr@2: (_Base&)*this = (const _Base&)__x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: iterator begin() { return iterator(&_M_iter_list,_Base::begin()); } williamr@2: const_iterator begin() const { return const_iterator(&_M_iter_list, _Base::begin()); } williamr@2: iterator end() { return iterator(&_M_iter_list, _Base::end()); } williamr@2: const_iterator end() const { return const_iterator(&_M_iter_list,_Base::end()); } williamr@2: williamr@2: public: williamr@2: reverse_iterator rbegin() { return reverse_iterator(end()); } williamr@2: const_reverse_iterator rbegin() const { williamr@2: return const_reverse_iterator(end()); williamr@2: } williamr@2: reverse_iterator rend() { return reverse_iterator(begin()); } williamr@2: const_reverse_iterator rend() const { williamr@2: return const_reverse_iterator(begin()); williamr@2: } williamr@2: void swap(_Self& __t) { williamr@2: _Base::swap(__t); williamr@2: _M_iter_list._Swap_owners(__t._M_iter_list); williamr@2: } williamr@2: williamr@2: public: williamr@2: williamr@2: iterator find(const key_type& __x) { williamr@2: return iterator(&_M_iter_list, _Base::find(__x)); williamr@2: } williamr@2: const_iterator find(const key_type& __x) const { williamr@2: return const_iterator(&_M_iter_list, _Base::find(__x)); williamr@2: } williamr@2: williamr@2: iterator lower_bound(const key_type& __x) { williamr@2: return iterator(&_M_iter_list, _Base::lower_bound(__x)); williamr@2: } williamr@2: const_iterator lower_bound(const key_type& __x) const { williamr@2: return const_iterator(&_M_iter_list, _Base::lower_bound(__x)); williamr@2: } williamr@2: williamr@2: iterator upper_bound(const key_type& __x) { williamr@2: return iterator(&_M_iter_list, _Base::upper_bound(__x)); williamr@2: } williamr@2: const_iterator upper_bound(const key_type& __x) const { williamr@2: return const_iterator(&_M_iter_list, _Base::upper_bound(__x)); williamr@2: } williamr@2: williamr@2: pair equal_range(const key_type& __x) { williamr@2: return pair(iterator(&_M_iter_list, _Base::lower_bound(__x)), williamr@2: iterator(&_M_iter_list, _Base::upper_bound(__x))); williamr@2: } williamr@2: pair equal_range(const key_type& __x) const { williamr@2: return pair(const_iterator(&_M_iter_list, _Base::lower_bound(__x)), williamr@2: const_iterator(&_M_iter_list, _Base::upper_bound(__x))); williamr@2: } williamr@2: williamr@2: pair insert_unique(const value_type& __x) { williamr@2: _STLP_STD::pair<_STLP_HEADER_TYPENAME _Base::iterator, bool> __res = _Base::insert_unique(__x); williamr@2: return pair( iterator(&_M_iter_list, __res.first), __res.second ) ; williamr@2: } williamr@2: iterator insert_equal(const value_type& __x) { williamr@2: return iterator(&_M_iter_list, _Base::insert_equal(__x)); williamr@2: } williamr@2: williamr@2: iterator insert_unique(iterator __position, const value_type& __x) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position)) williamr@2: return iterator(&_M_iter_list, _Base::insert_unique(__position._M_iterator, __x)); williamr@2: } williamr@2: iterator insert_equal(iterator __position, const value_type& __x) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position)) williamr@2: return iterator(&_M_iter_list, _Base::insert_equal(__position._M_iterator, __x)); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: void insert_equal(_II __first, _II __last) { williamr@2: _Base::insert_equal(__first, __last); williamr@2: } williamr@2: template williamr@2: void insert_unique(_II __first, _II __last) { williamr@2: _Base::insert_unique(__first, __last); williamr@2: } williamr@2: #else /* _STLP_MEMBER_TEMPLATES */ williamr@2: void insert_unique(const_iterator __first, const_iterator __last) { williamr@2: _Base::insert_unique(__first._M_iterator, __last._M_iterator); williamr@2: } williamr@2: void insert_unique(const value_type* __first, const value_type* __last) { williamr@2: _Base::insert_unique(__first, __last); williamr@2: } williamr@2: void insert_equal(const_iterator __first, const_iterator __last) { williamr@2: _Base::insert_equal(__first._M_iterator, __last._M_iterator); williamr@2: } williamr@2: void insert_equal(const value_type* __first, const value_type* __last) { williamr@2: _Base::insert_equal(__first, __last); williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: void erase(iterator __position) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position)) williamr@2: _STLP_DEBUG_CHECK(_Dereferenceable(__position)) williamr@2: _Invalidate_iterator(__position); williamr@2: _Base::erase(__position._M_iterator); williamr@2: } williamr@2: size_type erase(const key_type& __x) { williamr@2: pair __p = equal_range(__x); williamr@2: size_type __n = distance(__p.first, __p.second); williamr@2: _Invalidate_iterators(__p.first, __p.second); williamr@2: _Base::erase(__p.first._M_iterator, __p.second._M_iterator); williamr@2: return __n; williamr@2: } williamr@2: williamr@2: void erase(iterator __first, iterator __last) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __first)&& williamr@2: __check_if_owner(&_M_iter_list, __last)) williamr@2: _Invalidate_iterators(__first, __last); williamr@2: _Base::erase(__first._M_iterator, __last._M_iterator); williamr@2: } williamr@2: void erase(const key_type* __first, const key_type* __last) { williamr@2: while (__first != __last) erase(*__first++); williamr@2: } williamr@2: williamr@2: void clear() { williamr@2: _Invalidate_all(); williamr@2: _Base::clear(); williamr@2: } williamr@2: }; williamr@2: williamr@2: #define _STLP_TEMPLATE_HEADER template williamr@2: #define _STLP_TEMPLATE_CONTAINER _DBG_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> williamr@2: #define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_TREE_SUPER williamr@2: #include williamr@2: #undef _STLP_TEMPLATE_CONTAINER_BASE williamr@2: #undef _STLP_TEMPLATE_CONTAINER williamr@2: #undef _STLP_TEMPLATE_HEADER williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # undef _STLP_DBG_TREE_SUPER williamr@2: williamr@2: #endif /* _STLP_INTERNAL_DBG_TREE_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: williamr@2: