stl_deque.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:55k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_DEQUE_H
  30. #define __SGI_STL_INTERNAL_DEQUE_H
  31. /* Class invariants:
  32.  *  For any nonsingular iterator i:
  33.  *    i.node is the address of an element in the map array.  The
  34.  *      contents of i.node is a pointer to the beginning of a node.
  35.  *    i.first == *(i.node) 
  36.  *    i.last  == i.first + node_size
  37.  *    i.cur is a pointer in the range [i.first, i.last).  NOTE:
  38.  *      the implication of this is that i.cur is always a dereferenceable
  39.  *      pointer, even if i is a past-the-end iterator.
  40.  *  Start and Finish are always nonsingular iterators.  NOTE: this means
  41.  *    that an empty deque must have one node, and that a deque
  42.  *    with N elements, where N is the buffer size, must have two nodes.
  43.  *  For every node other than start.node and finish.node, every element
  44.  *    in the node is an initialized object.  If start.node == finish.node,
  45.  *    then [start.cur, finish.cur) are initialized objects, and
  46.  *    the elements outside that range are uninitialized storage.  Otherwise,
  47.  *    [start.cur, start.last) and [finish.first, finish.cur) are initialized
  48.  *    objects, and [start.first, start.cur) and [finish.cur, finish.last)
  49.  *    are uninitialized storage.
  50.  *  [map, map + map_size) is a valid, non-empty range.  
  51.  *  [start.node, finish.node] is a valid range contained within 
  52.  *    [map, map + map_size).  
  53.  *  A pointer in the range [map, map + map_size) points to an allocated node
  54.  *    if and only if the pointer is in the range [start.node, finish.node].
  55.  */
  56. /*
  57.  * In previous versions of deque, node_size was fixed by the 
  58.  * implementation.  In this version, however, users can select
  59.  * the node size.  Deque has three template parameters; the third,
  60.  * a number of type size_t, is the number of elements per node.
  61.  * If the third template parameter is 0 (which is the default), 
  62.  * then deque will use a default node size.
  63.  *
  64.  * The only reason for using an alternate node size is if your application
  65.  * requires a different performance tradeoff than the default.  If,
  66.  * for example, your program contains many deques each of which contains
  67.  * only a few elements, then you might want to save memory (possibly
  68.  * by sacrificing some speed) by using smaller nodes.
  69.  *
  70.  * Unfortunately, some compilers have trouble with non-type template 
  71.  * parameters; stl_config.h defines __STL_NON_TYPE_TMPL_PARAM_BUG if
  72.  * that is the case.  If your compiler is one of them, then you will
  73.  * not be able to use alternate node sizes; you will have to use the
  74.  * default value.
  75.  */
  76. __STL_BEGIN_NAMESPACE 
  77. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  78. #pragma set woff 1174
  79. #pragma set woff 1375
  80. #endif
  81. // Note: this function is simply a kludge to work around several compilers'
  82. //  bugs in handling constant expressions.
  83. inline size_t
  84. __deque_buf_size(size_t __n, size_t __size)
  85. {
  86.   return __n != 0 ? __n : (__size < 512 ? size_t(512 / __size) : size_t(1));
  87. }
  88. #ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
  89. template <class _T, class _Ref, class _Ptr, size_t __bufsiz>
  90. struct _Deque_iterator {
  91.   typedef _Deque_iterator<_T,_T&,_T*,__bufsiz>             iterator;
  92.   typedef _Deque_iterator<_T,const _T&,const _T*,__bufsiz> const_iterator;
  93.   static size_t 
  94.     _S_buffer_size() { return __deque_buf_size(__bufsiz, sizeof(_T)); }
  95. #else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
  96. template <class _T, class _Ref, class _Ptr>
  97. struct _Deque_iterator {
  98.   typedef _Deque_iterator<_T, _T&, _T*>             iterator;
  99.   typedef _Deque_iterator<_T, const _T&, const _T*> const_iterator;
  100.   static size_t 
  101.     _S_buffer_size() { return __deque_buf_size(0, sizeof(_T)); }
  102. #endif
  103.   typedef random_access_iterator_tag iterator_category;
  104.   typedef _T value_type;
  105.   typedef _Ptr pointer;
  106.   typedef _Ref reference;
  107.   typedef size_t size_type;
  108.   typedef ptrdiff_t difference_type;
  109.   typedef _T** _Map_pointer;
  110.   typedef _Deque_iterator _Self;
  111.   _T* _M_cur;
  112.   _T* _M_first;
  113.   _T* _M_last;
  114.   _Map_pointer _M_node;
  115.   _Deque_iterator(_T* __x, _Map_pointer __y) 
  116.     : _M_cur(__x), _M_first(*__y),
  117.       _M_last(*__y + _S_buffer_size()), _M_node(__y) {}
  118.   _Deque_iterator() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {}
  119.   _Deque_iterator(const iterator& __x)
  120.     : _M_cur(__x._M_cur), _M_first(__x._M_first), 
  121.       _M_last(__x._M_last), _M_node(__x._M_node) {}
  122.   reference operator*() const { return *_M_cur; }
  123. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  124.   pointer operator->() const { return _M_cur; }
  125. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  126.   difference_type operator-(const _Self& __x) const {
  127.     return difference_type(_S_buffer_size()) * (_M_node - __x._M_node - 1) +
  128.       (_M_cur - _M_first) + (__x._M_last - __x._M_cur);
  129.   }
  130.   _Self& operator++() {
  131.     ++_M_cur;
  132.     if (_M_cur == _M_last) {
  133.       _M_set_node(_M_node + 1);
  134.       _M_cur = _M_first;
  135.     }
  136.     return *this; 
  137.   }
  138.   _Self operator++(int)  {
  139.     _Self __tmp = *this;
  140.     ++*this;
  141.     return __tmp;
  142.   }
  143.   _Self& operator--() {
  144.     if (_M_cur == _M_first) {
  145.       _M_set_node(_M_node - 1);
  146.       _M_cur = _M_last;
  147.     }
  148.     --_M_cur;
  149.     return *this;
  150.   }
  151.   _Self operator--(int) {
  152.     _Self __tmp = *this;
  153.     --*this;
  154.     return __tmp;
  155.   }
  156.   _Self& operator+=(difference_type __n)
  157.   {
  158.     difference_type __offset = __n + (_M_cur - _M_first);
  159.     if (__offset >= 0 && __offset < difference_type(_S_buffer_size()))
  160.       _M_cur += __n;
  161.     else {
  162.       difference_type __node_offset =
  163.         __offset > 0 ? __offset / difference_type(_S_buffer_size())
  164.                    : -difference_type((-__offset - 1) / _S_buffer_size()) - 1;
  165.       _M_set_node(_M_node + __node_offset);
  166.       _M_cur = _M_first + 
  167.         (__offset - __node_offset * difference_type(_S_buffer_size()));
  168.     }
  169.     return *this;
  170.   }
  171.   _Self operator+(difference_type __n) const
  172.   {
  173.     _Self __tmp = *this;
  174.     return __tmp += __n;
  175.   }
  176.   _Self& operator-=(difference_type __n) { return *this += -__n; }
  177.  
  178.   _Self operator-(difference_type __n) const {
  179.     _Self __tmp = *this;
  180.     return __tmp -= __n;
  181.   }
  182.   reference operator[](difference_type __n) const { return *(*this + __n); }
  183.   bool operator==(const _Self& __x) const { return _M_cur == __x._M_cur; }
  184.   bool operator!=(const _Self& __x) const { return !(*this == __x); }
  185.   bool operator<(const _Self& __x) const {
  186.     return (_M_node == __x._M_node) ? 
  187.       (_M_cur < __x._M_cur) : (_M_node < __x._M_node);
  188.   }
  189.   void _M_set_node(_Map_pointer __new_node) {
  190.     _M_node = __new_node;
  191.     _M_first = *__new_node;
  192.     _M_last = _M_first + difference_type(_S_buffer_size());
  193.   }
  194. };
  195. #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
  196. #ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
  197. template <class _T, class _Ref, class _Ptr, size_t __bufsiz>
  198. inline random_access_iterator_tag
  199. iterator_category(const _Deque_iterator<_T,_Ref,_Ptr,__bufsiz>&) {
  200.   return random_access_iterator_tag();
  201. }
  202. template <class _T, class _Ref, class _Ptr, size_t __bufsiz>
  203. inline _T*
  204. value_type(const _Deque_iterator<_T,_Ref,_Ptr,__bufsiz>&) {
  205.   return 0;
  206. }
  207. template <class _T, class _Ref, class _Ptr, size_t __bufsiz>
  208. inline ptrdiff_t*
  209. distance_type(const _Deque_iterator<_T,_Ref,_Ptr,__bufsiz>&) {
  210.   return 0;
  211. }
  212. #else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
  213. template <class _T, class _Ref, class _Ptr>
  214. inline random_access_iterator_tag
  215. iterator_category(const _Deque_iterator<_T,_Ref,_Ptr>&)
  216. {
  217.   return random_access_iterator_tag();
  218. }
  219. template <class _T, class _Ref, class _Ptr>
  220. inline _T*
  221. value_type(const _Deque_iterator<_T,_Ref,_Ptr>&) { return 0; }
  222. template <class _T, class _Ref, class _Ptr>
  223. inline ptrdiff_t*
  224. distance_type(const _Deque_iterator<_T,_Ref,_Ptr>&) {
  225.   return 0;
  226. }
  227. #endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
  228. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  229. // Deque base class.  It has two purposes.  First, its constructor
  230. //  and destructor allocate (but don't initialize) storage.  This makes
  231. //  exception safety easier.  Second, the base class encapsulates all of
  232. //  the differences between SGI-style allocators and standard-conforming
  233. //  allocators.
  234. #ifdef __STL_USE_STD_ALLOCATORS
  235. // Base class for ordinary allocators.
  236. template <class _T, class _Alloc, size_t __bufsiz, bool __is_static>
  237. class _Deque_alloc_base {
  238. public:
  239.   typedef typename _Alloc_traits<_T,_Alloc>::allocator_type allocator_type;
  240.   allocator_type get_allocator() const { return node_allocator; }
  241.   _Deque_alloc_base(const allocator_type& __a)
  242.     : node_allocator(__a), map_allocator(__a), _M_map(0), _M_map_size(0)
  243.   {}
  244.   
  245. protected:
  246.   typedef typename _Alloc_traits<_T*, _Alloc>::allocator_type
  247.           map_allocator_type;
  248.   allocator_type node_allocator;
  249.   map_allocator_type map_allocator;
  250.   _T* _M_allocate_node()
  251.     { return node_allocator.allocate(__deque_buf_size(__bufsiz,sizeof(_T))); }
  252.   void _M_deallocate_node(_T* __p)
  253.     { node_allocator.deallocate(__p, __deque_buf_size(__bufsiz,sizeof(_T))); }
  254.   _T** _M_allocate_map(size_t __n) 
  255.     { return map_allocator.allocate(__n); }
  256.   void _M_deallocate_map(_T** __p, size_t __n) 
  257.     { map_allocator.deallocate(__p, __n); }
  258.   _T** _M_map;
  259.   size_t _M_map_size;
  260. };
  261. // Specialization for instanceless allocators.
  262. template <class _T, class _Alloc, size_t __bufsiz>
  263. class _Deque_alloc_base<_T, _Alloc, __bufsiz, true>
  264. {
  265. public:
  266.   typedef typename _Alloc_traits<_T,_Alloc>::allocator_type allocator_type;
  267.   allocator_type get_allocator() const { return allocator_type(); }
  268.   _Deque_alloc_base(const allocator_type&) : _M_map(0), _M_map_size(0) {}
  269.   
  270. protected:
  271.   typedef typename _Alloc_traits<_T, _Alloc>::_Alloc_type _Node_alloc_type;
  272.   typedef typename _Alloc_traits<_T*, _Alloc>::_Alloc_type _Map_alloc_type;
  273.   _T* _M_allocate_node()
  274.     { return _Node_alloc_type::allocate(__deque_buf_size(__bufsiz, 
  275.                                                          sizeof(_T))); }
  276.   void _M_deallocate_node(_T* __p)
  277.     { _Node_alloc_type::deallocate(__p, __deque_buf_size(__bufsiz, 
  278.                                                          sizeof(_T))); }
  279.   _T** _M_allocate_map(size_t __n) 
  280.     { return _Map_alloc_type::allocate(__n); }
  281.   void _M_deallocate_map(_T** __p, size_t __n) 
  282.     { _Map_alloc_type::deallocate(__p, __n); }
  283.   _T** _M_map;
  284.   size_t _M_map_size;
  285. };
  286. template <class _T, class _Alloc, size_t __bufsiz>
  287. class _Deque_base
  288.   : public _Deque_alloc_base<_T,_Alloc,__bufsiz, 
  289.                               _Alloc_traits<_T, _Alloc>::_S_instanceless>
  290. {
  291. public:
  292.   typedef _Deque_alloc_base<_T,_Alloc,__bufsiz,
  293.                              _Alloc_traits<_T, _Alloc>::_S_instanceless>
  294.           _Base;
  295.   typedef typename _Base::allocator_type allocator_type;
  296.   typedef _Deque_iterator<_T,_T&,_T*,__bufsiz>              iterator;
  297.   typedef _Deque_iterator<_T,const _T&,const _T&, __bufsiz>  const_iterator;
  298.   _Deque_base(const allocator_type& __a, size_t __num_elements)
  299.     : _Base(__a), _M_start(), _M_finish()
  300.     { _M_initialize_map(__num_elements); }
  301.   _Deque_base(const allocator_type& __a) 
  302.     : _Base(__a), _M_start(), _M_finish() {}
  303.   ~_Deque_base();    
  304. protected:
  305.   void _M_initialize_map(size_t);
  306.   void _M_create_nodes(_T** __nstart, _T** __nfinish);
  307.   void _M_destroy_nodes(_T** __nstart, _T** __nfinish);
  308.   enum { _S_initial_map_size = 8 };
  309. protected:
  310.   iterator _M_start;
  311.   iterator _M_finish;
  312. };
  313. #else /* __STL_USE_STD_ALLOCATORS */
  314. template <class _T, class _Alloc, size_t __bufsiz>
  315. class _Deque_base {
  316. public:
  317. #ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
  318.   typedef _Deque_iterator<_T,_T&,_T*,__bufsiz>              iterator;
  319.   typedef _Deque_iterator<_T,const _T&,const _T*, __bufsiz> const_iterator;
  320. #else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
  321.   typedef _Deque_iterator<_T,_T&,_T*>                      iterator;
  322.   typedef _Deque_iterator<_T,const _T&,const _T*>          const_iterator;
  323. #endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
  324.   typedef _Alloc allocator_type;
  325.   allocator_type get_allocator() const { return allocator_type(); }
  326.   _Deque_base(const allocator_type&, size_t __num_elements)
  327.     : _M_map(0), _M_map_size(0),  _M_start(), _M_finish() {
  328.     _M_initialize_map(__num_elements);
  329.   }
  330.   _Deque_base(const allocator_type&)
  331.     : _M_map(0), _M_map_size(0),  _M_start(), _M_finish() {}
  332.   ~_Deque_base();    
  333. protected:
  334.   void _M_initialize_map(size_t);
  335.   void _M_create_nodes(_T** __nstart, _T** __nfinish);
  336.   void _M_destroy_nodes(_T** __nstart, _T** __nfinish);
  337.   enum { _S_initial_map_size = 8 };
  338. protected:
  339.   _T** _M_map;
  340.   size_t _M_map_size;  
  341.   iterator _M_start;
  342.   iterator _M_finish;
  343.   typedef simple_alloc<_T, _Alloc>  _Node_alloc_type;
  344.   typedef simple_alloc<_T*, _Alloc> _Map_alloc_type;
  345.   _T* _M_allocate_node()
  346.     { return _Node_alloc_type::allocate(__deque_buf_size(__bufsiz, 
  347.                                                          sizeof(_T))); }
  348.   void _M_deallocate_node(_T* __p)
  349.     { _Node_alloc_type::deallocate(__p, __deque_buf_size(__bufsiz, 
  350.                                                          sizeof(_T))); }
  351.   _T** _M_allocate_map(size_t __n) 
  352.     { return _Map_alloc_type::allocate(__n); }
  353.   void _M_deallocate_map(_T** __p, size_t __n) 
  354.     { _Map_alloc_type::deallocate(__p, __n); }
  355. };
  356. #endif /* __STL_USE_STD_ALLOCATORS */
  357. // Non-inline member functions from _Deque_base.
  358. template <class _T, class _Alloc, size_t __bufsiz>
  359. _Deque_base<_T,_Alloc,__bufsiz>::~_Deque_base() {
  360.   if (_M_map) {
  361.     _M_destroy_nodes(_M_start._M_node, _M_finish._M_node + 1);
  362.     _M_deallocate_map(_M_map, _M_map_size);
  363.   }
  364. }
  365. template <class _T, class _Alloc, size_t __bufsiz>
  366. void _Deque_base<_T,_Alloc,__bufsiz>::_M_initialize_map(size_t __num_elements)
  367. {
  368.   size_t __num_nodes = 
  369.     __num_elements / __deque_buf_size(__bufsiz, sizeof(_T)) + 1;
  370.   _M_map_size = max((size_t) _S_initial_map_size, __num_nodes + 2);
  371.   _M_map = _M_allocate_map(_M_map_size);
  372.   _T** __nstart = _M_map + (_M_map_size - __num_nodes) / 2;
  373.   _T** __nfinish = __nstart + __num_nodes;
  374.     
  375.   __STL_TRY {
  376.     _M_create_nodes(__nstart, __nfinish);
  377.   }
  378.   __STL_UNWIND((_M_deallocate_map(_M_map, _M_map_size), 
  379.                 _M_map = 0, _M_map_size = 0));
  380.   _M_start._M_set_node(__nstart);
  381.   _M_finish._M_set_node(__nfinish - 1);
  382.   _M_start._M_cur = _M_start._M_first;
  383.   _M_finish._M_cur = _M_finish._M_first +
  384.                __num_elements % __deque_buf_size(__bufsiz, sizeof(_T));
  385. }
  386. template <class _T, class _Alloc, size_t __bufsiz>
  387. void
  388. _Deque_base<_T,_Alloc,__bufsiz>::_M_create_nodes(_T** __nstart,
  389.                                                  _T** __nfinish)
  390. {
  391.   _T** __cur;
  392.   __STL_TRY {
  393.     for (__cur = __nstart; __cur < __nfinish; ++__cur)
  394.       *__cur = _M_allocate_node();
  395.   }
  396.   __STL_UNWIND(_M_destroy_nodes(__nstart, __cur));
  397. }
  398. template <class _T, class _Alloc, size_t __bufsiz>
  399. void 
  400. _Deque_base<_T,_Alloc,__bufsiz>::_M_destroy_nodes(_T** __nstart,
  401.                                                   _T** __nfinish)
  402. {
  403.   for (_T** __n = __nstart; __n < __nfinish; ++__n)
  404.     _M_deallocate_node(*__n);
  405. }
  406. // See __deque_buf_size().  The only reason that the default value is 0
  407. //  is as a workaround for bugs in the way that some compilers handle
  408. //  constant expressions.
  409. template <class _T, class _Alloc = __STL_DEFAULT_ALLOCATOR(_T), 
  410.           size_t __bufsiz = 0> 
  411. class deque : protected _Deque_base<_T, _Alloc, __bufsiz> {
  412.   typedef _Deque_base<_T, _Alloc, __bufsiz> _Base;
  413. public:                         // Basic types
  414.   typedef _T value_type;
  415.   typedef value_type* pointer;
  416.   typedef const value_type* const_pointer;
  417.   typedef value_type& reference;
  418.   typedef const value_type& const_reference;
  419.   typedef size_t size_type;
  420.   typedef ptrdiff_t difference_type;
  421.   typedef typename _Base::allocator_type allocator_type;
  422.   allocator_type get_allocator() const { return _Base::get_allocator(); }
  423. public:                         // Iterators
  424.   typedef typename _Base::iterator       iterator;
  425.   typedef typename _Base::const_iterator const_iterator;
  426. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  427.   typedef reverse_iterator<const_iterator> const_reverse_iterator;
  428.   typedef reverse_iterator<iterator> reverse_iterator;
  429. #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  430.   typedef reverse_iterator<const_iterator, value_type, const_reference, 
  431.                            difference_type>  
  432.           const_reverse_iterator;
  433.   typedef reverse_iterator<iterator, value_type, reference, difference_type>
  434.           reverse_iterator; 
  435. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  436. protected:                      // Internal typedefs
  437.   typedef pointer* _Map_pointer;
  438.   static size_t _S_buffer_size()
  439.     { return __deque_buf_size(__bufsiz, sizeof(_T)); }
  440. protected:
  441. #ifdef __STL_USE_NAMESPACES
  442.   using _Base::_M_initialize_map;
  443.   using _Base::_M_create_nodes;
  444.   using _Base::_M_destroy_nodes;
  445.   using _Base::_M_allocate_node;
  446.   using _Base::_M_deallocate_node;
  447.   using _Base::_M_allocate_map;
  448.   using _Base::_M_deallocate_map;
  449.   using _Base::_M_map;
  450.   using _Base::_M_map_size;
  451.   using _Base::_M_start;
  452.   using _Base::_M_finish;
  453. #endif /* __STL_USE_NAMESPACES */
  454. public:                         // Basic accessors
  455.   iterator begin() { return _M_start; }
  456.   iterator end() { return _M_finish; }
  457.   const_iterator begin() const { return _M_start; }
  458.   const_iterator end() const { return _M_finish; }
  459.   reverse_iterator rbegin() { return reverse_iterator(_M_finish); }
  460.   reverse_iterator rend() { return reverse_iterator(_M_start); }
  461.   const_reverse_iterator rbegin() const 
  462.     { return const_reverse_iterator(_M_finish); }
  463.   const_reverse_iterator rend() const 
  464.     { return const_reverse_iterator(_M_start); }
  465.   reference operator[](size_type __n)
  466.     { return _M_start[difference_type(__n)]; }
  467.   const_reference operator[](size_type __n) const 
  468.     { return _M_start[difference_type(__n)]; }
  469.   reference front() { return *_M_start; }
  470.   reference back() {
  471.     iterator __tmp = _M_finish;
  472.     --__tmp;
  473.     return *__tmp;
  474.   }
  475.   const_reference front() const { return *_M_start; }
  476.   const_reference back() const {
  477.     const_iterator __tmp = _M_finish;
  478.     --__tmp;
  479.     return *__tmp;
  480.   }
  481.   size_type size() const { return _M_finish - _M_start;; }
  482.   size_type max_size() const { return size_type(-1); }
  483.   bool empty() const { return _M_finish == _M_start; }
  484. public:                         // Constructor, destructor.
  485.   explicit deque(const allocator_type& __a = allocator_type()) 
  486.     : _Base(__a, 0) {}
  487.   deque(const deque& __x) : _Base(__x.get_allocator(), __x.size()) 
  488.     { uninitialized_copy(__x.begin(), __x.end(), _M_start); }
  489.   deque(size_type __n, const value_type& __value,
  490.         const allocator_type& __a = allocator_type()) : _Base(__a, __n)
  491.     { _M_fill_initialize(__value); }
  492.   explicit deque(size_type __n) : _Base(allocator_type(), __n)
  493.     { _M_fill_initialize(value_type()); }
  494. #ifdef __STL_MEMBER_TEMPLATES
  495.   // Check whether it's an integral type.  If so, it's not an iterator.
  496.   template <class _InputIterator>
  497.   deque(_InputIterator __first, _InputIterator __last,
  498.         const allocator_type& __a = allocator_type()) : _Base(__a) {
  499.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  500.     _M_initialize_dispatch(__first, __last, _Integral());
  501.   }
  502.   template <class _Integer>
  503.   void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) {
  504.     _M_initialize_map(__n);
  505.     _M_fill_initialize(__x);
  506.   }
  507.   template <class _InputIter>
  508.   void _M_initialize_dispatch(_InputIter __first, _InputIter __last,
  509.                               __false_type) {
  510.     _M_range_initialize(__first, __last, __ITERATOR_CATEGORY(__first));
  511.   }
  512. #else /* __STL_MEMBER_TEMPLATES */
  513.   deque(const value_type* __first, const value_type* __last,
  514.         const allocator_type& __a = allocator_type()) 
  515.     : _Base(__a, __last - __first)
  516.     { uninitialized_copy(__first, __last, _M_start); }
  517.   deque(const_iterator __first, const_iterator __last,
  518.         const allocator_type& __a = allocator_type()) 
  519.     : _Base(__a, __last - __first)
  520.     { uninitialized_copy(__first, __last, _M_start); }
  521. #endif /* __STL_MEMBER_TEMPLATES */
  522.   ~deque() { destroy(_M_start, _M_finish); }
  523.   deque& operator= (const deque& __x) {
  524.     const size_type __len = size();
  525.     if (&__x != this) {
  526.       if (__len >= __x.size())
  527.         erase(copy(__x.begin(), __x.end(), _M_start), _M_finish);
  528.       else {
  529.         const_iterator __mid = __x.begin() + difference_type(__len);
  530.         copy(__x.begin(), __mid, _M_start);
  531.         insert(_M_finish, __mid, __x.end());
  532.       }
  533.     }
  534.     return *this;
  535.   }        
  536.   void swap(deque& __x) {
  537.     __STD::swap(_M_start, __x._M_start);
  538.     __STD::swap(_M_finish, __x._M_finish);
  539.     __STD::swap(_M_map, __x._M_map);
  540.     __STD::swap(_M_map_size, __x._M_map_size);
  541.   }
  542. public: 
  543.   // assign(), a generalized assignment member function.  Two
  544.   // versions: one that takes a count, and one that takes a range.
  545.   // The range version is a member template, so we dispatch on whether
  546.   // or not the type is an integer.
  547.   void assign(size_type __n, const _T& __val) {
  548.     if (__n > size()) {
  549.       fill(begin(), end(), __val);
  550.       insert(end(), __n - size(), __val);
  551.     }
  552.     else {
  553.       erase(begin() + __n, end());
  554.       fill(begin(), end(), __val);
  555.     }
  556.   }
  557. #ifdef __STL_MEMBER_TEMPLATES
  558.   template <class _InputIterator>
  559.   void assign(_InputIterator __first, _InputIterator __last) {
  560.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  561.     _M_assign_dispatch(__first, __last, _Integral());
  562.   }
  563. private:                        // helper functions for assign() 
  564.   template <class _Integer>
  565.   void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
  566.     { assign((size_type) __n, (_T) __val); }
  567.   template <class _InputIterator>
  568.   void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
  569.                           __false_type) {
  570.     _M_assign_aux(__first, __last, __ITERATOR_CATEGORY(__first));
  571.   }
  572.   template <class _InputIterator>
  573.   void _M_assign_aux(_InputIterator __first, _InputIterator __last,
  574.                      input_iterator_tag);
  575.   template <class _ForwardIterator>
  576.   void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
  577.                      forward_iterator_tag) {
  578.     size_type __len = 0;
  579.     distance(__first, __last, __len);
  580.     if (__len > size()) {
  581.       _ForwardIterator __mid = __first;
  582.       advance(__mid, size());
  583.       copy(__first, __mid, begin());
  584.       insert(end(), __mid, __last);
  585.     }
  586.     else
  587.       erase(copy(__first, __last, begin()), end());
  588.   }
  589. #endif /* __STL_MEMBER_TEMPLATES */
  590. public:                         // push_* and pop_*
  591.   
  592.   void push_back(const value_type& __t) {
  593.     if (_M_finish._M_cur != _M_finish._M_last - 1) {
  594.       construct(_M_finish._M_cur, __t);
  595.       ++_M_finish._M_cur;
  596.     }
  597.     else
  598.       _M_push_back_aux(__t);
  599.   }
  600.   void push_back() {
  601.     if (_M_finish._M_cur != _M_finish._M_last - 1) {
  602.       construct(_M_finish._M_cur);
  603.       ++_M_finish._M_cur;
  604.     }
  605.     else
  606.       _M_push_back_aux();
  607.   }
  608.   void push_front(const value_type& __t) {
  609.     if (_M_start._M_cur != _M_start._M_first) {
  610.       construct(_M_start._M_cur - 1, __t);
  611.       --_M_start._M_cur;
  612.     }
  613.     else
  614.       _M_push_front_aux(__t);
  615.   }
  616.   void push_front() {
  617.     if (_M_start._M_cur != _M_start._M_first) {
  618.       construct(_M_start._M_cur - 1);
  619.       --_M_start._M_cur;
  620.     }
  621.     else
  622.       _M_push_front_aux();
  623.   }
  624.   void pop_back() {
  625.     if (_M_finish._M_cur != _M_finish._M_first) {
  626.       --_M_finish._M_cur;
  627.       destroy(_M_finish._M_cur);
  628.     }
  629.     else
  630.       _M_pop_back_aux();
  631.   }
  632.   void pop_front() {
  633.     if (_M_start._M_cur != _M_start._M_last - 1) {
  634.       destroy(_M_start._M_cur);
  635.       ++_M_start._M_cur;
  636.     }
  637.     else 
  638.       _M_pop_front_aux();
  639.   }
  640. public:                         // Insert
  641.   iterator insert(iterator position, const value_type& __x) {
  642.     if (position._M_cur == _M_start._M_cur) {
  643.       push_front(__x);
  644.       return _M_start;
  645.     }
  646.     else if (position._M_cur == _M_finish._M_cur) {
  647.       push_back(__x);
  648.       iterator __tmp = _M_finish;
  649.       --__tmp;
  650.       return __tmp;
  651.     }
  652.     else {
  653.       return _M_insert_aux(position, __x);
  654.     }
  655.   }
  656.   iterator insert(iterator __position)
  657.     { return insert(__position, value_type()); }
  658.   void insert(iterator __pos, size_type __n, const value_type& __x); 
  659. #ifdef __STL_MEMBER_TEMPLATES  
  660.   // Check whether it's an integral type.  If so, it's not an iterator.
  661.   template <class _InputIterator>
  662.   void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
  663.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  664.     _M_insert_dispatch(__pos, __first, __last, _Integral());
  665.   }
  666.   template <class _Integer>
  667.   void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
  668.                           __true_type) {
  669.     insert(__pos, (size_type) __n, (value_type) __x);
  670.   }
  671.   template <class _InputIterator>
  672.   void _M_insert_dispatch(iterator __pos,
  673.                           _InputIterator __first, _InputIterator __last,
  674.                           __false_type) {
  675.     insert(__pos, __first, __last, __ITERATOR_CATEGORY(__first));
  676.   }
  677. #else /* __STL_MEMBER_TEMPLATES */
  678.   void insert(iterator __pos,
  679.               const value_type* __first, const value_type* __last);
  680.   void insert(iterator __pos,
  681.               const_iterator __first, const_iterator __last);
  682. #endif /* __STL_MEMBER_TEMPLATES */
  683.   void resize(size_type __new_size, const value_type& __x) {
  684.     const size_type __len = size();
  685.     if (__new_size < __len) 
  686.       erase(_M_start + __new_size, _M_finish);
  687.     else
  688.       insert(_M_finish, __new_size - __len, __x);
  689.   }
  690.   void resize(size_type new_size) { resize(new_size, value_type()); }
  691. public:                         // Erase
  692.   iterator erase(iterator __pos) {
  693.     iterator __next = __pos;
  694.     ++__next;
  695.     difference_type __index = __pos - _M_start;
  696.     if (__index < (size() >> 1)) {
  697.       copy_backward(_M_start, __pos, __next);
  698.       pop_front();
  699.     }
  700.     else {
  701.       copy(__next, _M_finish, __pos);
  702.       pop_back();
  703.     }
  704.     return _M_start + __index;
  705.   }
  706.   iterator erase(iterator __first, iterator __last);
  707.   void clear(); 
  708. protected:                        // Internal construction/destruction
  709.   void _M_fill_initialize(const value_type& __value);
  710. #ifdef __STL_MEMBER_TEMPLATES  
  711.   template <class _InputIterator>
  712.   void _M_range_initialize(_InputIterator __first, _InputIterator __last,
  713.                         input_iterator_tag);
  714.   template <class _ForwardIterator>
  715.   void _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
  716.                         forward_iterator_tag);
  717. #endif /* __STL_MEMBER_TEMPLATES */
  718. protected:                        // Internal push_* and pop_*
  719.   void _M_push_back_aux(const value_type&);
  720.   void _M_push_back_aux();
  721.   void _M_push_front_aux(const value_type&);
  722.   void _M_push_front_aux();
  723.   void _M_pop_back_aux();
  724.   void _M_pop_front_aux();
  725. protected:                        // Internal insert functions
  726. #ifdef __STL_MEMBER_TEMPLATES  
  727.   template <class _InputIterator>
  728.   void insert(iterator __pos, _InputIterator __first, _InputIterator __last,
  729.               input_iterator_tag);
  730.   template <class _ForwardIterator>
  731.   void insert(iterator __pos,
  732.               _ForwardIterator __first, _ForwardIterator __last,
  733.               forward_iterator_tag);
  734. #endif /* __STL_MEMBER_TEMPLATES */
  735.   iterator _M_insert_aux(iterator __pos, const value_type& __x);
  736.   iterator _M_insert_aux(iterator __pos);
  737.   void _M_insert_aux(iterator __pos, size_type __n, const value_type& __x);
  738. #ifdef __STL_MEMBER_TEMPLATES  
  739.   template <class _ForwardIterator>
  740.   void _M_insert_aux(iterator __pos, 
  741.                      _ForwardIterator __first, _ForwardIterator __last,
  742.                      size_type __n);
  743. #else /* __STL_MEMBER_TEMPLATES */
  744.   
  745.   void _M_insert_aux(iterator __pos,
  746.                      const value_type* __first, const value_type* __last,
  747.                      size_type __n);
  748.   void _M_insert_aux(iterator __pos, 
  749.                      const_iterator __first, const_iterator __last,
  750.                      size_type __n);
  751.  
  752. #endif /* __STL_MEMBER_TEMPLATES */
  753.   iterator _M_reserve_elements_at_front(size_type __n) {
  754.     size_type __vacancies = _M_start._M_cur - _M_start._M_first;
  755.     if (__n > __vacancies) 
  756.       _M_new_elements_at_front(__n - __vacancies);
  757.     return _M_start - difference_type(__n);
  758.   }
  759.   iterator _M_reserve_elements_at_back(size_type __n) {
  760.     size_type __vacancies = (_M_finish._M_last - _M_finish._M_cur) - 1;
  761.     if (__n > __vacancies)
  762.       _M_new_elements_at_back(__n - __vacancies);
  763.     return _M_finish + difference_type(__n);
  764.   }
  765.   void _M_new_elements_at_front(size_type __new_elements);
  766.   void _M_new_elements_at_back(size_type __new_elements);
  767. protected:                      // Allocation of _M_map and nodes
  768.   // Makes sure the _M_map has space for new nodes.  Does not actually
  769.   //  add the nodes.  Can invalidate _M_map pointers.  (And consequently, 
  770.   //  deque iterators.)
  771.   void _M_reserve_map_at_back (size_type __nodes_to_add = 1) {
  772.     if (__nodes_to_add + 1 > _M_map_size - (_M_finish._M_node - _M_map))
  773.       _M_reallocate_map(__nodes_to_add, false);
  774.   }
  775.   void _M_reserve_map_at_front (size_type __nodes_to_add = 1) {
  776.     if (__nodes_to_add > _M_start._M_node - _M_map)
  777.       _M_reallocate_map(__nodes_to_add, true);
  778.   }
  779.   void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);
  780.  
  781. #ifdef __STL_NON_TYPE_TMPL_PARAM_BUG
  782. public:
  783.   bool operator==(const deque<_T,_Alloc,0>& __x) const {
  784.     return size() == __x.size() && equal(begin(), end(), __x.begin());
  785.   }
  786.   bool operator!=(const deque<_T,_Alloc,0>& __x) const {
  787.     return size() != __x.size() || !equal(begin(), end(), __x.begin());
  788.   }
  789.   bool operator<(const deque<_T,_Alloc,0>& __x) const {
  790.     return lexicographical_compare(begin(), end(), __x.begin(), __x.end());
  791.   }
  792. #endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
  793. };
  794. // Non-inline member functions
  795. #ifdef __STL_MEMBER_TEMPLATES
  796. template <class _T, class _Alloc, size_t __bufsize>
  797. template <class _InputIter>
  798. void deque<_T, _Alloc, __bufsize>
  799.   ::_M_assign_aux(_InputIter __first, _InputIter __last, input_iterator_tag)
  800. {
  801.   iterator __cur = begin();
  802.   for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
  803.     *__cur = *__first;
  804.   if (__first == __last)
  805.     erase(__cur, end());
  806.   else
  807.     insert(end(), __first, __last);
  808. }
  809. #endif /* __STL_MEMBER_TEMPLATES */
  810. template <class _T, class _Alloc, size_t __bufsize>
  811. void 
  812. deque<_T, _Alloc, __bufsize>::insert(iterator __pos,
  813.                                      size_type __n, const value_type& __x)
  814. {
  815.   if (__pos._M_cur == _M_start._M_cur) {
  816.     iterator __new_start = _M_reserve_elements_at_front(__n);
  817.     uninitialized_fill(__new_start, _M_start, __x);
  818.     _M_start = __new_start;
  819.   }
  820.   else if (__pos._M_cur == _M_finish._M_cur) {
  821.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  822.     uninitialized_fill(_M_finish, __new_finish, __x);
  823.     _M_finish = __new_finish;
  824.   }
  825.   else 
  826.     _M_insert_aux(__pos, __n, __x);
  827. }
  828. #ifndef __STL_MEMBER_TEMPLATES  
  829. template <class _T, class _Alloc, size_t __bufsize>
  830. void deque<_T, _Alloc, __bufsize>::insert(iterator __pos,
  831.                                       const value_type* __first,
  832.                                       const value_type* __last) {
  833.   size_type __n = __last - __first;
  834.   if (__pos._M_cur == _M_start._M_cur) {
  835.     iterator __new_start = _M_reserve_elements_at_front(__n);
  836.     __STL_TRY {
  837.       uninitialized_copy(__first, __last, __new_start);
  838.       _M_start = __new_start;
  839.     }
  840.     __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));
  841.   }
  842.   else if (__pos._M_cur == _M_finish._M_cur) {
  843.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  844.     __STL_TRY {
  845.       uninitialized_copy(__first, __last, _M_finish);
  846.       _M_finish = __new_finish;
  847.     }
  848.     __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, 
  849.                                   __new_finish._M_node + 1));
  850.   }
  851.   else
  852.     _M_insert_aux(__pos, __first, __last, __n);
  853. }
  854. template <class _T, class _Alloc, size_t __bufsize>
  855. void deque<_T,_Alloc,__bufsize>::insert(iterator __pos,
  856.                                         const_iterator __first,
  857.                                         const_iterator __last)
  858. {
  859.   size_type __n = __last - __first;
  860.   if (__pos._M_cur == _M_start._M_cur) {
  861.     iterator __new_start = _M_reserve_elements_at_front(__n);
  862.     __STL_TRY {
  863.       uninitialized_copy(__first, __last, __new_start);
  864.       _M_start = __new_start;
  865.     }
  866.     __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));
  867.   }
  868.   else if (__pos._M_cur == _M_finish._M_cur) {
  869.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  870.     __STL_TRY {
  871.       uninitialized_copy(__first, __last, _M_finish);
  872.       _M_finish = __new_finish;
  873.     }
  874.     __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, 
  875.                  __new_finish._M_node + 1));
  876.   }
  877.   else
  878.     _M_insert_aux(__pos, __first, __last, __n);
  879. }
  880. #endif /* __STL_MEMBER_TEMPLATES */
  881. template <class _T, class _Alloc, size_t __bufsize>
  882. deque<_T,_Alloc,__bufsize>::iterator 
  883. deque<_T,_Alloc,__bufsize>::erase(iterator __first, iterator __last)
  884. {
  885.   if (__first == _M_start && __last == _M_finish) {
  886.     clear();
  887.     return _M_finish;
  888.   }
  889.   else {
  890.     difference_type __n = __last - __first;
  891.     difference_type __elems_before = __first - _M_start;
  892.     if (__elems_before < (size() - __n) / 2) {
  893.       copy_backward(_M_start, __first, __last);
  894.       iterator __new_start = _M_start + __n;
  895.       destroy(_M_start, __new_start);
  896.       _M_destroy_nodes(__new_start._M_node, _M_start._M_node);
  897.       _M_start = __new_start;
  898.     }
  899.     else {
  900.       copy(__last, _M_finish, __first);
  901.       iterator __new_finish = _M_finish - __n;
  902.       destroy(__new_finish, _M_finish);
  903.       _M_destroy_nodes(__new_finish._M_node + 1, _M_finish._M_node + 1);
  904.       _M_finish = __new_finish;
  905.     }
  906.     return _M_start + __elems_before;
  907.   }
  908. }
  909. template <class _T, class _Alloc, size_t __bufsize>
  910. void deque<_T,_Alloc,__bufsize>::clear()
  911. {
  912.   for (_Map_pointer __node = _M_start._M_node + 1;
  913.        __node < _M_finish._M_node;
  914.        ++__node) {
  915.     destroy(*__node, *__node + _S_buffer_size());
  916.     _M_deallocate_node(*__node);
  917.   }
  918.   if (_M_start._M_node != _M_finish._M_node) {
  919.     destroy(_M_start._M_cur, _M_start._M_last);
  920.     destroy(_M_finish._M_first, _M_finish._M_cur);
  921.     _M_deallocate_node(_M_finish._M_first);
  922.   }
  923.   else
  924.     destroy(_M_start._M_cur, _M_finish._M_cur);
  925.   _M_finish = _M_start;
  926. }
  927. // Precondition: _M_start and _M_finish have already been initialized,
  928. // but none of the deque's elements have yet been constructed.
  929. template <class _T, class _Alloc, size_t __bufsize>
  930. void 
  931. deque<_T,_Alloc,__bufsize>::_M_fill_initialize(const value_type& __value) {
  932.   _Map_pointer __cur;
  933.   __STL_TRY {
  934.     for (__cur = _M_start._M_node; __cur < _M_finish._M_node; ++__cur)
  935.       uninitialized_fill(*__cur, *__cur + _S_buffer_size(), __value);
  936.     uninitialized_fill(_M_finish._M_first, _M_finish._M_cur, __value);
  937.   }
  938.   __STL_UNWIND(destroy(_M_start, iterator(*__cur, __cur)));
  939. }
  940. #ifdef __STL_MEMBER_TEMPLATES  
  941. template <class _T, class _Alloc, size_t __bufsize>
  942. template <class _InputIterator>
  943. void
  944. deque<_T,_Alloc,__bufsize>::_M_range_initialize(_InputIterator __first,
  945.                                                 _InputIterator __last,
  946.                                                 input_iterator_tag)
  947. {
  948.   _M_initialize_map(0);
  949.   for ( ; __first != __last; ++__first)
  950.     push_back(*__first);
  951. }
  952. template <class _T, class _Alloc, size_t __bufsize>
  953. template <class _ForwardIterator>
  954. void
  955. deque<_T,_Alloc,__bufsize>::_M_range_initialize(_ForwardIterator __first,
  956.                                                 _ForwardIterator __last,
  957.                                                 forward_iterator_tag)
  958. {
  959.   size_type __n = 0;
  960.   distance(__first, __last, __n);
  961.   _M_initialize_map(__n);
  962.   _Map_pointer __cur_node;
  963.   __STL_TRY {
  964.     for (__cur_node = _M_start._M_node; 
  965.          __cur_node < _M_finish._M_node; 
  966.  ++__cur_node) {
  967.       _ForwardIterator __mid = __first;
  968.       advance(__mid, _S_buffer_size());
  969.       uninitialized_copy(__first, __mid, *__cur_node);
  970.       __first = __mid;
  971.     }
  972.     uninitialized_copy(__first, __last, _M_finish._M_first);
  973.   }
  974.   __STL_UNWIND(destroy(_M_start, iterator(*__cur_node, __cur_node)));
  975. }
  976. #endif /* __STL_MEMBER_TEMPLATES */
  977. // Called only if _M_finish._M_cur == _M_finish._M_last - 1.
  978. template <class _T, class _Alloc, size_t __bufsize>
  979. void
  980. deque<_T,_Alloc,__bufsize>::_M_push_back_aux(const value_type& __t)
  981. {
  982.   value_type __t_copy = __t;
  983.   _M_reserve_map_at_back();
  984.   *(_M_finish._M_node + 1) = _M_allocate_node();
  985.   __STL_TRY {
  986.     construct(_M_finish._M_cur, __t_copy);
  987.     _M_finish._M_set_node(_M_finish._M_node + 1);
  988.     _M_finish._M_cur = _M_finish._M_first;
  989.   }
  990.   __STL_UNWIND(_M_deallocate_node(*(_M_finish._M_node + 1)));
  991. }
  992. // Called only if _M_finish._M_cur == _M_finish._M_last - 1.
  993. template <class _T, class _Alloc, size_t __bufsize>
  994. void
  995. deque<_T,_Alloc,__bufsize>::_M_push_back_aux()
  996. {
  997.   _M_reserve_map_at_back();
  998.   *(_M_finish._M_node + 1) = _M_allocate_node();
  999.   __STL_TRY {
  1000.     construct(_M_finish._M_cur);
  1001.     _M_finish._M_set_node(_M_finish._M_node + 1);
  1002.     _M_finish._M_cur = _M_finish._M_first;
  1003.   }
  1004.   __STL_UNWIND(_M_deallocate_node(*(_M_finish._M_node + 1)));
  1005. }
  1006. // Called only if _M_start._M_cur == _M_start._M_first.
  1007. template <class _T, class _Alloc, size_t __bufsize>
  1008. void 
  1009. deque<_T,_Alloc,__bufsize>::_M_push_front_aux(const value_type& __t)
  1010. {
  1011.   value_type __t_copy = __t;
  1012.   _M_reserve_map_at_front();
  1013.   *(_M_start._M_node - 1) = _M_allocate_node();
  1014.   __STL_TRY {
  1015.     _M_start._M_set_node(_M_start._M_node - 1);
  1016.     _M_start._M_cur = _M_start._M_last - 1;
  1017.     construct(_M_start._M_cur, __t_copy);
  1018.   }
  1019.   __STL_UNWIND((++_M_start, _M_deallocate_node(*(_M_start._M_node - 1))));
  1020. // Called only if _M_start._M_cur == _M_start._M_first.
  1021. template <class _T, class _Alloc, size_t __bufsize>
  1022. void 
  1023. deque<_T,_Alloc,__bufsize>::_M_push_front_aux()
  1024. {
  1025.   _M_reserve_map_at_front();
  1026.   *(_M_start._M_node - 1) = _M_allocate_node();
  1027.   __STL_TRY {
  1028.     _M_start._M_set_node(_M_start._M_node - 1);
  1029.     _M_start._M_cur = _M_start._M_last - 1;
  1030.     construct(_M_start._M_cur);
  1031.   }
  1032.   __STL_UNWIND((++_M_start, _M_deallocate_node(*(_M_start._M_node - 1))));
  1033. // Called only if _M_finish._M_cur == _M_finish._M_first.
  1034. template <class _T, class _Alloc, size_t __bufsize>
  1035. void 
  1036. deque<_T,_Alloc,__bufsize>::_M_pop_back_aux()
  1037. {
  1038.   _M_deallocate_node(_M_finish._M_first);
  1039.   _M_finish._M_set_node(_M_finish._M_node - 1);
  1040.   _M_finish._M_cur = _M_finish._M_last - 1;
  1041.   destroy(_M_finish._M_cur);
  1042. }
  1043. // Called only if _M_start._M_cur == _M_start._M_last - 1.  Note that 
  1044. // if the deque has at least one element (a precondition for this member 
  1045. // function), and if _M_start._M_cur == _M_start._M_last, then the deque 
  1046. // must have at least two nodes.
  1047. template <class _T, class _Alloc, size_t __bufsize>
  1048. void 
  1049. deque<_T,_Alloc,__bufsize>::_M_pop_front_aux()
  1050. {
  1051.   destroy(_M_start._M_cur);
  1052.   _M_deallocate_node(_M_start._M_first);
  1053.   _M_start._M_set_node(_M_start._M_node + 1);
  1054.   _M_start._M_cur = _M_start._M_first;
  1055. }      
  1056. #ifdef __STL_MEMBER_TEMPLATES  
  1057. template <class _T, class _Alloc, size_t __bufsize>
  1058. template <class _InputIterator>
  1059. void 
  1060. deque<_T,_Alloc,__bufsize>::insert(iterator __pos,
  1061.                                    _InputIterator __first,
  1062.                                    _InputIterator __last,
  1063.                                    input_iterator_tag)
  1064. {
  1065.   copy(__first, __last, inserter(*this, __pos));
  1066. }
  1067. template <class _T, class _Alloc, size_t __bufsize>
  1068. template <class _ForwardIterator>
  1069. void 
  1070. deque<_T,_Alloc,__bufsize>::insert(iterator __pos,
  1071.                                    _ForwardIterator __first,
  1072.                                    _ForwardIterator __last,
  1073.                                    forward_iterator_tag) {
  1074.   size_type __n = 0;
  1075.   distance(__first, __last, __n);
  1076.   if (__pos._M_cur == _M_start._M_cur) {
  1077.     iterator __new_start = _M_reserve_elements_at_front(__n);
  1078.     __STL_TRY {
  1079.       uninitialized_copy(__first, __last, __new_start);
  1080.       _M_start = __new_start;
  1081.     }
  1082.     __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));
  1083.   }
  1084.   else if (__pos._M_cur == _M_finish._M_cur) {
  1085.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  1086.     __STL_TRY {
  1087.       uninitialized_copy(__first, __last, _M_finish);
  1088.       _M_finish = __new_finish;
  1089.     }
  1090.     __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, 
  1091.                                   __new_finish._M_node + 1));
  1092.   }
  1093.   else
  1094.     _M_insert_aux(__pos, __first, __last, __n);
  1095. }
  1096. #endif /* __STL_MEMBER_TEMPLATES */
  1097. template <class _T, class _Alloc, size_t __bufsize>
  1098. typename deque<_T, _Alloc, __bufsize>::iterator
  1099. deque<_T,_Alloc,__bufsize>::_M_insert_aux(iterator __pos,
  1100.                                           const value_type& __x)
  1101. {
  1102.   difference_type __index = __pos - _M_start;
  1103.   value_type __x_copy = __x;
  1104.   if (__index < size() / 2) {
  1105.     push_front(front());
  1106.     iterator __front1 = _M_start;
  1107.     ++__front1;
  1108.     iterator __front2 = __front1;
  1109.     ++__front2;
  1110.     __pos = _M_start + __index;
  1111.     iterator __pos1 = __pos;
  1112.     ++__pos1;
  1113.     copy(__front2, __pos1, __front1);
  1114.   }
  1115.   else {
  1116.     push_back(back());
  1117.     iterator __back1 = _M_finish;
  1118.     --__back1;
  1119.     iterator __back2 = __back1;
  1120.     --__back2;
  1121.     __pos = _M_start + __index;
  1122.     copy_backward(__pos, __back2, __back1);
  1123.   }
  1124.   *__pos = __x_copy;
  1125.   return __pos;
  1126. }
  1127. template <class _T, class _Alloc, size_t __bufsize>
  1128. typename deque<_T,_Alloc,__bufsize>::iterator
  1129. deque<_T,_Alloc,__bufsize>::_M_insert_aux(iterator __pos)
  1130. {
  1131.   difference_type __index = __pos - _M_start;
  1132.   if (__index < size() / 2) {
  1133.     push_front(front());
  1134.     iterator __front1 = _M_start;
  1135.     ++__front1;
  1136.     iterator __front2 = __front1;
  1137.     ++__front2;
  1138.     __pos = _M_start + __index;
  1139.     iterator __pos1 = __pos;
  1140.     ++__pos1;
  1141.     copy(__front2, __pos1, __front1);
  1142.   }
  1143.   else {
  1144.     push_back(back());
  1145.     iterator __back1 = _M_finish;
  1146.     --__back1;
  1147.     iterator __back2 = __back1;
  1148.     --__back2;
  1149.     __pos = _M_start + __index;
  1150.     copy_backward(__pos, __back2, __back1);
  1151.   }
  1152.   *__pos = value_type();
  1153.   return __pos;
  1154. }
  1155. template <class _T, class _Alloc, size_t __bufsize>
  1156. void
  1157. deque<_T,_Alloc,__bufsize>::_M_insert_aux(iterator __pos,
  1158.                                           size_type __n,
  1159.                                           const value_type& __x)
  1160. {
  1161.   const difference_type __elems_before = __pos - _M_start;
  1162.   size_type __length = size();
  1163.   value_type __x_copy = __x;
  1164.   if (__elems_before < __length / 2) {
  1165.     iterator __new_start = _M_reserve_elements_at_front(__n);
  1166.     iterator __old_start = _M_start;
  1167.     __pos = _M_start + __elems_before;
  1168.     __STL_TRY {
  1169.       if (__elems_before >= difference_type(__n)) {
  1170.         iterator __start_n = _M_start + difference_type(__n);
  1171.         uninitialized_copy(_M_start, __start_n, __new_start);
  1172.         _M_start = __new_start;
  1173.         copy(__start_n, __pos, __old_start);
  1174.         fill(__pos - difference_type(__n), __pos, __x_copy);
  1175.       }
  1176.       else {
  1177.         __uninitialized_copy_fill(_M_start, __pos, __new_start, 
  1178.                           _M_start, __x_copy);
  1179.         _M_start = __new_start;
  1180.         fill(__old_start, __pos, __x_copy);
  1181.       }
  1182.     }
  1183.     __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));
  1184.   }
  1185.   else {
  1186.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  1187.     iterator __old_finish = _M_finish;
  1188.     const difference_type __elems_after = 
  1189.       difference_type(__length) - __elems_before;
  1190.     __pos = _M_finish - __elems_after;
  1191.     __STL_TRY {
  1192.       if (__elems_after > difference_type(__n)) {
  1193.         iterator __finish_n = _M_finish - difference_type(__n);
  1194.         uninitialized_copy(__finish_n, _M_finish, _M_finish);
  1195.         _M_finish = __new_finish;
  1196.         copy_backward(__pos, __finish_n, __old_finish);
  1197.         fill(__pos, __pos + difference_type(__n), __x_copy);
  1198.       }
  1199.       else {
  1200.         __uninitialized_fill_copy(_M_finish, __pos + difference_type(__n),
  1201.                                   __x_copy, __pos, _M_finish);
  1202.         _M_finish = __new_finish;
  1203.         fill(__pos, __old_finish, __x_copy);
  1204.       }
  1205.     }
  1206.     __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, 
  1207.                                   __new_finish._M_node + 1));
  1208.   }
  1209. }
  1210. #ifdef __STL_MEMBER_TEMPLATES  
  1211. template <class _T, class _Alloc, size_t __bufsize>
  1212. template <class _ForwardIterator>
  1213. void
  1214. deque<_T,_Alloc,__bufsize>::_M_insert_aux(iterator __pos,
  1215.                                        _ForwardIterator __first,
  1216.                                        _ForwardIterator __last,
  1217.                                        size_type __n)
  1218. {
  1219.   const difference_type __elemsbefore = __pos - _M_start;
  1220.   size_type __length = size();
  1221.   if (__elemsbefore < __length / 2) {
  1222.     iterator __new_start = _M_reserve_elements_at_front(__n);
  1223.     iterator __old_start = _M_start;
  1224.     __pos = _M_start + __elemsbefore;
  1225.     __STL_TRY {
  1226.       if (__elemsbefore >= difference_type(__n)) {
  1227.         iterator __start_n = _M_start + difference_type(__n); 
  1228.         uninitialized_copy(_M_start, __start_n, __new_start);
  1229.         _M_start = __new_start;
  1230.         copy(__start_n, __pos, __old_start);
  1231.         copy(__first, __last, __pos - difference_type(__n));
  1232.       }
  1233.       else {
  1234.         _ForwardIterator __mid = __first;
  1235.         advance(__mid, difference_type(__n) - __elemsbefore);
  1236.         __uninitialized_copy_copy(_M_start, __pos, __first, __mid,
  1237.                                   __new_start);
  1238.         _M_start = __new_start;
  1239.         copy(__mid, __last, __old_start);
  1240.       }
  1241.     }
  1242.     __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));
  1243.   }
  1244.   else {
  1245.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  1246.     iterator __old_finish = _M_finish;
  1247.     const difference_type __elemsafter = 
  1248.       difference_type(__length) - __elemsbefore;
  1249.     __pos = _M_finish - __elemsafter;
  1250.     __STL_TRY {
  1251.       if (__elemsafter > difference_type(__n)) {
  1252.         iterator __finish_n = _M_finish - difference_type(__n);
  1253.         uninitialized_copy(__finish_n, _M_finish, _M_finish);
  1254.         _M_finish = __new_finish;
  1255.         copy_backward(__pos, __finish_n, __old_finish);
  1256.         copy(__first, __last, __pos);
  1257.       }
  1258.       else {
  1259.         _ForwardIterator __mid = __first;
  1260.         advance(__mid, __elemsafter);
  1261.         __uninitialized_copy_copy(__mid, __last, __pos, _M_finish, _M_finish);
  1262.         _M_finish = __new_finish;
  1263.         copy(__first, __mid, __pos);
  1264.       }
  1265.     }
  1266.     __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, 
  1267.                                   __new_finish._M_node + 1));
  1268.   }
  1269. }
  1270. #else /* __STL_MEMBER_TEMPLATES */
  1271. template <class _T, class _Alloc, size_t __bufsize>
  1272. void 
  1273. deque<_T,_Alloc,__bufsize>::_M_insert_aux(iterator __pos,
  1274.                                        const value_type* __first,
  1275.                                        const value_type* __last,
  1276.                                        size_type __n)
  1277. {
  1278.   const difference_type __elemsbefore = __pos - _M_start;
  1279.   size_type __length = size();
  1280.   if (__elemsbefore < __length / 2) {
  1281.     iterator __new_start = _M_reserve_elements_at_front(__n);
  1282.     iterator __old_start = _M_start;
  1283.     __pos = _M_start + __elemsbefore;
  1284.     __STL_TRY {
  1285.       if (__elemsbefore >= difference_type(__n)) {
  1286.         iterator __start_n = _M_start + difference_type(__n);
  1287.         uninitialized_copy(_M_start, __start_n, __new_start);
  1288.         _M_start = __new_start;
  1289.         copy(__start_n, __pos, __old_start);
  1290.         copy(__first, __last, __pos - difference_type(__n));
  1291.       }
  1292.       else {
  1293.         const value_type* __mid = 
  1294.   __first + (difference_type(__n) - __elemsbefore);
  1295.         __uninitialized_copy_copy(_M_start, __pos, __first, __mid,
  1296.                                   __new_start);
  1297.         _M_start = __new_start;
  1298.         copy(__mid, __last, __old_start);
  1299.       }
  1300.     }
  1301.     __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));
  1302.   }
  1303.   else {
  1304.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  1305.     iterator __old_finish = _M_finish;
  1306.     const difference_type __elemsafter = 
  1307.       difference_type(__length) - __elemsbefore;
  1308.     __pos = _M_finish - __elemsafter;
  1309.     __STL_TRY {
  1310.       if (__elemsafter > difference_type(__n)) {
  1311.         iterator __finish_n = _M_finish - difference_type(__n);
  1312.         uninitialized_copy(__finish_n, _M_finish, _M_finish);
  1313.         _M_finish = __new_finish;
  1314.         copy_backward(__pos, __finish_n, __old_finish);
  1315.         copy(__first, __last, __pos);
  1316.       }
  1317.       else {
  1318.         const value_type* __mid = __first + __elemsafter;
  1319.         __uninitialized_copy_copy(__mid, __last, __pos, _M_finish, _M_finish);
  1320.         _M_finish = __new_finish;
  1321.         copy(__first, __mid, __pos);
  1322.       }
  1323.     }
  1324.     __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, 
  1325.                                   __new_finish._M_node + 1));
  1326.   }
  1327. }
  1328. template <class _T, class _Alloc, size_t __bufsize>
  1329. void
  1330. deque<_T,_Alloc,__bufsize>::_M_insert_aux(iterator __pos,
  1331.                                        const_iterator __first,
  1332.                                        const_iterator __last,
  1333.                                        size_type __n)
  1334. {
  1335.   const difference_type __elemsbefore = __pos - _M_start;
  1336.   size_type __length = size();
  1337.   if (__elemsbefore < __length / 2) {
  1338.     iterator __new_start = _M_reserve_elements_at_front(__n);
  1339.     iterator __old_start = _M_start;
  1340.     __pos = _M_start + __elemsbefore;
  1341.     __STL_TRY {
  1342.       if (__elemsbefore >= __n) {
  1343.         iterator __start_n = _M_start + __n;
  1344.         uninitialized_copy(_M_start, __start_n, __new_start);
  1345.         _M_start = __new_start;
  1346.         copy(__start_n, __pos, __old_start);
  1347.         copy(__first, __last, __pos - difference_type(__n));
  1348.       }
  1349.       else {
  1350.         const_iterator __mid = __first + (__n - __elemsbefore);
  1351.         __uninitialized_copy_copy(_M_start, __pos, __first, __mid,
  1352.                                   __new_start);
  1353.         _M_start = __new_start;
  1354.         copy(__mid, __last, __old_start);
  1355.       }
  1356.     }
  1357.     __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));
  1358.   }
  1359.   else {
  1360.     iterator __new_finish = _M_reserve_elements_at_back(__n);
  1361.     iterator __old_finish = _M_finish;
  1362.     const difference_type __elemsafter = __length - __elemsbefore;
  1363.     __pos = _M_finish - __elemsafter;
  1364.     __STL_TRY {
  1365.       if (__elemsafter > __n) {
  1366.         iterator __finish_n = _M_finish - difference_type(__n);
  1367.         uninitialized_copy(__finish_n, _M_finish, _M_finish);
  1368.         _M_finish = __new_finish;
  1369.         copy_backward(__pos, __finish_n, __old_finish);
  1370.         copy(__first, __last, __pos);
  1371.       }
  1372.       else {
  1373.         const_iterator __mid = __first + __elemsafter;
  1374.         __uninitialized_copy_copy(__mid, __last, __pos, _M_finish, _M_finish);
  1375.         _M_finish = __new_finish;
  1376.         copy(__first, __mid, __pos);
  1377.       }
  1378.     }
  1379.     __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1, 
  1380.                  __new_finish._M_node + 1));
  1381.   }
  1382. }
  1383. #endif /* __STL_MEMBER_TEMPLATES */
  1384. template <class _T, class _Alloc, size_t __bufsize>
  1385. void 
  1386. deque<_T,_Alloc,__bufsize>::_M_new_elements_at_front(size_type __new_elements) 
  1387. {
  1388.   size_type __new_nodes
  1389.       = (__new_elements+_S_buffer_size()-1) / _S_buffer_size();
  1390.   _M_reserve_map_at_front(__new_nodes);
  1391.   size_type __i;
  1392.   __STL_TRY {
  1393.     for (__i = 1; __i <= __new_nodes; ++__i)
  1394.       *(_M_start._M_node - __i) = _M_allocate_node();
  1395.   }
  1396. #       ifdef __STL_USE_EXCEPTIONS
  1397.   catch(...) {
  1398.     for (size_type __j = 1; __j < __i; ++__j)
  1399.       _M_deallocate_node(*(_M_start._M_node - __j));      
  1400.     throw;
  1401.   }
  1402. #       endif /* __STL_USE_EXCEPTIONS */
  1403. }
  1404. template <class _T, class _Alloc, size_t __bufsize>
  1405. void 
  1406. deque<_T,_Alloc,__bufsize>::_M_new_elements_at_back(size_type __new_elements)
  1407. {
  1408.   size_type __new_nodes
  1409.       = (__new_elements+_S_buffer_size()-1) / _S_buffer_size();
  1410.   _M_reserve_map_at_back(__new_nodes);
  1411.   size_type __i;
  1412.   __STL_TRY {
  1413.     for (__i = 1; __i <= __new_nodes; ++__i)
  1414.       *(_M_finish._M_node + __i) = _M_allocate_node();
  1415.   }
  1416. #       ifdef __STL_USE_EXCEPTIONS
  1417.   catch(...) {
  1418.     for (size_type __j = 1; __j < __i; ++__j)
  1419.       _M_deallocate_node(*(_M_finish._M_node + __j));      
  1420.     throw;
  1421.   }
  1422. #       endif /* __STL_USE_EXCEPTIONS */
  1423. }
  1424. template <class _T, class _Alloc, size_t __bufsize>
  1425. void 
  1426. deque<_T,_Alloc,__bufsize>::_M_reallocate_map(size_type __nodes_to_add,
  1427.                                               bool __add_at_front)
  1428. {
  1429.   size_type __old_num_nodes = _M_finish._M_node - _M_start._M_node + 1;
  1430.   size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
  1431.   _Map_pointer __new_nstart;
  1432.   if (_M_map_size > 2 * __new_num_nodes) {
  1433.     __new_nstart = _M_map + (_M_map_size - __new_num_nodes) / 2 
  1434.                      + (__add_at_front ? __nodes_to_add : 0);
  1435.     if (__new_nstart < _M_start._M_node)
  1436.       copy(_M_start._M_node, _M_finish._M_node + 1, __new_nstart);
  1437.     else
  1438.       copy_backward(_M_start._M_node, _M_finish._M_node + 1, 
  1439.                     __new_nstart + __old_num_nodes);
  1440.   }
  1441.   else {
  1442.     size_type __new_map_size = 
  1443.       _M_map_size + max(_M_map_size, __nodes_to_add) + 2;
  1444.     _Map_pointer __new_map = _M_allocate_map(__new_map_size);
  1445.     __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
  1446.                          + (__add_at_front ? __nodes_to_add : 0);
  1447.     copy(_M_start._M_node, _M_finish._M_node + 1, __new_nstart);
  1448.     _M_deallocate_map(_M_map, _M_map_size);
  1449.     _M_map = __new_map;
  1450.     _M_map_size = __new_map_size;
  1451.   }
  1452.   _M_start._M_set_node(__new_nstart);
  1453.   _M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
  1454. }
  1455. // Nonmember functions.
  1456. #ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
  1457. template <class _T, class _Alloc, size_t __bufsiz>
  1458. bool operator==(const deque<_T, _Alloc, __bufsiz>& __x,
  1459.                 const deque<_T, _Alloc, __bufsiz>& __y)
  1460. {
  1461.   return __x.size() == __y.size() &&
  1462.          equal(__x.begin(), __x.end(), __y.begin());
  1463. }
  1464. template <class _T, class _Alloc, size_t __bufsiz>
  1465. bool operator<(const deque<_T, _Alloc, __bufsiz>& __x,
  1466.                const deque<_T, _Alloc, __bufsiz>& __y)
  1467. {
  1468.   return lexicographical_compare(__x.begin(), __x.end(), 
  1469.                                  __y.begin(), __y.end());
  1470. }
  1471. #endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
  1472. #if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) && 
  1473.     !defined(__STL_NON_TYPE_TMPL_PARAM_BUG)
  1474. template <class _T, class _Alloc, size_t __bufsiz>
  1475. inline void 
  1476. swap(deque<_T,_Alloc,__bufsiz>& __x, deque<_T,_Alloc,__bufsiz>& __y)
  1477. {
  1478.   __x.swap(__y);
  1479. }
  1480. #endif
  1481. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  1482. #pragma reset woff 1174
  1483. #pragma reset woff 1375
  1484. #endif
  1485.           
  1486. __STL_END_NAMESPACE 
  1487.   
  1488. #endif /* __SGI_STL_INTERNAL_DEQUE_H */
  1489. // Local Variables:
  1490. // mode:C++
  1491. // End: