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
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static size_t _S_buffer_size() {
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t blocksize = _MAX_BYTES;
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return (sizeof(_Tp) < blocksize ? (blocksize / sizeof(_Tp)) : 1);
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef random_access_iterator_tag iterator_category;
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type** _Map_pointer;
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Deque_iterator_base< _Tp > _Self;
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type* _M_cur;
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type* _M_first;
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type* _M_last;
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Map_pointer _M_node;
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator_base(value_type* __x, _Map_pointer __y)
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_cur(__x), _M_first(*__y),
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_last(*__y + _S_buffer_size()), _M_node(__y) {}
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator_base() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {}
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// see comment in doc/README.evc4 and doc/README.evc8
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MSVC) && (_STLP_MSVC <= 1401) && defined (MIPS) && defined (NDEBUG)
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_iterator_base(_Deque_iterator_base const& __other)
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : _M_cur(__other._M_cur), _M_first(__other._M_first),
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_last(__other._M_last), _M_node(__other._M_node) {}
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type _M_subtract(const _Self& __x) const {
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return difference_type(_S_buffer_size()) * (_M_node - __x._M_node - 1) +
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      (_M_cur - _M_first) + (__x._M_last - __x._M_cur);
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_increment() {
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (++_M_cur == _M_last) {
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_set_node(_M_node + 1);
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur = _M_first;
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_decrement() {
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (_M_cur == _M_first) {
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_set_node(_M_node - 1);
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur = _M_last;
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --_M_cur;
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_advance(difference_type __n) {
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t buffersize = _S_buffer_size();
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    difference_type __offset = __n + (_M_cur - _M_first);
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (__offset >= 0 && __offset < difference_type(buffersize))
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur += __n;
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      difference_type __node_offset =
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        __offset > 0 ? __offset / buffersize
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                   : -difference_type((-__offset - 1) / buffersize) - 1;
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_set_node(_M_node + __node_offset);
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_cur = _M_first +
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        (__offset - __node_offset * difference_type(buffersize));
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_set_node(_Map_pointer __new_node) {
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_last = (_M_first = *(_M_node = __new_node)) + difference_type(_S_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)
345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef _Alloc 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
354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static size_t _STLP_CALL buffer_size() { return _Deque_iterator_base<_Tp>::_S_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
365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Deque_base(__move_source<_Self> src)
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_start(src.get()._M_start), _M_finish(src.get()._M_finish),
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_map(__move_source<_Map_alloc_proxy>(src.get()._M_map)),
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_map_size(__move_source<_Alloc_proxy>(src.get()._M_map_size)) {
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    src.get()._M_map._M_data = 0;
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    src.get()._M_map_size._M_data = 0;
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    src.get()._M_finish = src.get()._M_start;
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~_Deque_base();
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_map(size_t);
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish);
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish);
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  enum { _S_initial_map_size = 8 };
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_start;
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_finish;
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Map_alloc_proxy  _M_map;
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Alloc_proxy      _M_map_size;
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define deque _STLP_PTR_IMPL_NAME(deque)
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif defined (_STLP_DEBUG)
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define deque _STLP_NON_DBG_NAME(deque)
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass deque : protected _STLP_PRIV _Deque_base<_Tp, _Alloc>
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (deque)
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block            , public __stlport_class<deque<_Tp, _Alloc> >
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Deque_base<_Tp, _Alloc> _Base;
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef deque<_Tp, _Alloc> _Self;
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Basic types
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type* pointer;
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type* const_pointer;
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type& reference;
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type& const_reference;
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef random_access_iterator_tag _Iterator_category;
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::allocator_type allocator_type;
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Iterators
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::iterator       iterator;
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::const_iterator const_iterator;
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                      // Internal typedefs
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef pointer* _Map_pointer;
427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_NO_MOVE_SEMANTIC)
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type _Movable;
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Basic accessors
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator begin() { return this->_M_start; }
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator end() { return this->_M_finish; }
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator begin() const { return const_iterator(this->_M_start); }
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator end() const { return const_iterator(this->_M_finish); }
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rbegin() { return reverse_iterator(this->_M_finish); }
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rend() { return reverse_iterator(this->_M_start); }
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rbegin() const
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return const_reverse_iterator(this->_M_finish); }
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rend() const
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return const_reverse_iterator(this->_M_start); }
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference operator[](size_type __n)
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return this->_M_start[difference_type(__n)]; }
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference operator[](size_type __n) const
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { return this->_M_start[difference_type(__n)]; }
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_check(size_type __n) const {
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n >= this->size())
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __stl_throw_out_of_range("deque");
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference at(size_type __n)
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_range_check(__n); return (*this)[__n]; }
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference at(size_type __n) const
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    { _M_range_check(__n); return (*this)[__n]; }
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference front() { return *this->_M_start; }
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference back() {
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __tmp = this->_M_finish;
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --__tmp;
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *__tmp;
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference front() const { return *this->_M_start; }
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference back() const {
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const_iterator __tmp = this->_M_finish;
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --__tmp;
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return *__tmp;
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type size() const { return this->_M_finish - this->_M_start; }
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type max_size() const { return size_type(-1); }
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool empty() const { return this->_M_finish == this->_M_start; }
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  allocator_type get_allocator() const { return this->_M_map_size; }
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Constructor, destructor.
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit deque(const allocator_type& __a = allocator_type())
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque()
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), 0) {}
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const allocator_type& __a)
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, 0) {}
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const _Self& __x)
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__x.get_allocator(), __x.size())
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV __ucopy(__x.begin(), __x.end(), this->_M_start); }
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_initialize(size_type __n, const value_type& __val = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename _TrivialInit<_Tp>::_Ret _TrivialInit;
494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_fill_initialize(__val, _TrivialInit());
495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit deque(size_type __n)
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), __n)
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_initialize(__n); }
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(size_type __n, const value_type& __val, const allocator_type& __a = allocator_type())
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit deque(size_type __n)
503e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), __n) {
504e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename _TrivialInit<_Tp>::_Ret _TrivialInit;
505e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_fill_initialize(_STLP_DEFAULT_CONSTRUCTED(_Tp), _TrivialInit());
506e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(size_type __n, const value_type& __val)
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type(), __n)
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_initialize(__val, __false_type()); }
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(size_type __n, const value_type& __val, const allocator_type& __a)
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, __n)
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_initialize(__val, __false_type()); }
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_initialize_map(__n);
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_initialize(__x, __false_type());
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_dispatch(_InputIter __first, _InputIter __last,
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              const __false_type&) {
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(_InputIterator __first, _InputIterator __last,
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a) {
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_dispatch(__first, __last, _Integral());
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(_InputIterator __first, _InputIterator __last)
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(allocator_type()) {
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_dispatch(__first, __last, _Integral());
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const value_type* __first, const value_type* __last,
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a = allocator_type() )
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, __last - __first)
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV __ucopy(__first, __last, this->_M_start); }
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(const_iterator __first, const_iterator __last,
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const allocator_type& __a = allocator_type() )
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__a, __last - __first)
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_PRIV __ucopy(__first, __last, this->_M_start); }
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
560e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  deque(__move_source<_Self> src)
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Deque_base<_Tp, _Alloc>(__move_source<_Base>(src.get()))
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {}
564e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~deque()
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _STLP_STD::_Destroy_Range(this->_M_start, this->_M_finish); }
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator= (const _Self& __x);
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void swap(_Self& __x) {
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::swap(this->_M_start, __x._M_start);
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::swap(this->_M_finish, __x._M_finish);
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map.swap(__x._M_map);
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map_size.swap(__x._M_map_size);
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
577e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
578e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_swap_workaround(_Self& __x) { swap(__x); }
579e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // assign(), a generalized assignment member function.  Two
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // versions: one that takes a count, and one that takes a range.
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The range version is a member template, so we dispatch on whether
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // or not the type is an integer.
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_assign(size_type __n, const _Tp& __val) {
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > size()) {
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::fill(begin(), end(), __val);
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __n - size(), __val);
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(begin() + __n, end());
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::fill(begin(), end(), __val);
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(size_type __n, const _Tp& __val) {
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_assign(__n, __val);
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(_InputIterator __first, _InputIterator __last) {
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_assign_dispatch(__first, __last, _Integral());
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:                        // helper functions for assign()
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_Integer __n, _Integer __val,
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/)
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_assign((size_type) __n, (_Tp) __val); }
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_aux(_InputIter __first, _InputIter __last, const input_iterator_tag &) {
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __cur = begin();
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__cur = *__first;
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first == __last)
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(__cur, end());
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __first, __last);
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     const forward_iterator_tag &) {
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const value_type *__first, const value_type *__last) {
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __size = size();
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __len = __last - __first;
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__len > __size) {
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const value_type *__mid = __first + __size;
642e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::copy(__first, __mid, begin());
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __mid, __last);
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
646e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      erase(_STLP_STD::copy(__first, __last, begin()), end());
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const_iterator __first, const_iterator __last) {
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef const_iterator _ForwardIterator;
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
652e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __len = _STLP_STD::distance(__first, __last);
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__len > size()) {
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _ForwardIterator __mid = __first;
655e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::advance(__mid, size());
656e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::copy(__first, __mid, begin());
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __mid, __last);
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
660e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      erase(_STLP_STD::copy(__first, __last, begin()), end());
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // push_* and pop_*
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back(const value_type& __t = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back(const value_type& __t) {
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Copy_Construct(this->_M_finish._M_cur, __t);
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++this->_M_finish._M_cur;
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_back_aux_v(__t);
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front(const value_type& __t = _STLP_DEFAULT_CONSTRUCTED(_Tp))   {
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front(const value_type& __t)   {
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_start._M_cur != this->_M_start._M_first) {
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Copy_Construct(this->_M_start._M_cur - 1, __t);
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --this->_M_start._M_cur;
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_front_aux_v(__t);
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back() {
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Construct(this->_M_finish._M_cur);
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++this->_M_finish._M_cur;
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_back_aux();
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_front() {
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_start._M_cur != this->_M_start._M_first) {
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Construct(this->_M_start._M_cur - 1);
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --this->_M_start._M_cur;
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_push_front_aux();
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_back() {
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish._M_cur != this->_M_finish._M_first) {
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --this->_M_finish._M_cur;
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy(this->_M_finish._M_cur);
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_pop_back_aux();
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy(this->_M_finish._M_cur);
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_front() {
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(this->_M_start._M_cur);
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_pop_front_aux();
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Insert
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const value_type& __x) {
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
735e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
736e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__pos._M_cur == this->_M_start._M_cur) {
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      push_front(__x);
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return this->_M_start;
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (__pos._M_cur == this->_M_finish._M_cur) {
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      push_back(__x);
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __tmp = this->_M_finish;
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --__tmp;
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return __tmp;
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return _M_fill_insert_aux(__pos, 1, __x, _Movable());
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos)
7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, size_type __n, const value_type& __x)
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_insert(__pos, __n, __x); }
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_fill_insert_aux(iterator __pos, size_type __n, const value_type& __x, const __true_type& /*_Movable*/);
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_fill_insert_aux(iterator __pos, size_type __n, const value_type& __x, const __false_type& /*_Movable*/);
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/) {
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_insert(__pos, (size_type) __n, (value_type) __x);
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos,
7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _InputIterator __first, _InputIterator __last,
7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/) {
7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
7839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
7859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_dispatch(__pos, __first, __last, _Integral());
7869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const value_type* __first, const value_type* __last,
7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __true_type& /*_Movable*/);
7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const value_type* __first, const value_type* __last,
7949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __false_type& /*_Movable*/);
7959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const_iterator __first, const_iterator __last,
7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __true_type& /*_Movable*/);
7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const_iterator __first, const_iterator __last,
8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __false_type& /*_Movable*/);
8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos,
8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              const value_type* __first, const value_type* __last);
8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos,
8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              const_iterator __first, const_iterator __last);
8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined(_STLP_DONT_SUP_DFLT_PARAM)
8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size,
8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size, const value_type& __x) {
8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const size_type __len = size();
8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__new_size < __len)
8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(this->_M_start + __new_size, this->_M_finish);
8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(this->_M_finish, __new_size - __len, __x);
8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM)
8249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size)
8259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { resize(__new_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
8269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
8279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
8299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __pos, const __true_type& /*_Movable*/);
8309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __pos, const __false_type& /*_Movable*/);
8319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __first, iterator __last, const __true_type& /*_Movable*/);
8339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __first, iterator __last, const __false_type& /*_Movable*/);
8349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:                         // Erase
8359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __pos) {
836e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
837e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
838e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
8399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_erase(__pos, _Movable());
8409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __first, iterator __last) {
842e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
843e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
844e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
8459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first == this->_M_start && __last == this->_M_finish) {
8469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      clear();
8479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return this->_M_finish;
8489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
8509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__first == __last)
8519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        return __first;
8529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return _M_erase(__first, __last, _Movable());
8539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void clear();
8569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                        // Internal construction/destruction
8589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_initialize(const value_type& __val, const __true_type& /*_TrivialInit*/)
8609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {}
8619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_initialize(const value_type& __val, const __false_type& /*_TrivialInit*/);
8629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
8649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
8659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_initialize(_InputIterator __first, _InputIterator __last,
8669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const input_iterator_tag &) {
8679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_initialize_map(0);
8689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
8699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for ( ; __first != __last; ++__first)
8709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        push_back(*__first);
8719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
8729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(clear())
8739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
8759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void  _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
8769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                            const forward_iterator_tag &)  {
877e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   size_type __n = _STLP_STD::distance(__first, __last);
8789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   this->_M_initialize_map(__n);
8799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   _Map_pointer __cur_node = this->_M_start._M_node;
8809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   _STLP_TRY {
8819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __cur_node < this->_M_finish._M_node; ++__cur_node) {
8829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _ForwardIterator __mid = __first;
883e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::advance(__mid, this->buffer_size());
884e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::uninitialized_copy(__first, __mid, *__cur_node);
8859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __first = __mid;
8869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
887e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STD::uninitialized_copy(__first, __last, this->_M_finish._M_first);
8889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   }
8899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(this->_M_start, iterator(*__cur_node, __cur_node)))
8909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }
8919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
8929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                        // Internal push_* and pop_*
8949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_back_aux_v(const value_type&);
8969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_front_aux_v(const value_type&);
8979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
8989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_back_aux();
8999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_push_front_aux();
9009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM !_STLP_NO_ANACHRONISMS*/
9019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_pop_back_aux();
9029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_pop_front_aux();
9039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                        // Internal insert functions
9059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
9079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
9099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert(iterator __pos,
9109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                _InputIterator __first,
9119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                _InputIterator __last,
9129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                const input_iterator_tag &) {
913e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STD::copy(__first, __last, inserter(*this, __pos));
9149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
9179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void  _M_insert(iterator __pos,
9189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  _ForwardIterator __first, _ForwardIterator __last,
9199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  const forward_iterator_tag &) {
920e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
921e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
922e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
923e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __n = _STLP_STD::distance(__first, __last);
9249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__pos._M_cur == this->_M_start._M_cur) {
9259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_start = _M_reserve_elements_at_front(__n);
9269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, __new_start);
9289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
9299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
9319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (__pos._M_cur == this->_M_finish._M_cur) {
9339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_finish = _M_reserve_elements_at_back(__n);
9349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, this->_M_finish);
9369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
9379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
9399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
9419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
9429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
9459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
9469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _ForwardIterator __first, _ForwardIterator __last,
9479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __true_type& /*_Movable*/) {
9489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elemsbefore = __pos - this->_M_start;
9499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __length = size();
9509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__elemsbefore <= difference_type(__length / 2)) {
9519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_start = _M_reserve_elements_at_front(__n);
9529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_start + __elemsbefore;
9539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __dst = __new_start;
9559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __src = this->_M_start;
9569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        for (; __src != __pos; ++__dst, ++__src) {
9579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Move_Construct(&(*__dst), *__src);
9589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Destroy_Moved(&(*__src));
9599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
9609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
9619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, __dst);
9629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
9649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
9669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_finish = _M_reserve_elements_at_back(__n);
9679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const difference_type __elemsafter = difference_type(__length) - __elemsbefore;
9689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_finish - __elemsafter;
9699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __dst = __new_finish;
9719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __src = this->_M_finish;
9729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
9739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Move_Construct(&(*__dst), *__src);
9749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Destroy_Moved(&(*__src));
9759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
9769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
9779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        uninitialized_copy(__first, __last, __pos);
9789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
9799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
9809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
9819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
9829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
9839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
9849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_range_aux(iterator __pos,
9859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _ForwardIterator __first, _ForwardIterator __last,
9869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __false_type& /*_Movable*/) {
9879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elemsbefore = __pos - this->_M_start;
9889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __length = size();
9899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__elemsbefore <= difference_type(__length / 2)) {
9909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_start = _M_reserve_elements_at_front(__n);
9919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __old_start = this->_M_start;
9929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_start + __elemsbefore;
9939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
9949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__elemsbefore >= difference_type(__n)) {
9959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          iterator __start_n = this->_M_start + difference_type(__n);
996e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::uninitialized_copy(this->_M_start, __start_n, __new_start);
9979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_start = __new_start;
998e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::copy(__start_n, __pos, __old_start);
999e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::copy(__first, __last, __pos - difference_type(__n));
10009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else {
10029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _ForwardIterator __mid = __first;
1003e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::advance(__mid, difference_type(__n) - __elemsbefore);
10049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
10059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_start = __new_start;
1006e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::copy(__mid, __last, __old_start);
10079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
10109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
10119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
10129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_finish = _M_reserve_elements_at_back(__n);
10139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __old_finish = this->_M_finish;
10149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const difference_type __elemsafter = difference_type(__length) - __elemsbefore;
10159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = this->_M_finish - __elemsafter;
10169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_TRY {
10179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        if (__elemsafter > difference_type(__n)) {
10189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          iterator __finish_n = this->_M_finish - difference_type(__n);
1019e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
10209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_finish = __new_finish;
1021e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
1022e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::copy(__first, __last, __pos);
10239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        else {
10259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _ForwardIterator __mid = __first;
1026e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::advance(__mid, __elemsafter);
10279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
10289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          this->_M_finish = __new_finish;
1029e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott          _STLP_STD::copy(__first, __mid, __pos);
10309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
10319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
10329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
10339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
10349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
10369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_reserve_elements_at_front(size_type __n) {
10389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __vacancies = this->_M_start._M_cur - this->_M_start._M_first;
10399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > __vacancies)
10409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_new_elements_at_front(__n - __vacancies);
10419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_start - difference_type(__n);
10429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_reserve_elements_at_back(size_type __n) {
10459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __vacancies = (this->_M_finish._M_last - this->_M_finish._M_cur) - 1;
10469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n > __vacancies)
10479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_new_elements_at_back(__n - __vacancies);
10489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return this->_M_finish + difference_type(__n);
10499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_new_elements_at_front(size_type __new_elements);
10529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_new_elements_at_back(size_type __new_elements);
10539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:                      // Allocation of _M_map and nodes
10559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Makes sure the _M_map has space for new nodes.  Does not actually
10579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  add the nodes.  Can invalidate _M_map pointers.  (And consequently,
10589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //  deque iterators.)
10599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_reserve_map_at_back (size_type __nodes_to_add = 1) {
10619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__nodes_to_add + 1 > this->_M_map_size._M_data - (this->_M_finish._M_node - this->_M_map._M_data))
10629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_reallocate_map(__nodes_to_add, false);
10639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_reserve_map_at_front (size_type __nodes_to_add = 1) {
10669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__nodes_to_add > size_type(this->_M_start._M_node - this->_M_map._M_data))
10679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_reallocate_map(__nodes_to_add, true);
10689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
10699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);
10719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
10729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (deque)
10749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef deque
10759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
10769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
10799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION)
10819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_deque.c>
10829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
10859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/pointers/_deque.h>
10869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG)
10899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/debug/_deque.h>
10909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
10919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
10939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
10949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_CONTAINER deque<_Tp, _Alloc>
10959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
10969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <stl/_relops_cont.h>
10979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_CONTAINER
10989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_HEADER
10999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC)
11019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
11029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __move_traits<deque<_Tp, _Alloc> > {
1103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef __true_type implemented;
11049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Alloc>::complete complete;
11059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
11079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
11099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_DEQUE_H */
11119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
11129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
11139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
11149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
11159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1116