111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1994
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hewlett-Packard Company
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996,1997
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1997
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Moscow Center for SPARC Technology
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk.
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies.
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted,
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice.
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* NOTE: This is an internal header file, included by other STL headers.
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *   You should not attempt to use it directly.
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_DBG_DEQUE_H
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_INTERNAL_DBG_DEQUE_H
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_DBG_ITERATOR_H
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/debug/_iterator.h>
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_NON_DBG_DEQUE _STLP_PRIV _STLP_NON_DBG_NAME(deque) <_Tp,_Alloc>
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS)
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _Tp* value_type(const _STLP_PRIV _DBG_iter_base< _STLP_NON_DBG_DEQUE >&)
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return (_Tp*)0; }
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline random_access_iterator_tag iterator_category(const _STLP_PRIV _DBG_iter_base< _STLP_NON_DBG_DEQUE >&)
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return random_access_iterator_tag(); }
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass deque :
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (__DMC__)
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert             private
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                     _STLP_PRIV __construct_checker<_STLP_NON_DBG_DEQUE >
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            , public __stlport_class<deque<_Tp, _Alloc> >
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef deque<_Tp,_Alloc> _Self;
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _STLP_NON_DBG_DEQUE _Base;
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _STLP_PRIV __construct_checker<_STLP_NON_DBG_DEQUE > _ConstructCheck;
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Basic types
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  __IMPORT_CONTAINER_TYPEDEFS(_Base)
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Iterators
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _STLP_PRIV _DBG_iter<_Base, _STLP_PRIV _DbgTraits<_Nonconst_traits<value_type> > > iterator;
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef _STLP_PRIV _DBG_iter<_Base, _STLP_PRIV _DbgTraits<_Const_traits<value_type> > >    const_iterator;
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprotected:
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Base _M_non_dbg_impl;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_PRIV __owned_list _M_iter_list;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void _Invalidate_all()
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { _M_iter_list._Invalidate_all(); }
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void _Invalidate_iterator(const iterator& __it)
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { _STLP_PRIV __invalidate_iterator(&_M_iter_list,__it); }
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void _Invalidate_iterators(const iterator& __first, const iterator& __last)
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  { _STLP_PRIV __invalidate_range(&_M_iter_list, __first, __last); }
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Basic accessors
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  allocator_type get_allocator() const { return _M_non_dbg_impl.get_allocator(); }
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator begin() { return iterator(&_M_iter_list, _M_non_dbg_impl.begin()); }
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator end() { return iterator(&_M_iter_list, _M_non_dbg_impl.end()); }
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_iterator begin() const { return const_iterator(&_M_iter_list, _M_non_dbg_impl.begin()); }
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_iterator end() const { return const_iterator(&_M_iter_list, _M_non_dbg_impl.end()); }
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  reverse_iterator rbegin() { return reverse_iterator(end()); }
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  reverse_iterator rend() { return reverse_iterator(begin()); }
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  reference operator[](size_type __n) {
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__n < size(), _StlMsg_OUT_OF_BOUNDS)
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return _M_non_dbg_impl[__n];
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_reference operator[](size_type __n) const {
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(__n < size(), _StlMsg_OUT_OF_BOUNDS)
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return _M_non_dbg_impl[__n];
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  reference at(size_type __n) { return _M_non_dbg_impl.at(__n); }
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_reference at(size_type __n) const { return _M_non_dbg_impl.at(__n); }
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  reference front() {
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(!empty(), _StlMsg_EMPTY_CONTAINER)
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *begin();
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_reference front() const {
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(!empty(), _StlMsg_EMPTY_CONTAINER)
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *begin();
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  reference back() {
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(!empty(), _StlMsg_EMPTY_CONTAINER)
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *(--end());
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const_reference back() const {
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(!empty(), _StlMsg_EMPTY_CONTAINER)
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *(--end());
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Constructor, destructor.
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit deque(const allocator_type& __a = allocator_type()) :
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl(__a), _M_iter_list(&_M_non_dbg_impl) {}
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  deque(const _Self& __x) :
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _ConstructCheck(__x), _M_non_dbg_impl(__x._M_non_dbg_impl),
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_iter_list(&_M_non_dbg_impl) {}
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(_STLP_DONT_SUP_DFLT_PARAM)
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit deque(size_type __n, const value_type& __x = _Tp(),
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  deque(size_type __n, const value_type& __x,
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const allocator_type& __a = allocator_type()) :
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl(__n, __x, __a), _M_iter_list(&_M_non_dbg_impl) {}
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DONT_SUP_DFLT_PARAM)
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit deque(size_type __n) :
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl(__n), _M_iter_list(&_M_non_dbg_impl) {}
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_MOVE_SEMANTIC)
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  deque(__move_source<_Self> src)
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_non_dbg_impl(__move_source<_Base>(src.get()._M_non_dbg_impl)),
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_iter_list(&_M_non_dbg_impl) {
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_NO_EXTENSIONS) || (_STLP_DEBUG_LEVEL == _STLP_STANDARD_DBG_LEVEL)
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    src.get()._M_iter_list._Invalidate_all();
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  else
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    src.get()._M_iter_list._Set_owner(_M_iter_list);
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MEMBER_TEMPLATES)
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _InputIterator>
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  deque(_InputIterator __first, _InputIterator __last,
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _ConstructCheck(__first, __last),
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_non_dbg_impl(_STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last), __a),
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_iter_list(&_M_non_dbg_impl) {
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _InputIterator>
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  deque(_InputIterator __first, _InputIterator __last)
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _ConstructCheck(__first, __last),
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_non_dbg_impl(_STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last)),
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_iter_list(&_M_non_dbg_impl) {
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  endif
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  deque(const value_type* __first, const value_type* __last,
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const allocator_type& __a = allocator_type())
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _ConstructCheck(__first, __last),
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_non_dbg_impl(__first, __last, __a),
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_iter_list(&_M_non_dbg_impl) {
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  deque(const_iterator __first, const_iterator __last,
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const allocator_type& __a = allocator_type())
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _ConstructCheck(__first, __last),
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_non_dbg_impl(__first._M_iterator, __last._M_iterator, __a),
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_iter_list(&_M_non_dbg_impl) {
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Self& operator=(const _Self& __x) {
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (this != &__x) {
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Invalidate_all();
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_non_dbg_impl = __x._M_non_dbg_impl;
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return *this;
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  bool empty() const { return _M_non_dbg_impl.empty(); }
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type size() const { return _M_non_dbg_impl.size(); }
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type max_size() const { return _M_non_dbg_impl.max_size(); }
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void swap(_Self& __x) {
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_iter_list._Swap_owners(__x._M_iter_list);
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.swap(__x._M_non_dbg_impl);
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void _M_swap_workaround(_Self& __x) { swap(__x); }
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void assign(size_type __n, const _Tp& __val) {
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.assign(__n, __val);
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MEMBER_TEMPLATES)
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _InputIterator>
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void assign(_InputIterator __first, _InputIterator __last) {
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.assign(_STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last));
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void assign(const_iterator __first, const_iterator __last) {
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.assign(__first._M_iterator, __last._M_iterator);
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void assign(const value_type *__first, const value_type *__last) {
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_ptr_range(__first, __last))
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.assign(__first, __last);
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:                         // push_* and pop_*
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void push_back(const value_type& __t = _Tp()) {
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void push_back(const value_type& __t) {
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.push_back(__t);
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void push_back() {
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.push_back();
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void push_front(const value_type& __t = _Tp()) {
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void push_front(const value_type& __t) {
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.push_front(__t);
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void push_front() {
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.push_front();
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void pop_back() {
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(!empty(), _StlMsg_EMPTY_CONTAINER)
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_iterator(end());
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.pop_back();
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void pop_front() {
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_VERBOSE_ASSERT(!empty(), _StlMsg_EMPTY_CONTAINER)
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_iterator(begin());
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.pop_front();
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic:                         // Insert
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator insert(iterator __pos, const value_type& __x = _Tp()) {
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator insert(iterator __pos, const value_type& __x) {
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return iterator(&_M_iter_list, _M_non_dbg_impl.insert(__pos._M_iterator, __x));
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator insert(iterator __pos) {
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return iterator(&_M_iter_list, _M_non_dbg_impl.insert(__pos._M_iterator));
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void insert(iterator __pos, size_type __n, const value_type& __x) {
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__n != 0) _Invalidate_all();
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.insert(__pos._M_iterator, __n, __x);
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_MEMBER_TEMPLATES)
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template <class _InputIterator>
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // We perform invalidate first to detect self referencing in __check_range as __first and __last
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // will have been invalidated.
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__first != __last) _Invalidate_all();
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.insert(__pos._M_iterator,
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                           _STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last));
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_MEMBER_TEMPLATES)
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void insert(iterator __pos,
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert              const value_type* __first, const value_type* __last) {
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_ptr_range(__first, __last))
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__first != __last) _Invalidate_all();
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.insert(__pos._M_iterator, __first, __last);
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_MEMBER_TEMPLATES) || !defined (_STLP_NO_METHOD_SPECIALIZATION)
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void insert(iterator __pos,
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert              const_iterator __first, const_iterator __last) {
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    //Sequence requirements 23.1.1 Table 67:
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_not_owner(&_M_iter_list, __first));
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__first != __last) _Invalidate_all();
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.insert(__pos._M_iterator, __first._M_iterator, __last._M_iterator);
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void insert(iterator __pos,
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert              iterator __first, iterator __last) {
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    //Sequence requirements 23.1.1 Table 67:
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_not_owner(&_M_iter_list, __first));
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__first != __last) _Invalidate_all();
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.insert(__pos._M_iterator, __first._M_iterator, __last._M_iterator);
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void resize(size_type __new_size, const value_type& __x = _Tp()) {
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void resize(size_type __new_size, const value_type& __x) {
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__new_size != size()) {
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if ((__new_size > size()) || (__new_size < size() - 1))
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _Invalidate_all();
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _Invalidate_iterator(end());
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.resize(__new_size, __x);
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DONT_SUP_DFLT_PARAM)
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void resize(size_type new_size) { resize(new_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Erase
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator erase(iterator __pos) {
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list, __pos))
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV _Dereferenceable(__pos))
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__pos._M_iterator == _M_non_dbg_impl.begin()) {
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Invalidate_iterator(__pos);
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    } else {
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typename _Base::iterator tmp = --(_M_non_dbg_impl.end());
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__pos._M_iterator == tmp)
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _Invalidate_iterator(__pos);
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _Invalidate_all();
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return iterator (&_M_iter_list, _M_non_dbg_impl.erase(__pos._M_iterator));
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator erase(iterator __first, iterator __last) {
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last, begin(), end()))
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (!empty()) {
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__first._M_iterator == _M_non_dbg_impl.begin() ||
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          __last._M_iterator == _M_non_dbg_impl.end())
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _Invalidate_iterators(__first, __last);
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _Invalidate_all();
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return iterator (&_M_iter_list, _M_non_dbg_impl.erase(__first._M_iterator, __last._M_iterator));
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void clear() {
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Invalidate_all();
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_non_dbg_impl.clear();
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _STLP_NON_DBG_DEQUE
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_INTERNAL_DEQUE_H */
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables:
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End:
415