Home | History | Annotate | Download | only in v1
      1 // -*- C++ -*-
      2 //===---------------------------- deque -----------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_DEQUE
     12 #define _LIBCPP_DEQUE
     13 
     14 /*
     15     deque synopsis
     16 
     17 namespace std
     18 {
     19 
     20 template <class T, class Allocator = allocator<T> >
     21 class deque
     22 {
     23 public:
     24     // types:
     25     typedef T value_type;
     26     typedef Allocator allocator_type;
     27 
     28     typedef typename allocator_type::reference       reference;
     29     typedef typename allocator_type::const_reference const_reference;
     30     typedef implementation-defined                   iterator;
     31     typedef implementation-defined                   const_iterator;
     32     typedef typename allocator_type::size_type       size_type;
     33     typedef typename allocator_type::difference_type difference_type;
     34 
     35     typedef typename allocator_type::pointer         pointer;
     36     typedef typename allocator_type::const_pointer   const_pointer;
     37     typedef std::reverse_iterator<iterator>          reverse_iterator;
     38     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
     39 
     40     // construct/copy/destroy:
     41     deque() noexcept(is_nothrow_default_constructible<allocator_type>::value);
     42     explicit deque(const allocator_type& a);
     43     explicit deque(size_type n);
     44     explicit deque(size_type n, const allocator_type& a); // C++14
     45     deque(size_type n, const value_type& v);
     46     deque(size_type n, const value_type& v, const allocator_type& a);
     47     template <class InputIterator>
     48         deque(InputIterator f, InputIterator l);
     49     template <class InputIterator>
     50         deque(InputIterator f, InputIterator l, const allocator_type& a);
     51     deque(const deque& c);
     52     deque(deque&& c)
     53         noexcept(is_nothrow_move_constructible<allocator_type>::value);
     54     deque(initializer_list<value_type> il, const Allocator& a = allocator_type());
     55     deque(const deque& c, const allocator_type& a);
     56     deque(deque&& c, const allocator_type& a);
     57     ~deque();
     58 
     59     deque& operator=(const deque& c);
     60     deque& operator=(deque&& c)
     61         noexcept(
     62              allocator_type::propagate_on_container_move_assignment::value &&
     63              is_nothrow_move_assignable<allocator_type>::value);
     64     deque& operator=(initializer_list<value_type> il);
     65 
     66     template <class InputIterator>
     67         void assign(InputIterator f, InputIterator l);
     68     void assign(size_type n, const value_type& v);
     69     void assign(initializer_list<value_type> il);
     70 
     71     allocator_type get_allocator() const noexcept;
     72 
     73     // iterators:
     74 
     75     iterator       begin() noexcept;
     76     const_iterator begin() const noexcept;
     77     iterator       end() noexcept;
     78     const_iterator end() const noexcept;
     79 
     80     reverse_iterator       rbegin() noexcept;
     81     const_reverse_iterator rbegin() const noexcept;
     82     reverse_iterator       rend() noexcept;
     83     const_reverse_iterator rend() const noexcept;
     84 
     85     const_iterator         cbegin() const noexcept;
     86     const_iterator         cend() const noexcept;
     87     const_reverse_iterator crbegin() const noexcept;
     88     const_reverse_iterator crend() const noexcept;
     89 
     90     // capacity:
     91     size_type size() const noexcept;
     92     size_type max_size() const noexcept;
     93     void resize(size_type n);
     94     void resize(size_type n, const value_type& v);
     95     void shrink_to_fit();
     96     bool empty() const noexcept;
     97 
     98     // element access:
     99     reference operator[](size_type i);
    100     const_reference operator[](size_type i) const;
    101     reference at(size_type i);
    102     const_reference at(size_type i) const;
    103     reference front();
    104     const_reference front() const;
    105     reference back();
    106     const_reference back() const;
    107 
    108     // modifiers:
    109     void push_front(const value_type& v);
    110     void push_front(value_type&& v);
    111     void push_back(const value_type& v);
    112     void push_back(value_type&& v);
    113     template <class... Args> reference emplace_front(Args&&... args);  // reference in C++17
    114     template <class... Args> reference emplace_back(Args&&... args);   // reference in C++17
    115     template <class... Args> iterator emplace(const_iterator p, Args&&... args);
    116     iterator insert(const_iterator p, const value_type& v);
    117     iterator insert(const_iterator p, value_type&& v);
    118     iterator insert(const_iterator p, size_type n, const value_type& v);
    119     template <class InputIterator>
    120         iterator insert(const_iterator p, InputIterator f, InputIterator l);
    121     iterator insert(const_iterator p, initializer_list<value_type> il);
    122     void pop_front();
    123     void pop_back();
    124     iterator erase(const_iterator p);
    125     iterator erase(const_iterator f, const_iterator l);
    126     void swap(deque& c)
    127         noexcept(allocator_traits<allocator_type>::is_always_equal::value);  // C++17
    128     void clear() noexcept;
    129 };
    130 
    131 template <class T, class Allocator>
    132     bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
    133 template <class T, class Allocator>
    134     bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
    135 template <class T, class Allocator>
    136     bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
    137 template <class T, class Allocator>
    138     bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
    139 template <class T, class Allocator>
    140     bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
    141 template <class T, class Allocator>
    142     bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
    143 
    144 // specialized algorithms:
    145 template <class T, class Allocator>
    146     void swap(deque<T,Allocator>& x, deque<T,Allocator>& y)
    147          noexcept(noexcept(x.swap(y)));
    148 
    149 }  // std
    150 
    151 */
    152 
    153 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    154 #pragma GCC system_header
    155 #endif
    156 
    157 #include <__config>
    158 #include <__split_buffer>
    159 #include <type_traits>
    160 #include <initializer_list>
    161 #include <iterator>
    162 #include <algorithm>
    163 #include <stdexcept>
    164 
    165 #include <__undef_min_max>
    166 
    167 _LIBCPP_BEGIN_NAMESPACE_STD
    168 
    169 template <class _Tp, class _Allocator> class __deque_base;
    170 template <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS deque;
    171 
    172 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
    173           class _DiffType, _DiffType _BlockSize>
    174 class _LIBCPP_TEMPLATE_VIS __deque_iterator;
    175 
    176 template <class _RAIter,
    177           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    178 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    179 copy(_RAIter __f,
    180      _RAIter __l,
    181      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    182      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
    183 
    184 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    185           class _OutputIterator>
    186 _OutputIterator
    187 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    188      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    189      _OutputIterator __r);
    190 
    191 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    192           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    193 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    194 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    195      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    196      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    197 
    198 template <class _RAIter,
    199           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    200 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    201 copy_backward(_RAIter __f,
    202               _RAIter __l,
    203               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    204               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
    205 
    206 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    207           class _OutputIterator>
    208 _OutputIterator
    209 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    210               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    211               _OutputIterator __r);
    212 
    213 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    214           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    215 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    216 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    217               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    218               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    219 
    220 template <class _RAIter,
    221           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    222 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    223 move(_RAIter __f,
    224      _RAIter __l,
    225      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    226      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
    227 
    228 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    229           class _OutputIterator>
    230 _OutputIterator
    231 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    232      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    233      _OutputIterator __r);
    234 
    235 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    236           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    237 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    238 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    239      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    240      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    241 
    242 template <class _RAIter,
    243           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    244 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    245 move_backward(_RAIter __f,
    246               _RAIter __l,
    247               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    248               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
    249 
    250 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    251           class _OutputIterator>
    252 _OutputIterator
    253 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    254               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    255               _OutputIterator __r);
    256 
    257 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    258           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    259 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    260 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    261               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    262               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    263 
    264 template <class _ValueType, class _DiffType>
    265 struct __deque_block_size {
    266   static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16;
    267 };
    268 
    269 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
    270           class _DiffType, _DiffType _BS =
    271 #ifdef _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
    272 // Keep template parameter to avoid changing all template declarations thoughout
    273 // this file.
    274                                0
    275 #else
    276                                __deque_block_size<_ValueType, _DiffType>::value
    277 #endif
    278           >
    279 class _LIBCPP_TEMPLATE_VIS __deque_iterator
    280 {
    281     typedef _MapPointer __map_iterator;
    282 public:
    283     typedef _Pointer  pointer;
    284     typedef _DiffType difference_type;
    285 private:
    286     __map_iterator __m_iter_;
    287     pointer        __ptr_;
    288 
    289     static const difference_type __block_size;
    290 public:
    291     typedef _ValueType                  value_type;
    292     typedef random_access_iterator_tag  iterator_category;
    293     typedef _Reference                  reference;
    294 
    295     _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT
    296 #if _LIBCPP_STD_VER > 11
    297      : __m_iter_(nullptr), __ptr_(nullptr)
    298 #endif
    299      {}
    300 
    301     template <class _Pp, class _Rp, class _MP>
    302     _LIBCPP_INLINE_VISIBILITY
    303     __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, _BS>& __it,
    304                 typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
    305         : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
    306 
    307     _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;}
    308     _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;}
    309 
    310     _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++()
    311     {
    312         if (++__ptr_ - *__m_iter_ == __block_size)
    313         {
    314             ++__m_iter_;
    315             __ptr_ = *__m_iter_;
    316         }
    317         return *this;
    318     }
    319 
    320     _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int)
    321     {
    322         __deque_iterator __tmp = *this;
    323         ++(*this);
    324         return __tmp;
    325     }
    326 
    327     _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--()
    328     {
    329         if (__ptr_ == *__m_iter_)
    330         {
    331             --__m_iter_;
    332             __ptr_ = *__m_iter_ + __block_size;
    333         }
    334         --__ptr_;
    335         return *this;
    336     }
    337 
    338     _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int)
    339     {
    340         __deque_iterator __tmp = *this;
    341         --(*this);
    342         return __tmp;
    343     }
    344 
    345     _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n)
    346     {
    347         if (__n != 0)
    348         {
    349             __n += __ptr_ - *__m_iter_;
    350             if (__n > 0)
    351             {
    352                 __m_iter_ += __n / __block_size;
    353                 __ptr_ = *__m_iter_ + __n % __block_size;
    354             }
    355             else // (__n < 0)
    356             {
    357                 difference_type __z = __block_size - 1 - __n;
    358                 __m_iter_ -= __z / __block_size;
    359                 __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size);
    360             }
    361         }
    362         return *this;
    363     }
    364 
    365     _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n)
    366     {
    367         return *this += -__n;
    368     }
    369 
    370     _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const
    371     {
    372         __deque_iterator __t(*this);
    373         __t += __n;
    374         return __t;
    375     }
    376 
    377     _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const
    378     {
    379         __deque_iterator __t(*this);
    380         __t -= __n;
    381         return __t;
    382     }
    383 
    384     _LIBCPP_INLINE_VISIBILITY
    385     friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it)
    386         {return __it + __n;}
    387 
    388     _LIBCPP_INLINE_VISIBILITY
    389     friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y)
    390     {
    391         if (__x != __y)
    392             return (__x.__m_iter_ - __y.__m_iter_) * __block_size
    393                  + (__x.__ptr_ - *__x.__m_iter_)
    394                  - (__y.__ptr_ - *__y.__m_iter_);
    395         return 0;
    396     }
    397 
    398     _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
    399         {return *(*this + __n);}
    400 
    401     _LIBCPP_INLINE_VISIBILITY friend
    402         bool operator==(const __deque_iterator& __x, const __deque_iterator& __y)
    403         {return __x.__ptr_ == __y.__ptr_;}
    404 
    405     _LIBCPP_INLINE_VISIBILITY friend
    406         bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y)
    407         {return !(__x == __y);}
    408 
    409     _LIBCPP_INLINE_VISIBILITY friend
    410         bool operator<(const __deque_iterator& __x, const __deque_iterator& __y)
    411         {return __x.__m_iter_ < __y.__m_iter_ ||
    412                (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);}
    413 
    414     _LIBCPP_INLINE_VISIBILITY friend
    415         bool operator>(const __deque_iterator& __x, const __deque_iterator& __y)
    416         {return __y < __x;}
    417 
    418     _LIBCPP_INLINE_VISIBILITY friend
    419         bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y)
    420         {return !(__y < __x);}
    421 
    422     _LIBCPP_INLINE_VISIBILITY friend
    423         bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y)
    424         {return !(__x < __y);}
    425 
    426 private:
    427     _LIBCPP_INLINE_VISIBILITY __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT
    428         : __m_iter_(__m), __ptr_(__p) {}
    429 
    430     template <class _Tp, class _Ap> friend class __deque_base;
    431     template <class _Tp, class _Ap> friend class _LIBCPP_TEMPLATE_VIS deque;
    432     template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp>
    433         friend class _LIBCPP_TEMPLATE_VIS __deque_iterator;
    434 
    435     template <class _RAIter,
    436               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    437     friend
    438     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    439     copy(_RAIter __f,
    440          _RAIter __l,
    441          __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    442          typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
    443 
    444     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    445               class _OutputIterator>
    446     friend
    447     _OutputIterator
    448     copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    449          __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    450          _OutputIterator __r);
    451 
    452     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    453               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    454     friend
    455     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    456     copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    457          __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    458          __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    459 
    460     template <class _RAIter,
    461               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    462     friend
    463     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    464     copy_backward(_RAIter __f,
    465                   _RAIter __l,
    466                   __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    467                   typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
    468 
    469     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    470               class _OutputIterator>
    471     friend
    472     _OutputIterator
    473     copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    474                   __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    475                   _OutputIterator __r);
    476 
    477     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    478               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    479     friend
    480     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    481     copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    482                   __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    483                   __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    484 
    485     template <class _RAIter,
    486               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    487     friend
    488     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    489     move(_RAIter __f,
    490          _RAIter __l,
    491          __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    492          typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
    493 
    494     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    495               class _OutputIterator>
    496     friend
    497     _OutputIterator
    498     move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    499          __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    500          _OutputIterator __r);
    501 
    502     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    503               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    504     friend
    505     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    506     move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    507          __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    508          __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    509 
    510     template <class _RAIter,
    511               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    512     friend
    513     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    514     move_backward(_RAIter __f,
    515                   _RAIter __l,
    516                   __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    517                   typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
    518 
    519     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    520               class _OutputIterator>
    521     friend
    522     _OutputIterator
    523     move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    524                   __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    525                   _OutputIterator __r);
    526 
    527     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    528               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    529     friend
    530     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    531     move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    532                   __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    533                   __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
    534 };
    535 
    536 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
    537           class _DiffType, _DiffType _BlockSize>
    538 const _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer,
    539                                  _DiffType, _BlockSize>::__block_size =
    540     __deque_block_size<_ValueType, _DiffType>::value;
    541 
    542 // copy
    543 
    544 template <class _RAIter,
    545           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    546 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    547 copy(_RAIter __f,
    548      _RAIter __l,
    549      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    550      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
    551 {
    552     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
    553     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
    554     const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
    555     while (__f != __l)
    556     {
    557         pointer __rb = __r.__ptr_;
    558         pointer __re = *__r.__m_iter_ + __block_size;
    559         difference_type __bs = __re - __rb;
    560         difference_type __n = __l - __f;
    561         _RAIter __m = __l;
    562         if (__n > __bs)
    563         {
    564             __n = __bs;
    565             __m = __f + __n;
    566         }
    567         _VSTD::copy(__f, __m, __rb);
    568         __f = __m;
    569         __r += __n;
    570     }
    571     return __r;
    572 }
    573 
    574 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    575           class _OutputIterator>
    576 _OutputIterator
    577 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    578      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    579      _OutputIterator __r)
    580 {
    581     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    582     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    583     const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
    584     difference_type __n = __l - __f;
    585     while (__n > 0)
    586     {
    587         pointer __fb = __f.__ptr_;
    588         pointer __fe = *__f.__m_iter_ + __block_size;
    589         difference_type __bs = __fe - __fb;
    590         if (__bs > __n)
    591         {
    592             __bs = __n;
    593             __fe = __fb + __bs;
    594         }
    595         __r = _VSTD::copy(__fb, __fe, __r);
    596         __n -= __bs;
    597         __f += __bs;
    598     }
    599     return __r;
    600 }
    601 
    602 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    603           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    604 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    605 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    606      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    607      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
    608 {
    609     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    610     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    611     const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
    612     difference_type __n = __l - __f;
    613     while (__n > 0)
    614     {
    615         pointer __fb = __f.__ptr_;
    616         pointer __fe = *__f.__m_iter_ + __block_size;
    617         difference_type __bs = __fe - __fb;
    618         if (__bs > __n)
    619         {
    620             __bs = __n;
    621             __fe = __fb + __bs;
    622         }
    623         __r = _VSTD::copy(__fb, __fe, __r);
    624         __n -= __bs;
    625         __f += __bs;
    626     }
    627     return __r;
    628 }
    629 
    630 // copy_backward
    631 
    632 template <class _RAIter,
    633           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    634 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    635 copy_backward(_RAIter __f,
    636               _RAIter __l,
    637               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    638               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
    639 {
    640     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
    641     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
    642     while (__f != __l)
    643     {
    644         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
    645         pointer __rb = *__rp.__m_iter_;
    646         pointer __re = __rp.__ptr_ + 1;
    647         difference_type __bs = __re - __rb;
    648         difference_type __n = __l - __f;
    649         _RAIter __m = __f;
    650         if (__n > __bs)
    651         {
    652             __n = __bs;
    653             __m = __l - __n;
    654         }
    655         _VSTD::copy_backward(__m, __l, __re);
    656         __l = __m;
    657         __r -= __n;
    658     }
    659     return __r;
    660 }
    661 
    662 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    663           class _OutputIterator>
    664 _OutputIterator
    665 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    666               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    667               _OutputIterator __r)
    668 {
    669     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    670     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    671     difference_type __n = __l - __f;
    672     while (__n > 0)
    673     {
    674         --__l;
    675         pointer __lb = *__l.__m_iter_;
    676         pointer __le = __l.__ptr_ + 1;
    677         difference_type __bs = __le - __lb;
    678         if (__bs > __n)
    679         {
    680             __bs = __n;
    681             __lb = __le - __bs;
    682         }
    683         __r = _VSTD::copy_backward(__lb, __le, __r);
    684         __n -= __bs;
    685         __l -= __bs - 1;
    686     }
    687     return __r;
    688 }
    689 
    690 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    691           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    692 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    693 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    694               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    695               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
    696 {
    697     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    698     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    699     difference_type __n = __l - __f;
    700     while (__n > 0)
    701     {
    702         --__l;
    703         pointer __lb = *__l.__m_iter_;
    704         pointer __le = __l.__ptr_ + 1;
    705         difference_type __bs = __le - __lb;
    706         if (__bs > __n)
    707         {
    708             __bs = __n;
    709             __lb = __le - __bs;
    710         }
    711         __r = _VSTD::copy_backward(__lb, __le, __r);
    712         __n -= __bs;
    713         __l -= __bs - 1;
    714     }
    715     return __r;
    716 }
    717 
    718 // move
    719 
    720 template <class _RAIter,
    721           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    722 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    723 move(_RAIter __f,
    724      _RAIter __l,
    725      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    726      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
    727 {
    728     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
    729     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
    730     const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
    731     while (__f != __l)
    732     {
    733         pointer __rb = __r.__ptr_;
    734         pointer __re = *__r.__m_iter_ + __block_size;
    735         difference_type __bs = __re - __rb;
    736         difference_type __n = __l - __f;
    737         _RAIter __m = __l;
    738         if (__n > __bs)
    739         {
    740             __n = __bs;
    741             __m = __f + __n;
    742         }
    743         _VSTD::move(__f, __m, __rb);
    744         __f = __m;
    745         __r += __n;
    746     }
    747     return __r;
    748 }
    749 
    750 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    751           class _OutputIterator>
    752 _OutputIterator
    753 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    754      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    755      _OutputIterator __r)
    756 {
    757     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    758     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    759     const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
    760     difference_type __n = __l - __f;
    761     while (__n > 0)
    762     {
    763         pointer __fb = __f.__ptr_;
    764         pointer __fe = *__f.__m_iter_ + __block_size;
    765         difference_type __bs = __fe - __fb;
    766         if (__bs > __n)
    767         {
    768             __bs = __n;
    769             __fe = __fb + __bs;
    770         }
    771         __r = _VSTD::move(__fb, __fe, __r);
    772         __n -= __bs;
    773         __f += __bs;
    774     }
    775     return __r;
    776 }
    777 
    778 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    779           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    780 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    781 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    782      __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    783      __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
    784 {
    785     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    786     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    787     const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
    788     difference_type __n = __l - __f;
    789     while (__n > 0)
    790     {
    791         pointer __fb = __f.__ptr_;
    792         pointer __fe = *__f.__m_iter_ + __block_size;
    793         difference_type __bs = __fe - __fb;
    794         if (__bs > __n)
    795         {
    796             __bs = __n;
    797             __fe = __fb + __bs;
    798         }
    799         __r = _VSTD::move(__fb, __fe, __r);
    800         __n -= __bs;
    801         __f += __bs;
    802     }
    803     return __r;
    804 }
    805 
    806 // move_backward
    807 
    808 template <class _RAIter,
    809           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    810 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    811 move_backward(_RAIter __f,
    812               _RAIter __l,
    813               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
    814               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
    815 {
    816     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
    817     typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
    818     while (__f != __l)
    819     {
    820         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
    821         pointer __rb = *__rp.__m_iter_;
    822         pointer __re = __rp.__ptr_ + 1;
    823         difference_type __bs = __re - __rb;
    824         difference_type __n = __l - __f;
    825         _RAIter __m = __f;
    826         if (__n > __bs)
    827         {
    828             __n = __bs;
    829             __m = __l - __n;
    830         }
    831         _VSTD::move_backward(__m, __l, __re);
    832         __l = __m;
    833         __r -= __n;
    834     }
    835     return __r;
    836 }
    837 
    838 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    839           class _OutputIterator>
    840 _OutputIterator
    841 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    842               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    843               _OutputIterator __r)
    844 {
    845     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    846     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    847     difference_type __n = __l - __f;
    848     while (__n > 0)
    849     {
    850         --__l;
    851         pointer __lb = *__l.__m_iter_;
    852         pointer __le = __l.__ptr_ + 1;
    853         difference_type __bs = __le - __lb;
    854         if (__bs > __n)
    855         {
    856             __bs = __n;
    857             __lb = __le - __bs;
    858         }
    859         __r = _VSTD::move_backward(__lb, __le, __r);
    860         __n -= __bs;
    861         __l -= __bs - 1;
    862     }
    863     return __r;
    864 }
    865 
    866 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
    867           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
    868 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
    869 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
    870               __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
    871               __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
    872 {
    873     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
    874     typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
    875     difference_type __n = __l - __f;
    876     while (__n > 0)
    877     {
    878         --__l;
    879         pointer __lb = *__l.__m_iter_;
    880         pointer __le = __l.__ptr_ + 1;
    881         difference_type __bs = __le - __lb;
    882         if (__bs > __n)
    883         {
    884             __bs = __n;
    885             __lb = __le - __bs;
    886         }
    887         __r = _VSTD::move_backward(__lb, __le, __r);
    888         __n -= __bs;
    889         __l -= __bs - 1;
    890     }
    891     return __r;
    892 }
    893 
    894 template <bool>
    895 class __deque_base_common
    896 {
    897 protected:
    898     _LIBCPP_NORETURN void __throw_length_error() const;
    899     _LIBCPP_NORETURN void __throw_out_of_range() const;
    900 };
    901 
    902 template <bool __b>
    903 void
    904 __deque_base_common<__b>::__throw_length_error() const
    905 {
    906     _VSTD::__throw_length_error("deque");
    907 }
    908 
    909 template <bool __b>
    910 void
    911 __deque_base_common<__b>::__throw_out_of_range() const
    912 {
    913     _VSTD::__throw_out_of_range("deque");
    914 }
    915 
    916 template <class _Tp, class _Allocator>
    917 class __deque_base
    918     : protected __deque_base_common<true>
    919 {
    920     __deque_base(const __deque_base& __c);
    921     __deque_base& operator=(const __deque_base& __c);
    922 protected:
    923     typedef _Tp                                      value_type;
    924     typedef _Allocator                               allocator_type;
    925     typedef allocator_traits<allocator_type>         __alloc_traits;
    926     typedef value_type&                              reference;
    927     typedef const value_type&                        const_reference;
    928     typedef typename __alloc_traits::size_type       size_type;
    929     typedef typename __alloc_traits::difference_type difference_type;
    930     typedef typename __alloc_traits::pointer         pointer;
    931     typedef typename __alloc_traits::const_pointer   const_pointer;
    932 
    933     static const difference_type __block_size;
    934 
    935     typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
    936     typedef allocator_traits<__pointer_allocator>        __map_traits;
    937     typedef typename __map_traits::pointer               __map_pointer;
    938     typedef typename __rebind_alloc_helper<__alloc_traits, const_pointer>::type __const_pointer_allocator;
    939     typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer;
    940     typedef __split_buffer<pointer, __pointer_allocator> __map;
    941 
    942     typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
    943                              difference_type>    iterator;
    944     typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
    945                              difference_type>    const_iterator;
    946 
    947     __map __map_;
    948     size_type __start_;
    949     __compressed_pair<size_type, allocator_type> __size_;
    950 
    951     iterator       begin() _NOEXCEPT;
    952     const_iterator begin() const _NOEXCEPT;
    953     iterator       end() _NOEXCEPT;
    954     const_iterator end() const _NOEXCEPT;
    955 
    956     _LIBCPP_INLINE_VISIBILITY size_type&            size()          {return __size_.first();}
    957     _LIBCPP_INLINE_VISIBILITY
    958     const size_type& size() const _NOEXCEPT {return __size_.first();}
    959     _LIBCPP_INLINE_VISIBILITY allocator_type&       __alloc()       {return __size_.second();}
    960     _LIBCPP_INLINE_VISIBILITY
    961     const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
    962 
    963     _LIBCPP_INLINE_VISIBILITY
    964     __deque_base()
    965         _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
    966     _LIBCPP_INLINE_VISIBILITY
    967     explicit __deque_base(const allocator_type& __a);
    968 public:
    969     ~__deque_base();
    970 
    971 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    972 
    973     __deque_base(__deque_base&& __c)
    974         _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
    975     __deque_base(__deque_base&& __c, const allocator_type& __a);
    976 
    977 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    978     void swap(__deque_base& __c)
    979 #if _LIBCPP_STD_VER >= 14
    980         _NOEXCEPT;
    981 #else
    982         _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 
    983                     __is_nothrow_swappable<allocator_type>::value);
    984 #endif
    985 protected:
    986     void clear() _NOEXCEPT;
    987 
    988     bool __invariants() const;
    989 
    990     _LIBCPP_INLINE_VISIBILITY
    991     void __move_assign(__deque_base& __c)
    992         _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
    993                    is_nothrow_move_assignable<allocator_type>::value)
    994     {
    995         __map_ = _VSTD::move(__c.__map_);
    996         __start_ = __c.__start_;
    997         size() = __c.size();
    998         __move_assign_alloc(__c);
    999         __c.__start_ = __c.size() = 0;
   1000     }
   1001 
   1002     _LIBCPP_INLINE_VISIBILITY
   1003     void __move_assign_alloc(__deque_base& __c)
   1004         _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value ||
   1005                    is_nothrow_move_assignable<allocator_type>::value)
   1006         {__move_assign_alloc(__c, integral_constant<bool,
   1007                       __alloc_traits::propagate_on_container_move_assignment::value>());}
   1008 
   1009 private:
   1010     _LIBCPP_INLINE_VISIBILITY
   1011     void __move_assign_alloc(__deque_base& __c, true_type)
   1012         _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
   1013         {
   1014             __alloc() = _VSTD::move(__c.__alloc());
   1015         }
   1016 
   1017     _LIBCPP_INLINE_VISIBILITY
   1018     void __move_assign_alloc(__deque_base&, false_type) _NOEXCEPT
   1019         {}
   1020 };
   1021 
   1022 template <class _Tp, class _Allocator>
   1023 const typename __deque_base<_Tp, _Allocator>::difference_type
   1024     __deque_base<_Tp, _Allocator>::__block_size =
   1025         __deque_block_size<value_type, difference_type>::value;
   1026 
   1027 template <class _Tp, class _Allocator>
   1028 bool
   1029 __deque_base<_Tp, _Allocator>::__invariants() const
   1030 {
   1031     if (!__map_.__invariants())
   1032         return false;
   1033     if (__map_.size() >= size_type(-1) / __block_size)
   1034         return false;
   1035     for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end();
   1036          __i != __e; ++__i)
   1037         if (*__i == nullptr)
   1038             return false;
   1039     if (__map_.size() != 0)
   1040     {
   1041         if (size() >= __map_.size() * __block_size)
   1042             return false;
   1043         if (__start_ >= __map_.size() * __block_size - size())
   1044             return false;
   1045     }
   1046     else
   1047     {
   1048         if (size() != 0)
   1049             return false;
   1050         if (__start_ != 0)
   1051             return false;
   1052     }
   1053     return true;
   1054 }
   1055 
   1056 template <class _Tp, class _Allocator>
   1057 typename __deque_base<_Tp, _Allocator>::iterator
   1058 __deque_base<_Tp, _Allocator>::begin() _NOEXCEPT
   1059 {
   1060     __map_pointer __mp = __map_.begin() + __start_ / __block_size;
   1061     return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
   1062 }
   1063 
   1064 template <class _Tp, class _Allocator>
   1065 typename __deque_base<_Tp, _Allocator>::const_iterator
   1066 __deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
   1067 {
   1068     __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
   1069     return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
   1070 }
   1071 
   1072 template <class _Tp, class _Allocator>
   1073 typename __deque_base<_Tp, _Allocator>::iterator
   1074 __deque_base<_Tp, _Allocator>::end() _NOEXCEPT
   1075 {
   1076     size_type __p = size() + __start_;
   1077     __map_pointer __mp = __map_.begin() + __p / __block_size;
   1078     return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
   1079 }
   1080 
   1081 template <class _Tp, class _Allocator>
   1082 typename __deque_base<_Tp, _Allocator>::const_iterator
   1083 __deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
   1084 {
   1085     size_type __p = size() + __start_;
   1086     __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
   1087     return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
   1088 }
   1089 
   1090 template <class _Tp, class _Allocator>
   1091 inline
   1092 __deque_base<_Tp, _Allocator>::__deque_base()
   1093     _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
   1094     : __start_(0), __size_(0) {}
   1095 
   1096 template <class _Tp, class _Allocator>
   1097 inline
   1098 __deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
   1099     : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
   1100 
   1101 template <class _Tp, class _Allocator>
   1102 __deque_base<_Tp, _Allocator>::~__deque_base()
   1103 {
   1104     clear();
   1105     typename __map::iterator __i = __map_.begin();
   1106     typename __map::iterator __e = __map_.end();
   1107     for (; __i != __e; ++__i)
   1108         __alloc_traits::deallocate(__alloc(), *__i, __block_size);
   1109 }
   1110 
   1111 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1112 
   1113 template <class _Tp, class _Allocator>
   1114 __deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c)
   1115     _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
   1116     : __map_(_VSTD::move(__c.__map_)),
   1117       __start_(_VSTD::move(__c.__start_)),
   1118       __size_(_VSTD::move(__c.__size_))
   1119 {
   1120     __c.__start_ = 0;
   1121     __c.size() = 0;
   1122 }
   1123 
   1124 template <class _Tp, class _Allocator>
   1125 __deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a)
   1126     : __map_(_VSTD::move(__c.__map_), __pointer_allocator(__a)),
   1127       __start_(_VSTD::move(__c.__start_)),
   1128       __size_(_VSTD::move(__c.size()), __a)
   1129 {
   1130     if (__a == __c.__alloc())
   1131     {
   1132         __c.__start_ = 0;
   1133         __c.size() = 0;
   1134     }
   1135     else
   1136     {
   1137         __map_.clear();
   1138         __start_ = 0;
   1139         size() = 0;
   1140     }
   1141 }
   1142 
   1143 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1144 
   1145 template <class _Tp, class _Allocator>
   1146 void
   1147 __deque_base<_Tp, _Allocator>::swap(__deque_base& __c)
   1148 #if _LIBCPP_STD_VER >= 14
   1149         _NOEXCEPT
   1150 #else
   1151         _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 
   1152                     __is_nothrow_swappable<allocator_type>::value)
   1153 #endif
   1154 {
   1155     __map_.swap(__c.__map_);
   1156     _VSTD::swap(__start_, __c.__start_);
   1157     _VSTD::swap(size(), __c.size());
   1158     __swap_allocator(__alloc(), __c.__alloc());
   1159 }
   1160 
   1161 template <class _Tp, class _Allocator>
   1162 void
   1163 __deque_base<_Tp, _Allocator>::clear() _NOEXCEPT
   1164 {
   1165     allocator_type& __a = __alloc();
   1166     for (iterator __i = begin(), __e = end(); __i != __e; ++__i)
   1167         __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
   1168     size() = 0;
   1169     while (__map_.size() > 2)
   1170     {
   1171         __alloc_traits::deallocate(__a, __map_.front(), __block_size);
   1172         __map_.pop_front();
   1173     }
   1174     switch (__map_.size())
   1175     {
   1176     case 1:
   1177         __start_ = __block_size / 2;
   1178         break;
   1179     case 2:
   1180         __start_ = __block_size;
   1181         break;
   1182     }
   1183 }
   1184 
   1185 template <class _Tp, class _Allocator /*= allocator<_Tp>*/>
   1186 class _LIBCPP_TEMPLATE_VIS deque
   1187     : private __deque_base<_Tp, _Allocator>
   1188 {
   1189 public:
   1190     // types:
   1191 
   1192     typedef _Tp value_type;
   1193     typedef _Allocator allocator_type;
   1194 
   1195     static_assert((is_same<typename allocator_type::value_type, value_type>::value),
   1196                   "Allocator::value_type must be same type as value_type");
   1197 
   1198     typedef __deque_base<value_type, allocator_type> __base;
   1199 
   1200     typedef typename __base::__alloc_traits        __alloc_traits;
   1201     typedef typename __base::reference             reference;
   1202     typedef typename __base::const_reference       const_reference;
   1203     typedef typename __base::iterator              iterator;
   1204     typedef typename __base::const_iterator        const_iterator;
   1205     typedef typename __base::size_type             size_type;
   1206     typedef typename __base::difference_type       difference_type;
   1207 
   1208     typedef typename __base::pointer               pointer;
   1209     typedef typename __base::const_pointer         const_pointer;
   1210     typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
   1211     typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
   1212 
   1213     // construct/copy/destroy:
   1214     _LIBCPP_INLINE_VISIBILITY
   1215     deque()
   1216         _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
   1217         {}
   1218     _LIBCPP_INLINE_VISIBILITY explicit deque(const allocator_type& __a) : __base(__a) {}
   1219     explicit deque(size_type __n);
   1220 #if _LIBCPP_STD_VER > 11
   1221     explicit deque(size_type __n, const _Allocator& __a);
   1222 #endif
   1223     deque(size_type __n, const value_type& __v);
   1224     deque(size_type __n, const value_type& __v, const allocator_type& __a);
   1225     template <class _InputIter>
   1226         deque(_InputIter __f, _InputIter __l,
   1227               typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
   1228     template <class _InputIter>
   1229         deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
   1230               typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
   1231     deque(const deque& __c);
   1232     deque(const deque& __c, const allocator_type& __a);
   1233 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1234     deque(initializer_list<value_type> __il);
   1235     deque(initializer_list<value_type> __il, const allocator_type& __a);
   1236 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1237 
   1238     deque& operator=(const deque& __c);
   1239 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1240     _LIBCPP_INLINE_VISIBILITY
   1241     deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;}
   1242 #endif   // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1243 
   1244 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1245     _LIBCPP_INLINE_VISIBILITY
   1246     deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
   1247     _LIBCPP_INLINE_VISIBILITY
   1248     deque(deque&& __c, const allocator_type& __a);
   1249     _LIBCPP_INLINE_VISIBILITY
   1250     deque& operator=(deque&& __c)
   1251         _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
   1252                    is_nothrow_move_assignable<allocator_type>::value);
   1253 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1254 
   1255     template <class _InputIter>
   1256         void assign(_InputIter __f, _InputIter __l,
   1257                     typename enable_if<__is_input_iterator<_InputIter>::value &&
   1258                                       !__is_random_access_iterator<_InputIter>::value>::type* = 0);
   1259     template <class _RAIter>
   1260         void assign(_RAIter __f, _RAIter __l,
   1261                     typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
   1262     void assign(size_type __n, const value_type& __v);
   1263 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1264     _LIBCPP_INLINE_VISIBILITY
   1265     void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
   1266 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1267 
   1268     _LIBCPP_INLINE_VISIBILITY
   1269     allocator_type get_allocator() const _NOEXCEPT;
   1270 
   1271     // iterators:
   1272 
   1273     _LIBCPP_INLINE_VISIBILITY
   1274     iterator       begin() _NOEXCEPT       {return __base::begin();}
   1275     _LIBCPP_INLINE_VISIBILITY
   1276     const_iterator begin() const _NOEXCEPT {return __base::begin();}
   1277     _LIBCPP_INLINE_VISIBILITY
   1278     iterator       end() _NOEXCEPT         {return __base::end();}
   1279     _LIBCPP_INLINE_VISIBILITY
   1280     const_iterator end()   const _NOEXCEPT {return __base::end();}
   1281 
   1282     _LIBCPP_INLINE_VISIBILITY
   1283     reverse_iterator       rbegin() _NOEXCEPT
   1284         {return       reverse_iterator(__base::end());}
   1285     _LIBCPP_INLINE_VISIBILITY
   1286     const_reverse_iterator rbegin() const _NOEXCEPT
   1287         {return const_reverse_iterator(__base::end());}
   1288     _LIBCPP_INLINE_VISIBILITY
   1289     reverse_iterator       rend() _NOEXCEPT
   1290         {return       reverse_iterator(__base::begin());}
   1291     _LIBCPP_INLINE_VISIBILITY
   1292     const_reverse_iterator rend()   const _NOEXCEPT
   1293         {return const_reverse_iterator(__base::begin());}
   1294 
   1295     _LIBCPP_INLINE_VISIBILITY
   1296     const_iterator         cbegin()  const _NOEXCEPT
   1297         {return __base::begin();}
   1298     _LIBCPP_INLINE_VISIBILITY
   1299     const_iterator         cend()    const _NOEXCEPT
   1300         {return __base::end();}
   1301     _LIBCPP_INLINE_VISIBILITY
   1302     const_reverse_iterator crbegin() const _NOEXCEPT
   1303         {return const_reverse_iterator(__base::end());}
   1304     _LIBCPP_INLINE_VISIBILITY
   1305     const_reverse_iterator crend()   const _NOEXCEPT
   1306         {return const_reverse_iterator(__base::begin());}
   1307 
   1308     // capacity:
   1309     _LIBCPP_INLINE_VISIBILITY
   1310     size_type size() const _NOEXCEPT {return __base::size();}
   1311     _LIBCPP_INLINE_VISIBILITY
   1312     size_type max_size() const _NOEXCEPT
   1313         {return std::min<size_type>(
   1314             __alloc_traits::max_size(__base::__alloc()),
   1315             numeric_limits<difference_type>::max());}
   1316     void resize(size_type __n);
   1317     void resize(size_type __n, const value_type& __v);
   1318     void shrink_to_fit() _NOEXCEPT;
   1319     _LIBCPP_INLINE_VISIBILITY
   1320     bool empty() const _NOEXCEPT {return __base::size() == 0;}
   1321 
   1322     // element access:
   1323     _LIBCPP_INLINE_VISIBILITY
   1324     reference operator[](size_type __i);
   1325     _LIBCPP_INLINE_VISIBILITY
   1326     const_reference operator[](size_type __i) const;
   1327     _LIBCPP_INLINE_VISIBILITY
   1328     reference at(size_type __i);
   1329     _LIBCPP_INLINE_VISIBILITY
   1330     const_reference at(size_type __i) const;
   1331     _LIBCPP_INLINE_VISIBILITY
   1332     reference front();
   1333     _LIBCPP_INLINE_VISIBILITY
   1334     const_reference front() const;
   1335     _LIBCPP_INLINE_VISIBILITY
   1336     reference back();
   1337     _LIBCPP_INLINE_VISIBILITY
   1338     const_reference back() const;
   1339 
   1340     // 23.2.2.3 modifiers:
   1341     void push_front(const value_type& __v);
   1342     void push_back(const value_type& __v);
   1343 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1344 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1345 #if _LIBCPP_STD_VER > 14
   1346     template <class... _Args> reference emplace_front(_Args&&... __args);
   1347     template <class... _Args> reference emplace_back (_Args&&... __args);
   1348 #else
   1349     template <class... _Args> void      emplace_front(_Args&&... __args);
   1350     template <class... _Args> void      emplace_back (_Args&&... __args);
   1351 #endif
   1352     template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
   1353 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1354     void push_front(value_type&& __v);
   1355     void push_back(value_type&& __v);
   1356     iterator insert(const_iterator __p, value_type&& __v);
   1357 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1358     iterator insert(const_iterator __p, const value_type& __v);
   1359     iterator insert(const_iterator __p, size_type __n, const value_type& __v);
   1360     template <class _InputIter>
   1361         iterator insert(const_iterator __p, _InputIter __f, _InputIter __l,
   1362                          typename enable_if<__is_input_iterator<_InputIter>::value
   1363                                          &&!__is_forward_iterator<_InputIter>::value>::type* = 0);
   1364     template <class _ForwardIterator>
   1365         iterator insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
   1366                                typename enable_if<__is_forward_iterator<_ForwardIterator>::value
   1367                                          &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type* = 0);
   1368     template <class _BiIter>
   1369         iterator insert(const_iterator __p, _BiIter __f, _BiIter __l,
   1370                          typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type* = 0);
   1371 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1372     _LIBCPP_INLINE_VISIBILITY
   1373     iterator insert(const_iterator __p, initializer_list<value_type> __il)
   1374         {return insert(__p, __il.begin(), __il.end());}
   1375 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1376     void pop_front();
   1377     void pop_back();
   1378     iterator erase(const_iterator __p);
   1379     iterator erase(const_iterator __f, const_iterator __l);
   1380 
   1381     _LIBCPP_INLINE_VISIBILITY
   1382     void swap(deque& __c)
   1383 #if _LIBCPP_STD_VER >= 14
   1384         _NOEXCEPT;
   1385 #else
   1386         _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
   1387                    __is_nothrow_swappable<allocator_type>::value);
   1388 #endif
   1389     _LIBCPP_INLINE_VISIBILITY
   1390     void clear() _NOEXCEPT;
   1391 
   1392     _LIBCPP_INLINE_VISIBILITY
   1393     bool __invariants() const {return __base::__invariants();}
   1394 private:
   1395     typedef typename __base::__map_const_pointer __map_const_pointer;
   1396 
   1397     _LIBCPP_INLINE_VISIBILITY
   1398     static size_type __recommend_blocks(size_type __n)
   1399     {
   1400         return __n / __base::__block_size + (__n % __base::__block_size != 0);
   1401     }
   1402     _LIBCPP_INLINE_VISIBILITY
   1403     size_type __capacity() const
   1404     {
   1405         return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1;
   1406     }
   1407     _LIBCPP_INLINE_VISIBILITY
   1408     size_type __front_spare() const
   1409     {
   1410         return __base::__start_;
   1411     }
   1412     _LIBCPP_INLINE_VISIBILITY
   1413     size_type __back_spare() const
   1414     {
   1415         return __capacity() - (__base::__start_ + __base::size());
   1416     }
   1417 
   1418     template <class _InpIter>
   1419         void __append(_InpIter __f, _InpIter __l,
   1420                  typename enable_if<__is_input_iterator<_InpIter>::value &&
   1421                                    !__is_forward_iterator<_InpIter>::value>::type* = 0);
   1422     template <class _ForIter>
   1423         void __append(_ForIter __f, _ForIter __l,
   1424                       typename enable_if<__is_forward_iterator<_ForIter>::value>::type* = 0);
   1425     void __append(size_type __n);
   1426     void __append(size_type __n, const value_type& __v);
   1427     void __erase_to_end(const_iterator __f);
   1428     void __add_front_capacity();
   1429     void __add_front_capacity(size_type __n);
   1430     void __add_back_capacity();
   1431     void __add_back_capacity(size_type __n);
   1432     iterator __move_and_check(iterator __f, iterator __l, iterator __r,
   1433                               const_pointer& __vt);
   1434     iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r,
   1435                                        const_pointer& __vt);
   1436     void __move_construct_and_check(iterator __f, iterator __l,
   1437                                     iterator __r, const_pointer& __vt);
   1438     void __move_construct_backward_and_check(iterator __f, iterator __l,
   1439                                              iterator __r, const_pointer& __vt);
   1440 
   1441     _LIBCPP_INLINE_VISIBILITY
   1442     void __copy_assign_alloc(const deque& __c)
   1443         {__copy_assign_alloc(__c, integral_constant<bool,
   1444                       __alloc_traits::propagate_on_container_copy_assignment::value>());}
   1445 
   1446     _LIBCPP_INLINE_VISIBILITY
   1447     void __copy_assign_alloc(const deque& __c, true_type)
   1448         {
   1449             if (__base::__alloc() != __c.__alloc())
   1450             {
   1451                 clear();
   1452                 shrink_to_fit();
   1453             }
   1454             __base::__alloc() = __c.__alloc();
   1455             __base::__map_.__alloc() = __c.__map_.__alloc();
   1456         }
   1457 
   1458     _LIBCPP_INLINE_VISIBILITY
   1459     void __copy_assign_alloc(const deque&, false_type)
   1460         {}
   1461 
   1462     void __move_assign(deque& __c, true_type)
   1463         _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
   1464     void __move_assign(deque& __c, false_type);
   1465 };
   1466 
   1467 template <class _Tp, class _Allocator>
   1468 deque<_Tp, _Allocator>::deque(size_type __n)
   1469 {
   1470     if (__n > 0)
   1471         __append(__n);
   1472 }
   1473 
   1474 #if _LIBCPP_STD_VER > 11
   1475 template <class _Tp, class _Allocator>
   1476 deque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a)
   1477     : __base(__a)
   1478 {
   1479     if (__n > 0)
   1480         __append(__n);
   1481 }
   1482 #endif
   1483 
   1484 template <class _Tp, class _Allocator>
   1485 deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)
   1486 {
   1487     if (__n > 0)
   1488         __append(__n, __v);
   1489 }
   1490 
   1491 template <class _Tp, class _Allocator>
   1492 deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a)
   1493     : __base(__a)
   1494 {
   1495     if (__n > 0)
   1496         __append(__n, __v);
   1497 }
   1498 
   1499 template <class _Tp, class _Allocator>
   1500 template <class _InputIter>
   1501 deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l,
   1502               typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
   1503 {
   1504     __append(__f, __l);
   1505 }
   1506 
   1507 template <class _Tp, class _Allocator>
   1508 template <class _InputIter>
   1509 deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
   1510               typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
   1511     : __base(__a)
   1512 {
   1513     __append(__f, __l);
   1514 }
   1515 
   1516 template <class _Tp, class _Allocator>
   1517 deque<_Tp, _Allocator>::deque(const deque& __c)
   1518     : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc()))
   1519 {
   1520     __append(__c.begin(), __c.end());
   1521 }
   1522 
   1523 template <class _Tp, class _Allocator>
   1524 deque<_Tp, _Allocator>::deque(const deque& __c, const allocator_type& __a)
   1525     : __base(__a)
   1526 {
   1527     __append(__c.begin(), __c.end());
   1528 }
   1529 
   1530 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1531 
   1532 template <class _Tp, class _Allocator>
   1533 deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il)
   1534 {
   1535     __append(__il.begin(), __il.end());
   1536 }
   1537 
   1538 template <class _Tp, class _Allocator>
   1539 deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a)
   1540     : __base(__a)
   1541 {
   1542     __append(__il.begin(), __il.end());
   1543 }
   1544 
   1545 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1546 
   1547 template <class _Tp, class _Allocator>
   1548 deque<_Tp, _Allocator>&
   1549 deque<_Tp, _Allocator>::operator=(const deque& __c)
   1550 {
   1551     if (this != &__c)
   1552     {
   1553         __copy_assign_alloc(__c);
   1554         assign(__c.begin(), __c.end());
   1555     }
   1556     return *this;
   1557 }
   1558 
   1559 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1560 
   1561 template <class _Tp, class _Allocator>
   1562 inline
   1563 deque<_Tp, _Allocator>::deque(deque&& __c)
   1564     _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
   1565     : __base(_VSTD::move(__c))
   1566 {
   1567 }
   1568 
   1569 template <class _Tp, class _Allocator>
   1570 inline
   1571 deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a)
   1572     : __base(_VSTD::move(__c), __a)
   1573 {
   1574     if (__a != __c.__alloc())
   1575     {
   1576         typedef move_iterator<iterator> _Ip;
   1577         assign(_Ip(__c.begin()), _Ip(__c.end()));
   1578     }
   1579 }
   1580 
   1581 template <class _Tp, class _Allocator>
   1582 inline
   1583 deque<_Tp, _Allocator>&
   1584 deque<_Tp, _Allocator>::operator=(deque&& __c)
   1585         _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
   1586                    is_nothrow_move_assignable<allocator_type>::value)
   1587 {
   1588     __move_assign(__c, integral_constant<bool,
   1589           __alloc_traits::propagate_on_container_move_assignment::value>());
   1590     return *this;
   1591 }
   1592 
   1593 template <class _Tp, class _Allocator>
   1594 void
   1595 deque<_Tp, _Allocator>::__move_assign(deque& __c, false_type)
   1596 {
   1597     if (__base::__alloc() != __c.__alloc())
   1598     {
   1599         typedef move_iterator<iterator> _Ip;
   1600         assign(_Ip(__c.begin()), _Ip(__c.end()));
   1601     }
   1602     else
   1603         __move_assign(__c, true_type());
   1604 }
   1605 
   1606 template <class _Tp, class _Allocator>
   1607 void
   1608 deque<_Tp, _Allocator>::__move_assign(deque& __c, true_type)
   1609     _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
   1610 {
   1611     clear();
   1612     shrink_to_fit();
   1613     __base::__move_assign(__c);
   1614 }
   1615 
   1616 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1617 
   1618 template <class _Tp, class _Allocator>
   1619 template <class _InputIter>
   1620 void
   1621 deque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
   1622                                typename enable_if<__is_input_iterator<_InputIter>::value &&
   1623                                                  !__is_random_access_iterator<_InputIter>::value>::type*)
   1624 {
   1625     iterator __i = __base::begin();
   1626     iterator __e = __base::end();
   1627     for (; __f != __l && __i != __e; ++__f, (void) ++__i)
   1628         *__i = *__f;
   1629     if (__f != __l)
   1630         __append(__f, __l);
   1631     else
   1632         __erase_to_end(__i);
   1633 }
   1634 
   1635 template <class _Tp, class _Allocator>
   1636 template <class _RAIter>
   1637 void
   1638 deque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l,
   1639                                typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
   1640 {
   1641     if (static_cast<size_type>(__l - __f) > __base::size())
   1642     {
   1643         _RAIter __m = __f + __base::size();
   1644         _VSTD::copy(__f, __m, __base::begin());
   1645         __append(__m, __l);
   1646     }
   1647     else
   1648         __erase_to_end(_VSTD::copy(__f, __l, __base::begin()));
   1649 }
   1650 
   1651 template <class _Tp, class _Allocator>
   1652 void
   1653 deque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v)
   1654 {
   1655     if (__n > __base::size())
   1656     {
   1657         _VSTD::fill_n(__base::begin(), __base::size(), __v);
   1658         __n -= __base::size();
   1659         __append(__n, __v);
   1660     }
   1661     else
   1662         __erase_to_end(_VSTD::fill_n(__base::begin(), __n, __v));
   1663 }
   1664 
   1665 template <class _Tp, class _Allocator>
   1666 inline
   1667 _Allocator
   1668 deque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
   1669 {
   1670     return __base::__alloc();
   1671 }
   1672 
   1673 template <class _Tp, class _Allocator>
   1674 void
   1675 deque<_Tp, _Allocator>::resize(size_type __n)
   1676 {
   1677     if (__n > __base::size())
   1678         __append(__n - __base::size());
   1679     else if (__n < __base::size())
   1680         __erase_to_end(__base::begin() + __n);
   1681 }
   1682 
   1683 template <class _Tp, class _Allocator>
   1684 void
   1685 deque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v)
   1686 {
   1687     if (__n > __base::size())
   1688         __append(__n - __base::size(), __v);
   1689     else if (__n < __base::size())
   1690         __erase_to_end(__base::begin() + __n);
   1691 }
   1692 
   1693 template <class _Tp, class _Allocator>
   1694 void
   1695 deque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
   1696 {
   1697     allocator_type& __a = __base::__alloc();
   1698     if (empty())
   1699     {
   1700         while (__base::__map_.size() > 0)
   1701         {
   1702             __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
   1703             __base::__map_.pop_back();
   1704         }
   1705         __base::__start_ = 0;
   1706     }
   1707     else
   1708     {
   1709         if (__front_spare() >= __base::__block_size)
   1710         {
   1711             __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
   1712             __base::__map_.pop_front();
   1713             __base::__start_ -= __base::__block_size;
   1714         }
   1715         if (__back_spare() >= __base::__block_size)
   1716         {
   1717             __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
   1718             __base::__map_.pop_back();
   1719         }
   1720     }
   1721     __base::__map_.shrink_to_fit();
   1722 }
   1723 
   1724 template <class _Tp, class _Allocator>
   1725 inline
   1726 typename deque<_Tp, _Allocator>::reference
   1727 deque<_Tp, _Allocator>::operator[](size_type __i)
   1728 {
   1729     size_type __p = __base::__start_ + __i;
   1730     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
   1731 }
   1732 
   1733 template <class _Tp, class _Allocator>
   1734 inline
   1735 typename deque<_Tp, _Allocator>::const_reference
   1736 deque<_Tp, _Allocator>::operator[](size_type __i) const
   1737 {
   1738     size_type __p = __base::__start_ + __i;
   1739     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
   1740 }
   1741 
   1742 template <class _Tp, class _Allocator>
   1743 inline
   1744 typename deque<_Tp, _Allocator>::reference
   1745 deque<_Tp, _Allocator>::at(size_type __i)
   1746 {
   1747     if (__i >= __base::size())
   1748         __base::__throw_out_of_range();
   1749     size_type __p = __base::__start_ + __i;
   1750     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
   1751 }
   1752 
   1753 template <class _Tp, class _Allocator>
   1754 inline
   1755 typename deque<_Tp, _Allocator>::const_reference
   1756 deque<_Tp, _Allocator>::at(size_type __i) const
   1757 {
   1758     if (__i >= __base::size())
   1759         __base::__throw_out_of_range();
   1760     size_type __p = __base::__start_ + __i;
   1761     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
   1762 }
   1763 
   1764 template <class _Tp, class _Allocator>
   1765 inline
   1766 typename deque<_Tp, _Allocator>::reference
   1767 deque<_Tp, _Allocator>::front()
   1768 {
   1769     return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
   1770                                       + __base::__start_ % __base::__block_size);
   1771 }
   1772 
   1773 template <class _Tp, class _Allocator>
   1774 inline
   1775 typename deque<_Tp, _Allocator>::const_reference
   1776 deque<_Tp, _Allocator>::front() const
   1777 {
   1778     return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
   1779                                       + __base::__start_ % __base::__block_size);
   1780 }
   1781 
   1782 template <class _Tp, class _Allocator>
   1783 inline
   1784 typename deque<_Tp, _Allocator>::reference
   1785 deque<_Tp, _Allocator>::back()
   1786 {
   1787     size_type __p = __base::size() + __base::__start_ - 1;
   1788     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
   1789 }
   1790 
   1791 template <class _Tp, class _Allocator>
   1792 inline
   1793 typename deque<_Tp, _Allocator>::const_reference
   1794 deque<_Tp, _Allocator>::back() const
   1795 {
   1796     size_type __p = __base::size() + __base::__start_ - 1;
   1797     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
   1798 }
   1799 
   1800 template <class _Tp, class _Allocator>
   1801 void
   1802 deque<_Tp, _Allocator>::push_back(const value_type& __v)
   1803 {
   1804     allocator_type& __a = __base::__alloc();
   1805     if (__back_spare() == 0)
   1806         __add_back_capacity();
   1807     // __back_spare() >= 1
   1808     __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
   1809     ++__base::size();
   1810 }
   1811 
   1812 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1813 
   1814 template <class _Tp, class _Allocator>
   1815 void
   1816 deque<_Tp, _Allocator>::push_back(value_type&& __v)
   1817 {
   1818     allocator_type& __a = __base::__alloc();
   1819     if (__back_spare() == 0)
   1820         __add_back_capacity();
   1821     // __back_spare() >= 1
   1822     __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
   1823     ++__base::size();
   1824 }
   1825 
   1826 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1827 
   1828 template <class _Tp, class _Allocator>
   1829 template <class... _Args>
   1830 #if _LIBCPP_STD_VER > 14
   1831 typename deque<_Tp, _Allocator>::reference
   1832 #else
   1833 void
   1834 #endif
   1835 deque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
   1836 {
   1837     allocator_type& __a = __base::__alloc();
   1838     if (__back_spare() == 0)
   1839         __add_back_capacity();
   1840     // __back_spare() >= 1
   1841     __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()),
   1842                               _VSTD::forward<_Args>(__args)...);
   1843     ++__base::size();
   1844 #if _LIBCPP_STD_VER > 14
   1845     return *--__base::end();
   1846 #endif
   1847 }
   1848 
   1849 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1850 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1851 
   1852 template <class _Tp, class _Allocator>
   1853 void
   1854 deque<_Tp, _Allocator>::push_front(const value_type& __v)
   1855 {
   1856     allocator_type& __a = __base::__alloc();
   1857     if (__front_spare() == 0)
   1858         __add_front_capacity();
   1859     // __front_spare() >= 1
   1860     __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
   1861     --__base::__start_;
   1862     ++__base::size();
   1863 }
   1864 
   1865 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1866 
   1867 template <class _Tp, class _Allocator>
   1868 void
   1869 deque<_Tp, _Allocator>::push_front(value_type&& __v)
   1870 {
   1871     allocator_type& __a = __base::__alloc();
   1872     if (__front_spare() == 0)
   1873         __add_front_capacity();
   1874     // __front_spare() >= 1
   1875     __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
   1876     --__base::__start_;
   1877     ++__base::size();
   1878 }
   1879 
   1880 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1881 
   1882 template <class _Tp, class _Allocator>
   1883 template <class... _Args>
   1884 #if _LIBCPP_STD_VER > 14
   1885 typename deque<_Tp, _Allocator>::reference
   1886 #else
   1887 void
   1888 #endif
   1889 deque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
   1890 {
   1891     allocator_type& __a = __base::__alloc();
   1892     if (__front_spare() == 0)
   1893         __add_front_capacity();
   1894     // __front_spare() >= 1
   1895     __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
   1896     --__base::__start_;
   1897     ++__base::size();
   1898 #if _LIBCPP_STD_VER > 14
   1899     return *__base::begin();
   1900 #endif
   1901 }
   1902 
   1903 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1904 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1905 
   1906 template <class _Tp, class _Allocator>
   1907 typename deque<_Tp, _Allocator>::iterator
   1908 deque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v)
   1909 {
   1910     size_type __pos = __p - __base::begin();
   1911     size_type __to_end = __base::size() - __pos;
   1912     allocator_type& __a = __base::__alloc();
   1913     if (__pos < __to_end)
   1914     {   // insert by shifting things backward
   1915         if (__front_spare() == 0)
   1916             __add_front_capacity();
   1917         // __front_spare() >= 1
   1918         if (__pos == 0)
   1919         {
   1920             __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
   1921             --__base::__start_;
   1922             ++__base::size();
   1923         }
   1924         else
   1925         {
   1926             const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
   1927             iterator __b = __base::begin();
   1928             iterator __bm1 = _VSTD::prev(__b);
   1929             if (__vt == pointer_traits<const_pointer>::pointer_to(*__b))
   1930                 __vt = pointer_traits<const_pointer>::pointer_to(*__bm1);
   1931             __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
   1932             --__base::__start_;
   1933             ++__base::size();
   1934             if (__pos > 1)
   1935                 __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt);
   1936             *__b = *__vt;
   1937         }
   1938     }
   1939     else
   1940     {   // insert by shifting things forward
   1941         if (__back_spare() == 0)
   1942             __add_back_capacity();
   1943         // __back_capacity >= 1
   1944         size_type __de = __base::size() - __pos;
   1945         if (__de == 0)
   1946         {
   1947             __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
   1948             ++__base::size();
   1949         }
   1950         else
   1951         {
   1952             const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
   1953             iterator __e = __base::end();
   1954             iterator __em1 = _VSTD::prev(__e);
   1955             if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1))
   1956                 __vt = pointer_traits<const_pointer>::pointer_to(*__e);
   1957             __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
   1958             ++__base::size();
   1959             if (__de > 1)
   1960                 __e = __move_backward_and_check(__e - __de, __em1, __e, __vt);
   1961             *--__e = *__vt;
   1962         }
   1963     }
   1964     return __base::begin() + __pos;
   1965 }
   1966 
   1967 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1968 
   1969 template <class _Tp, class _Allocator>
   1970 typename deque<_Tp, _Allocator>::iterator
   1971 deque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v)
   1972 {
   1973     size_type __pos = __p - __base::begin();
   1974     size_type __to_end = __base::size() - __pos;
   1975     allocator_type& __a = __base::__alloc();
   1976     if (__pos < __to_end)
   1977     {   // insert by shifting things backward
   1978         if (__front_spare() == 0)
   1979             __add_front_capacity();
   1980         // __front_spare() >= 1
   1981         if (__pos == 0)
   1982         {
   1983             __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
   1984             --__base::__start_;
   1985             ++__base::size();
   1986         }
   1987         else
   1988         {
   1989             iterator __b = __base::begin();
   1990             iterator __bm1 = _VSTD::prev(__b);
   1991             __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
   1992             --__base::__start_;
   1993             ++__base::size();
   1994             if (__pos > 1)
   1995                 __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
   1996             *__b = _VSTD::move(__v);
   1997         }
   1998     }
   1999     else
   2000     {   // insert by shifting things forward
   2001         if (__back_spare() == 0)
   2002             __add_back_capacity();
   2003         // __back_capacity >= 1
   2004         size_type __de = __base::size() - __pos;
   2005         if (__de == 0)
   2006         {
   2007             __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
   2008             ++__base::size();
   2009         }
   2010         else
   2011         {
   2012             iterator __e = __base::end();
   2013             iterator __em1 = _VSTD::prev(__e);
   2014             __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
   2015             ++__base::size();
   2016             if (__de > 1)
   2017                 __e = _VSTD::move_backward(__e - __de, __em1, __e);
   2018             *--__e = _VSTD::move(__v);
   2019         }
   2020     }
   2021     return __base::begin() + __pos;
   2022 }
   2023 
   2024 #ifndef _LIBCPP_HAS_NO_VARIADICS
   2025 
   2026 template <class _Tp, class _Allocator>
   2027 template <class... _Args>
   2028 typename deque<_Tp, _Allocator>::iterator
   2029 deque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args)
   2030 {
   2031     size_type __pos = __p - __base::begin();
   2032     size_type __to_end = __base::size() - __pos;
   2033     allocator_type& __a = __base::__alloc();
   2034     if (__pos < __to_end)
   2035     {   // insert by shifting things backward
   2036         if (__front_spare() == 0)
   2037             __add_front_capacity();
   2038         // __front_spare() >= 1
   2039         if (__pos == 0)
   2040         {
   2041             __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
   2042             --__base::__start_;
   2043             ++__base::size();
   2044         }
   2045         else
   2046         {
   2047             __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
   2048             iterator __b = __base::begin();
   2049             iterator __bm1 = _VSTD::prev(__b);
   2050             __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
   2051             --__base::__start_;
   2052             ++__base::size();
   2053             if (__pos > 1)
   2054                 __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
   2055             *__b = _VSTD::move(__tmp.get());
   2056         }
   2057     }
   2058     else
   2059     {   // insert by shifting things forward
   2060         if (__back_spare() == 0)
   2061             __add_back_capacity();
   2062         // __back_capacity >= 1
   2063         size_type __de = __base::size() - __pos;
   2064         if (__de == 0)
   2065         {
   2066             __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...);
   2067             ++__base::size();
   2068         }
   2069         else
   2070         {
   2071             __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
   2072             iterator __e = __base::end();
   2073             iterator __em1 = _VSTD::prev(__e);
   2074             __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
   2075             ++__base::size();
   2076             if (__de > 1)
   2077                 __e = _VSTD::move_backward(__e - __de, __em1, __e);
   2078             *--__e = _VSTD::move(__tmp.get());
   2079         }
   2080     }
   2081     return __base::begin() + __pos;
   2082 }
   2083 
   2084 #endif  // _LIBCPP_HAS_NO_VARIADICS
   2085 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   2086 
   2087 template <class _Tp, class _Allocator>
   2088 typename deque<_Tp, _Allocator>::iterator
   2089 deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v)
   2090 {
   2091     size_type __pos = __p - __base::begin();
   2092     size_type __to_end = __base::size() - __pos;
   2093     allocator_type& __a = __base::__alloc();
   2094     if (__pos < __to_end)
   2095     {   // insert by shifting things backward
   2096         if (__n > __front_spare())
   2097             __add_front_capacity(__n - __front_spare());
   2098         // __n <= __front_spare()
   2099         iterator __old_begin = __base::begin();
   2100         iterator __i = __old_begin;
   2101         if (__n > __pos)
   2102         {
   2103             for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size())
   2104                 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v);
   2105             __n = __pos;
   2106         }
   2107         if (__n > 0)
   2108         {
   2109             const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
   2110             iterator __obn = __old_begin + __n;
   2111             __move_construct_backward_and_check(__old_begin, __obn, __i, __vt);
   2112             if (__n < __pos)
   2113                 __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt);
   2114             _VSTD::fill_n(__old_begin, __n, *__vt);
   2115         }
   2116     }
   2117     else
   2118     {   // insert by shifting things forward
   2119         size_type __back_capacity = __back_spare();
   2120         if (__n > __back_capacity)
   2121             __add_back_capacity(__n - __back_capacity);
   2122         // __n <= __back_capacity
   2123         iterator __old_end = __base::end();
   2124         iterator __i = __old_end;
   2125         size_type __de = __base::size() - __pos;
   2126         if (__n > __de)
   2127         {
   2128             for (size_type __m = __n - __de; __m; --__m, ++__i, ++__base::size())
   2129                 __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
   2130             __n = __de;
   2131         }
   2132         if (__n > 0)
   2133         {
   2134             const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
   2135             iterator __oen = __old_end - __n;
   2136             __move_construct_and_check(__oen, __old_end, __i, __vt);
   2137             if (__n < __de)
   2138                 __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt);
   2139             _VSTD::fill_n(__old_end - __n, __n, *__vt);
   2140         }
   2141     }
   2142     return __base::begin() + __pos;
   2143 }
   2144 
   2145 template <class _Tp, class _Allocator>
   2146 template <class _InputIter>
   2147 typename deque<_Tp, _Allocator>::iterator
   2148 deque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l,
   2149                                typename enable_if<__is_input_iterator<_InputIter>::value
   2150                                                &&!__is_forward_iterator<_InputIter>::value>::type*)
   2151 {
   2152     __split_buffer<value_type, allocator_type&> __buf(__base::__alloc());
   2153     __buf.__construct_at_end(__f, __l);
   2154     typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi;
   2155     return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end()));
   2156 }
   2157 
   2158 template <class _Tp, class _Allocator>
   2159 template <class _ForwardIterator>
   2160 typename deque<_Tp, _Allocator>::iterator
   2161 deque<_Tp, _Allocator>::insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
   2162                                typename enable_if<__is_forward_iterator<_ForwardIterator>::value
   2163                                                &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type*)
   2164 {
   2165     size_type __n = _VSTD::distance(__f, __l);
   2166     __split_buffer<value_type, allocator_type&> __buf(__n, 0, __base::__alloc());
   2167     __buf.__construct_at_end(__f, __l);
   2168     typedef typename __split_buffer<value_type, allocator_type&>::iterator __fwd;
   2169     return insert(__p, move_iterator<__fwd>(__buf.begin()), move_iterator<__fwd>(__buf.end()));
   2170 }
   2171 
   2172 template <class _Tp, class _Allocator>
   2173 template <class _BiIter>
   2174 typename deque<_Tp, _Allocator>::iterator
   2175 deque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
   2176                                typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type*)
   2177 {
   2178     size_type __n = _VSTD::distance(__f, __l);
   2179     size_type __pos = __p - __base::begin();
   2180     size_type __to_end = __base::size() - __pos;
   2181     allocator_type& __a = __base::__alloc();
   2182     if (__pos < __to_end)
   2183     {   // insert by shifting things backward
   2184         if (__n > __front_spare())
   2185             __add_front_capacity(__n - __front_spare());
   2186         // __n <= __front_spare()
   2187         iterator __old_begin = __base::begin();
   2188         iterator __i = __old_begin;
   2189         _BiIter __m = __f;
   2190         if (__n > __pos)
   2191         {
   2192             __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos);
   2193             for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size())
   2194                 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j);
   2195             __n = __pos;
   2196         }
   2197         if (__n > 0)
   2198         {
   2199             iterator __obn = __old_begin + __n;
   2200             for (iterator __j = __obn; __j != __old_begin;)
   2201             {
   2202                 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j));
   2203                 --__base::__start_;
   2204                 ++__base::size();
   2205             }
   2206             if (__n < __pos)
   2207                 __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin);
   2208             _VSTD::copy(__m, __l, __old_begin);
   2209         }
   2210     }
   2211     else
   2212     {   // insert by shifting things forward
   2213         size_type __back_capacity = __back_spare();
   2214         if (__n > __back_capacity)
   2215             __add_back_capacity(__n - __back_capacity);
   2216         // __n <= __back_capacity
   2217         iterator __old_end = __base::end();
   2218         iterator __i = __old_end;
   2219         _BiIter __m = __l;
   2220         size_type __de = __base::size() - __pos;
   2221         if (__n > __de)
   2222         {
   2223             __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
   2224             for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
   2225                 __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
   2226             __n = __de;
   2227         }
   2228         if (__n > 0)
   2229         {
   2230             iterator __oen = __old_end - __n;
   2231             for (iterator __j = __oen; __j != __old_end; ++__i, ++__j, ++__base::size())
   2232                 __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j));
   2233             if (__n < __de)
   2234                 __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end);
   2235             _VSTD::copy_backward(__f, __m, __old_end);
   2236         }
   2237     }
   2238     return __base::begin() + __pos;
   2239 }
   2240 
   2241 template <class _Tp, class _Allocator>
   2242 template <class _InpIter>
   2243 void
   2244 deque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l,
   2245                                  typename enable_if<__is_input_iterator<_InpIter>::value &&
   2246                                                    !__is_forward_iterator<_InpIter>::value>::type*)
   2247 {
   2248     for (; __f != __l; ++__f)
   2249         push_back(*__f);
   2250 }
   2251 
   2252 template <class _Tp, class _Allocator>
   2253 template <class _ForIter>
   2254 void
   2255 deque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
   2256                                  typename enable_if<__is_forward_iterator<_ForIter>::value>::type*)
   2257 {
   2258     size_type __n = _VSTD::distance(__f, __l);
   2259     allocator_type& __a = __base::__alloc();
   2260     size_type __back_capacity = __back_spare();
   2261     if (__n > __back_capacity)
   2262         __add_back_capacity(__n - __back_capacity);
   2263     // __n <= __back_capacity
   2264     for (iterator __i = __base::end(); __f != __l; ++__i, (void) ++__f, ++__base::size())
   2265         __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f);
   2266 }
   2267 
   2268 template <class _Tp, class _Allocator>
   2269 void
   2270 deque<_Tp, _Allocator>::__append(size_type __n)
   2271 {
   2272     allocator_type& __a = __base::__alloc();
   2273     size_type __back_capacity = __back_spare();
   2274     if (__n > __back_capacity)
   2275         __add_back_capacity(__n - __back_capacity);
   2276     // __n <= __back_capacity
   2277     for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
   2278         __alloc_traits::construct(__a, _VSTD::addressof(*__i));
   2279 }
   2280 
   2281 template <class _Tp, class _Allocator>
   2282 void
   2283 deque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v)
   2284 {
   2285     allocator_type& __a = __base::__alloc();
   2286     size_type __back_capacity = __back_spare();
   2287     if (__n > __back_capacity)
   2288         __add_back_capacity(__n - __back_capacity);
   2289     // __n <= __back_capacity
   2290     for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
   2291         __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
   2292 }
   2293 
   2294 // Create front capacity for one block of elements.
   2295 // Strong guarantee.  Either do it or don't touch anything.
   2296 template <class _Tp, class _Allocator>
   2297 void
   2298 deque<_Tp, _Allocator>::__add_front_capacity()
   2299 {
   2300     allocator_type& __a = __base::__alloc();
   2301     if (__back_spare() >= __base::__block_size)
   2302     {
   2303         __base::__start_ += __base::__block_size;
   2304         pointer __pt = __base::__map_.back();
   2305         __base::__map_.pop_back();
   2306         __base::__map_.push_front(__pt);
   2307     }
   2308     // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer
   2309     else if (__base::__map_.size() < __base::__map_.capacity())
   2310     {   // we can put the new buffer into the map, but don't shift things around
   2311         // until all buffers are allocated.  If we throw, we don't need to fix
   2312         // anything up (any added buffers are undetectible)
   2313         if (__base::__map_.__front_spare() > 0)
   2314             __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
   2315         else
   2316         {
   2317             __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
   2318             // Done allocating, reorder capacity
   2319             pointer __pt = __base::__map_.back();
   2320             __base::__map_.pop_back();
   2321             __base::__map_.push_front(__pt);
   2322         }
   2323         __base::__start_ = __base::__map_.size() == 1 ?
   2324                                __base::__block_size / 2 :
   2325                                __base::__start_ + __base::__block_size;
   2326     }
   2327     // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
   2328     else
   2329     {
   2330         __split_buffer<pointer, typename __base::__pointer_allocator&>
   2331             __buf(max<size_type>(2 * __base::__map_.capacity(), 1),
   2332                   0, __base::__map_.__alloc());
   2333 
   2334         typedef __allocator_destructor<_Allocator> _Dp;
   2335         unique_ptr<pointer, _Dp> __hold(
   2336             __alloc_traits::allocate(__a, __base::__block_size),
   2337                 _Dp(__a, __base::__block_size));
   2338         __buf.push_back(__hold.get());
   2339         __hold.release();
   2340     
   2341         for (typename __base::__map_pointer __i = __base::__map_.begin();
   2342                 __i != __base::__map_.end(); ++__i)
   2343             __buf.push_back(*__i);
   2344         _VSTD::swap(__base::__map_.__first_, __buf.__first_);
   2345         _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
   2346         _VSTD::swap(__base::__map_.__end_, __buf.__end_);
   2347         _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
   2348         __base::__start_ = __base::__map_.size() == 1 ?
   2349                                __base::__block_size / 2 :
   2350                                __base::__start_ + __base::__block_size;
   2351     }
   2352 }
   2353 
   2354 // Create front capacity for __n elements.
   2355 // Strong guarantee.  Either do it or don't touch anything.
   2356 template <class _Tp, class _Allocator>
   2357 void
   2358 deque<_Tp, _Allocator>::__add_front_capacity(size_type __n)
   2359 {
   2360     allocator_type& __a = __base::__alloc();
   2361     size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
   2362     // Number of unused blocks at back:
   2363     size_type __back_capacity = __back_spare() / __base::__block_size;
   2364     __back_capacity = _VSTD::min(__back_capacity, __nb);  // don't take more than you need
   2365     __nb -= __back_capacity;  // number of blocks need to allocate
   2366     // If __nb == 0, then we have sufficient capacity.
   2367     if (__nb == 0)
   2368     {
   2369         __base::__start_ += __base::__block_size * __back_capacity;
   2370         for (; __back_capacity > 0; --__back_capacity)
   2371         {
   2372             pointer __pt = __base::__map_.back();
   2373             __base::__map_.pop_back();
   2374             __base::__map_.push_front(__pt);
   2375         }
   2376     }
   2377     // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
   2378     else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
   2379     {   // we can put the new buffers into the map, but don't shift things around
   2380         // until all buffers are allocated.  If we throw, we don't need to fix
   2381         // anything up (any added buffers are undetectible)
   2382         for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1))
   2383         {
   2384             if (__base::__map_.__front_spare() == 0)
   2385                 break;
   2386             __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
   2387         }
   2388         for (; __nb > 0; --__nb, ++__back_capacity)
   2389             __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
   2390         // Done allocating, reorder capacity
   2391         __base::__start_ += __back_capacity * __base::__block_size;
   2392         for (; __back_capacity > 0; --__back_capacity)
   2393         {
   2394             pointer __pt = __base::__map_.back();
   2395             __base::__map_.pop_back();
   2396             __base::__map_.push_front(__pt);
   2397         }
   2398     }
   2399     // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
   2400     else
   2401     {
   2402         size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty();
   2403         __split_buffer<pointer, typename __base::__pointer_allocator&>
   2404             __buf(max<size_type>(2* __base::__map_.capacity(),
   2405                                  __nb + __base::__map_.size()),
   2406                   0, __base::__map_.__alloc());
   2407 #ifndef _LIBCPP_NO_EXCEPTIONS
   2408         try
   2409         {
   2410 #endif  // _LIBCPP_NO_EXCEPTIONS
   2411             for (; __nb > 0; --__nb)
   2412                 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
   2413 #ifndef _LIBCPP_NO_EXCEPTIONS
   2414         }
   2415         catch (...)
   2416         {
   2417             for (typename __base::__map_pointer __i = __buf.begin();
   2418                     __i != __buf.end(); ++__i)
   2419                 __alloc_traits::deallocate(__a, *__i, __base::__block_size);
   2420             throw;
   2421         }
   2422 #endif  // _LIBCPP_NO_EXCEPTIONS
   2423         for (; __back_capacity > 0; --__back_capacity)
   2424         {
   2425             __buf.push_back(__base::__map_.back());
   2426             __base::__map_.pop_back();
   2427         }
   2428         for (typename __base::__map_pointer __i = __base::__map_.begin();
   2429                 __i != __base::__map_.end(); ++__i)
   2430             __buf.push_back(*__i);
   2431         _VSTD::swap(__base::__map_.__first_, __buf.__first_);
   2432         _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
   2433         _VSTD::swap(__base::__map_.__end_, __buf.__end_);
   2434         _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
   2435         __base::__start_ += __ds;
   2436     }
   2437 }
   2438 
   2439 // Create back capacity for one block of elements.
   2440 // Strong guarantee.  Either do it or don't touch anything.
   2441 template <class _Tp, class _Allocator>
   2442 void
   2443 deque<_Tp, _Allocator>::__add_back_capacity()
   2444 {
   2445     allocator_type& __a = __base::__alloc();
   2446     if (__front_spare() >= __base::__block_size)
   2447     {
   2448         __base::__start_ -= __base::__block_size;
   2449         pointer __pt = __base::__map_.front();
   2450         __base::__map_.pop_front();
   2451         __base::__map_.push_back(__pt);
   2452     }
   2453     // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
   2454     else if (__base::__map_.size() < __base::__map_.capacity())
   2455     {   // we can put the new buffer into the map, but don't shift things around
   2456         // until it is allocated.  If we throw, we don't need to fix
   2457         // anything up (any added buffers are undetectible)
   2458         if (__base::__map_.__back_spare() != 0)
   2459             __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
   2460         else
   2461         {
   2462             __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
   2463             // Done allocating, reorder capacity
   2464             pointer __pt = __base::__map_.front();
   2465             __base::__map_.pop_front();
   2466             __base::__map_.push_back(__pt);
   2467         }
   2468     }
   2469     // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
   2470     else
   2471     {
   2472         __split_buffer<pointer, typename __base::__pointer_allocator&>
   2473             __buf(max<size_type>(2* __base::__map_.capacity(), 1),
   2474                   __base::__map_.size(),
   2475                   __base::__map_.__alloc());
   2476 
   2477         typedef __allocator_destructor<_Allocator> _Dp;
   2478         unique_ptr<pointer, _Dp> __hold(
   2479             __alloc_traits::allocate(__a, __base::__block_size),
   2480                 _Dp(__a, __base::__block_size));
   2481         __buf.push_back(__hold.get());
   2482         __hold.release();
   2483 
   2484         for (typename __base::__map_pointer __i = __base::__map_.end();
   2485                 __i != __base::__map_.begin();)
   2486             __buf.push_front(*--__i);
   2487         _VSTD::swap(__base::__map_.__first_, __buf.__first_);
   2488         _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
   2489         _VSTD::swap(__base::__map_.__end_, __buf.__end_);
   2490         _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
   2491     }
   2492 }
   2493 
   2494 // Create back capacity for __n elements.
   2495 // Strong guarantee.  Either do it or don't touch anything.
   2496 template <class _Tp, class _Allocator>
   2497 void
   2498 deque<_Tp, _Allocator>::__add_back_capacity(size_type __n)
   2499 {
   2500     allocator_type& __a = __base::__alloc();
   2501     size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
   2502     // Number of unused blocks at front:
   2503     size_type __front_capacity = __front_spare() / __base::__block_size;
   2504     __front_capacity = _VSTD::min(__front_capacity, __nb);  // don't take more than you need
   2505     __nb -= __front_capacity;  // number of blocks need to allocate
   2506     // If __nb == 0, then we have sufficient capacity.
   2507     if (__nb == 0)
   2508     {
   2509         __base::__start_ -= __base::__block_size * __front_capacity;
   2510         for (; __front_capacity > 0; --__front_capacity)
   2511         {
   2512             pointer __pt = __base::__map_.front();
   2513             __base::__map_.pop_front();
   2514             __base::__map_.push_back(__pt);
   2515         }
   2516     }
   2517     // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
   2518     else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
   2519     {   // we can put the new buffers into the map, but don't shift things around
   2520         // until all buffers are allocated.  If we throw, we don't need to fix
   2521         // anything up (any added buffers are undetectible)
   2522         for (; __nb > 0; --__nb)
   2523         {
   2524             if (__base::__map_.__back_spare() == 0)
   2525                 break;
   2526             __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
   2527         }
   2528         for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ +=
   2529                                  __base::__block_size - (__base::__map_.size() == 1))
   2530             __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
   2531         // Done allocating, reorder capacity
   2532         __base::__start_ -= __base::__block_size * __front_capacity;
   2533         for (; __front_capacity > 0; --__front_capacity)
   2534         {
   2535             pointer __pt = __base::__map_.front();
   2536             __base::__map_.pop_front();
   2537             __base::__map_.push_back(__pt);
   2538         }
   2539     }
   2540     // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
   2541     else
   2542     {
   2543         size_type __ds = __front_capacity * __base::__block_size;
   2544         __split_buffer<pointer, typename __base::__pointer_allocator&>
   2545             __buf(max<size_type>(2* __base::__map_.capacity(),
   2546                                  __nb + __base::__map_.size()),
   2547                   __base::__map_.size() - __front_capacity,
   2548                   __base::__map_.__alloc());
   2549 #ifndef _LIBCPP_NO_EXCEPTIONS
   2550         try
   2551         {
   2552 #endif  // _LIBCPP_NO_EXCEPTIONS
   2553             for (; __nb > 0; --__nb)
   2554                 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
   2555 #ifndef _LIBCPP_NO_EXCEPTIONS
   2556         }
   2557         catch (...)
   2558         {
   2559             for (typename __base::__map_pointer __i = __buf.begin();
   2560                     __i != __buf.end(); ++__i)
   2561                 __alloc_traits::deallocate(__a, *__i, __base::__block_size);
   2562             throw;
   2563         }
   2564 #endif  // _LIBCPP_NO_EXCEPTIONS
   2565         for (; __front_capacity > 0; --__front_capacity)
   2566         {
   2567             __buf.push_back(__base::__map_.front());
   2568             __base::__map_.pop_front();
   2569         }
   2570         for (typename __base::__map_pointer __i = __base::__map_.end();
   2571                 __i != __base::__map_.begin();)
   2572             __buf.push_front(*--__i);
   2573         _VSTD::swap(__base::__map_.__first_, __buf.__first_);
   2574         _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
   2575         _VSTD::swap(__base::__map_.__end_, __buf.__end_);
   2576         _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
   2577         __base::__start_ -= __ds;
   2578     }
   2579 }
   2580 
   2581 template <class _Tp, class _Allocator>
   2582 void
   2583 deque<_Tp, _Allocator>::pop_front()
   2584 {
   2585     allocator_type& __a = __base::__alloc();
   2586     __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
   2587                                                     __base::__start_ / __base::__block_size) +
   2588                                                     __base::__start_ % __base::__block_size));
   2589     --__base::size();
   2590     if (++__base::__start_ >= 2 * __base::__block_size)
   2591     {
   2592         __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
   2593         __base::__map_.pop_front();
   2594         __base::__start_ -= __base::__block_size;
   2595     }
   2596 }
   2597 
   2598 template <class _Tp, class _Allocator>
   2599 void
   2600 deque<_Tp, _Allocator>::pop_back()
   2601 {
   2602     allocator_type& __a = __base::__alloc();
   2603     size_type __p = __base::size() + __base::__start_ - 1;
   2604     __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
   2605                                                     __p / __base::__block_size) +
   2606                                                     __p % __base::__block_size));
   2607     --__base::size();
   2608     if (__back_spare() >= 2 * __base::__block_size)
   2609     {
   2610         __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
   2611         __base::__map_.pop_back();
   2612     }
   2613 }
   2614 
   2615 // move assign [__f, __l) to [__r, __r + (__l-__f)).
   2616 // If __vt points into [__f, __l), then subtract (__f - __r) from __vt.
   2617 template <class _Tp, class _Allocator>
   2618 typename deque<_Tp, _Allocator>::iterator
   2619 deque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r,
   2620                                          const_pointer& __vt)
   2621 {
   2622     // as if
   2623     //   for (; __f != __l; ++__f, ++__r)
   2624     //       *__r = _VSTD::move(*__f);
   2625     difference_type __n = __l - __f;
   2626     while (__n > 0)
   2627     {
   2628         pointer __fb = __f.__ptr_;
   2629         pointer __fe = *__f.__m_iter_ + __base::__block_size;
   2630         difference_type __bs = __fe - __fb;
   2631         if (__bs > __n)
   2632         {
   2633             __bs = __n;
   2634             __fe = __fb + __bs;
   2635         }
   2636         if (__fb <= __vt && __vt < __fe)
   2637             __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_;
   2638         __r = _VSTD::move(__fb, __fe, __r);
   2639         __n -= __bs;
   2640         __f += __bs;
   2641     }
   2642     return __r;
   2643 }
   2644 
   2645 // move assign [__f, __l) to [__r - (__l-__f), __r) backwards.
   2646 // If __vt points into [__f, __l), then add (__r - __l) to __vt.
   2647 template <class _Tp, class _Allocator>
   2648 typename deque<_Tp, _Allocator>::iterator
   2649 deque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r,
   2650                                                   const_pointer& __vt)
   2651 {
   2652     // as if
   2653     //   while (__f != __l)
   2654     //       *--__r = _VSTD::move(*--__l);
   2655     difference_type __n = __l - __f;
   2656     while (__n > 0)
   2657     {
   2658         --__l;
   2659         pointer __lb = *__l.__m_iter_;
   2660         pointer __le = __l.__ptr_ + 1;
   2661         difference_type __bs = __le - __lb;
   2662         if (__bs > __n)
   2663         {
   2664             __bs = __n;
   2665             __lb = __le - __bs;
   2666         }
   2667         if (__lb <= __vt && __vt < __le)
   2668             __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_;
   2669         __r = _VSTD::move_backward(__lb, __le, __r);
   2670         __n -= __bs;
   2671         __l -= __bs - 1;
   2672     }
   2673     return __r;
   2674 }
   2675 
   2676 // move construct [__f, __l) to [__r, __r + (__l-__f)).
   2677 // If __vt points into [__f, __l), then add (__r - __f) to __vt.
   2678 template <class _Tp, class _Allocator>
   2679 void
   2680 deque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
   2681                                                    iterator __r, const_pointer& __vt)
   2682 {
   2683     allocator_type& __a = __base::__alloc();
   2684     // as if
   2685     //   for (; __f != __l; ++__r, ++__f, ++__base::size())
   2686     //       __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f));
   2687     difference_type __n = __l - __f;
   2688     while (__n > 0)
   2689     {
   2690         pointer __fb = __f.__ptr_;
   2691         pointer __fe = *__f.__m_iter_ + __base::__block_size;
   2692         difference_type __bs = __fe - __fb;
   2693         if (__bs > __n)
   2694         {
   2695             __bs = __n;
   2696             __fe = __fb + __bs;
   2697         }
   2698         if (__fb <= __vt && __vt < __fe)
   2699             __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_;
   2700         for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
   2701             __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb));
   2702         __n -= __bs;
   2703         __f += __bs;
   2704     }
   2705 }
   2706 
   2707 // move construct [__f, __l) to [__r - (__l-__f), __r) backwards.
   2708 // If __vt points into [__f, __l), then subtract (__l - __r) from __vt.
   2709 template <class _Tp, class _Allocator>
   2710 void
   2711 deque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l,
   2712                                                             iterator __r, const_pointer& __vt)
   2713 {
   2714     allocator_type& __a = __base::__alloc();
   2715     // as if
   2716     //   for (iterator __j = __l; __j != __f;)
   2717     //   {
   2718     //       __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j));
   2719     //       --__base::__start_;
   2720     //       ++__base::size();
   2721     //   }
   2722     difference_type __n = __l - __f;
   2723     while (__n > 0)
   2724     {
   2725         --__l;
   2726         pointer __lb = *__l.__m_iter_;
   2727         pointer __le = __l.__ptr_ + 1;
   2728         difference_type __bs = __le - __lb;
   2729         if (__bs > __n)
   2730         {
   2731             __bs = __n;
   2732             __lb = __le - __bs;
   2733         }
   2734         if (__lb <= __vt && __vt < __le)
   2735             __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_;
   2736         while (__le != __lb)
   2737         {
   2738             __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le));
   2739             --__base::__start_;
   2740             ++__base::size();
   2741         }
   2742         __n -= __bs;
   2743         __l -= __bs - 1;
   2744     }
   2745 }
   2746 
   2747 template <class _Tp, class _Allocator>
   2748 typename deque<_Tp, _Allocator>::iterator
   2749 deque<_Tp, _Allocator>::erase(const_iterator __f)
   2750 {
   2751     iterator __b = __base::begin();
   2752     difference_type __pos = __f - __b;
   2753     iterator __p = __b + __pos;
   2754     allocator_type& __a = __base::__alloc();
   2755     if (static_cast<size_t>(__pos) <= (__base::size() - 1) / 2)
   2756     {   // erase from front
   2757         _VSTD::move_backward(__b, __p, _VSTD::next(__p));
   2758         __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
   2759         --__base::size();
   2760         ++__base::__start_;
   2761         if (__front_spare() >= 2 * __base::__block_size)
   2762         {
   2763             __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
   2764             __base::__map_.pop_front();
   2765             __base::__start_ -= __base::__block_size;
   2766         }
   2767     }
   2768     else
   2769     {   // erase from back
   2770         iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p);
   2771         __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
   2772         --__base::size();
   2773         if (__back_spare() >= 2 * __base::__block_size)
   2774         {
   2775             __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
   2776             __base::__map_.pop_back();
   2777         }
   2778     }
   2779     return __base::begin() + __pos;
   2780 }
   2781 
   2782 template <class _Tp, class _Allocator>
   2783 typename deque<_Tp, _Allocator>::iterator
   2784 deque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l)
   2785 {
   2786     difference_type __n = __l - __f;
   2787     iterator __b = __base::begin();
   2788     difference_type __pos = __f - __b;
   2789     iterator __p = __b + __pos;
   2790     if (__n > 0)
   2791     {
   2792         allocator_type& __a = __base::__alloc();
   2793         if (static_cast<size_t>(__pos) <= (__base::size() - __n) / 2)
   2794         {   // erase from front
   2795             iterator __i = _VSTD::move_backward(__b, __p, __p + __n);
   2796             for (; __b != __i; ++__b)
   2797                 __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
   2798             __base::size() -= __n;
   2799             __base::__start_ += __n;
   2800             while (__front_spare() >= 2 * __base::__block_size)
   2801             {
   2802                 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
   2803                 __base::__map_.pop_front();
   2804                 __base::__start_ -= __base::__block_size;
   2805             }
   2806         }
   2807         else
   2808         {   // erase from back
   2809             iterator __i = _VSTD::move(__p + __n, __base::end(), __p);
   2810             for (iterator __e = __base::end(); __i != __e; ++__i)
   2811                 __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
   2812             __base::size() -= __n;
   2813             while (__back_spare() >= 2 * __base::__block_size)
   2814             {
   2815                 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
   2816                 __base::__map_.pop_back();
   2817             }
   2818         }
   2819     }
   2820     return __base::begin() + __pos;
   2821 }
   2822 
   2823 template <class _Tp, class _Allocator>
   2824 void
   2825 deque<_Tp, _Allocator>::__erase_to_end(const_iterator __f)
   2826 {
   2827     iterator __e = __base::end();
   2828     difference_type __n = __e - __f;
   2829     if (__n > 0)
   2830     {
   2831         allocator_type& __a = __base::__alloc();
   2832         iterator __b = __base::begin();
   2833         difference_type __pos = __f - __b;
   2834         for (iterator __p = __b + __pos; __p != __e; ++__p)
   2835             __alloc_traits::destroy(__a, _VSTD::addressof(*__p));
   2836         __base::size() -= __n;
   2837         while (__back_spare() >= 2 * __base::__block_size)
   2838         {
   2839             __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
   2840             __base::__map_.pop_back();
   2841         }
   2842     }
   2843 }
   2844 
   2845 template <class _Tp, class _Allocator>
   2846 inline
   2847 void
   2848 deque<_Tp, _Allocator>::swap(deque& __c)
   2849 #if _LIBCPP_STD_VER >= 14
   2850         _NOEXCEPT
   2851 #else
   2852         _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 
   2853                     __is_nothrow_swappable<allocator_type>::value)
   2854 #endif
   2855 {
   2856     __base::swap(__c);
   2857 }
   2858 
   2859 template <class _Tp, class _Allocator>
   2860 inline
   2861 void
   2862 deque<_Tp, _Allocator>::clear() _NOEXCEPT
   2863 {
   2864     __base::clear();
   2865 }
   2866 
   2867 template <class _Tp, class _Allocator>
   2868 inline _LIBCPP_INLINE_VISIBILITY
   2869 bool
   2870 operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
   2871 {
   2872     const typename deque<_Tp, _Allocator>::size_type __sz = __x.size();
   2873     return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
   2874 }
   2875 
   2876 template <class _Tp, class _Allocator>
   2877 inline _LIBCPP_INLINE_VISIBILITY
   2878 bool
   2879 operator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
   2880 {
   2881     return !(__x == __y);
   2882 }
   2883 
   2884 template <class _Tp, class _Allocator>
   2885 inline _LIBCPP_INLINE_VISIBILITY
   2886 bool
   2887 operator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
   2888 {
   2889     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
   2890 }
   2891 
   2892 template <class _Tp, class _Allocator>
   2893 inline _LIBCPP_INLINE_VISIBILITY
   2894 bool
   2895 operator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
   2896 {
   2897     return __y < __x;
   2898 }
   2899 
   2900 template <class _Tp, class _Allocator>
   2901 inline _LIBCPP_INLINE_VISIBILITY
   2902 bool
   2903 operator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
   2904 {
   2905     return !(__x < __y);
   2906 }
   2907 
   2908 template <class _Tp, class _Allocator>
   2909 inline _LIBCPP_INLINE_VISIBILITY
   2910 bool
   2911 operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
   2912 {
   2913     return !(__y < __x);
   2914 }
   2915 
   2916 template <class _Tp, class _Allocator>
   2917 inline _LIBCPP_INLINE_VISIBILITY
   2918 void
   2919 swap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y)
   2920     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   2921 {
   2922     __x.swap(__y);
   2923 }
   2924 
   2925 _LIBCPP_END_NAMESPACE_STD
   2926 
   2927 #endif  // _LIBCPP_DEQUE
   2928