source: svn/trunk/newcon3bcm2_21bu/toolchain/include/c++/3.4.2/bits/stl_deque.h

Last change on this file was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 50.7 KB
Line 
1// Deque implementation -*- C++ -*-
2
3// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING.  If not, write to the Free
18// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19// USA.
20
21// As a special exception, you may use this file as part of a free software
22// library without restriction.  Specifically, if other files instantiate
23// templates or use macros or inline functions from this file, or you compile
24// this file and link it with other files to produce an executable, this
25// file does not by itself cause the resulting executable to be covered by
26// the GNU General Public License.  This exception does not however
27// invalidate any other reasons why the executable file might be covered by
28// the GNU General Public License.
29
30/*
31 *
32 * Copyright (c) 1994
33 * Hewlett-Packard Company
34 *
35 * Permission to use, copy, modify, distribute and sell this software
36 * and its documentation for any purpose is hereby granted without fee,
37 * provided that the above copyright notice appear in all copies and
38 * that both that copyright notice and this permission notice appear
39 * in supporting documentation.  Hewlett-Packard Company makes no
40 * representations about the suitability of this software for any
41 * purpose.  It is provided "as is" without express or implied warranty.
42 *
43 *
44 * Copyright (c) 1997
45 * Silicon Graphics Computer Systems, Inc.
46 *
47 * Permission to use, copy, modify, distribute and sell this software
48 * and its documentation for any purpose is hereby granted without fee,
49 * provided that the above copyright notice appear in all copies and
50 * that both that copyright notice and this permission notice appear
51 * in supporting documentation.  Silicon Graphics makes no
52 * representations about the suitability of this software for any
53 * purpose.  It is provided "as is" without express or implied warranty.
54 */
55
56/** @file stl_deque.h
57 *  This is an internal header file, included by other library headers.
58 *  You should not attempt to use it directly.
59 */
60
61#ifndef _DEQUE_H
62#define _DEQUE_H 1
63
64#include <bits/concept_check.h>
65#include <bits/stl_iterator_base_types.h>
66#include <bits/stl_iterator_base_funcs.h>
67
68namespace _GLIBCXX_STD
69{
70  /**
71   *  @if maint
72   *  @brief This function controls the size of memory nodes.
73   *  @param  size  The size of an element.
74   *  @return   The number (not byte size) of elements per node.
75   *
76   *  This function started off as a compiler kludge from SGI, but seems to
77   *  be a useful wrapper around a repeated constant expression.  The '512' is
78   *  tuneable (and no other code needs to change), but no investigation has
79   *  been done since inheriting the SGI code.
80   *  @endif
81  */
82  inline size_t
83  __deque_buf_size(size_t __size)
84  { return __size < 512 ? size_t(512 / __size) : size_t(1); }
85
86
87  /**
88   *  @brief A deque::iterator.
89   *
90   *  Quite a bit of intelligence here.  Much of the functionality of deque is
91   *  actually passed off to this class.  A deque holds two of these internally,
92   *  marking its valid range.  Access to elements is done as offsets of either
93   *  of those two, relying on operator overloading in this class.
94   *
95   *  @if maint
96   *  All the functions are op overloads except for _M_set_node.
97   *  @endif
98  */
99  template<typename _Tp, typename _Ref, typename _Ptr>
100    struct _Deque_iterator
101    {
102      typedef _Deque_iterator<_Tp, _Tp&, _Tp*>             iterator;
103      typedef _Deque_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;
104
105      static size_t _S_buffer_size()
106      { return __deque_buf_size(sizeof(_Tp)); }
107
108      typedef random_access_iterator_tag iterator_category;
109      typedef _Tp                        value_type;
110      typedef _Ptr                       pointer;
111      typedef _Ref                       reference;
112      typedef size_t                     size_type;
113      typedef ptrdiff_t                  difference_type;
114      typedef _Tp**                      _Map_pointer;
115      typedef _Deque_iterator            _Self;
116
117      _Tp* _M_cur;
118      _Tp* _M_first;
119      _Tp* _M_last;
120      _Map_pointer _M_node;
121
122      _Deque_iterator(_Tp* __x, _Map_pointer __y)
123      : _M_cur(__x), _M_first(*__y),
124        _M_last(*__y + _S_buffer_size()), _M_node(__y) {}
125
126      _Deque_iterator() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {}
127
128      _Deque_iterator(const iterator& __x)
129      : _M_cur(__x._M_cur), _M_first(__x._M_first),
130        _M_last(__x._M_last), _M_node(__x._M_node) {}
131
132      reference
133      operator*() const
134      { return *_M_cur; }
135
136      pointer
137      operator->() const
138      { return _M_cur; }
139
140      _Self&
141      operator++()
142      {
143        ++_M_cur;
144        if (_M_cur == _M_last)
145          {
146            _M_set_node(_M_node + 1);
147            _M_cur = _M_first;
148          }
149        return *this;
150      }
151
152      _Self
153      operator++(int)
154      {
155        _Self __tmp = *this;
156        ++*this;
157        return __tmp;
158      }
159
160      _Self&
161      operator--()
162      {
163        if (_M_cur == _M_first)
164          {
165            _M_set_node(_M_node - 1);
166            _M_cur = _M_last;
167          }
168        --_M_cur;
169        return *this;
170      }
171
172      _Self
173      operator--(int)
174      {
175        _Self __tmp = *this;
176        --*this;
177        return __tmp;
178      }
179
180      _Self&
181      operator+=(difference_type __n)
182      {
183        const difference_type __offset = __n + (_M_cur - _M_first);
184        if (__offset >= 0 && __offset < difference_type(_S_buffer_size()))
185          _M_cur += __n;
186        else
187          {
188            const difference_type __node_offset =
189              __offset > 0 ? __offset / difference_type(_S_buffer_size())
190                           : -difference_type((-__offset - 1)
191                                              / _S_buffer_size()) - 1;
192            _M_set_node(_M_node + __node_offset);
193            _M_cur = _M_first + (__offset - __node_offset
194                                 * difference_type(_S_buffer_size()));
195          }
196        return *this;
197      }
198
199      _Self
200      operator+(difference_type __n) const
201      {
202        _Self __tmp = *this;
203        return __tmp += __n;
204      }
205
206      _Self&
207      operator-=(difference_type __n)
208      { return *this += -__n; }
209
210      _Self
211      operator-(difference_type __n) const
212      {
213        _Self __tmp = *this;
214        return __tmp -= __n;
215      }
216
217      reference
218      operator[](difference_type __n) const
219      { return *(*this + __n); }
220
221      /** @if maint
222       *  Prepares to traverse new_node.  Sets everything except _M_cur, which
223       *  should therefore be set by the caller immediately afterwards, based on
224       *  _M_first and _M_last.
225       *  @endif
226       */
227      void
228      _M_set_node(_Map_pointer __new_node)
229      {
230        _M_node = __new_node;
231        _M_first = *__new_node;
232        _M_last = _M_first + difference_type(_S_buffer_size());
233      }
234    };
235
236  // Note: we also provide overloads whose operands are of the same type in
237  // order to avoid ambiguous overload resolution when std::rel_ops operators
238  // are in scope (for additional details, see libstdc++/3628)
239  template<typename _Tp, typename _Ref, typename _Ptr>
240    inline bool
241    operator==(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
242               const _Deque_iterator<_Tp, _Ref, _Ptr>& __y)
243    { return __x._M_cur == __y._M_cur; }
244
245  template<typename _Tp, typename _RefL, typename _PtrL,
246           typename _RefR, typename _PtrR>
247    inline bool
248    operator==(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
249               const _Deque_iterator<_Tp, _RefR, _PtrR>& __y)
250    { return __x._M_cur == __y._M_cur; }
251
252  template<typename _Tp, typename _Ref, typename _Ptr>
253    inline bool
254    operator!=(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
255               const _Deque_iterator<_Tp, _Ref, _Ptr>& __y)
256    { return !(__x == __y); }
257
258  template<typename _Tp, typename _RefL, typename _PtrL,
259           typename _RefR, typename _PtrR>
260    inline bool
261    operator!=(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
262               const _Deque_iterator<_Tp, _RefR, _PtrR>& __y)
263    { return !(__x == __y); }
264
265  template<typename _Tp, typename _Ref, typename _Ptr>
266    inline bool
267    operator<(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
268              const _Deque_iterator<_Tp, _Ref, _Ptr>& __y)
269    { return (__x._M_node == __y._M_node) ? (__x._M_cur < __y._M_cur)
270                                          : (__x._M_node < __y._M_node); }
271
272  template<typename _Tp, typename _RefL, typename _PtrL,
273           typename _RefR, typename _PtrR>
274    inline bool
275    operator<(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
276              const _Deque_iterator<_Tp, _RefR, _PtrR>& __y)
277    { return (__x._M_node == __y._M_node) ? (__x._M_cur < __y._M_cur)
278                                          : (__x._M_node < __y._M_node); }
279
280  template<typename _Tp, typename _Ref, typename _Ptr>
281    inline bool
282    operator>(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
283              const _Deque_iterator<_Tp, _Ref, _Ptr>& __y)
284    { return __y < __x; }
285
286  template<typename _Tp, typename _RefL, typename _PtrL,
287           typename _RefR, typename _PtrR>
288    inline bool
289    operator>(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
290              const _Deque_iterator<_Tp, _RefR, _PtrR>& __y)
291    { return __y < __x; }
292
293  template<typename _Tp, typename _Ref, typename _Ptr>
294    inline bool
295    operator<=(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
296               const _Deque_iterator<_Tp, _Ref, _Ptr>& __y)
297    { return !(__y < __x); }
298
299  template<typename _Tp, typename _RefL, typename _PtrL,
300           typename _RefR, typename _PtrR>
301    inline bool
302    operator<=(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
303               const _Deque_iterator<_Tp, _RefR, _PtrR>& __y)
304    { return !(__y < __x); }
305
306  template<typename _Tp, typename _Ref, typename _Ptr>
307    inline bool
308    operator>=(const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
309               const _Deque_iterator<_Tp, _Ref, _Ptr>& __y)
310    { return !(__x < __y); }
311
312  template<typename _Tp, typename _RefL, typename _PtrL,
313           typename _RefR, typename _PtrR>
314    inline bool
315    operator>=(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
316               const _Deque_iterator<_Tp, _RefR, _PtrR>& __y)
317    { return !(__x < __y); }
318
319  // _GLIBCXX_RESOLVE_LIB_DEFECTS
320  // According to the resolution of DR179 not only the various comparison
321  // operators but also operator- must accept mixed iterator/const_iterator
322  // parameters.
323  template<typename _Tp, typename _RefL, typename _PtrL,
324           typename _RefR, typename _PtrR>
325    inline typename _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type
326    operator-(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
327              const _Deque_iterator<_Tp, _RefR, _PtrR>& __y)
328    {
329      return typename _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type
330        (_Deque_iterator<_Tp, _RefL, _PtrL>::_S_buffer_size())
331        * (__x._M_node - __y._M_node - 1) + (__x._M_cur - __x._M_first)
332        + (__y._M_last - __y._M_cur);
333    }
334
335  template<typename _Tp, typename _Ref, typename _Ptr>
336    inline _Deque_iterator<_Tp, _Ref, _Ptr>
337    operator+(ptrdiff_t __n, const _Deque_iterator<_Tp, _Ref, _Ptr>& __x)
338    { return __x + __n; }
339
340  /**
341   *  @if maint
342   *  Deque base class.  This class provides the unified face for %deque's
343   *  allocation.  This class's constructor and destructor allocate and
344   *  deallocate (but do not initialize) storage.  This makes %exception
345   *  safety easier.
346   *
347   *  Nothing in this class ever constructs or destroys an actual Tp element.
348   *  (Deque handles that itself.)  Only/All memory management is performed
349   *  here.
350   *  @endif
351  */
352  template<typename _Tp, typename _Alloc>
353    class _Deque_base
354    {
355    public:
356      typedef _Alloc                  allocator_type;
357
358      allocator_type
359      get_allocator() const
360      { return *static_cast<const _Alloc*>(&this->_M_impl); }
361
362      typedef _Deque_iterator<_Tp,_Tp&,_Tp*>             iterator;
363      typedef _Deque_iterator<_Tp,const _Tp&,const _Tp*> const_iterator;
364
365      _Deque_base(const allocator_type& __a, size_t __num_elements)
366        : _M_impl(__a)
367      { _M_initialize_map(__num_elements); }
368
369      _Deque_base(const allocator_type& __a)
370        : _M_impl(__a)
371      { }
372
373      ~_Deque_base();
374
375    protected:
376      //This struct encapsulates the implementation of the std::deque
377      //standard container and at the same time makes use of the EBO
378      //for empty allocators.
379      struct _Deque_impl
380        : public _Alloc {
381        _Tp** _M_map;
382        size_t _M_map_size;
383        iterator _M_start;
384        iterator _M_finish;
385
386        _Deque_impl(const _Alloc& __a)
387          : _Alloc(__a), _M_map(0), _M_map_size(0), _M_start(), _M_finish()
388        { }
389      };
390
391      typedef typename _Alloc::template rebind<_Tp*>::other _Map_alloc_type;
392      _Map_alloc_type _M_get_map_allocator() const
393      { return _Map_alloc_type(this->get_allocator()); }
394
395      _Tp*
396      _M_allocate_node()
397      { return _M_impl._Alloc::allocate(__deque_buf_size(sizeof(_Tp))); }
398
399      void
400      _M_deallocate_node(_Tp* __p)
401      { _M_impl._Alloc::deallocate(__p, __deque_buf_size(sizeof(_Tp))); }
402
403      _Tp**
404      _M_allocate_map(size_t __n)
405      { return _M_get_map_allocator().allocate(__n); }
406
407      void
408      _M_deallocate_map(_Tp** __p, size_t __n)
409      { _M_get_map_allocator().deallocate(__p, __n); }
410
411    protected:
412      void _M_initialize_map(size_t);
413      void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish);
414      void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish);
415      enum { _S_initial_map_size = 8 };
416
417      _Deque_impl _M_impl;
418    };
419
420  template<typename _Tp, typename _Alloc>
421  _Deque_base<_Tp,_Alloc>::~_Deque_base()
422  {
423    if (this->_M_impl._M_map)
424    {
425      _M_destroy_nodes(this->_M_impl._M_start._M_node, this->_M_impl._M_finish._M_node + 1);
426      _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
427    }
428  }
429
430  /**
431   *  @if maint
432   *  @brief Layout storage.
433   *  @param  num_elements  The count of T's for which to allocate space
434   *                        at first.
435   *  @return   Nothing.
436   *
437   *  The initial underlying memory layout is a bit complicated...
438   *  @endif
439  */
440  template<typename _Tp, typename _Alloc>
441    void
442    _Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements)
443    {
444      size_t __num_nodes = __num_elements / __deque_buf_size(sizeof(_Tp)) + 1;
445
446      this->_M_impl._M_map_size = std::max((size_t) _S_initial_map_size,
447                                   __num_nodes + 2);
448      this->_M_impl._M_map = _M_allocate_map(this->_M_impl._M_map_size);
449
450      // For "small" maps (needing less than _M_map_size nodes), allocation
451      // starts in the middle elements and grows outwards.  So nstart may be
452      // the beginning of _M_map, but for small maps it may be as far in as
453      // _M_map+3.
454
455      _Tp** __nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size - __num_nodes) / 2;
456      _Tp** __nfinish = __nstart + __num_nodes;
457
458      try
459        { _M_create_nodes(__nstart, __nfinish); }
460      catch(...)
461        {
462          _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
463          this->_M_impl._M_map = 0;
464          this->_M_impl._M_map_size = 0;
465          __throw_exception_again;
466        }
467
468      this->_M_impl._M_start._M_set_node(__nstart);
469      this->_M_impl._M_finish._M_set_node(__nfinish - 1);
470      this->_M_impl._M_start._M_cur = _M_impl._M_start._M_first;
471      this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first + __num_elements
472                         % __deque_buf_size(sizeof(_Tp));
473    }
474
475  template<typename _Tp, typename _Alloc>
476    void
477    _Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart, _Tp** __nfinish)
478    {
479      _Tp** __cur;
480      try
481        {
482          for (__cur = __nstart; __cur < __nfinish; ++__cur)
483            *__cur = this->_M_allocate_node();
484        }
485      catch(...)
486        {
487          _M_destroy_nodes(__nstart, __cur);
488          __throw_exception_again;
489        }
490    }
491
492  template<typename _Tp, typename _Alloc>
493    void
494    _Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish)
495    {
496      for (_Tp** __n = __nstart; __n < __nfinish; ++__n)
497        _M_deallocate_node(*__n);
498    }
499
500  /**
501   *  @brief  A standard container using fixed-size memory allocation and
502   *  constant-time manipulation of elements at either end.
503   *
504   *  @ingroup Containers
505   *  @ingroup Sequences
506   *
507   *  Meets the requirements of a <a href="tables.html#65">container</a>, a
508   *  <a href="tables.html#66">reversible container</a>, and a
509   *  <a href="tables.html#67">sequence</a>, including the
510   *  <a href="tables.html#68">optional sequence requirements</a>.
511   *
512   *  In previous HP/SGI versions of deque, there was an extra template
513   *  parameter so users could control the node size.  This extension turned
514   *  out to violate the C++ standard (it can be detected using template
515   *  template parameters), and it was removed.
516   *
517   *  @if maint
518   *  Here's how a deque<Tp> manages memory.  Each deque has 4 members:
519   *
520   *  - Tp**        _M_map
521   *  - size_t      _M_map_size
522   *  - iterator    _M_start, _M_finish
523   *
524   *  map_size is at least 8.  %map is an array of map_size pointers-to-"nodes".
525   *  (The name %map has nothing to do with the std::map class, and "nodes"
526   *  should not be confused with std::list's usage of "node".)
527   *
528   *  A "node" has no specific type name as such, but it is referred to as
529   *  "node" in this file.  It is a simple array-of-Tp.  If Tp is very large,
530   *  there will be one Tp element per node (i.e., an "array" of one).
531   *  For non-huge Tp's, node size is inversely related to Tp size:  the
532   *  larger the Tp, the fewer Tp's will fit in a node.  The goal here is to
533   *  keep the total size of a node relatively small and constant over different
534   *  Tp's, to improve allocator efficiency.
535   *
536   *  **** As I write this, the nodes are /not/ allocated using the high-speed
537   *  memory pool.  There are 20 hours left in the year; perhaps I can fix
538   *  this before 2002.
539   *
540   *  Not every pointer in the %map array will point to a node.  If the initial
541   *  number of elements in the deque is small, the /middle/ %map pointers will
542   *  be valid, and the ones at the edges will be unused.  This same situation
543   *  will arise as the %map grows:  available %map pointers, if any, will be on
544   *  the ends.  As new nodes are created, only a subset of the %map's pointers
545   *  need to be copied "outward".
546   *
547   *  Class invariants:
548   * - For any nonsingular iterator i:
549   *    - i.node points to a member of the %map array.  (Yes, you read that
550   *      correctly:  i.node does not actually point to a node.)  The member of
551   *      the %map array is what actually points to the node.
552   *    - i.first == *(i.node)    (This points to the node (first Tp element).)
553   *    - i.last  == i.first + node_size
554   *    - i.cur is a pointer in the range [i.first, i.last).  NOTE:
555   *      the implication of this is that i.cur is always a dereferenceable
556   *      pointer, even if i is a past-the-end iterator.
557   * - Start and Finish are always nonsingular iterators.  NOTE: this means that
558   *   an empty deque must have one node, a deque with <N elements (where N is
559   *   the node buffer size) must have one node, a deque with N through (2N-1)
560   *   elements must have two nodes, etc.
561   * - For every node other than start.node and finish.node, every element in
562   *   the node is an initialized object.  If start.node == finish.node, then
563   *   [start.cur, finish.cur) are initialized objects, and the elements outside
564   *   that range are uninitialized storage.  Otherwise, [start.cur, start.last)
565   *   and [finish.first, finish.cur) are initialized objects, and [start.first,
566   *   start.cur) and [finish.cur, finish.last) are uninitialized storage.
567   * - [%map, %map + map_size) is a valid, non-empty range.
568   * - [start.node, finish.node] is a valid range contained within
569   *   [%map, %map + map_size).
570   * - A pointer in the range [%map, %map + map_size) points to an allocated
571   *   node if and only if the pointer is in the range
572   *   [start.node, finish.node].
573   *
574   *  Here's the magic:  nothing in deque is "aware" of the discontiguous
575   *  storage!
576   *
577   *  The memory setup and layout occurs in the parent, _Base, and the iterator
578   *  class is entirely responsible for "leaping" from one node to the next.
579   *  All the implementation routines for deque itself work only through the
580   *  start and finish iterators.  This keeps the routines simple and sane,
581   *  and we can use other standard algorithms as well.
582   *  @endif
583  */
584  template<typename _Tp, typename _Alloc = allocator<_Tp> >
585    class deque : protected _Deque_base<_Tp, _Alloc>
586    {
587      // concept requirements
588      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
589
590      typedef _Deque_base<_Tp, _Alloc>           _Base;
591
592    public:
593      typedef _Tp                                value_type;
594      typedef typename _Alloc::pointer           pointer;
595      typedef typename _Alloc::const_pointer     const_pointer;
596      typedef typename _Alloc::reference         reference;
597      typedef typename _Alloc::const_reference   const_reference;
598      typedef typename _Base::iterator           iterator;
599      typedef typename _Base::const_iterator     const_iterator;
600      typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
601      typedef std::reverse_iterator<iterator>         reverse_iterator;
602      typedef size_t                             size_type;
603      typedef ptrdiff_t                          difference_type;
604      typedef typename _Base::allocator_type     allocator_type;
605
606    protected:
607      typedef pointer*                           _Map_pointer;
608
609      static size_t _S_buffer_size()
610      { return __deque_buf_size(sizeof(_Tp)); }
611
612      // Functions controlling memory layout, and nothing else.
613      using _Base::_M_initialize_map;
614      using _Base::_M_create_nodes;
615      using _Base::_M_destroy_nodes;
616      using _Base::_M_allocate_node;
617      using _Base::_M_deallocate_node;
618      using _Base::_M_allocate_map;
619      using _Base::_M_deallocate_map;
620
621      /** @if maint
622       *  A total of four data members accumulated down the heirarchy.
623       *  May be accessed via _M_impl.*
624       *  @endif
625       */
626      using _Base::_M_impl;
627
628    public:
629      // [23.2.1.1] construct/copy/destroy
630      // (assign() and get_allocator() are also listed in this section)
631      /**
632       *  @brief  Default constructor creates no elements.
633       */
634      explicit
635      deque(const allocator_type& __a = allocator_type())
636      : _Base(__a, 0) {}
637
638      /**
639       *  @brief  Create a %deque with copies of an exemplar element.
640       *  @param  n  The number of elements to initially create.
641       *  @param  value  An element to copy.
642       *
643       *  This constructor fills the %deque with @a n copies of @a value.
644       */
645      deque(size_type __n, const value_type& __value,
646            const allocator_type& __a = allocator_type())
647      : _Base(__a, __n)
648      { _M_fill_initialize(__value); }
649
650      /**
651       *  @brief  Create a %deque with default elements.
652       *  @param  n  The number of elements to initially create.
653       *
654       *  This constructor fills the %deque with @a n copies of a
655       *  default-constructed element.
656       */
657      explicit
658      deque(size_type __n)
659      : _Base(allocator_type(), __n)
660      { _M_fill_initialize(value_type()); }
661
662      /**
663       *  @brief  %Deque copy constructor.
664       *  @param  x  A %deque of identical element and allocator types.
665       *
666       *  The newly-created %deque uses a copy of the allocation object used
667       *  by @a x.
668       */
669      deque(const deque& __x)
670      : _Base(__x.get_allocator(), __x.size())
671      { std::uninitialized_copy(__x.begin(), __x.end(), this->_M_impl._M_start); }
672
673      /**
674       *  @brief  Builds a %deque from a range.
675       *  @param  first  An input iterator.
676       *  @param  last  An input iterator.
677       *
678       *  Create a %deque consisting of copies of the elements from [first,
679       *  last).
680       *
681       *  If the iterators are forward, bidirectional, or random-access, then
682       *  this will call the elements' copy constructor N times (where N is
683       *  distance(first,last)) and do no memory reallocation.  But if only
684       *  input iterators are used, then this will do at most 2N calls to the
685       *  copy constructor, and logN memory reallocations.
686       */
687      template<typename _InputIterator>
688        deque(_InputIterator __first, _InputIterator __last,
689              const allocator_type& __a = allocator_type())
690        : _Base(__a)
691        {
692          // Check whether it's an integral type.  If so, it's not an iterator.
693          typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
694          _M_initialize_dispatch(__first, __last, _Integral());
695        }
696
697      /**
698       *  The dtor only erases the elements, and note that if the elements
699       *  themselves are pointers, the pointed-to memory is not touched in any
700       *  way.  Managing the pointer is the user's responsibilty.
701       */
702      ~deque()
703      { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish); }
704
705      /**
706       *  @brief  %Deque assignment operator.
707       *  @param  x  A %deque of identical element and allocator types.
708       *
709       *  All the elements of @a x are copied, but unlike the copy constructor,
710       *  the allocator object is not copied.
711       */
712      deque&
713      operator=(const deque& __x);
714
715      /**
716       *  @brief  Assigns a given value to a %deque.
717       *  @param  n  Number of elements to be assigned.
718       *  @param  val  Value to be assigned.
719       *
720       *  This function fills a %deque with @a n copies of the given value.
721       *  Note that the assignment completely changes the %deque and that the
722       *  resulting %deque's size is the same as the number of elements assigned.
723       *  Old data may be lost.
724       */
725      void
726      assign(size_type __n, const value_type& __val)
727      { _M_fill_assign(__n, __val); }
728
729      /**
730       *  @brief  Assigns a range to a %deque.
731       *  @param  first  An input iterator.
732       *  @param  last   An input iterator.
733       *
734       *  This function fills a %deque with copies of the elements in the
735       *  range [first,last).
736       *
737       *  Note that the assignment completely changes the %deque and that the
738       *  resulting %deque's size is the same as the number of elements
739       *  assigned.  Old data may be lost.
740       */
741      template<typename _InputIterator>
742        void
743        assign(_InputIterator __first, _InputIterator __last)
744        {
745          typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
746          _M_assign_dispatch(__first, __last, _Integral());
747        }
748
749      /// Get a copy of the memory allocation object.
750      allocator_type
751      get_allocator() const
752      { return _Base::get_allocator(); }
753
754      // iterators
755      /**
756       *  Returns a read/write iterator that points to the first element in the
757       *  %deque.  Iteration is done in ordinary element order.
758       */
759      iterator
760      begin()
761      { return this->_M_impl._M_start; }
762
763      /**
764       *  Returns a read-only (constant) iterator that points to the first
765       *  element in the %deque.  Iteration is done in ordinary element order.
766       */
767      const_iterator
768      begin() const
769      { return this->_M_impl._M_start; }
770
771      /**
772       *  Returns a read/write iterator that points one past the last element in
773       *  the %deque.  Iteration is done in ordinary element order.
774       */
775      iterator
776      end()
777      { return this->_M_impl._M_finish; }
778
779      /**
780       *  Returns a read-only (constant) iterator that points one past the last
781       *  element in the %deque.  Iteration is done in ordinary element order.
782       */
783      const_iterator
784      end() const
785      { return this->_M_impl._M_finish; }
786
787      /**
788       *  Returns a read/write reverse iterator that points to the last element
789       *  in the %deque.  Iteration is done in reverse element order.
790       */
791      reverse_iterator
792      rbegin()
793      { return reverse_iterator(this->_M_impl._M_finish); }
794
795      /**
796       *  Returns a read-only (constant) reverse iterator that points to the
797       *  last element in the %deque.  Iteration is done in reverse element
798       *  order.
799       */
800      const_reverse_iterator
801      rbegin() const
802      { return const_reverse_iterator(this->_M_impl._M_finish); }
803
804      /**
805       *  Returns a read/write reverse iterator that points to one before the
806       *  first element in the %deque.  Iteration is done in reverse element
807       *  order.
808       */
809      reverse_iterator
810      rend() { return reverse_iterator(this->_M_impl._M_start); }
811
812      /**
813       *  Returns a read-only (constant) reverse iterator that points to one
814       *  before the first element in the %deque.  Iteration is done in reverse
815       *  element order.
816       */
817      const_reverse_iterator
818      rend() const
819      { return const_reverse_iterator(this->_M_impl._M_start); }
820
821      // [23.2.1.2] capacity
822      /**  Returns the number of elements in the %deque.  */
823      size_type
824      size() const
825      { return this->_M_impl._M_finish - this->_M_impl._M_start; }
826
827      /**  Returns the size() of the largest possible %deque.  */
828      size_type
829      max_size() const
830      { return size_type(-1); }
831
832      /**
833       *  @brief  Resizes the %deque to the specified number of elements.
834       *  @param  new_size  Number of elements the %deque should contain.
835       *  @param  x  Data with which new elements should be populated.
836       *
837       *  This function will %resize the %deque to the specified number of
838       *  elements.  If the number is smaller than the %deque's current size the
839       *  %deque is truncated, otherwise the %deque is extended and new elements
840       *  are populated with given data.
841       */
842      void
843      resize(size_type __new_size, const value_type& __x)
844      {
845        const size_type __len = size();
846        if (__new_size < __len)
847          erase(this->_M_impl._M_start + __new_size, this->_M_impl._M_finish);
848        else
849          insert(this->_M_impl._M_finish, __new_size - __len, __x);
850      }
851
852      /**
853       *  @brief  Resizes the %deque to the specified number of elements.
854       *  @param  new_size  Number of elements the %deque should contain.
855       *
856       *  This function will resize the %deque to the specified number of
857       *  elements.  If the number is smaller than the %deque's current size the
858       *  %deque is truncated, otherwise the %deque is extended and new elements
859       *  are default-constructed.
860       */
861      void
862      resize(size_type new_size)
863      { resize(new_size, value_type()); }
864
865      /**
866       *  Returns true if the %deque is empty.  (Thus begin() would equal end().)
867       */
868      bool
869      empty() const
870      { return this->_M_impl._M_finish == this->_M_impl._M_start; }
871
872      // element access
873      /**
874       *  @brief  Subscript access to the data contained in the %deque.
875       *  @param  n  The index of the element for which data should be accessed.
876       *  @return  Read/write reference to data.
877       *
878       *  This operator allows for easy, array-style, data access.
879       *  Note that data access with this operator is unchecked and out_of_range
880       *  lookups are not defined. (For checked lookups see at().)
881       */
882      reference
883      operator[](size_type __n)
884      { return this->_M_impl._M_start[difference_type(__n)]; }
885
886      /**
887       *  @brief  Subscript access to the data contained in the %deque.
888       *  @param  n  The index of the element for which data should be accessed.
889       *  @return  Read-only (constant) reference to data.
890       *
891       *  This operator allows for easy, array-style, data access.
892       *  Note that data access with this operator is unchecked and out_of_range
893       *  lookups are not defined. (For checked lookups see at().)
894       */
895      const_reference
896      operator[](size_type __n) const
897      { return this->_M_impl._M_start[difference_type(__n)]; }
898
899    protected:
900      /// @if maint Safety check used only from at().  @endif
901      void
902      _M_range_check(size_type __n) const
903      {
904        if (__n >= this->size())
905          __throw_out_of_range(__N("deque::_M_range_check"));
906      }
907
908    public:
909      /**
910       *  @brief  Provides access to the data contained in the %deque.
911       *  @param  n  The index of the element for which data should be accessed.
912       *  @return  Read/write reference to data.
913       *  @throw  std::out_of_range  If @a n is an invalid index.
914       *
915       *  This function provides for safer data access.  The parameter is first
916       *  checked that it is in the range of the deque.  The function throws
917       *  out_of_range if the check fails.
918       */
919      reference
920      at(size_type __n)
921      { _M_range_check(__n); return (*this)[__n]; }
922
923      /**
924       *  @brief  Provides access to the data contained in the %deque.
925       *  @param  n  The index of the element for which data should be accessed.
926       *  @return  Read-only (constant) reference to data.
927       *  @throw  std::out_of_range  If @a n is an invalid index.
928       *
929       *  This function provides for safer data access.  The parameter is first
930       *  checked that it is in the range of the deque.  The function throws
931       *  out_of_range if the check fails.
932       */
933      const_reference
934      at(size_type __n) const
935      {
936        _M_range_check(__n);
937        return (*this)[__n];
938      }
939
940      /**
941       *  Returns a read/write reference to the data at the first element of the
942       *  %deque.
943       */
944      reference
945      front()
946      { return *this->_M_impl._M_start; }
947
948      /**
949       *  Returns a read-only (constant) reference to the data at the first
950       *  element of the %deque.
951       */
952      const_reference
953      front() const
954      { return *this->_M_impl._M_start; }
955
956      /**
957       *  Returns a read/write reference to the data at the last element of the
958       *  %deque.
959       */
960      reference
961      back()
962      {
963        iterator __tmp = this->_M_impl._M_finish;
964        --__tmp;
965        return *__tmp;
966      }
967
968      /**
969       *  Returns a read-only (constant) reference to the data at the last
970       *  element of the %deque.
971       */
972      const_reference
973      back() const
974      {
975        const_iterator __tmp = this->_M_impl._M_finish;
976        --__tmp;
977        return *__tmp;
978      }
979
980      // [23.2.1.2] modifiers
981      /**
982       *  @brief  Add data to the front of the %deque.
983       *  @param  x  Data to be added.
984       *
985       *  This is a typical stack operation.  The function creates an element at
986       *  the front of the %deque and assigns the given data to it.  Due to the
987       *  nature of a %deque this operation can be done in constant time.
988       */
989      void
990      push_front(const value_type& __x)
991      {
992        if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_first)
993          {
994            std::_Construct(this->_M_impl._M_start._M_cur - 1, __x);
995            --this->_M_impl._M_start._M_cur;
996          }
997        else
998          _M_push_front_aux(__x);
999      }
1000
1001      /**
1002       *  @brief  Add data to the end of the %deque.
1003       *  @param  x  Data to be added.
1004       *
1005       *  This is a typical stack operation.  The function creates an element at
1006       *  the end of the %deque and assigns the given data to it.  Due to the
1007       *  nature of a %deque this operation can be done in constant time.
1008       */
1009      void
1010      push_back(const value_type& __x)
1011      {
1012        if (this->_M_impl._M_finish._M_cur != this->_M_impl._M_finish._M_last - 1)
1013          {
1014            std::_Construct(this->_M_impl._M_finish._M_cur, __x);
1015            ++this->_M_impl._M_finish._M_cur;
1016          }
1017        else
1018          _M_push_back_aux(__x);
1019      }
1020
1021      /**
1022       *  @brief  Removes first element.
1023       *
1024       *  This is a typical stack operation.  It shrinks the %deque by one.
1025       *
1026       *  Note that no data is returned, and if the first element's data is
1027       *  needed, it should be retrieved before pop_front() is called.
1028       */
1029      void
1030      pop_front()
1031      {
1032        if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_last - 1)
1033          {
1034            std::_Destroy(this->_M_impl._M_start._M_cur);
1035            ++this->_M_impl._M_start._M_cur;
1036          }
1037        else
1038          _M_pop_front_aux();
1039      }
1040
1041      /**
1042       *  @brief  Removes last element.
1043       *
1044       *  This is a typical stack operation.  It shrinks the %deque by one.
1045       *
1046       *  Note that no data is returned, and if the last element's data is
1047       *  needed, it should be retrieved before pop_back() is called.
1048       */
1049      void
1050      pop_back()
1051      {
1052        if (this->_M_impl._M_finish._M_cur != this->_M_impl._M_finish._M_first)
1053          {
1054            --this->_M_impl._M_finish._M_cur;
1055            std::_Destroy(this->_M_impl._M_finish._M_cur);
1056          }
1057        else
1058          _M_pop_back_aux();
1059      }
1060
1061      /**
1062       *  @brief  Inserts given value into %deque before specified iterator.
1063       *  @param  position  An iterator into the %deque.
1064       *  @param  x  Data to be inserted.
1065       *  @return  An iterator that points to the inserted data.
1066       *
1067       *  This function will insert a copy of the given value before the
1068       *  specified location.
1069       */
1070      iterator
1071      insert(iterator position, const value_type& __x);
1072
1073      /**
1074       *  @brief  Inserts a number of copies of given data into the %deque.
1075       *  @param  position  An iterator into the %deque.
1076       *  @param  n  Number of elements to be inserted.
1077       *  @param  x  Data to be inserted.
1078       *
1079       *  This function will insert a specified number of copies of the given
1080       *  data before the location specified by @a position.
1081       */
1082      void
1083      insert(iterator __position, size_type __n, const value_type& __x)
1084      { _M_fill_insert(__position, __n, __x); }
1085
1086      /**
1087       *  @brief  Inserts a range into the %deque.
1088       *  @param  position  An iterator into the %deque.
1089       *  @param  first  An input iterator.
1090       *  @param  last   An input iterator.
1091       *
1092       *  This function will insert copies of the data in the range [first,last)
1093       *  into the %deque before the location specified by @a pos.  This is
1094       *  known as "range insert."
1095       */
1096      template<typename _InputIterator>
1097        void
1098        insert(iterator __position, _InputIterator __first,
1099               _InputIterator __last)
1100        {
1101          // Check whether it's an integral type.  If so, it's not an iterator.
1102          typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
1103          _M_insert_dispatch(__position, __first, __last, _Integral());
1104        }
1105
1106      /**
1107       *  @brief  Remove element at given position.
1108       *  @param  position  Iterator pointing to element to be erased.
1109       *  @return  An iterator pointing to the next element (or end()).
1110       *
1111       *  This function will erase the element at the given position and thus
1112       *  shorten the %deque by one.
1113       *
1114       *  The user is cautioned that
1115       *  this function only erases the element, and that if the element is
1116       *  itself a pointer, the pointed-to memory is not touched in any way.
1117       *  Managing the pointer is the user's responsibilty.
1118       */
1119      iterator
1120      erase(iterator __position);
1121
1122      /**
1123       *  @brief  Remove a range of elements.
1124       *  @param  first  Iterator pointing to the first element to be erased.
1125       *  @param  last  Iterator pointing to one past the last element to be
1126       *                erased.
1127       *  @return  An iterator pointing to the element pointed to by @a last
1128       *           prior to erasing (or end()).
1129       *
1130       *  This function will erase the elements in the range [first,last) and
1131       *  shorten the %deque accordingly.
1132       *
1133       *  The user is cautioned that
1134       *  this function only erases the elements, and that if the elements
1135       *  themselves are pointers, the pointed-to memory is not touched in any
1136       *  way.  Managing the pointer is the user's responsibilty.
1137       */
1138      iterator
1139      erase(iterator __first, iterator __last);
1140
1141      /**
1142       *  @brief  Swaps data with another %deque.
1143       *  @param  x  A %deque of the same element and allocator types.
1144       *
1145       *  This exchanges the elements between two deques in constant time.
1146       *  (Four pointers, so it should be quite fast.)
1147       *  Note that the global std::swap() function is specialized such that
1148       *  std::swap(d1,d2) will feed to this function.
1149       */
1150      void
1151      swap(deque& __x)
1152      {
1153        std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
1154        std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
1155        std::swap(this->_M_impl._M_map, __x._M_impl._M_map);
1156        std::swap(this->_M_impl._M_map_size, __x._M_impl._M_map_size);
1157      }
1158
1159      /**
1160       *  Erases all the elements.  Note that this function only erases the
1161       *  elements, and that if the elements themselves are pointers, the
1162       *  pointed-to memory is not touched in any way.  Managing the pointer is
1163       *  the user's responsibilty.
1164       */
1165      void clear();
1166
1167    protected:
1168      // Internal constructor functions follow.
1169
1170      // called by the range constructor to implement [23.1.1]/9
1171      template<typename _Integer>
1172        void
1173        _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1174        {
1175          _M_initialize_map(__n);
1176          _M_fill_initialize(__x);
1177        }
1178
1179      // called by the range constructor to implement [23.1.1]/9
1180      template<typename _InputIterator>
1181        void
1182        _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1183                               __false_type)
1184        {
1185          typedef typename iterator_traits<_InputIterator>::iterator_category
1186            _IterCategory;
1187          _M_range_initialize(__first, __last, _IterCategory());
1188        }
1189
1190      // called by the second initialize_dispatch above
1191      //@{
1192      /**
1193       *  @if maint
1194       *  @brief Fills the deque with whatever is in [first,last).
1195       *  @param  first  An input iterator.
1196       *  @param  last  An input iterator.
1197       *  @return   Nothing.
1198       *
1199       *  If the iterators are actually forward iterators (or better), then the
1200       *  memory layout can be done all at once.  Else we move forward using
1201       *  push_back on each value from the iterator.
1202       *  @endif
1203       */
1204      template<typename _InputIterator>
1205        void
1206        _M_range_initialize(_InputIterator __first, _InputIterator __last,
1207                            input_iterator_tag);
1208
1209      // called by the second initialize_dispatch above
1210      template<typename _ForwardIterator>
1211        void
1212        _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
1213                            forward_iterator_tag);
1214      //@}
1215
1216      /**
1217       *  @if maint
1218       *  @brief Fills the %deque with copies of value.
1219       *  @param  value  Initial value.
1220       *  @return   Nothing.
1221       *  @pre _M_start and _M_finish have already been initialized, but none of
1222       *       the %deque's elements have yet been constructed.
1223       *
1224       *  This function is called only when the user provides an explicit size
1225       *  (with or without an explicit exemplar value).
1226       *  @endif
1227       */
1228      void
1229      _M_fill_initialize(const value_type& __value);
1230
1231      // Internal assign functions follow.  The *_aux functions do the actual
1232      // assignment work for the range versions.
1233
1234      // called by the range assign to implement [23.1.1]/9
1235      template<typename _Integer>
1236        void
1237        _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1238        {
1239          _M_fill_assign(static_cast<size_type>(__n),
1240                         static_cast<value_type>(__val));
1241        }
1242
1243      // called by the range assign to implement [23.1.1]/9
1244      template<typename _InputIterator>
1245        void
1246        _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1247                           __false_type)
1248        {
1249          typedef typename iterator_traits<_InputIterator>::iterator_category
1250            _IterCategory;
1251          _M_assign_aux(__first, __last, _IterCategory());
1252        }
1253
1254      // called by the second assign_dispatch above
1255      template<typename _InputIterator>
1256        void
1257        _M_assign_aux(_InputIterator __first, _InputIterator __last,
1258                      input_iterator_tag);
1259
1260      // called by the second assign_dispatch above
1261      template<typename _ForwardIterator>
1262        void
1263        _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1264                      forward_iterator_tag)
1265        {
1266          const size_type __len = std::distance(__first, __last);
1267          if (__len > size())
1268            {
1269              _ForwardIterator __mid = __first;
1270              std::advance(__mid, size());
1271              std::copy(__first, __mid, begin());
1272              insert(end(), __mid, __last);
1273            }
1274          else
1275            erase(std::copy(__first, __last, begin()), end());
1276        }
1277
1278      // Called by assign(n,t), and the range assign when it turns out to be the
1279      // same thing.
1280      void
1281      _M_fill_assign(size_type __n, const value_type& __val)
1282      {
1283        if (__n > size())
1284          {
1285            std::fill(begin(), end(), __val);
1286            insert(end(), __n - size(), __val);
1287          }
1288        else
1289          {
1290            erase(begin() + __n, end());
1291            std::fill(begin(), end(), __val);
1292          }
1293      }
1294
1295      //@{
1296      /**
1297       *  @if maint
1298       *  @brief Helper functions for push_* and pop_*.
1299       *  @endif
1300       */
1301      void _M_push_back_aux(const value_type&);
1302      void _M_push_front_aux(const value_type&);
1303      void _M_pop_back_aux();
1304      void _M_pop_front_aux();
1305      //@}
1306
1307      // Internal insert functions follow.  The *_aux functions do the actual
1308      // insertion work when all shortcuts fail.
1309
1310      // called by the range insert to implement [23.1.1]/9
1311      template<typename _Integer>
1312        void
1313        _M_insert_dispatch(iterator __pos,
1314                           _Integer __n, _Integer __x, __true_type)
1315        {
1316          _M_fill_insert(__pos, static_cast<size_type>(__n),
1317                         static_cast<value_type>(__x));
1318        }
1319
1320      // called by the range insert to implement [23.1.1]/9
1321      template<typename _InputIterator>
1322        void
1323        _M_insert_dispatch(iterator __pos,
1324                           _InputIterator __first, _InputIterator __last,
1325                           __false_type)
1326        {
1327          typedef typename iterator_traits<_InputIterator>::iterator_category
1328            _IterCategory;
1329          _M_range_insert_aux(__pos, __first, __last, _IterCategory());
1330        }
1331
1332      // called by the second insert_dispatch above
1333      template<typename _InputIterator>
1334        void
1335        _M_range_insert_aux(iterator __pos, _InputIterator __first,
1336                            _InputIterator __last, input_iterator_tag);
1337
1338      // called by the second insert_dispatch above
1339      template<typename _ForwardIterator>
1340        void
1341        _M_range_insert_aux(iterator __pos, _ForwardIterator __first,
1342                            _ForwardIterator __last, forward_iterator_tag);
1343
1344      // Called by insert(p,n,x), and the range insert when it turns out to be
1345      // the same thing.  Can use fill functions in optimal situations,
1346      // otherwise passes off to insert_aux(p,n,x).
1347      void
1348      _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
1349
1350      // called by insert(p,x)
1351      iterator
1352      _M_insert_aux(iterator __pos, const value_type& __x);
1353
1354      // called by insert(p,n,x) via fill_insert
1355      void
1356      _M_insert_aux(iterator __pos, size_type __n, const value_type& __x);
1357
1358      // called by range_insert_aux for forward iterators
1359      template<typename _ForwardIterator>
1360        void
1361        _M_insert_aux(iterator __pos,
1362                      _ForwardIterator __first, _ForwardIterator __last,
1363                      size_type __n);
1364
1365      //@{
1366      /**
1367       *  @if maint
1368       *  @brief Memory-handling helpers for the previous internal insert
1369       *         functions.
1370       *  @endif
1371       */
1372      iterator
1373      _M_reserve_elements_at_front(size_type __n)
1374      {
1375        const size_type __vacancies = this->_M_impl._M_start._M_cur
1376                                      - this->_M_impl._M_start._M_first;
1377        if (__n > __vacancies)
1378          _M_new_elements_at_front(__n - __vacancies);
1379        return this->_M_impl._M_start - difference_type(__n);
1380      }
1381
1382      iterator
1383      _M_reserve_elements_at_back(size_type __n)
1384      {
1385        const size_type __vacancies = (this->_M_impl._M_finish._M_last
1386                                       - this->_M_impl._M_finish._M_cur) - 1;
1387        if (__n > __vacancies)
1388          _M_new_elements_at_back(__n - __vacancies);
1389        return this->_M_impl._M_finish + difference_type(__n);
1390      }
1391
1392      void
1393      _M_new_elements_at_front(size_type __new_elements);
1394
1395      void
1396      _M_new_elements_at_back(size_type __new_elements);
1397      //@}
1398
1399
1400      //@{
1401      /**
1402       *  @if maint
1403       *  @brief Memory-handling helpers for the major %map.
1404       *
1405       *  Makes sure the _M_map has space for new nodes.  Does not actually add
1406       *  the nodes.  Can invalidate _M_map pointers.  (And consequently, %deque
1407       *  iterators.)
1408       *  @endif
1409       */
1410      void
1411      _M_reserve_map_at_back (size_type __nodes_to_add = 1)
1412      {
1413        if (__nodes_to_add + 1 > this->_M_impl._M_map_size
1414            - (this->_M_impl._M_finish._M_node - this->_M_impl._M_map))
1415          _M_reallocate_map(__nodes_to_add, false);
1416      }
1417
1418      void
1419      _M_reserve_map_at_front (size_type __nodes_to_add = 1)
1420      {
1421        if (__nodes_to_add > size_type(this->_M_impl._M_start._M_node - this->_M_impl._M_map))
1422          _M_reallocate_map(__nodes_to_add, true);
1423      }
1424
1425      void
1426      _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);
1427      //@}
1428    };
1429
1430
1431  /**
1432   *  @brief  Deque equality comparison.
1433   *  @param  x  A %deque.
1434   *  @param  y  A %deque of the same type as @a x.
1435   *  @return  True iff the size and elements of the deques are equal.
1436   *
1437   *  This is an equivalence relation.  It is linear in the size of the
1438   *  deques.  Deques are considered equivalent if their sizes are equal,
1439   *  and if corresponding elements compare equal.
1440  */
1441  template<typename _Tp, typename _Alloc>
1442    inline bool
1443    operator==(const deque<_Tp, _Alloc>& __x,
1444                         const deque<_Tp, _Alloc>& __y)
1445    { return __x.size() == __y.size()
1446             && std::equal(__x.begin(), __x.end(), __y.begin()); }
1447
1448  /**
1449   *  @brief  Deque ordering relation.
1450   *  @param  x  A %deque.
1451   *  @param  y  A %deque of the same type as @a x.
1452   *  @return  True iff @a x is lexicographically less than @a y.
1453   *
1454   *  This is a total ordering relation.  It is linear in the size of the
1455   *  deques.  The elements must be comparable with @c <.
1456   *
1457   *  See std::lexicographical_compare() for how the determination is made.
1458  */
1459  template<typename _Tp, typename _Alloc>
1460    inline bool
1461    operator<(const deque<_Tp, _Alloc>& __x,
1462              const deque<_Tp, _Alloc>& __y)
1463    { return lexicographical_compare(__x.begin(), __x.end(),
1464                                     __y.begin(), __y.end()); }
1465
1466  /// Based on operator==
1467  template<typename _Tp, typename _Alloc>
1468    inline bool
1469    operator!=(const deque<_Tp, _Alloc>& __x,
1470               const deque<_Tp, _Alloc>& __y)
1471    { return !(__x == __y); }
1472
1473  /// Based on operator<
1474  template<typename _Tp, typename _Alloc>
1475    inline bool
1476    operator>(const deque<_Tp, _Alloc>& __x,
1477              const deque<_Tp, _Alloc>& __y)
1478    { return __y < __x; }
1479
1480  /// Based on operator<
1481  template<typename _Tp, typename _Alloc>
1482    inline bool
1483    operator<=(const deque<_Tp, _Alloc>& __x,
1484               const deque<_Tp, _Alloc>& __y)
1485    { return !(__y < __x); }
1486
1487  /// Based on operator<
1488  template<typename _Tp, typename _Alloc>
1489    inline bool
1490    operator>=(const deque<_Tp, _Alloc>& __x,
1491               const deque<_Tp, _Alloc>& __y)
1492    { return !(__x < __y); }
1493
1494  /// See std::deque::swap().
1495  template<typename _Tp, typename _Alloc>
1496    inline void
1497    swap(deque<_Tp,_Alloc>& __x, deque<_Tp,_Alloc>& __y)
1498    { __x.swap(__y); }
1499} // namespace std
1500
1501#endif /* _DEQUE_H */
Note: See TracBrowser for help on using the repository browser.