_deque.h revision 9720d5f59b9c1f5d1b9ecbc9173dbcb71bd557be
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers.
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *   You should not attempt to use it directly.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_DEQUE_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_DEQUE_H
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGOBASE_H
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_algobase.h>
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_alloc.h>
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_H
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_iterator.h>
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_UNINITIALIZED_H
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_uninitialized.h>
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_RANGE_ERRORS_H
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_range_errors.h>
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* Class invariants:
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  For any nonsingular iterator i:
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    i.node is the address of an element in the map array.  The
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *      contents of i.node is a pointer to the beginning of a node.
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    i.first == *(i.node)
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    i.last  == i.first + node_size
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    i.cur is a pointer in the range [i.first, i.last).  NOTE:
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *      the implication of this is that i.cur is always a dereferenceable
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *      pointer, even if i is a past-the-end iterator.
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  Start and Finish are always nonsingular iterators.  NOTE: this means
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    that an empty deque must have one node, and that a deque
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    with N elements, where N is the buffer size, must have two nodes.
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  For every node other than start.node and finish.node, every element
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    in the node is an initialized object.  If start.node == finish.node,
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    then [start.cur, finish.cur) are initialized objects, and
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    the elements outside that range are uninitialized storage.  Otherwise,
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    [start.cur, start.last) and [finish.first, finish.cur) are initialized
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    objects, and [start.first, start.cur) and [finish.cur, finish.last)
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    are uninitialized storage.
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  [map, map + map_size) is a valid, non-empty range.
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  [start.node, finish.node] is a valid range contained within
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    [map, map + map_size).
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  A pointer in the range [map, map + map_size) points to an allocated node
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *    if and only if the pointer is in the range [start.node, finish.node].
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Deque_iterator_base {
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  enum _Constants {
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _blocksize = _MAX_BYTES,
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __buffer_size = (sizeof(_Tp) < (size_t)_blocksize ?
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  ( (size_t)_blocksize / sizeof(_Tp)) : size_t(1))
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  };
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef random_access_iterator_tag iterator_category;
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type** _Map_pointer;
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator_base< _Tp > _Self;
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type* _M_cur;
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type* _M_first;
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type* _M_last;
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Map_pointer _M_node;
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator_base(value_type* __x, _Map_pointer __y)
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_cur(__x), _M_first(*__y),
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_last(*__y + __buffer_size), _M_node(__y) {}
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator_base() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {}
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// see comment in doc/README.evc4 and doc/README.evc8
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MSVC) && (_STLP_MSVC <= 1401) && defined (MIPS) && defined (NDEBUG)
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator_base(_Deque_iterator_base const& __other)
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_cur(__other._M_cur), _M_first(__other._M_first),
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_last(__other._M_last), _M_node(__other._M_node) {}
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type _M_subtract(const _Self& __x) const {
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return difference_type(__buffer_size) * (_M_node - __x._M_node - 1) +
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      (_M_cur - _M_first) + (__x._M_last - __x._M_cur);
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_increment() {
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (++_M_cur == _M_last) {
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_set_node(_M_node + 1);
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur = _M_first;
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_decrement() {
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (_M_cur == _M_first) {
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_set_node(_M_node - 1);
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur = _M_last;
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --_M_cur;
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_advance(difference_type __n) {
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    difference_type __offset = __n + (_M_cur - _M_first);
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__offset >= 0 && __offset < difference_type(__buffer_size))
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur += __n;
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      difference_type __node_offset =
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __offset > 0 ? __offset / __buffer_size
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                   : -difference_type((-__offset - 1) / __buffer_size) - 1;
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_set_node(_M_node + __node_offset);
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur = _M_first +
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        (__offset - __node_offset * difference_type(__buffer_size));
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_set_node(_Map_pointer __new_node) {
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_last = (_M_first = *(_M_node = __new_node)) + difference_type(__buffer_size);
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Deque_iterator : public _Deque_iterator_base< _Tp> {
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef random_access_iterator_tag iterator_category;
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::reference  reference;
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::pointer    pointer;
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type** _Map_pointer;
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator_base< _Tp > _Base;
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator<_Tp, _Traits> _Self;
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::_NonConstTraits     _NonConstTraits;
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator<_Tp, _NonConstTraits> iterator;
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Traits::_ConstTraits        _ConstTraits;
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator<_Tp, _ConstTraits>    const_iterator;
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator(value_type* __x, _Map_pointer __y) :
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Deque_iterator_base<value_type>(__x,__y) {}
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator() {}
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //copy constructor for iterator and constructor from iterator for const_iterator
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator(const iterator& __x) :
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Deque_iterator_base<value_type>(__x) {}
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference operator*() const {
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *this->_M_cur;
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEFINE_ARROW_OPERATOR
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type operator-(const const_iterator& __x) const { return this->_M_subtract(__x); }
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator++() { this->_M_increment(); return *this; }
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self operator++(int)  {
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp = *this;
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++*this;
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp;
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator--() { this->_M_decrement(); return *this; }
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self operator--(int) {
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp = *this;
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --*this;
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp;
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator+=(difference_type __n) { this->_M_advance(__n); return *this; }
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self operator+(difference_type __n) const {
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp = *this;
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp += __n;
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator-=(difference_type __n) { return *this += -__n; }
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self operator-(difference_type __n) const {
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Self __tmp = *this;
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __tmp -= __n;
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference operator[](difference_type __n) const { return *(*this + __n); }
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Deque_iterator<_Tp, _Traits> _STLP_CALL
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator+(ptrdiff_t __n, const _Deque_iterator<_Tp, _Traits>& __x)
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __x + __n; }
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE)
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator==(const _Deque_iterator_base<_Tp >& __x,
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           const _Deque_iterator_base<_Tp >& __y)
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __x._M_cur == __y._M_cur; }
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator < (const _Deque_iterator_base<_Tp >& __x,
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            const _Deque_iterator_base<_Tp >& __y) {
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (__x._M_node == __y._M_node) ?
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    (__x._M_cur < __y._M_cur) : (__x._M_node < __y._M_node);
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator!=(const _Deque_iterator_base<_Tp >& __x,
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           const _Deque_iterator_base<_Tp >& __y)
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __x._M_cur != __y._M_cur; }
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>(const _Deque_iterator_base<_Tp >& __x,
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          const _Deque_iterator_base<_Tp >& __y)
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __y < __x; }
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL operator>=(const _Deque_iterator_base<_Tp >& __x,
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   const _Deque_iterator_base<_Tp >& __y)
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__x < __y); }
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL operator<=(const _Deque_iterator_base<_Tp >& __x,
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                   const _Deque_iterator_base<_Tp >& __y)
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__y < __x); }
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits1, class _Traits2>
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator==(const _Deque_iterator<_Tp, _Traits1 >& __x,
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           const _Deque_iterator<_Tp, _Traits2 >& __y)
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __x._M_cur == __y._M_cur; }
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits1, class _Traits2>
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator < (const _Deque_iterator<_Tp, _Traits1 >& __x,
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            const _Deque_iterator<_Tp, _Traits2 >& __y) {
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return (__x._M_node == __y._M_node) ?
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    (__x._M_cur < __y._M_cur) : (__x._M_node < __y._M_node);
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator!=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y)
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __x._M_cur != __y._M_cur; }
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y)
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __y < __x; }
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool  _STLP_CALL
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator>=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y)
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__x < __y); }
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool _STLP_CALL
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator<=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block           const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y)
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return !(__y < __x); }
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits>
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<_STLP_PRIV _Deque_iterator<_Tp, _Traits> > {
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type   has_trivial_default_constructor;
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_copy_constructor;
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_assignment_operator;
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __true_type    has_trivial_destructor;
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type   is_POD_type;
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits> inline _Tp*  _STLP_CALL
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvalue_type(const _STLP_PRIV _Deque_iterator<_Tp, _Traits  >&) { return (_Tp*)0; }
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits> inline random_access_iterator_tag _STLP_CALL
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockiterator_category(const _STLP_PRIV _Deque_iterator<_Tp, _Traits  >&) { return random_access_iterator_tag(); }
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Traits> inline ptrdiff_t* _STLP_CALL
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockdistance_type(const _STLP_PRIV _Deque_iterator<_Tp, _Traits  >&) { return 0; }
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* Deque base class.  It has two purposes.  First, its constructor
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  and destructor allocate (but don't initialize) storage.  This makes
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  exception safety easier.  Second, the base class encapsulates all of
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  the differences between SGI-style allocators and standard-conforming
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *  allocators.
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Deque_base {
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_base<_Tp, _Alloc> _Self;
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Alloc_traits<_Tp,_Alloc>::allocator_type  allocator_type;
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_alloc_proxy<size_t, value_type,  allocator_type> _Alloc_proxy;
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Alloc_traits<_Tp*, _Alloc>::allocator_type _Map_alloc_type;
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_alloc_proxy<value_type**, value_type*, _Map_alloc_type> _Map_alloc_proxy;
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static size_t _STLP_CALL buffer_size() { return (size_t)_Deque_iterator_base<_Tp>::__buffer_size; }
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_base(const allocator_type& __a, size_t __num_elements)
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_start(), _M_finish(), _M_map(_STLP_CONVERT_ALLOCATOR(__a, _Tp*), 0),
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_map_size(__a, (size_t)0)
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_initialize_map(__num_elements); }
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_base(const allocator_type& __a)
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_start(), _M_finish(), _M_map(_STLP_CONVERT_ALLOCATOR(__a, _Tp*), 0),
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_map_size(__a, (size_t)0) {}
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_base(__move_source<_Self> src)
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_start(src.get()._M_start), _M_finish(src.get()._M_finish),
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_map(__move_source<_Map_alloc_proxy>(src.get()._M_map)),
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_map_size(__move_source<_Alloc_proxy>(src.get()._M_map_size)) {
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    src.get()._M_map._M_data = 0;
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    src.get()._M_map_size._M_data = 0;
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    src.get()._M_finish = src.get()._M_start;
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~_Deque_base();
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_map(size_t);
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish);
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish);
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  enum { _S_initial_map_size = 8 };
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_start;
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_finish;
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Map_alloc_proxy  _M_map;
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Alloc_proxy      _M_map_size;
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define deque _STLP_PTR_IMPL_NAME(deque)
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif defined (_STLP_DEBUG)
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define deque _STLP_NON_DBG_NAME(deque)
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass deque : protected _STLP_PRIV _Deque_base<_Tp, _Alloc>
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (deque)
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            , public __stlport_class<deque<_Tp, _Alloc> >
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Deque_base<_Tp, _Alloc> _Base;
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef deque<_Tp, _Alloc> _Self;
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Basic types
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type* pointer;
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type* const_pointer;
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type& reference;
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type& const_reference;
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef random_access_iterator_tag _Iterator_category;
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::allocator_type allocator_type;
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Iterators
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::iterator       iterator;
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::const_iterator const_iterator;
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                      // Internal typedefs
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef pointer* _Map_pointer;
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialAss;
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialCpy;
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _TrivialInit<_Tp>::_Ret _TrivialInit;
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_MOVE_SEMANTIC)
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Tp>::implemented _Movable;
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type _Movable;
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Basic accessors
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator begin() { return this->_M_start; }
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator end() { return this->_M_finish; }
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator begin() const { return const_iterator(this->_M_start); }
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator end() const { return const_iterator(this->_M_finish); }
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rbegin() { return reverse_iterator(this->_M_finish); }
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rend() { return reverse_iterator(this->_M_start); }
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rbegin() const
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return const_reverse_iterator(this->_M_finish); }
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rend() const
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return const_reverse_iterator(this->_M_start); }
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference operator[](size_type __n)
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return this->_M_start[difference_type(__n)]; }
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference operator[](size_type __n) const
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return this->_M_start[difference_type(__n)]; }
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_check(size_type __n) const {
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n >= this->size())
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __stl_throw_out_of_range("deque");
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference at(size_type __n)
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_range_check(__n); return (*this)[__n]; }
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference at(size_type __n) const
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_range_check(__n); return (*this)[__n]; }
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference front() { return *this->_M_start; }
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference back() {
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __tmp = this->_M_finish;
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --__tmp;
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *__tmp;
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference front() const { return *this->_M_start; }
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference back() const {
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const_iterator __tmp = this->_M_finish;
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --__tmp;
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *__tmp;
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type size() const { return this->_M_finish - this->_M_start; }
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type max_size() const { return size_type(-1); }
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool empty() const { return this->_M_finish == this->_M_start; }
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  allocator_type get_allocator() const { return this->_M_map_size; }
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Constructor, destructor.
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit deque(const allocator_type& __a = allocator_type())
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque()
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), 0) {}
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const allocator_type& __a)
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, 0) {}
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const _Self& __x)
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__x.get_allocator(), __x.size())
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV __ucopy(__x.begin(), __x.end(), this->_M_start); }
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize(size_type __n, const value_type& __val = _STLP_DEFAULT_CONSTRUCTED(_Tp))
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_initialize(__val, _TrivialInit()); }
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit deque(size_type __n)
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), __n)
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_initialize(__n); }
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(size_type __n, const value_type& __val, const allocator_type& __a = allocator_type())
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit deque(size_type __n)
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), __n)
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_initialize(_STLP_DEFAULT_CONSTRUCTED(_Tp), _TrivialInit()); }
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(size_type __n, const value_type& __val)
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), __n)
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_initialize(__val, __false_type()); }
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(size_type __n, const value_type& __val, const allocator_type& __a)
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, __n)
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_initialize(__val, __false_type()); }
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_initialize_map(__n);
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_initialize(__x, __false_type());
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_dispatch(_InputIter __first, _InputIter __last,
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const __false_type&) {
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(_InputIterator __first, _InputIterator __last,
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a) {
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_dispatch(__first, __last, _Integral());
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(_InputIterator __first, _InputIterator __last)
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type()) {
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_dispatch(__first, __last, _Integral());
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const value_type* __first, const value_type* __last,
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a = allocator_type() )
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, __last - __first)
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV __ucopy(__first, __last, this->_M_start); }
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const_iterator __first, const_iterator __last,
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a = allocator_type() )
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, __last - __first)
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV __ucopy(__first, __last, this->_M_start); }
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(__move_source<_Self> src)
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__move_source<_Base>(src.get()))
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {}
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~deque()
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_STD::_Destroy_Range(this->_M_start, this->_M_finish); }
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator= (const _Self& __x);
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void swap(_Self& __x) {
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::swap(this->_M_start, __x._M_start);
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::swap(this->_M_finish, __x._M_finish);
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map.swap(__x._M_map);
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map_size.swap(__x._M_map_size);
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // assign(), a generalized assignment member function.  Two
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // versions: one that takes a count, and one that takes a range.
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The range version is a member template, so we dispatch on whether
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // or not the type is an integer.
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_assign(size_type __n, const _Tp& __val) {
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > size()) {
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::fill(begin(), end(), __val);
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __n - size(), __val);
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(begin() + __n, end());
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::fill(begin(), end(), __val);
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(size_type __n, const _Tp& __val) {
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_assign(__n, __val);
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(_InputIterator __first, _InputIterator __last) {
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_assign_dispatch(__first, __last, _Integral());
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:                        // helper functions for assign()
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_Integer __n, _Integer __val,
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/)
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_assign((size_type) __n, (_Tp) __val); }
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_aux(_InputIter __first, _InputIter __last, const input_iterator_tag &) {
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __cur = begin();
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__cur = *__first;
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first == __last)
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(__cur, end());
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __first, __last);
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     const forward_iterator_tag &) {
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const value_type *__first, const value_type *__last) {
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __size = size();
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __len = __last - __first;
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__len > __size) {
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const value_type *__mid = __first + __size;
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      copy(__first, __mid, begin());
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __mid, __last);
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(copy(__first, __last, begin()), end());
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const_iterator __first, const_iterator __last) {
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef const_iterator _ForwardIterator;
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __len = distance(__first, __last);
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__len > size()) {
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _ForwardIterator __mid = __first;
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      advance(__mid, size());
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      copy(__first, __mid, begin());
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __mid, __last);
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(copy(__first, __last, begin()), end());
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // push_* and pop_*
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back(const value_type& __t = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back(const value_type& __t) {
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Copy_Construct(this->_M_finish._M_cur, __t);
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++this->_M_finish._M_cur;
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_back_aux_v(__t);
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front(const value_type& __t = _STLP_DEFAULT_CONSTRUCTED(_Tp))   {
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front(const value_type& __t)   {
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_start._M_cur != this->_M_start._M_first) {
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Copy_Construct(this->_M_start._M_cur - 1, __t);
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --this->_M_start._M_cur;
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_front_aux_v(__t);
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back() {
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Construct(this->_M_finish._M_cur);
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++this->_M_finish._M_cur;
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_back_aux();
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front() {
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_start._M_cur != this->_M_start._M_first) {
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Construct(this->_M_start._M_cur - 1);
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --this->_M_start._M_cur;
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_front_aux();
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_back() {
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish._M_cur != this->_M_finish._M_first) {
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --this->_M_finish._M_cur;
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy(this->_M_finish._M_cur);
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_pop_back_aux();
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy(this->_M_finish._M_cur);
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_front() {
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(this->_M_start._M_cur);
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_pop_front_aux();
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Insert
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const value_type& __x) {
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__pos._M_cur == this->_M_start._M_cur) {
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      push_front(__x);
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return this->_M_start;
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (__pos._M_cur == this->_M_finish._M_cur) {
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      push_back(__x);
7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __tmp = this->_M_finish;
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --__tmp;
7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return __tmp;
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return _M_fill_insert_aux(__pos, 1, __x, _Movable());
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos)
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, size_type __n, const value_type& __x)
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_insert(__pos, __n, __x); }
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_fill_insert_aux(iterator __pos, size_type __n, const value_type& __x, const __true_type& /*_Movable*/);
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_fill_insert_aux(iterator __pos, size_type __n, const value_type& __x, const __false_type& /*_Movable*/);
7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/) {
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_insert(__pos, (size_type) __n, (value_type) __x);
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos,
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _InputIterator __first, _InputIterator __last,
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_dispatch(__pos, __first, __last, _Integral());
7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const value_type* __first, const value_type* __last,
7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __true_type& /*_Movable*/);
7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const value_type* __first, const value_type* __last,
7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __false_type& /*_Movable*/);
7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const_iterator __first, const_iterator __last,
7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __true_type& /*_Movable*/);
7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const_iterator __first, const_iterator __last,
7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __false_type& /*_Movable*/);
7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos,
7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              const value_type* __first, const value_type* __last);
7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos,
7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              const_iterator __first, const_iterator __last);
7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined(_STLP_DONT_SUP_DFLT_PARAM)
8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size,
8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size, const value_type& __x) {
8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const size_type __len = size();
8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__new_size < __len)
8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(this->_M_start + __new_size, this->_M_finish);
8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(this->_M_finish, __new_size - __len, __x);
8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM)
8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size)
8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { resize(__new_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __pos, const __true_type& /*_Movable*/);
8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __pos, const __false_type& /*_Movable*/);
8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __first, iterator __last, const __true_type& /*_Movable*/);
8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __first, iterator __last, const __false_type& /*_Movable*/);
8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Erase
8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __pos) {
8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_erase(__pos, _Movable());
8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __first, iterator __last) {
8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first == this->_M_start && __last == this->_M_finish) {
8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      clear();
8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return this->_M_finish;
8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__first == __last)
8369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __first;
8379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return _M_erase(__first, __last, _Movable());
8389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void clear();
8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                        // Internal construction/destruction
8439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_initialize(const value_type& __val, const __true_type& /*_TrivialInit*/)
8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {}
8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_initialize(const value_type& __val, const __false_type& /*_TrivialInit*/);
8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_initialize(_InputIterator __first, _InputIterator __last,
8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const input_iterator_tag &) {
8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_initialize_map(0);
8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for ( ; __first != __last; ++__first)
8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        push_back(*__first);
8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(clear())
8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void  _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            const forward_iterator_tag &)  {
8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   size_type __n = distance(__first, __last);
8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   this->_M_initialize_map(__n);
8649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   _Map_pointer __cur_node = this->_M_start._M_node;
8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   _STLP_TRY {
8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __cur_node < this->_M_finish._M_node; ++__cur_node) {
8679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _ForwardIterator __mid = __first;
8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      advance(__mid, this->buffer_size());
8699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_copy(__first, __mid, *__cur_node);
8709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __first = __mid;
8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    uninitialized_copy(__first, __last, this->_M_finish._M_first);
8739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   }
8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(this->_M_start, iterator(*__cur_node, __cur_node)))
8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }
8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
8779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                        // Internal push_* and pop_*
8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_back_aux_v(const value_type&);
8819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_front_aux_v(const value_type&);
8829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
8839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_back_aux();
8849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_front_aux();
8859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM !_STLP_NO_ANACHRONISMS*/
8869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_pop_back_aux();
8879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_pop_front_aux();
8889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                        // Internal insert functions
8909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
8929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
8949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert(iterator __pos,
8959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                _InputIterator __first,
8969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                _InputIterator __last,
8979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                const input_iterator_tag &) {
8989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    copy(__first, __last, inserter(*this, __pos));
8999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
9029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void  _M_insert(iterator __pos,
9039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  _ForwardIterator __first, _ForwardIterator __last,
9049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  const forward_iterator_tag &) {
9059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __n = distance(__first, __last);
9069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__pos._M_cur == this->_M_start._M_cur) {
9079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_start = _M_reserve_elements_at_front(__n);
9089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, __new_start);
9109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
9119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
9139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (__pos._M_cur == this->_M_finish._M_cur) {
9159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_finish = _M_reserve_elements_at_back(__n);
9169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, this->_M_finish);
9189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
9199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
9219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
9239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
9249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
9279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
9289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _ForwardIterator __first, _ForwardIterator __last,
9299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __true_type& /*_Movable*/) {
9309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elemsbefore = __pos - this->_M_start;
9319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __length = size();
9329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__elemsbefore <= difference_type(__length / 2)) {
9339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_start = _M_reserve_elements_at_front(__n);
9349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_start + __elemsbefore;
9359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __dst = __new_start;
9379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __src = this->_M_start;
9389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        for (; __src != __pos; ++__dst, ++__src) {
9399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Move_Construct(&(*__dst), *__src);
9409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Destroy_Moved(&(*__src));
9419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
9429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
9439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, __dst);
9449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
9469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
9489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_finish = _M_reserve_elements_at_back(__n);
9499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const difference_type __elemsafter = difference_type(__length) - __elemsbefore;
9509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_finish - __elemsafter;
9519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __dst = __new_finish;
9539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __src = this->_M_finish;
9549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
9559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Move_Construct(&(*__dst), *__src);
9569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Destroy_Moved(&(*__src));
9579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
9589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
9599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, __pos);
9609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
9629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
9669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
9679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _ForwardIterator __first, _ForwardIterator __last,
9689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __false_type& /*_Movable*/) {
9699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elemsbefore = __pos - this->_M_start;
9709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __length = size();
9719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__elemsbefore <= difference_type(__length / 2)) {
9729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_start = _M_reserve_elements_at_front(__n);
9739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __old_start = this->_M_start;
9749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_start + __elemsbefore;
9759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__elemsbefore >= difference_type(__n)) {
9779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          iterator __start_n = this->_M_start + difference_type(__n);
9789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          uninitialized_copy(this->_M_start, __start_n, __new_start);
9799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_start = __new_start;
9809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          copy(__start_n, __pos, __old_start);
9819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          copy(__first, __last, __pos - difference_type(__n));
9829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
9839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else {
9849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _ForwardIterator __mid = __first;
9859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          advance(__mid, difference_type(__n) - __elemsbefore);
9869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
9879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_start = __new_start;
9889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          copy(__mid, __last, __old_start);
9899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
9909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
9929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
9949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_finish = _M_reserve_elements_at_back(__n);
9959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __old_finish = this->_M_finish;
9969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const difference_type __elemsafter = difference_type(__length) - __elemsbefore;
9979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_finish - __elemsafter;
9989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__elemsafter > difference_type(__n)) {
10009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          iterator __finish_n = this->_M_finish - difference_type(__n);
10019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
10029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_finish = __new_finish;
10039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          copy_backward(__pos, __finish_n, __old_finish);
10049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          copy(__first, __last, __pos);
10059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else {
10079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _ForwardIterator __mid = __first;
10089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          advance(__mid, __elemsafter);
10099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
10109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_finish = __new_finish;
10119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          copy(__first, __mid, __pos);
10129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
10159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
10169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
10189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_reserve_elements_at_front(size_type __n) {
10209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __vacancies = this->_M_start._M_cur - this->_M_start._M_first;
10219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > __vacancies)
10229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_new_elements_at_front(__n - __vacancies);
10239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_start - difference_type(__n);
10249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_reserve_elements_at_back(size_type __n) {
10279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __vacancies = (this->_M_finish._M_last - this->_M_finish._M_cur) - 1;
10289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > __vacancies)
10299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_new_elements_at_back(__n - __vacancies);
10309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_finish + difference_type(__n);
10319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_new_elements_at_front(size_type __new_elements);
10349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_new_elements_at_back(size_type __new_elements);
10359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                      // Allocation of _M_map and nodes
10379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Makes sure the _M_map has space for new nodes.  Does not actually
10399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  add the nodes.  Can invalidate _M_map pointers.  (And consequently,
10409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  deque iterators.)
10419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_reserve_map_at_back (size_type __nodes_to_add = 1) {
10439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__nodes_to_add + 1 > this->_M_map_size._M_data - (this->_M_finish._M_node - this->_M_map._M_data))
10449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_reallocate_map(__nodes_to_add, false);
10459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_reserve_map_at_front (size_type __nodes_to_add = 1) {
10489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__nodes_to_add > size_type(this->_M_start._M_node - this->_M_map._M_data))
10499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_reallocate_map(__nodes_to_add, true);
10509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);
10539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
10549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (deque)
10569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef deque
10579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
10589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
10619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION)
10639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_deque.c>
10649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
10679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/pointers/_deque.h>
10689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG)
10719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/debug/_deque.h>
10729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
10759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_CONTAINER deque<_Tp, _Alloc>
10779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
10789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <stl/_relops_cont.h>
10799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_CONTAINER
10809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_HEADER
10819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
10839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
10849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __move_traits<deque<_Tp, _Alloc> > {
10859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __stlp_movable implemented;
10869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Alloc>::complete complete;
10879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
10889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
10899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
10919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_DEQUE_H */
10939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
10959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
10969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
10979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1098