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