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_DEQUE_H williamr@2: #define _STLP_INTERNAL_DBG_DEQUE_H williamr@2: williamr@2: #include <stl/debug/_iterator.h> williamr@2: williamr@2: # if !defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM) && !defined (_STLP_NO_DEFAULT_NON_TYPE_PARAM) williamr@2: # undef _DBG_deque williamr@2: # define _DBG_deque deque williamr@2: # endif williamr@2: williamr@2: # define _DEQUE_WRAPPER _DBG_deque<_Tp,_Alloc> williamr@2: williamr@2: # define _STLP_DEQUE_SUPER __WORKAROUND_DBG_RENAME(deque) <_Tp,_Alloc> williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: # ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS williamr@2: template <class _Tp, class _Alloc> williamr@2: inline _Tp* value_type(const _DBG_iter_base< _STLP_DEQUE_SUPER >&) { williamr@2: return (_Tp*)0; williamr@2: } williamr@2: template <class _Tp, class _Alloc> williamr@2: inline random_access_iterator_tag iterator_category(const _DBG_iter_base< _STLP_DEQUE_SUPER >&) { williamr@2: return random_access_iterator_tag(); williamr@2: } williamr@2: # endif williamr@2: williamr@2: template <class _Tp, _STLP_DBG_ALLOCATOR_SELECT(_Tp) > williamr@2: class _DBG_deque : public _STLP_DEQUE_SUPER { williamr@2: williamr@2: typedef _DBG_deque<_Tp,_Alloc> _Self; williamr@2: typedef _STLP_DEQUE_SUPER _Base; williamr@2: williamr@2: public: // Basic types williamr@2: williamr@2: __IMPORT_CONTAINER_TYPEDEFS(_Base) williamr@2: williamr@2: public: // Iterators williamr@2: typedef _DBG_iter< _STLP_DEQUE_SUPER, _Nonconst_traits<value_type> > iterator; williamr@2: typedef _DBG_iter< _STLP_DEQUE_SUPER, _Const_traits<value_type> > const_iterator; williamr@2: williamr@2: _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS; williamr@2: williamr@2: protected: williamr@2: __owned_list _M_iter_list; williamr@2: void _Invalidate_iterator(const iterator& __it) { williamr@2: __invalidate_iterator(&_M_iter_list,__it); williamr@2: } williamr@2: void _Invalidate_all() { williamr@2: _M_iter_list._Invalidate_all(); williamr@2: } williamr@2: williamr@2: public: // Basic accessors williamr@2: iterator begin() { return iterator(&_M_iter_list, this->_M_start); } williamr@2: iterator end() { return iterator(&_M_iter_list, this->_M_finish); } williamr@2: const_iterator begin() const { williamr@2: return const_iterator(&_M_iter_list, this->_M_start); williamr@2: } williamr@2: const_iterator end() const { williamr@2: return const_iterator(&_M_iter_list, this->_M_finish); williamr@2: } williamr@2: williamr@2: reverse_iterator rbegin() { return reverse_iterator(end()); } williamr@2: reverse_iterator rend() { return reverse_iterator(begin()); } williamr@2: const_reverse_iterator rbegin() const williamr@2: { return const_reverse_iterator(end()); } williamr@2: const_reverse_iterator rend() const williamr@2: { return const_reverse_iterator(begin()); } williamr@2: williamr@2: reference operator[](size_type __n) williamr@2: { return begin()[difference_type(__n)]; } williamr@2: const_reference operator[](size_type __n) const williamr@2: { return begin()[difference_type(__n)]; } williamr@2: williamr@2: reference front() { return *begin(); } williamr@2: reference back() { williamr@2: iterator __tmp = end(); williamr@2: --__tmp; williamr@2: return *__tmp; williamr@2: } williamr@2: const_reference front() const { return *begin(); } williamr@2: const_reference back() const { williamr@2: const_iterator __tmp = end(); williamr@2: --__tmp; williamr@2: return *__tmp; williamr@2: } williamr@2: williamr@2: public: // Constructor, destructor. williamr@2: williamr@2: const _Base* _Get_base() const { return (const _Base*)this; } williamr@2: williamr@2: explicit _DBG_deque(const allocator_type& __a = allocator_type()) : williamr@2: _STLP_DEQUE_SUPER(__a), _M_iter_list(_Get_base()) {} williamr@2: _DBG_deque(const _Self& __x) : _STLP_DEQUE_SUPER(__x), _M_iter_list(_Get_base()) {} williamr@2: _DBG_deque(size_type __n, const value_type& __value, williamr@2: const allocator_type& __a = allocator_type()) : williamr@2: _STLP_DEQUE_SUPER(__n, __value, __a), _M_iter_list(_Get_base()) {} williamr@2: explicit _DBG_deque(size_type __n) : _STLP_DEQUE_SUPER(__n), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template <class _InputIterator> williamr@2: _DBG_deque(_InputIterator __first, _InputIterator __last, williamr@2: const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) : williamr@2: _STLP_DEQUE_SUPER(__first, __last, __a) , _M_iter_list(_Get_base()) {} williamr@2: # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS williamr@2: template <class _InputIterator> williamr@2: _DBG_deque(_InputIterator __first, _InputIterator __last): williamr@2: _STLP_DEQUE_SUPER(__first, __last, allocator_type()) , _M_iter_list(_Get_base()) {} williamr@2: # endif williamr@2: #else /* _STLP_MEMBER_TEMPLATES */ williamr@2: _DBG_deque(const value_type* __first, const value_type* __last, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _STLP_DEQUE_SUPER(__first, __last, __a), _M_iter_list(_Get_base()) {} williamr@2: williamr@2: _DBG_deque(const_iterator __first, const_iterator __last, williamr@2: const allocator_type& __a = allocator_type()) williamr@2: : _STLP_DEQUE_SUPER(__first._M_iterator, __last._M_iterator, __a), williamr@2: _M_iter_list(_Get_base()) {} williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ 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: void swap(_Self& __x) { williamr@2: _M_iter_list._Swap_owners(__x._M_iter_list); williamr@2: _Base::swap(__x); williamr@2: } williamr@2: williamr@2: public: williamr@2: void assign(size_type __n, const _Tp& __val) { williamr@2: _Base::assign(__n, __val); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: williamr@2: template <class _InputIterator> williamr@2: void assign(_InputIterator __first, _InputIterator __last) { williamr@2: _Base::assign(__first, __last); williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: public: // push_* and pop_* williamr@2: williamr@2: void push_back(const value_type& __t) { williamr@2: _Invalidate_all(); williamr@2: _Base::push_back(__t); williamr@2: } williamr@2: williamr@2: void push_back() { williamr@2: _Invalidate_all(); williamr@2: _Base::push_back(); williamr@2: } williamr@2: williamr@2: void push_front(const value_type& __t) { williamr@2: _Invalidate_all(); williamr@2: _Base::push_front(__t); williamr@2: } williamr@2: williamr@2: void push_front() { williamr@2: _Base::push_front(); williamr@2: _Invalidate_all(); williamr@2: } williamr@2: williamr@2: williamr@2: void pop_back() { williamr@2: _Invalidate_iterator(end()); williamr@2: _Base::pop_back(); williamr@2: } williamr@2: williamr@2: void pop_front() { williamr@2: _Invalidate_iterator(begin()); williamr@2: _Base::pop_front(); williamr@2: } williamr@2: williamr@2: public: // Insert williamr@2: williamr@2: iterator insert(iterator __position, const value_type& __x) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position)) williamr@2: // fbp : invalidation ! williamr@2: return iterator(&_M_iter_list, _Base::insert(__position._M_iterator, __x)); williamr@2: } williamr@2: williamr@2: iterator insert(iterator __position) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position)) williamr@2: // fbp : invalidation ! williamr@2: return iterator(&_M_iter_list, _Base::insert(__position._M_iterator)); williamr@2: } williamr@2: williamr@2: void insert(iterator __position, size_type __n, const value_type& __x) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position)) williamr@2: // fbp : invalidation ! williamr@2: _Base::insert(__position._M_iterator, __n, __x); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template <class _InputIterator> williamr@2: void insert(iterator __position, _InputIterator __first, _InputIterator __last) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position)) williamr@2: // fbp : invalidation ! williamr@2: _Base::insert(__position._M_iterator, __first, __last); williamr@2: } williamr@2: #else /* _STLP_MEMBER_TEMPLATES */ williamr@2: void insert(iterator __position, williamr@2: const value_type* __first, const value_type* __last) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position)) williamr@2: _Base::insert(__position._M_iterator, __first, __last); williamr@2: } williamr@2: void insert(iterator __position, williamr@2: const_iterator __first, const_iterator __last) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position)) williamr@2: _Base::insert(__position._M_iterator, __first._M_iterator, __last._M_iterator); williamr@2: } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: public: // Erase williamr@2: iterator erase(iterator __pos) { williamr@2: _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __pos) && (__pos != end())) williamr@2: return iterator (&_M_iter_list, _Base::erase(__pos._M_iterator)); williamr@2: } williamr@2: williamr@2: iterator erase(iterator __first, iterator __last) { williamr@2: _STLP_DEBUG_CHECK(__first >= begin() && __last <= end()) williamr@2: return iterator (&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator)); 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 <class _Tp, class _Alloc> williamr@2: #define _STLP_TEMPLATE_CONTAINER _DBG_deque<_Tp, _Alloc> williamr@2: #define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DEQUE_SUPER williamr@2: #include <stl/debug/_relops_cont.h> 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 _DBG_deque williamr@2: # undef _STLP_DEQUE_SUPER williamr@2: williamr@2: #endif /* _STLP_INTERNAL_DEQUE_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: