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: