xref: /llvm-project-15.0.7/libcxx/include/deque (revision b58f59cd)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- deque -----------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_DEQUE
123e519524SHoward Hinnant#define _LIBCPP_DEQUE
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant    deque synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class T, class Allocator = allocator<T> >
213e519524SHoward Hinnantclass deque
223e519524SHoward Hinnant{
233e519524SHoward Hinnantpublic:
243e519524SHoward Hinnant    // types:
253e519524SHoward Hinnant    typedef T value_type;
263e519524SHoward Hinnant    typedef Allocator allocator_type;
273e519524SHoward Hinnant
283e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
293e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
303e519524SHoward Hinnant    typedef implementation-defined                   iterator;
313e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
323e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
333e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
343e519524SHoward Hinnant
353e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
363e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
373e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
383e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
393e519524SHoward Hinnant
403e519524SHoward Hinnant    // construct/copy/destroy:
413e519524SHoward Hinnant    deque();
423e519524SHoward Hinnant    explicit deque(const allocator_type& a);
433e519524SHoward Hinnant    explicit deque(size_type n);
443e519524SHoward Hinnant    deque(size_type n, const value_type& v);
453e519524SHoward Hinnant    deque(size_type n, const value_type& v, const allocator_type& a);
463e519524SHoward Hinnant    template <class InputIterator>
473e519524SHoward Hinnant        deque(InputIterator f, InputIterator l);
483e519524SHoward Hinnant    template <class InputIterator>
493e519524SHoward Hinnant        deque(InputIterator f, InputIterator l, const allocator_type& a);
503e519524SHoward Hinnant    deque(const deque& c);
51*b58f59cdSHoward Hinnant    deque(deque&& c)
52*b58f59cdSHoward Hinnant        noexcept(is_nothrow_move_constructible<allocator_type>::value);
533e519524SHoward Hinnant    deque(initializer_list<value_type> il, const Allocator& a = allocator_type());
543e519524SHoward Hinnant    deque(const deque& c, const allocator_type& a);
553e519524SHoward Hinnant    deque(deque&& c, const allocator_type& a);
563e519524SHoward Hinnant    ~deque();
573e519524SHoward Hinnant
583e519524SHoward Hinnant    deque& operator=(const deque& c);
59*b58f59cdSHoward Hinnant    deque& operator=(deque&& c)
60*b58f59cdSHoward Hinnant        noexcept(
61*b58f59cdSHoward Hinnant             allocator_type::propagate_on_container_move_assignment::value &&
62*b58f59cdSHoward Hinnant             is_nothrow_move_assignable<allocator_type>::value);
633e519524SHoward Hinnant    deque& operator=(initializer_list<value_type> il);
643e519524SHoward Hinnant
653e519524SHoward Hinnant    template <class InputIterator>
663e519524SHoward Hinnant        void assign(InputIterator f, InputIterator l);
673e519524SHoward Hinnant    void assign(size_type n, const value_type& v);
683e519524SHoward Hinnant    void assign(initializer_list<value_type> il);
693e519524SHoward Hinnant
70a87e8360SHoward Hinnant    allocator_type get_allocator() const noexcept;
713e519524SHoward Hinnant
723e519524SHoward Hinnant    // iterators:
733e519524SHoward Hinnant
74a87e8360SHoward Hinnant    iterator       begin() noexcept;
75a87e8360SHoward Hinnant    const_iterator begin() const noexcept;
76a87e8360SHoward Hinnant    iterator       end() noexcept;
77a87e8360SHoward Hinnant    const_iterator end() const noexcept;
783e519524SHoward Hinnant
79a87e8360SHoward Hinnant    reverse_iterator       rbegin() noexcept;
80a87e8360SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
81a87e8360SHoward Hinnant    reverse_iterator       rend() noexcept;
82a87e8360SHoward Hinnant    const_reverse_iterator rend() const noexcept;
833e519524SHoward Hinnant
84a87e8360SHoward Hinnant    const_iterator         cbegin() const noexcept;
85a87e8360SHoward Hinnant    const_iterator         cend() const noexcept;
86a87e8360SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
87a87e8360SHoward Hinnant    const_reverse_iterator crend() const noexcept;
883e519524SHoward Hinnant
893e519524SHoward Hinnant    // capacity:
90a87e8360SHoward Hinnant    size_type size() const noexcept;
91a87e8360SHoward Hinnant    size_type max_size() const noexcept;
923e519524SHoward Hinnant    void resize(size_type n);
933e519524SHoward Hinnant    void resize(size_type n, const value_type& v);
943e519524SHoward Hinnant    void shrink_to_fit();
95a87e8360SHoward Hinnant    bool empty() const noexcept;
963e519524SHoward Hinnant
973e519524SHoward Hinnant    // element access:
983e519524SHoward Hinnant    reference operator[](size_type i);
993e519524SHoward Hinnant    const_reference operator[](size_type i) const;
1003e519524SHoward Hinnant    reference at(size_type i);
1013e519524SHoward Hinnant    const_reference at(size_type i) const;
1023e519524SHoward Hinnant    reference front();
1033e519524SHoward Hinnant    const_reference front() const;
1043e519524SHoward Hinnant    reference back();
1053e519524SHoward Hinnant    const_reference back() const;
1063e519524SHoward Hinnant
1073e519524SHoward Hinnant    // modifiers:
1083e519524SHoward Hinnant    void push_front(const value_type& v);
1093e519524SHoward Hinnant    void push_front(value_type&& v);
1103e519524SHoward Hinnant    void push_back(const value_type& v);
1113e519524SHoward Hinnant    void push_back(value_type&& v);
1123e519524SHoward Hinnant    template <class... Args> void emplace_front(Args&&... args);
1133e519524SHoward Hinnant    template <class... Args> void emplace_back(Args&&... args);
1143e519524SHoward Hinnant    template <class... Args> iterator emplace(const_iterator p, Args&&... args);
1153e519524SHoward Hinnant    iterator insert(const_iterator p, const value_type& v);
1163e519524SHoward Hinnant    iterator insert(const_iterator p, value_type&& v);
1173e519524SHoward Hinnant    iterator insert(const_iterator p, size_type n, const value_type& v);
1183e519524SHoward Hinnant    template <class InputIterator>
1193e519524SHoward Hinnant        iterator insert (const_iterator p, InputIterator f, InputIterator l);
1203e519524SHoward Hinnant    iterator insert(const_iterator p, initializer_list<value_type> il);
1213e519524SHoward Hinnant    void pop_front();
1223e519524SHoward Hinnant    void pop_back();
1233e519524SHoward Hinnant    iterator erase(const_iterator p);
1243e519524SHoward Hinnant    iterator erase(const_iterator f, const_iterator l);
125*b58f59cdSHoward Hinnant    void swap(deque& c)
126*b58f59cdSHoward Hinnant        noexcept(!allocator_type::propagate_on_container_swap::value ||
127*b58f59cdSHoward Hinnant                 __is_nothrow_swappable<allocator_type>::value);
128a87e8360SHoward Hinnant    void clear() noexcept;
1293e519524SHoward Hinnant};
1303e519524SHoward Hinnant
1313e519524SHoward Hinnanttemplate <class T, class Allocator>
1323e519524SHoward Hinnant    bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1333e519524SHoward Hinnanttemplate <class T, class Allocator>
1343e519524SHoward Hinnant    bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1353e519524SHoward Hinnanttemplate <class T, class Allocator>
1363e519524SHoward Hinnant    bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1373e519524SHoward Hinnanttemplate <class T, class Allocator>
1383e519524SHoward Hinnant    bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1393e519524SHoward Hinnanttemplate <class T, class Allocator>
1403e519524SHoward Hinnant    bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1413e519524SHoward Hinnanttemplate <class T, class Allocator>
1423e519524SHoward Hinnant    bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1433e519524SHoward Hinnant
1443e519524SHoward Hinnant// specialized algorithms:
1453e519524SHoward Hinnanttemplate <class T, class Allocator>
146*b58f59cdSHoward Hinnant    void swap(deque<T,Allocator>& x, deque<T,Allocator>& y) noexcept(x.swap(y));
1473e519524SHoward Hinnant
1483e519524SHoward Hinnant}  // std
1493e519524SHoward Hinnant
1503e519524SHoward Hinnant*/
1513e519524SHoward Hinnant
1523e519524SHoward Hinnant#pragma GCC system_header
1533e519524SHoward Hinnant
1543e519524SHoward Hinnant#include <__config>
1553e519524SHoward Hinnant#include <__split_buffer>
1563e519524SHoward Hinnant#include <type_traits>
1573e519524SHoward Hinnant#include <initializer_list>
1583e519524SHoward Hinnant#include <iterator>
1593e519524SHoward Hinnant#include <algorithm>
1603e519524SHoward Hinnant#include <stdexcept>
1613e519524SHoward Hinnant
1623e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1633e519524SHoward Hinnant
1643e519524SHoward Hinnanttemplate <class _Tp, class _Allocator> class __deque_base;
1653e519524SHoward Hinnant
1663e519524SHoward Hinnanttemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
1673e519524SHoward Hinnant          class _DiffType, _DiffType _BlockSize>
168fb100021SHoward Hinnantclass _LIBCPP_VISIBLE __deque_iterator;
1693e519524SHoward Hinnant
1703e519524SHoward Hinnanttemplate <class _RAIter,
1713e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
1723e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
1733e519524SHoward Hinnantcopy(_RAIter __f,
1743e519524SHoward Hinnant     _RAIter __l,
1753e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
1763e519524SHoward Hinnant     typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
1773e519524SHoward Hinnant
1783e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
1793e519524SHoward Hinnant          class _OutputIterator>
1803e519524SHoward Hinnant_OutputIterator
1813e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
1823e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
1833e519524SHoward Hinnant     _OutputIterator __r);
1843e519524SHoward Hinnant
1853e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
1863e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
1873e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
1883e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
1893e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
1903e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
1913e519524SHoward Hinnant
1923e519524SHoward Hinnanttemplate <class _RAIter,
1933e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
1943e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
1953e519524SHoward Hinnantcopy_backward(_RAIter __f,
1963e519524SHoward Hinnant              _RAIter __l,
1973e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
1983e519524SHoward Hinnant              typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
1993e519524SHoward Hinnant
2003e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2013e519524SHoward Hinnant          class _OutputIterator>
2023e519524SHoward Hinnant_OutputIterator
2033e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2043e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2053e519524SHoward Hinnant              _OutputIterator __r);
2063e519524SHoward Hinnant
2073e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2083e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2093e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2103e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2113e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2123e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2133e519524SHoward Hinnant
2143e519524SHoward Hinnanttemplate <class _RAIter,
2153e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2163e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2173e519524SHoward Hinnantmove(_RAIter __f,
2183e519524SHoward Hinnant     _RAIter __l,
2193e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
2203e519524SHoward Hinnant     typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
2213e519524SHoward Hinnant
2223e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2233e519524SHoward Hinnant          class _OutputIterator>
2243e519524SHoward Hinnant_OutputIterator
2253e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2263e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2273e519524SHoward Hinnant     _OutputIterator __r);
2283e519524SHoward Hinnant
2293e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2303e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2313e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2323e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2333e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2343e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2353e519524SHoward Hinnant
2363e519524SHoward Hinnanttemplate <class _RAIter,
2373e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2383e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2393e519524SHoward Hinnantmove_backward(_RAIter __f,
2403e519524SHoward Hinnant              _RAIter __l,
2413e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
2423e519524SHoward Hinnant              typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
2433e519524SHoward Hinnant
2443e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2453e519524SHoward Hinnant          class _OutputIterator>
2463e519524SHoward Hinnant_OutputIterator
2473e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2483e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2493e519524SHoward Hinnant              _OutputIterator __r);
2503e519524SHoward Hinnant
2513e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2523e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2533e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2543e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2553e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2563e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2573e519524SHoward Hinnant
2583e519524SHoward Hinnanttemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
2593e519524SHoward Hinnant          class _DiffType, _DiffType _BlockSize>
260fb100021SHoward Hinnantclass _LIBCPP_VISIBLE __deque_iterator
2613e519524SHoward Hinnant{
2623e519524SHoward Hinnant    typedef _MapPointer __map_iterator;
2633e519524SHoward Hinnantpublic:
2643e519524SHoward Hinnant    typedef _Pointer  pointer;
2653e519524SHoward Hinnant    typedef _DiffType difference_type;
2663e519524SHoward Hinnantprivate:
2673e519524SHoward Hinnant    __map_iterator __m_iter_;
2683e519524SHoward Hinnant    pointer        __ptr_;
2693e519524SHoward Hinnant
2703e519524SHoward Hinnant    static const difference_type __block_size = _BlockSize;
2713e519524SHoward Hinnantpublic:
2723e519524SHoward Hinnant    typedef _ValueType                  value_type;
2733e519524SHoward Hinnant    typedef random_access_iterator_tag  iterator_category;
2743e519524SHoward Hinnant    typedef _Reference                  reference;
2753e519524SHoward Hinnant
276a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT {}
2773e519524SHoward Hinnant
2783e519524SHoward Hinnant    template <class _P, class _R, class _MP>
2793e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2803e519524SHoward Hinnant    __deque_iterator(const __deque_iterator<value_type, _P, _R, _MP, difference_type, __block_size>& __it,
281a87e8360SHoward Hinnant                typename enable_if<is_convertible<_P, pointer>::value>::type* = 0) _NOEXCEPT
2823e519524SHoward Hinnant        : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
2833e519524SHoward Hinnant
2843e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;}
2853e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;}
2863e519524SHoward Hinnant
2873e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++()
2883e519524SHoward Hinnant    {
2893e519524SHoward Hinnant        if (++__ptr_ - *__m_iter_ == __block_size)
2903e519524SHoward Hinnant        {
2913e519524SHoward Hinnant            ++__m_iter_;
2923e519524SHoward Hinnant            __ptr_ = *__m_iter_;
2933e519524SHoward Hinnant        }
2943e519524SHoward Hinnant        return *this;
2953e519524SHoward Hinnant    }
2963e519524SHoward Hinnant
2973e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int)
2983e519524SHoward Hinnant    {
2993e519524SHoward Hinnant        __deque_iterator __tmp = *this;
3003e519524SHoward Hinnant        ++(*this);
3013e519524SHoward Hinnant        return __tmp;
3023e519524SHoward Hinnant    }
3033e519524SHoward Hinnant
3043e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--()
3053e519524SHoward Hinnant    {
3063e519524SHoward Hinnant        if (__ptr_ == *__m_iter_)
3073e519524SHoward Hinnant        {
3083e519524SHoward Hinnant            --__m_iter_;
3093e519524SHoward Hinnant            __ptr_ = *__m_iter_ + __block_size;
3103e519524SHoward Hinnant        }
3113e519524SHoward Hinnant        --__ptr_;
3123e519524SHoward Hinnant        return *this;
3133e519524SHoward Hinnant    }
3143e519524SHoward Hinnant
3153e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int)
3163e519524SHoward Hinnant    {
3173e519524SHoward Hinnant        __deque_iterator __tmp = *this;
3183e519524SHoward Hinnant        --(*this);
3193e519524SHoward Hinnant        return __tmp;
3203e519524SHoward Hinnant    }
3213e519524SHoward Hinnant
3223e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n)
3233e519524SHoward Hinnant    {
3243e519524SHoward Hinnant        if (__n != 0)
3253e519524SHoward Hinnant        {
3263e519524SHoward Hinnant            __n += __ptr_ - *__m_iter_;
3273e519524SHoward Hinnant            if (__n > 0)
3283e519524SHoward Hinnant            {
3293e519524SHoward Hinnant                __m_iter_ += __n / __block_size;
3303e519524SHoward Hinnant                __ptr_ = *__m_iter_ + __n % __block_size;
3313e519524SHoward Hinnant            }
3323e519524SHoward Hinnant            else // (__n < 0)
3333e519524SHoward Hinnant            {
3343e519524SHoward Hinnant                difference_type __z = __block_size - 1 - __n;
3353e519524SHoward Hinnant                __m_iter_ -= __z / __block_size;
3363e519524SHoward Hinnant                __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size);
3373e519524SHoward Hinnant            }
3383e519524SHoward Hinnant        }
3393e519524SHoward Hinnant        return *this;
3403e519524SHoward Hinnant    }
3413e519524SHoward Hinnant
3423e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n)
3433e519524SHoward Hinnant    {
3443e519524SHoward Hinnant        return *this += -__n;
3453e519524SHoward Hinnant    }
3463e519524SHoward Hinnant
3473e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const
3483e519524SHoward Hinnant    {
3493e519524SHoward Hinnant        __deque_iterator __t(*this);
3503e519524SHoward Hinnant        __t += __n;
3513e519524SHoward Hinnant        return __t;
3523e519524SHoward Hinnant    }
3533e519524SHoward Hinnant
3543e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const
3553e519524SHoward Hinnant    {
3563e519524SHoward Hinnant        __deque_iterator __t(*this);
3573e519524SHoward Hinnant        __t -= __n;
3583e519524SHoward Hinnant        return __t;
3593e519524SHoward Hinnant    }
3603e519524SHoward Hinnant
3613e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3623e519524SHoward Hinnant    friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it)
3633e519524SHoward Hinnant        {return __it + __n;}
3643e519524SHoward Hinnant
3653e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3663e519524SHoward Hinnant    friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y)
3673e519524SHoward Hinnant    {
3683e519524SHoward Hinnant        if (__x != __y)
3693e519524SHoward Hinnant            return (__x.__m_iter_ - __y.__m_iter_) * __block_size
3703e519524SHoward Hinnant                 + (__x.__ptr_ - *__x.__m_iter_)
3713e519524SHoward Hinnant                 - (__y.__ptr_ - *__y.__m_iter_);
3723e519524SHoward Hinnant        return 0;
3733e519524SHoward Hinnant    }
3743e519524SHoward Hinnant
3753e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
3763e519524SHoward Hinnant        {return *(*this + __n);}
3773e519524SHoward Hinnant
3783e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
3793e519524SHoward Hinnant        bool operator==(const __deque_iterator& __x, const __deque_iterator& __y)
3803e519524SHoward Hinnant        {return __x.__ptr_ == __y.__ptr_;}
3813e519524SHoward Hinnant
3823e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
3833e519524SHoward Hinnant        bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y)
3843e519524SHoward Hinnant        {return !(__x == __y);}
3853e519524SHoward Hinnant
3863e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
3873e519524SHoward Hinnant        bool operator<(const __deque_iterator& __x, const __deque_iterator& __y)
3883e519524SHoward Hinnant        {return __x.__m_iter_ < __y.__m_iter_ ||
3893e519524SHoward Hinnant               (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);}
3903e519524SHoward Hinnant
3913e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
3923e519524SHoward Hinnant        bool operator>(const __deque_iterator& __x, const __deque_iterator& __y)
3933e519524SHoward Hinnant        {return __y < __x;}
3943e519524SHoward Hinnant
3953e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
3963e519524SHoward Hinnant        bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y)
3973e519524SHoward Hinnant        {return !(__y < __x);}
3983e519524SHoward Hinnant
3993e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4003e519524SHoward Hinnant        bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y)
4013e519524SHoward Hinnant        {return !(__x < __y);}
4023e519524SHoward Hinnant
4033e519524SHoward Hinnantprivate:
404a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT
4053e519524SHoward Hinnant        : __m_iter_(__m), __ptr_(__p) {}
4063e519524SHoward Hinnant
4073e519524SHoward Hinnant    template <class _Tp, class _A> friend class __deque_base;
408fb100021SHoward Hinnant    template <class _Tp, class _A> friend class _LIBCPP_VISIBLE deque;
4093e519524SHoward Hinnant    template <class _V, class _P, class _R, class _MP, class _D, _D>
410fb100021SHoward Hinnant        friend class _LIBCPP_VISIBLE __deque_iterator;
4113e519524SHoward Hinnant
4123e519524SHoward Hinnant    template <class _RAIter,
4133e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4143e519524SHoward Hinnant    friend
4153e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4163e519524SHoward Hinnant    copy(_RAIter __f,
4173e519524SHoward Hinnant         _RAIter __l,
4183e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
4193e519524SHoward Hinnant         typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
4203e519524SHoward Hinnant
4213e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4223e519524SHoward Hinnant              class _OutputIterator>
4233e519524SHoward Hinnant    friend
4243e519524SHoward Hinnant    _OutputIterator
4253e519524SHoward Hinnant    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4263e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4273e519524SHoward Hinnant         _OutputIterator __r);
4283e519524SHoward Hinnant
4293e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4303e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4313e519524SHoward Hinnant    friend
4323e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4333e519524SHoward Hinnant    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4343e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4353e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
4363e519524SHoward Hinnant
4373e519524SHoward Hinnant    template <class _RAIter,
4383e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4393e519524SHoward Hinnant    friend
4403e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4413e519524SHoward Hinnant    copy_backward(_RAIter __f,
4423e519524SHoward Hinnant                  _RAIter __l,
4433e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
4443e519524SHoward Hinnant                  typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
4453e519524SHoward Hinnant
4463e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4473e519524SHoward Hinnant              class _OutputIterator>
4483e519524SHoward Hinnant    friend
4493e519524SHoward Hinnant    _OutputIterator
4503e519524SHoward Hinnant    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4513e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4523e519524SHoward Hinnant                  _OutputIterator __r);
4533e519524SHoward Hinnant
4543e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4553e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4563e519524SHoward Hinnant    friend
4573e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4583e519524SHoward Hinnant    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4593e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4603e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
4613e519524SHoward Hinnant
4623e519524SHoward Hinnant    template <class _RAIter,
4633e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4643e519524SHoward Hinnant    friend
4653e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4663e519524SHoward Hinnant    move(_RAIter __f,
4673e519524SHoward Hinnant         _RAIter __l,
4683e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
4693e519524SHoward Hinnant         typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
4703e519524SHoward Hinnant
4713e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4723e519524SHoward Hinnant              class _OutputIterator>
4733e519524SHoward Hinnant    friend
4743e519524SHoward Hinnant    _OutputIterator
4753e519524SHoward Hinnant    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4763e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4773e519524SHoward Hinnant         _OutputIterator __r);
4783e519524SHoward Hinnant
4793e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4803e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4813e519524SHoward Hinnant    friend
4823e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4833e519524SHoward Hinnant    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4843e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4853e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
4863e519524SHoward Hinnant
4873e519524SHoward Hinnant    template <class _RAIter,
4883e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4893e519524SHoward Hinnant    friend
4903e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4913e519524SHoward Hinnant    move_backward(_RAIter __f,
4923e519524SHoward Hinnant                  _RAIter __l,
4933e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
4943e519524SHoward Hinnant                  typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
4953e519524SHoward Hinnant
4963e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4973e519524SHoward Hinnant              class _OutputIterator>
4983e519524SHoward Hinnant    friend
4993e519524SHoward Hinnant    _OutputIterator
5003e519524SHoward Hinnant    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5013e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5023e519524SHoward Hinnant                  _OutputIterator __r);
5033e519524SHoward Hinnant
5043e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5053e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5063e519524SHoward Hinnant    friend
5073e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5083e519524SHoward Hinnant    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5093e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5103e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5113e519524SHoward Hinnant};
5123e519524SHoward Hinnant
5133e519524SHoward Hinnant// copy
5143e519524SHoward Hinnant
5153e519524SHoward Hinnanttemplate <class _RAIter,
5163e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5173e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5183e519524SHoward Hinnantcopy(_RAIter __f,
5193e519524SHoward Hinnant     _RAIter __l,
5203e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
5213e519524SHoward Hinnant     typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
5223e519524SHoward Hinnant{
5233e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
5243e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
5253e519524SHoward Hinnant    while (__f != __l)
5263e519524SHoward Hinnant    {
5273e519524SHoward Hinnant        pointer __rb = __r.__ptr_;
5283e519524SHoward Hinnant        pointer __re = *__r.__m_iter_ + _B2;
5293e519524SHoward Hinnant        difference_type __bs = __re - __rb;
5303e519524SHoward Hinnant        difference_type __n = __l - __f;
5313e519524SHoward Hinnant        _RAIter __m = __l;
5323e519524SHoward Hinnant        if (__n > __bs)
5333e519524SHoward Hinnant        {
5343e519524SHoward Hinnant            __n = __bs;
5353e519524SHoward Hinnant            __m = __f + __n;
5363e519524SHoward Hinnant        }
5373e519524SHoward Hinnant        _STD::copy(__f, __m, __rb);
5383e519524SHoward Hinnant        __f = __m;
5393e519524SHoward Hinnant        __r += __n;
5403e519524SHoward Hinnant    }
5413e519524SHoward Hinnant    return __r;
5423e519524SHoward Hinnant}
5433e519524SHoward Hinnant
5443e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5453e519524SHoward Hinnant          class _OutputIterator>
5463e519524SHoward Hinnant_OutputIterator
5473e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5483e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5493e519524SHoward Hinnant     _OutputIterator __r)
5503e519524SHoward Hinnant{
5513e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
5523e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
5533e519524SHoward Hinnant    difference_type __n = __l - __f;
5543e519524SHoward Hinnant    while (__n > 0)
5553e519524SHoward Hinnant    {
5563e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
5573e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + _B1;
5583e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
5593e519524SHoward Hinnant        if (__bs > __n)
5603e519524SHoward Hinnant        {
5613e519524SHoward Hinnant            __bs = __n;
5623e519524SHoward Hinnant            __fe = __fb + __bs;
5633e519524SHoward Hinnant        }
5643e519524SHoward Hinnant        __r = _STD::copy(__fb, __fe, __r);
5653e519524SHoward Hinnant        __n -= __bs;
5663e519524SHoward Hinnant        __f += __bs;
5673e519524SHoward Hinnant    }
5683e519524SHoward Hinnant    return __r;
5693e519524SHoward Hinnant}
5703e519524SHoward Hinnant
5713e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5723e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5733e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5743e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5753e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5763e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
5773e519524SHoward Hinnant{
5783e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
5793e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
5803e519524SHoward Hinnant    difference_type __n = __l - __f;
5813e519524SHoward Hinnant    while (__n > 0)
5823e519524SHoward Hinnant    {
5833e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
5843e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + _B1;
5853e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
5863e519524SHoward Hinnant        if (__bs > __n)
5873e519524SHoward Hinnant        {
5883e519524SHoward Hinnant            __bs = __n;
5893e519524SHoward Hinnant            __fe = __fb + __bs;
5903e519524SHoward Hinnant        }
5913e519524SHoward Hinnant        __r = _STD::copy(__fb, __fe, __r);
5923e519524SHoward Hinnant        __n -= __bs;
5933e519524SHoward Hinnant        __f += __bs;
5943e519524SHoward Hinnant    }
5953e519524SHoward Hinnant    return __r;
5963e519524SHoward Hinnant}
5973e519524SHoward Hinnant
5983e519524SHoward Hinnant// copy_backward
5993e519524SHoward Hinnant
6003e519524SHoward Hinnanttemplate <class _RAIter,
6013e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
6023e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
6033e519524SHoward Hinnantcopy_backward(_RAIter __f,
6043e519524SHoward Hinnant              _RAIter __l,
6053e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
6063e519524SHoward Hinnant              typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
6073e519524SHoward Hinnant{
6083e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
6093e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
6103e519524SHoward Hinnant    while (__f != __l)
6113e519524SHoward Hinnant    {
612a0fe8c43SHoward Hinnant        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _STD::prev(__r);
6133e519524SHoward Hinnant        pointer __rb = *__rp.__m_iter_;
6143e519524SHoward Hinnant        pointer __re = __rp.__ptr_ + 1;
6153e519524SHoward Hinnant        difference_type __bs = __re - __rb;
6163e519524SHoward Hinnant        difference_type __n = __l - __f;
6173e519524SHoward Hinnant        _RAIter __m = __f;
6183e519524SHoward Hinnant        if (__n > __bs)
6193e519524SHoward Hinnant        {
6203e519524SHoward Hinnant            __n = __bs;
6213e519524SHoward Hinnant            __m = __l - __n;
6223e519524SHoward Hinnant        }
6233e519524SHoward Hinnant        _STD::copy_backward(__m, __l, __re);
6243e519524SHoward Hinnant        __l = __m;
6253e519524SHoward Hinnant        __r -= __n;
6263e519524SHoward Hinnant    }
6273e519524SHoward Hinnant    return __r;
6283e519524SHoward Hinnant}
6293e519524SHoward Hinnant
6303e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
6313e519524SHoward Hinnant          class _OutputIterator>
6323e519524SHoward Hinnant_OutputIterator
6333e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
6343e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
6353e519524SHoward Hinnant              _OutputIterator __r)
6363e519524SHoward Hinnant{
6373e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
6383e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
6393e519524SHoward Hinnant    difference_type __n = __l - __f;
6403e519524SHoward Hinnant    while (__n > 0)
6413e519524SHoward Hinnant    {
6423e519524SHoward Hinnant        --__l;
6433e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
6443e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
6453e519524SHoward Hinnant        difference_type __bs = __le - __lb;
6463e519524SHoward Hinnant        if (__bs > __n)
6473e519524SHoward Hinnant        {
6483e519524SHoward Hinnant            __bs = __n;
6493e519524SHoward Hinnant            __lb = __le - __bs;
6503e519524SHoward Hinnant        }
6513e519524SHoward Hinnant        __r = _STD::copy_backward(__lb, __le, __r);
6523e519524SHoward Hinnant        __n -= __bs;
6533e519524SHoward Hinnant        __l -= __bs - 1;
6543e519524SHoward Hinnant    }
6553e519524SHoward Hinnant    return __r;
6563e519524SHoward Hinnant}
6573e519524SHoward Hinnant
6583e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
6593e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
6603e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
6613e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
6623e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
6633e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
6643e519524SHoward Hinnant{
6653e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
6663e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
6673e519524SHoward Hinnant    difference_type __n = __l - __f;
6683e519524SHoward Hinnant    while (__n > 0)
6693e519524SHoward Hinnant    {
6703e519524SHoward Hinnant        --__l;
6713e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
6723e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
6733e519524SHoward Hinnant        difference_type __bs = __le - __lb;
6743e519524SHoward Hinnant        if (__bs > __n)
6753e519524SHoward Hinnant        {
6763e519524SHoward Hinnant            __bs = __n;
6773e519524SHoward Hinnant            __lb = __le - __bs;
6783e519524SHoward Hinnant        }
6793e519524SHoward Hinnant        __r = _STD::copy_backward(__lb, __le, __r);
6803e519524SHoward Hinnant        __n -= __bs;
6813e519524SHoward Hinnant        __l -= __bs - 1;
6823e519524SHoward Hinnant    }
6833e519524SHoward Hinnant    return __r;
6843e519524SHoward Hinnant}
6853e519524SHoward Hinnant
6863e519524SHoward Hinnant// move
6873e519524SHoward Hinnant
6883e519524SHoward Hinnanttemplate <class _RAIter,
6893e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
6903e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
6913e519524SHoward Hinnantmove(_RAIter __f,
6923e519524SHoward Hinnant     _RAIter __l,
6933e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
6943e519524SHoward Hinnant     typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
6953e519524SHoward Hinnant{
6963e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
6973e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
6983e519524SHoward Hinnant    while (__f != __l)
6993e519524SHoward Hinnant    {
7003e519524SHoward Hinnant        pointer __rb = __r.__ptr_;
7013e519524SHoward Hinnant        pointer __re = *__r.__m_iter_ + _B2;
7023e519524SHoward Hinnant        difference_type __bs = __re - __rb;
7033e519524SHoward Hinnant        difference_type __n = __l - __f;
7043e519524SHoward Hinnant        _RAIter __m = __l;
7053e519524SHoward Hinnant        if (__n > __bs)
7063e519524SHoward Hinnant        {
7073e519524SHoward Hinnant            __n = __bs;
7083e519524SHoward Hinnant            __m = __f + __n;
7093e519524SHoward Hinnant        }
7103e519524SHoward Hinnant        _STD::move(__f, __m, __rb);
7113e519524SHoward Hinnant        __f = __m;
7123e519524SHoward Hinnant        __r += __n;
7133e519524SHoward Hinnant    }
7143e519524SHoward Hinnant    return __r;
7153e519524SHoward Hinnant}
7163e519524SHoward Hinnant
7173e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7183e519524SHoward Hinnant          class _OutputIterator>
7193e519524SHoward Hinnant_OutputIterator
7203e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
7213e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
7223e519524SHoward Hinnant     _OutputIterator __r)
7233e519524SHoward Hinnant{
7243e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
7253e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
7263e519524SHoward Hinnant    difference_type __n = __l - __f;
7273e519524SHoward Hinnant    while (__n > 0)
7283e519524SHoward Hinnant    {
7293e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
7303e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + _B1;
7313e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
7323e519524SHoward Hinnant        if (__bs > __n)
7333e519524SHoward Hinnant        {
7343e519524SHoward Hinnant            __bs = __n;
7353e519524SHoward Hinnant            __fe = __fb + __bs;
7363e519524SHoward Hinnant        }
7373e519524SHoward Hinnant        __r = _STD::move(__fb, __fe, __r);
7383e519524SHoward Hinnant        __n -= __bs;
7393e519524SHoward Hinnant        __f += __bs;
7403e519524SHoward Hinnant    }
7413e519524SHoward Hinnant    return __r;
7423e519524SHoward Hinnant}
7433e519524SHoward Hinnant
7443e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7453e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
7463e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
7473e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
7483e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
7493e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
7503e519524SHoward Hinnant{
7513e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
7523e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
7533e519524SHoward Hinnant    difference_type __n = __l - __f;
7543e519524SHoward Hinnant    while (__n > 0)
7553e519524SHoward Hinnant    {
7563e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
7573e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + _B1;
7583e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
7593e519524SHoward Hinnant        if (__bs > __n)
7603e519524SHoward Hinnant        {
7613e519524SHoward Hinnant            __bs = __n;
7623e519524SHoward Hinnant            __fe = __fb + __bs;
7633e519524SHoward Hinnant        }
7643e519524SHoward Hinnant        __r = _STD::move(__fb, __fe, __r);
7653e519524SHoward Hinnant        __n -= __bs;
7663e519524SHoward Hinnant        __f += __bs;
7673e519524SHoward Hinnant    }
7683e519524SHoward Hinnant    return __r;
7693e519524SHoward Hinnant}
7703e519524SHoward Hinnant
7713e519524SHoward Hinnant// move_backward
7723e519524SHoward Hinnant
7733e519524SHoward Hinnanttemplate <class _RAIter,
7743e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
7753e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
7763e519524SHoward Hinnantmove_backward(_RAIter __f,
7773e519524SHoward Hinnant              _RAIter __l,
7783e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
7793e519524SHoward Hinnant              typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
7803e519524SHoward Hinnant{
7813e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
7823e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
7833e519524SHoward Hinnant    while (__f != __l)
7843e519524SHoward Hinnant    {
785a0fe8c43SHoward Hinnant        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _STD::prev(__r);
7863e519524SHoward Hinnant        pointer __rb = *__rp.__m_iter_;
7873e519524SHoward Hinnant        pointer __re = __rp.__ptr_ + 1;
7883e519524SHoward Hinnant        difference_type __bs = __re - __rb;
7893e519524SHoward Hinnant        difference_type __n = __l - __f;
7903e519524SHoward Hinnant        _RAIter __m = __f;
7913e519524SHoward Hinnant        if (__n > __bs)
7923e519524SHoward Hinnant        {
7933e519524SHoward Hinnant            __n = __bs;
7943e519524SHoward Hinnant            __m = __l - __n;
7953e519524SHoward Hinnant        }
7963e519524SHoward Hinnant        _STD::move_backward(__m, __l, __re);
7973e519524SHoward Hinnant        __l = __m;
7983e519524SHoward Hinnant        __r -= __n;
7993e519524SHoward Hinnant    }
8003e519524SHoward Hinnant    return __r;
8013e519524SHoward Hinnant}
8023e519524SHoward Hinnant
8033e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
8043e519524SHoward Hinnant          class _OutputIterator>
8053e519524SHoward Hinnant_OutputIterator
8063e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
8073e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8083e519524SHoward Hinnant              _OutputIterator __r)
8093e519524SHoward Hinnant{
8103e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8113e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
8123e519524SHoward Hinnant    difference_type __n = __l - __f;
8133e519524SHoward Hinnant    while (__n > 0)
8143e519524SHoward Hinnant    {
8153e519524SHoward Hinnant        --__l;
8163e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
8173e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
8183e519524SHoward Hinnant        difference_type __bs = __le - __lb;
8193e519524SHoward Hinnant        if (__bs > __n)
8203e519524SHoward Hinnant        {
8213e519524SHoward Hinnant            __bs = __n;
8223e519524SHoward Hinnant            __lb = __le - __bs;
8233e519524SHoward Hinnant        }
8243e519524SHoward Hinnant        __r = _STD::move_backward(__lb, __le, __r);
8253e519524SHoward Hinnant        __n -= __bs;
8263e519524SHoward Hinnant        __l -= __bs - 1;
8273e519524SHoward Hinnant    }
8283e519524SHoward Hinnant    return __r;
8293e519524SHoward Hinnant}
8303e519524SHoward Hinnant
8313e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
8323e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
8333e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
8343e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
8353e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8363e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
8373e519524SHoward Hinnant{
8383e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8393e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
8403e519524SHoward Hinnant    difference_type __n = __l - __f;
8413e519524SHoward Hinnant    while (__n > 0)
8423e519524SHoward Hinnant    {
8433e519524SHoward Hinnant        --__l;
8443e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
8453e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
8463e519524SHoward Hinnant        difference_type __bs = __le - __lb;
8473e519524SHoward Hinnant        if (__bs > __n)
8483e519524SHoward Hinnant        {
8493e519524SHoward Hinnant            __bs = __n;
8503e519524SHoward Hinnant            __lb = __le - __bs;
8513e519524SHoward Hinnant        }
8523e519524SHoward Hinnant        __r = _STD::move_backward(__lb, __le, __r);
8533e519524SHoward Hinnant        __n -= __bs;
8543e519524SHoward Hinnant        __l -= __bs - 1;
8553e519524SHoward Hinnant    }
8563e519524SHoward Hinnant    return __r;
8573e519524SHoward Hinnant}
8583e519524SHoward Hinnant
8593e519524SHoward Hinnanttemplate <bool>
8603e519524SHoward Hinnantclass __deque_base_common
8613e519524SHoward Hinnant{
8623e519524SHoward Hinnantprotected:
8633e519524SHoward Hinnant    void __throw_length_error() const;
8643e519524SHoward Hinnant    void __throw_out_of_range() const;
8653e519524SHoward Hinnant};
8663e519524SHoward Hinnant
8673e519524SHoward Hinnanttemplate <bool __b>
8683e519524SHoward Hinnantvoid
8693e519524SHoward Hinnant__deque_base_common<__b>::__throw_length_error() const
8703e519524SHoward Hinnant{
8713e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8723e519524SHoward Hinnant    throw length_error("deque");
8733e519524SHoward Hinnant#endif
8743e519524SHoward Hinnant}
8753e519524SHoward Hinnant
8763e519524SHoward Hinnanttemplate <bool __b>
8773e519524SHoward Hinnantvoid
8783e519524SHoward Hinnant__deque_base_common<__b>::__throw_out_of_range() const
8793e519524SHoward Hinnant{
8803e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
8813e519524SHoward Hinnant    throw out_of_range("deque");
8823e519524SHoward Hinnant#endif
8833e519524SHoward Hinnant}
8843e519524SHoward Hinnant
8853e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
8863e519524SHoward Hinnantclass __deque_base
8873e519524SHoward Hinnant    : protected __deque_base_common<true>
8883e519524SHoward Hinnant{
8893e519524SHoward Hinnant    __deque_base(const __deque_base& __c);
8903e519524SHoward Hinnant    __deque_base& operator=(const __deque_base& __c);
8913e519524SHoward Hinnantprotected:
8923e519524SHoward Hinnant    typedef _Tp                                      value_type;
8933e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
8943e519524SHoward Hinnant    typedef allocator_traits<allocator_type>         __alloc_traits;
8953e519524SHoward Hinnant    typedef value_type&                              reference;
8963e519524SHoward Hinnant    typedef const value_type&                        const_reference;
8973e519524SHoward Hinnant    typedef typename __alloc_traits::size_type       size_type;
8983e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type difference_type;
8993e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
9003e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
9013e519524SHoward Hinnant
9023e519524SHoward Hinnant    static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16;
9033e519524SHoward Hinnant
9043e519524SHoward Hinnant    typedef typename __alloc_traits::template
9053e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
9063e519524SHoward Hinnant                rebind_alloc<pointer>
9073e519524SHoward Hinnant#else
9083e519524SHoward Hinnant                rebind_alloc<pointer>::other
9093e519524SHoward Hinnant#endif
9103e519524SHoward Hinnant                                                         __pointer_allocator;
9113e519524SHoward Hinnant    typedef allocator_traits<__pointer_allocator>        __map_traits;
9123e519524SHoward Hinnant    typedef typename __map_traits::pointer               __map_pointer;
9133e519524SHoward Hinnant    typedef typename __map_traits::const_pointer         __map_const_pointer;
9143e519524SHoward Hinnant    typedef __split_buffer<pointer, __pointer_allocator> __map;
9153e519524SHoward Hinnant
9163e519524SHoward Hinnant    typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
9173e519524SHoward Hinnant                             difference_type, __block_size>    iterator;
9183e519524SHoward Hinnant    typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
9193e519524SHoward Hinnant                             difference_type, __block_size>    const_iterator;
9203e519524SHoward Hinnant
9213e519524SHoward Hinnant    __map __map_;
9223e519524SHoward Hinnant    size_type __start_;
9233e519524SHoward Hinnant    __compressed_pair<size_type, allocator_type> __size_;
9243e519524SHoward Hinnant
925a87e8360SHoward Hinnant    iterator       begin() _NOEXCEPT;
926a87e8360SHoward Hinnant    const_iterator begin() const _NOEXCEPT;
927a87e8360SHoward Hinnant    iterator       end() _NOEXCEPT;
928a87e8360SHoward Hinnant    const_iterator end() const _NOEXCEPT;
9293e519524SHoward Hinnant
9303e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY size_type&            size()          {return __size_.first();}
931a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
932a87e8360SHoward Hinnant    const size_type& size() const _NOEXCEPT {return __size_.first();}
9333e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY allocator_type&       __alloc()       {return __size_.second();}
934a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
935a87e8360SHoward Hinnant    const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
9363e519524SHoward Hinnant
9373e519524SHoward Hinnant    __deque_base();
9383e519524SHoward Hinnant    explicit __deque_base(const allocator_type& __a);
9399eebe11dSHoward Hinnantpublic:
9403e519524SHoward Hinnant    ~__deque_base();
9413e519524SHoward Hinnant
9427609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
9433e519524SHoward Hinnant
9449eebe11dSHoward Hinnant    __deque_base(__deque_base&& __c)
9459eebe11dSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
9463e519524SHoward Hinnant    __deque_base(__deque_base&& __c, const allocator_type& __a);
9473e519524SHoward Hinnant
9487609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
9499eebe11dSHoward Hinnant    void swap(__deque_base& __c)
9509eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value||
9519eebe11dSHoward Hinnant                   __is_nothrow_swappable<allocator_type>::value);
9529eebe11dSHoward Hinnantprotected:
953a87e8360SHoward Hinnant    void clear() _NOEXCEPT;
9543e519524SHoward Hinnant
9553e519524SHoward Hinnant    bool __invariants() const;
9563e519524SHoward Hinnant
957fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9583e519524SHoward Hinnant    void __move_assign(__deque_base& __c)
959*b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
960*b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
9613e519524SHoward Hinnant    {
9623e519524SHoward Hinnant        __map_ = _STD::move(__c.__map_);
9633e519524SHoward Hinnant        __start_ = __c.__start_;
9643e519524SHoward Hinnant        size() = __c.size();
9653e519524SHoward Hinnant        __move_assign_alloc(__c);
9663e519524SHoward Hinnant        __c.__start_ = __c.size() = 0;
9673e519524SHoward Hinnant    }
9683e519524SHoward Hinnant
969fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9703e519524SHoward Hinnant    void __move_assign_alloc(__deque_base& __c)
9719eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value ||
9729eebe11dSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
9733e519524SHoward Hinnant        {__move_assign_alloc(__c, integral_constant<bool,
9743e519524SHoward Hinnant                      __alloc_traits::propagate_on_container_move_assignment::value>());}
9753e519524SHoward Hinnant
9763e519524SHoward Hinnantprivate:
977fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9783e519524SHoward Hinnant    void __move_assign_alloc(const __deque_base& __c, true_type)
9799eebe11dSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
9803e519524SHoward Hinnant        {
9813e519524SHoward Hinnant            __alloc() = _STD::move(__c.__alloc());
9823e519524SHoward Hinnant        }
9833e519524SHoward Hinnant
984fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9859eebe11dSHoward Hinnant    void __move_assign_alloc(const __deque_base& __c, false_type) _NOEXCEPT
9863e519524SHoward Hinnant        {}
9873e519524SHoward Hinnant
988fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9893e519524SHoward Hinnant    static void __swap_alloc(allocator_type& __x, allocator_type& __y)
9909eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
9919eebe11dSHoward Hinnant                   __is_nothrow_swappable<allocator_type>::value)
9923e519524SHoward Hinnant        {__swap_alloc(__x, __y, integral_constant<bool,
9933e519524SHoward Hinnant                      __alloc_traits::propagate_on_container_swap::value>());}
9943e519524SHoward Hinnant
995fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9963e519524SHoward Hinnant    static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type)
9979eebe11dSHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
9983e519524SHoward Hinnant        {
9993e519524SHoward Hinnant            using _STD::swap;
10003e519524SHoward Hinnant            swap(__x, __y);
10013e519524SHoward Hinnant        }
1002fb100021SHoward Hinnant
1003fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10043e519524SHoward Hinnant    static void __swap_alloc(allocator_type& __x, allocator_type& __y, false_type)
10059eebe11dSHoward Hinnant        _NOEXCEPT
10063e519524SHoward Hinnant        {}
10073e519524SHoward Hinnant};
10083e519524SHoward Hinnant
10093e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10103e519524SHoward Hinnantbool
10113e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__invariants() const
10123e519524SHoward Hinnant{
10133e519524SHoward Hinnant    if (!__map_.__invariants())
10143e519524SHoward Hinnant        return false;
10153e519524SHoward Hinnant    if (__map_.size() >= size_type(-1) / __block_size)
10163e519524SHoward Hinnant        return false;
10173e519524SHoward Hinnant    for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end();
10183e519524SHoward Hinnant         __i != __e; ++__i)
10193e519524SHoward Hinnant        if (*__i == nullptr)
10203e519524SHoward Hinnant            return false;
10213e519524SHoward Hinnant    if (__map_.size() != 0)
10223e519524SHoward Hinnant    {
10233e519524SHoward Hinnant        if (size() >= __map_.size() * __block_size)
10243e519524SHoward Hinnant            return false;
10253e519524SHoward Hinnant        if (__start_ >= __map_.size() * __block_size - size())
10263e519524SHoward Hinnant            return false;
10273e519524SHoward Hinnant    }
10283e519524SHoward Hinnant    else
10293e519524SHoward Hinnant    {
10303e519524SHoward Hinnant        if (size() != 0)
10313e519524SHoward Hinnant            return false;
10323e519524SHoward Hinnant        if (__start_ != 0)
10333e519524SHoward Hinnant            return false;
10343e519524SHoward Hinnant    }
10353e519524SHoward Hinnant    return true;
10363e519524SHoward Hinnant}
10373e519524SHoward Hinnant
10383e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10393e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::iterator
1040a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::begin() _NOEXCEPT
10413e519524SHoward Hinnant{
10423e519524SHoward Hinnant    __map_pointer __mp = __map_.begin() + __start_ / __block_size;
10433e519524SHoward Hinnant    return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
10443e519524SHoward Hinnant}
10453e519524SHoward Hinnant
10463e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10473e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::const_iterator
1048a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
10493e519524SHoward Hinnant{
10503e519524SHoward Hinnant    __map_const_pointer __mp = __map_.begin() + __start_ / __block_size;
10513e519524SHoward Hinnant    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
10523e519524SHoward Hinnant}
10533e519524SHoward Hinnant
10543e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10553e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::iterator
1056a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::end() _NOEXCEPT
10573e519524SHoward Hinnant{
10583e519524SHoward Hinnant    size_type __p = size() + __start_;
10593e519524SHoward Hinnant    __map_pointer __mp = __map_.begin() + __p / __block_size;
10603e519524SHoward Hinnant    return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
10613e519524SHoward Hinnant}
10623e519524SHoward Hinnant
10633e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10643e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::const_iterator
1065a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
10663e519524SHoward Hinnant{
10673e519524SHoward Hinnant    size_type __p = size() + __start_;
10683e519524SHoward Hinnant    __map_const_pointer __mp = __map_.begin() + __p / __block_size;
10693e519524SHoward Hinnant    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
10703e519524SHoward Hinnant}
10713e519524SHoward Hinnant
10723e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10733e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10743e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base()
10753e519524SHoward Hinnant    : __start_(0), __size_(0) {}
10763e519524SHoward Hinnant
10773e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10783e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10793e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
10803e519524SHoward Hinnant    : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
10813e519524SHoward Hinnant
10823e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10833e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::~__deque_base()
10843e519524SHoward Hinnant{
10853e519524SHoward Hinnant    clear();
10863e519524SHoward Hinnant    typename __map::iterator __i = __map_.begin();
10873e519524SHoward Hinnant    typename __map::iterator __e = __map_.end();
10883e519524SHoward Hinnant    for (; __i != __e; ++__i)
10893e519524SHoward Hinnant        __alloc_traits::deallocate(__alloc(), *__i, __block_size);
10903e519524SHoward Hinnant}
10913e519524SHoward Hinnant
10927609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
10933e519524SHoward Hinnant
10943e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
10953e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c)
10969eebe11dSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
10973e519524SHoward Hinnant    : __map_(_STD::move(__c.__map_)),
10983e519524SHoward Hinnant      __start_(_STD::move(__c.__start_)),
10993e519524SHoward Hinnant      __size_(_STD::move(__c.__size_))
11003e519524SHoward Hinnant{
11013e519524SHoward Hinnant    __c.__start_ = 0;
11023e519524SHoward Hinnant    __c.size() = 0;
11033e519524SHoward Hinnant}
11043e519524SHoward Hinnant
11053e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11063e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a)
11073e519524SHoward Hinnant    : __map_(_STD::move(__c.__map_), __pointer_allocator(__a)),
11083e519524SHoward Hinnant      __start_(_STD::move(__c.__start_)),
11093e519524SHoward Hinnant      __size_(_STD::move(__c.size()), __a)
11103e519524SHoward Hinnant{
11113e519524SHoward Hinnant    if (__a == __c.__alloc())
11123e519524SHoward Hinnant    {
11133e519524SHoward Hinnant        __c.__start_ = 0;
11143e519524SHoward Hinnant        __c.size() = 0;
11153e519524SHoward Hinnant    }
11163e519524SHoward Hinnant    else
11173e519524SHoward Hinnant    {
11183e519524SHoward Hinnant        __map_.clear();
11193e519524SHoward Hinnant        __start_ = 0;
11203e519524SHoward Hinnant        size() = 0;
11213e519524SHoward Hinnant    }
11223e519524SHoward Hinnant}
11233e519524SHoward Hinnant
11247609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
11253e519524SHoward Hinnant
11263e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11273e519524SHoward Hinnantvoid
11283e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::swap(__deque_base& __c)
11299eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value||
11309eebe11dSHoward Hinnant                   __is_nothrow_swappable<allocator_type>::value)
11313e519524SHoward Hinnant{
11323e519524SHoward Hinnant    __map_.swap(__c.__map_);
11333e519524SHoward Hinnant    _STD::swap(__start_, __c.__start_);
11343e519524SHoward Hinnant    _STD::swap(size(), __c.size());
11353e519524SHoward Hinnant    __swap_alloc(__alloc(), __c.__alloc());
11363e519524SHoward Hinnant}
11373e519524SHoward Hinnant
11383e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11393e519524SHoward Hinnantvoid
1140a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::clear() _NOEXCEPT
11413e519524SHoward Hinnant{
11423e519524SHoward Hinnant    allocator_type& __a = __alloc();
11433e519524SHoward Hinnant    for (iterator __i = begin(), __e = end(); __i != __e; ++__i)
114472c5e142SHoward Hinnant        __alloc_traits::destroy(__a, _STD::addressof(*__i));
11453e519524SHoward Hinnant    size() = 0;
11463e519524SHoward Hinnant    while (__map_.size() > 2)
11473e519524SHoward Hinnant    {
11483e519524SHoward Hinnant        __alloc_traits::deallocate(__a, __map_.front(), __block_size);
11493e519524SHoward Hinnant        __map_.pop_front();
11503e519524SHoward Hinnant    }
11513e519524SHoward Hinnant    switch (__map_.size())
11523e519524SHoward Hinnant    {
11533e519524SHoward Hinnant    case 1:
11543e519524SHoward Hinnant        __start_ = __block_size / 2;
11553e519524SHoward Hinnant        break;
11563e519524SHoward Hinnant    case 2:
11573e519524SHoward Hinnant        __start_ = __block_size;
11583e519524SHoward Hinnant        break;
11593e519524SHoward Hinnant    }
11603e519524SHoward Hinnant}
11613e519524SHoward Hinnant
11623e519524SHoward Hinnanttemplate <class _Tp, class _Allocator = allocator<_Tp> >
1163fb100021SHoward Hinnantclass _LIBCPP_VISIBLE deque
11643e519524SHoward Hinnant    : private __deque_base<_Tp, _Allocator>
11653e519524SHoward Hinnant{
11663e519524SHoward Hinnantpublic:
11673e519524SHoward Hinnant    // types:
11683e519524SHoward Hinnant
11693e519524SHoward Hinnant    typedef _Tp value_type;
11703e519524SHoward Hinnant    typedef _Allocator allocator_type;
11713e519524SHoward Hinnant
11723e519524SHoward Hinnant    typedef __deque_base<value_type, allocator_type> __base;
11733e519524SHoward Hinnant
11743e519524SHoward Hinnant    typedef typename __base::__alloc_traits        __alloc_traits;
11753e519524SHoward Hinnant    typedef typename __base::reference             reference;
11763e519524SHoward Hinnant    typedef typename __base::const_reference       const_reference;
11773e519524SHoward Hinnant    typedef typename __base::iterator              iterator;
11783e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
11793e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
11803e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
11813e519524SHoward Hinnant
11823e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
11833e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
11843e519524SHoward Hinnant    typedef _STD::reverse_iterator<iterator>       reverse_iterator;
11853e519524SHoward Hinnant    typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
11863e519524SHoward Hinnant
11873e519524SHoward Hinnant    // construct/copy/destroy:
11883e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY deque() {}
11893e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY deque(const allocator_type& __a) : __base(__a) {}
11903e519524SHoward Hinnant    explicit deque(size_type __n);
11913e519524SHoward Hinnant    deque(size_type __n, const value_type& __v);
11923e519524SHoward Hinnant    deque(size_type __n, const value_type& __v, const allocator_type& __a);
11933e519524SHoward Hinnant    template <class _InputIter>
11943e519524SHoward Hinnant        deque(_InputIter __f, _InputIter __l,
11953e519524SHoward Hinnant              typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
11963e519524SHoward Hinnant    template <class _InputIter>
11973e519524SHoward Hinnant        deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
11983e519524SHoward Hinnant              typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
11993e519524SHoward Hinnant    deque(const deque& __c);
12003e519524SHoward Hinnant    deque(const deque& __c, const allocator_type& __a);
12013e519524SHoward Hinnant    deque(initializer_list<value_type> __il);
12023e519524SHoward Hinnant    deque(initializer_list<value_type> __il, const allocator_type& __a);
12033e519524SHoward Hinnant
12043e519524SHoward Hinnant    deque& operator=(const deque& __c);
1205fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12063e519524SHoward Hinnant    deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;}
12073e519524SHoward Hinnant
12087609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
12099eebe11dSHoward Hinnant    deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
12103e519524SHoward Hinnant    deque(deque&& __c, const allocator_type& __a);
12119eebe11dSHoward Hinnant    deque& operator=(deque&& __c)
1212*b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1213*b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value);
12147609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
12153e519524SHoward Hinnant
12163e519524SHoward Hinnant    template <class _InputIter>
12173e519524SHoward Hinnant        void assign(_InputIter __f, _InputIter __l,
12183e519524SHoward Hinnant                    typename enable_if<__is_input_iterator<_InputIter>::value &&
12193e519524SHoward Hinnant                                      !__is_random_access_iterator<_InputIter>::value>::type* = 0);
12203e519524SHoward Hinnant    template <class _RAIter>
12213e519524SHoward Hinnant        void assign(_RAIter __f, _RAIter __l,
12223e519524SHoward Hinnant                    typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
12233e519524SHoward Hinnant    void assign(size_type __n, const value_type& __v);
1224fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12253e519524SHoward Hinnant    void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
12263e519524SHoward Hinnant
1227a87e8360SHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT;
12283e519524SHoward Hinnant
12293e519524SHoward Hinnant    // iterators:
12303e519524SHoward Hinnant
1231fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1232a87e8360SHoward Hinnant    iterator       begin() _NOEXCEPT       {return __base::begin();}
1233fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1234a87e8360SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __base::begin();}
1235fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1236a87e8360SHoward Hinnant    iterator       end() _NOEXCEPT         {return __base::end();}
1237fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1238a87e8360SHoward Hinnant    const_iterator end()   const _NOEXCEPT {return __base::end();}
12393e519524SHoward Hinnant
1240fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1241a87e8360SHoward Hinnant    reverse_iterator       rbegin() _NOEXCEPT
1242a87e8360SHoward Hinnant        {return       reverse_iterator(__base::end());}
1243fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1244a87e8360SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
1245a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::end());}
1246fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1247a87e8360SHoward Hinnant    reverse_iterator       rend() _NOEXCEPT
1248a87e8360SHoward Hinnant        {return       reverse_iterator(__base::begin());}
1249fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1250a87e8360SHoward Hinnant    const_reverse_iterator rend()   const _NOEXCEPT
1251a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::begin());}
12523e519524SHoward Hinnant
1253fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1254a87e8360SHoward Hinnant    const_iterator         cbegin()  const _NOEXCEPT
1255a87e8360SHoward Hinnant        {return __base::begin();}
1256fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1257a87e8360SHoward Hinnant    const_iterator         cend()    const _NOEXCEPT
1258a87e8360SHoward Hinnant        {return __base::end();}
1259fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1260a87e8360SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT
1261a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::end());}
1262fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1263a87e8360SHoward Hinnant    const_reverse_iterator crend()   const _NOEXCEPT
1264a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::begin());}
12653e519524SHoward Hinnant
12663e519524SHoward Hinnant    // capacity:
1267fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1268a87e8360SHoward Hinnant    size_type size() const _NOEXCEPT {return __base::size();}
1269a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1270a87e8360SHoward Hinnant    size_type max_size() const _NOEXCEPT
1271a87e8360SHoward Hinnant        {return __alloc_traits::max_size(__base::__alloc());}
12723e519524SHoward Hinnant    void resize(size_type __n);
12733e519524SHoward Hinnant    void resize(size_type __n, const value_type& __v);
1274*b58f59cdSHoward Hinnant    void shrink_to_fit() _NOEXCEPT;
1275a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1276a87e8360SHoward Hinnant    bool empty() const _NOEXCEPT {return __base::size() == 0;}
12773e519524SHoward Hinnant
12783e519524SHoward Hinnant    // element access:
12793e519524SHoward Hinnant    reference operator[](size_type __i);
12803e519524SHoward Hinnant    const_reference operator[](size_type __i) const;
12813e519524SHoward Hinnant    reference at(size_type __i);
12823e519524SHoward Hinnant    const_reference at(size_type __i) const;
12833e519524SHoward Hinnant    reference front();
12843e519524SHoward Hinnant    const_reference front() const;
12853e519524SHoward Hinnant    reference back();
12863e519524SHoward Hinnant    const_reference back() const;
12873e519524SHoward Hinnant
12883e519524SHoward Hinnant    // 23.2.2.3 modifiers:
12893e519524SHoward Hinnant    void push_front(const value_type& __v);
12903e519524SHoward Hinnant    void push_back(const value_type& __v);
12917609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
12927609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
12933e519524SHoward Hinnant    template <class... _Args> void emplace_front(_Args&&... __args);
12943e519524SHoward Hinnant    template <class... _Args> void emplace_back(_Args&&... __args);
12953e519524SHoward Hinnant    template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
12967609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
12973e519524SHoward Hinnant    void push_front(value_type&& __v);
12983e519524SHoward Hinnant    void push_back(value_type&& __v);
12993e519524SHoward Hinnant    iterator insert(const_iterator __p, value_type&& __v);
13007609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
13013e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v);
13023e519524SHoward Hinnant    iterator insert(const_iterator __p, size_type __n, const value_type& __v);
13033e519524SHoward Hinnant    template <class _InputIter>
13043e519524SHoward Hinnant        iterator insert (const_iterator __p, _InputIter __f, _InputIter __l,
13053e519524SHoward Hinnant                         typename enable_if<__is_input_iterator<_InputIter>::value
13063e519524SHoward Hinnant                                         &&!__is_bidirectional_iterator<_InputIter>::value>::type* = 0);
13073e519524SHoward Hinnant    template <class _BiIter>
13083e519524SHoward Hinnant        iterator insert (const_iterator __p, _BiIter __f, _BiIter __l,
13093e519524SHoward Hinnant                         typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type* = 0);
1310fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13113e519524SHoward Hinnant    iterator insert(const_iterator __p, initializer_list<value_type> __il)
13123e519524SHoward Hinnant        {return insert(__p, __il.begin(), __il.end());}
13133e519524SHoward Hinnant    void pop_front();
13143e519524SHoward Hinnant    void pop_back();
13153e519524SHoward Hinnant    iterator erase(const_iterator __p);
13163e519524SHoward Hinnant    iterator erase(const_iterator __f, const_iterator __l);
13173e519524SHoward Hinnant
13189eebe11dSHoward Hinnant    void swap(deque& __c)
13199eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
13209eebe11dSHoward Hinnant                   __is_nothrow_swappable<allocator_type>::value);
1321a87e8360SHoward Hinnant    void clear() _NOEXCEPT;
13223e519524SHoward Hinnant
1323fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13243e519524SHoward Hinnant    bool __invariants() const {return __base::__invariants();}
13253e519524SHoward Hinnantprivate:
1326fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13273e519524SHoward Hinnant    static size_type __recommend_blocks(size_type __n)
13283e519524SHoward Hinnant    {
13293e519524SHoward Hinnant        return __n / __base::__block_size + (__n % __base::__block_size != 0);
13303e519524SHoward Hinnant    }
1331fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13323e519524SHoward Hinnant    size_type __capacity() const
13333e519524SHoward Hinnant    {
13343e519524SHoward Hinnant        return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1;
13353e519524SHoward Hinnant    }
1336fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13373e519524SHoward Hinnant    size_type __front_spare() const
13383e519524SHoward Hinnant    {
13393e519524SHoward Hinnant        return __base::__start_;
13403e519524SHoward Hinnant    }
1341fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13423e519524SHoward Hinnant    size_type __back_spare() const
13433e519524SHoward Hinnant    {
13443e519524SHoward Hinnant        return __capacity() - (__base::__start_ + __base::size());
13453e519524SHoward Hinnant    }
13463e519524SHoward Hinnant
13473e519524SHoward Hinnant    template <class _InpIter>
13483e519524SHoward Hinnant        void __append(_InpIter __f, _InpIter __l,
13493e519524SHoward Hinnant                 typename enable_if<__is_input_iterator<_InpIter>::value &&
13503e519524SHoward Hinnant                                   !__is_forward_iterator<_InpIter>::value>::type* = 0);
13513e519524SHoward Hinnant    template <class _ForIter>
13523e519524SHoward Hinnant        void __append(_ForIter __f, _ForIter __l,
13533e519524SHoward Hinnant                      typename enable_if<__is_forward_iterator<_ForIter>::value>::type* = 0);
13543e519524SHoward Hinnant    void __append(size_type __n);
13553e519524SHoward Hinnant    void __append(size_type __n, const value_type& __v);
13563e519524SHoward Hinnant    void __erase_to_end(const_iterator __f);
13573e519524SHoward Hinnant    void __add_front_capacity();
13583e519524SHoward Hinnant    void __add_front_capacity(size_type __n);
13593e519524SHoward Hinnant    void __add_back_capacity();
13603e519524SHoward Hinnant    void __add_back_capacity(size_type __n);
13613e519524SHoward Hinnant    iterator __move_and_check(iterator __f, iterator __l, iterator __r,
13623e519524SHoward Hinnant                              const_pointer& __vt);
13633e519524SHoward Hinnant    iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r,
13643e519524SHoward Hinnant                                       const_pointer& __vt);
13653e519524SHoward Hinnant    void __move_construct_and_check(iterator __f, iterator __l,
13663e519524SHoward Hinnant                                    iterator __r, const_pointer& __vt);
13673e519524SHoward Hinnant    void __move_construct_backward_and_check(iterator __f, iterator __l,
13683e519524SHoward Hinnant                                             iterator __r, const_pointer& __vt);
13693e519524SHoward Hinnant
1370fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13713e519524SHoward Hinnant    void __copy_assign_alloc(const deque& __c)
13723e519524SHoward Hinnant        {__copy_assign_alloc(__c, integral_constant<bool,
13733e519524SHoward Hinnant                      __alloc_traits::propagate_on_container_copy_assignment::value>());}
13743e519524SHoward Hinnant
1375fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13763e519524SHoward Hinnant    void __copy_assign_alloc(const deque& __c, true_type)
13773e519524SHoward Hinnant        {
13783e519524SHoward Hinnant            if (__base::__alloc() != __c.__alloc())
13793e519524SHoward Hinnant            {
13803e519524SHoward Hinnant                clear();
13813e519524SHoward Hinnant                shrink_to_fit();
13823e519524SHoward Hinnant            }
13833e519524SHoward Hinnant            __base::__alloc() = __c.__alloc();
13843e519524SHoward Hinnant            __base::__map_.__alloc() = __c.__map_.__alloc();
13853e519524SHoward Hinnant        }
13863e519524SHoward Hinnant
1387fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13883e519524SHoward Hinnant    void __copy_assign_alloc(const deque& __c, false_type)
13893e519524SHoward Hinnant        {}
13903e519524SHoward Hinnant
1391*b58f59cdSHoward Hinnant    void __move_assign(deque& __c, true_type)
1392*b58f59cdSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
13933e519524SHoward Hinnant    void __move_assign(deque& __c, false_type);
13943e519524SHoward Hinnant};
13953e519524SHoward Hinnant
13963e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
13973e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n)
13983e519524SHoward Hinnant{
13993e519524SHoward Hinnant    if (__n > 0)
14003e519524SHoward Hinnant        __append(__n);
14013e519524SHoward Hinnant}
14023e519524SHoward Hinnant
14033e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14043e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)
14053e519524SHoward Hinnant{
14063e519524SHoward Hinnant    if (__n > 0)
14073e519524SHoward Hinnant        __append(__n, __v);
14083e519524SHoward Hinnant}
14093e519524SHoward Hinnant
14103e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14113e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a)
14123e519524SHoward Hinnant    : __base(__a)
14133e519524SHoward Hinnant{
14143e519524SHoward Hinnant    if (__n > 0)
14153e519524SHoward Hinnant        __append(__n, __v);
14163e519524SHoward Hinnant}
14173e519524SHoward Hinnant
14183e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14193e519524SHoward Hinnanttemplate <class _InputIter>
14203e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l,
14213e519524SHoward Hinnant              typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
14223e519524SHoward Hinnant{
14233e519524SHoward Hinnant    __append(__f, __l);
14243e519524SHoward Hinnant}
14253e519524SHoward Hinnant
14263e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14273e519524SHoward Hinnanttemplate <class _InputIter>
14283e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
14293e519524SHoward Hinnant              typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
14303e519524SHoward Hinnant    : __base(__a)
14313e519524SHoward Hinnant{
14323e519524SHoward Hinnant    __append(__f, __l);
14333e519524SHoward Hinnant}
14343e519524SHoward Hinnant
14353e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14363e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(const deque& __c)
14373e519524SHoward Hinnant    : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc()))
14383e519524SHoward Hinnant{
14393e519524SHoward Hinnant    __append(__c.begin(), __c.end());
14403e519524SHoward Hinnant}
14413e519524SHoward Hinnant
14423e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14433e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(const deque& __c, const allocator_type& __a)
14443e519524SHoward Hinnant    : __base(__a)
14453e519524SHoward Hinnant{
14463e519524SHoward Hinnant    __append(__c.begin(), __c.end());
14473e519524SHoward Hinnant}
14483e519524SHoward Hinnant
14493e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14503e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il)
14513e519524SHoward Hinnant{
14523e519524SHoward Hinnant    __append(__il.begin(), __il.end());
14533e519524SHoward Hinnant}
14543e519524SHoward Hinnant
14553e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14563e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a)
14573e519524SHoward Hinnant    : __base(__a)
14583e519524SHoward Hinnant{
14593e519524SHoward Hinnant    __append(__il.begin(), __il.end());
14603e519524SHoward Hinnant}
14613e519524SHoward Hinnant
14623e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
14633e519524SHoward Hinnantdeque<_Tp, _Allocator>&
14643e519524SHoward Hinnantdeque<_Tp, _Allocator>::operator=(const deque& __c)
14653e519524SHoward Hinnant{
14663e519524SHoward Hinnant    if (this != &__c)
14673e519524SHoward Hinnant    {
14683e519524SHoward Hinnant        __copy_assign_alloc(__c);
14693e519524SHoward Hinnant        assign(__c.begin(), __c.end());
14703e519524SHoward Hinnant    }
14713e519524SHoward Hinnant    return *this;
14723e519524SHoward Hinnant}
14733e519524SHoward Hinnant
14747609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
14753e519524SHoward Hinnant
14763e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1477fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14783e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(deque&& __c)
14799eebe11dSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
14803e519524SHoward Hinnant    : __base(_STD::move(__c))
14813e519524SHoward Hinnant{
14823e519524SHoward Hinnant}
14833e519524SHoward Hinnant
14843e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1485fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14863e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a)
14873e519524SHoward Hinnant    : __base(_STD::move(__c), __a)
14883e519524SHoward Hinnant{
14893e519524SHoward Hinnant    if (__a != __c.__alloc())
14903e519524SHoward Hinnant    {
14913e519524SHoward Hinnant        typedef move_iterator<iterator> _I;
14923e519524SHoward Hinnant        assign(_I(__c.begin()), _I(__c.end()));
14933e519524SHoward Hinnant    }
14943e519524SHoward Hinnant}
14953e519524SHoward Hinnant
14963e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1497fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14983e519524SHoward Hinnantdeque<_Tp, _Allocator>&
14993e519524SHoward Hinnantdeque<_Tp, _Allocator>::operator=(deque&& __c)
1500*b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1501*b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
15023e519524SHoward Hinnant{
15033e519524SHoward Hinnant    __move_assign(__c, integral_constant<bool,
15043e519524SHoward Hinnant          __alloc_traits::propagate_on_container_move_assignment::value>());
15053e519524SHoward Hinnant    return *this;
15063e519524SHoward Hinnant}
15073e519524SHoward Hinnant
15083e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15093e519524SHoward Hinnantvoid
15103e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_assign(deque& __c, false_type)
15113e519524SHoward Hinnant{
15123e519524SHoward Hinnant    if (__base::__alloc() != __c.__alloc())
15133e519524SHoward Hinnant    {
15143e519524SHoward Hinnant        typedef move_iterator<iterator> _I;
15153e519524SHoward Hinnant        assign(_I(__c.begin()), _I(__c.end()));
15163e519524SHoward Hinnant    }
15173e519524SHoward Hinnant    else
15183e519524SHoward Hinnant        __move_assign(__c, true_type());
15193e519524SHoward Hinnant}
15203e519524SHoward Hinnant
15213e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15223e519524SHoward Hinnantvoid
15233e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_assign(deque& __c, true_type)
1524*b58f59cdSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
15253e519524SHoward Hinnant{
15263e519524SHoward Hinnant    clear();
15273e519524SHoward Hinnant    shrink_to_fit();
15283e519524SHoward Hinnant    __base::__move_assign(__c);
15293e519524SHoward Hinnant}
15303e519524SHoward Hinnant
15317609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
15323e519524SHoward Hinnant
15333e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15343e519524SHoward Hinnanttemplate <class _InputIter>
15353e519524SHoward Hinnantvoid
15363e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
15373e519524SHoward Hinnant                               typename enable_if<__is_input_iterator<_InputIter>::value &&
15383e519524SHoward Hinnant                                                 !__is_random_access_iterator<_InputIter>::value>::type*)
15393e519524SHoward Hinnant{
15403e519524SHoward Hinnant    iterator __i = __base::begin();
15413e519524SHoward Hinnant    iterator __e = __base::end();
15423e519524SHoward Hinnant    for (; __f != __l && __i != __e; ++__f, ++__i)
15433e519524SHoward Hinnant        *__i = *__f;
15443e519524SHoward Hinnant    if (__f != __l)
15453e519524SHoward Hinnant        __append(__f, __l);
15463e519524SHoward Hinnant    else
15473e519524SHoward Hinnant        __erase_to_end(__i);
15483e519524SHoward Hinnant}
15493e519524SHoward Hinnant
15503e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15513e519524SHoward Hinnanttemplate <class _RAIter>
15523e519524SHoward Hinnantvoid
15533e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l,
15543e519524SHoward Hinnant                               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
15553e519524SHoward Hinnant{
15563e519524SHoward Hinnant    if (static_cast<size_type>(__l - __f) > __base::size())
15573e519524SHoward Hinnant    {
15583e519524SHoward Hinnant        _RAIter __m = __f + __base::size();
15593e519524SHoward Hinnant        _STD::copy(__f, __m, __base::begin());
15603e519524SHoward Hinnant        __append(__m, __l);
15613e519524SHoward Hinnant    }
15623e519524SHoward Hinnant    else
15633e519524SHoward Hinnant        __erase_to_end(_STD::copy(__f, __l, __base::begin()));
15643e519524SHoward Hinnant}
15653e519524SHoward Hinnant
15663e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15673e519524SHoward Hinnantvoid
15683e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v)
15693e519524SHoward Hinnant{
15703e519524SHoward Hinnant    if (__n > __base::size())
15713e519524SHoward Hinnant    {
15723e519524SHoward Hinnant        _STD::fill_n(__base::begin(), __base::size(), __v);
15733e519524SHoward Hinnant        __n -= __base::size();
15743e519524SHoward Hinnant        __append(__n, __v);
15753e519524SHoward Hinnant    }
15763e519524SHoward Hinnant    else
15773e519524SHoward Hinnant        __erase_to_end(_STD::fill_n(__base::begin(), __n, __v));
15783e519524SHoward Hinnant}
15793e519524SHoward Hinnant
15803e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1581fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15823e519524SHoward Hinnant_Allocator
1583a87e8360SHoward Hinnantdeque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
15843e519524SHoward Hinnant{
15853e519524SHoward Hinnant    return __base::__alloc();
15863e519524SHoward Hinnant}
15873e519524SHoward Hinnant
15883e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15893e519524SHoward Hinnantvoid
15903e519524SHoward Hinnantdeque<_Tp, _Allocator>::resize(size_type __n)
15913e519524SHoward Hinnant{
15923e519524SHoward Hinnant    if (__n > __base::size())
15933e519524SHoward Hinnant        __append(__n - __base::size());
15943e519524SHoward Hinnant    else if (__n < __base::size())
15953e519524SHoward Hinnant        __erase_to_end(__base::begin() + __n);
15963e519524SHoward Hinnant}
15973e519524SHoward Hinnant
15983e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15993e519524SHoward Hinnantvoid
16003e519524SHoward Hinnantdeque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v)
16013e519524SHoward Hinnant{
16023e519524SHoward Hinnant    if (__n > __base::size())
16033e519524SHoward Hinnant        __append(__n - __base::size(), __v);
16043e519524SHoward Hinnant    else if (__n < __base::size())
16053e519524SHoward Hinnant        __erase_to_end(__base::begin() + __n);
16063e519524SHoward Hinnant}
16073e519524SHoward Hinnant
16083e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16093e519524SHoward Hinnantvoid
1610*b58f59cdSHoward Hinnantdeque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
16113e519524SHoward Hinnant{
16123e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
16133e519524SHoward Hinnant    if (empty())
16143e519524SHoward Hinnant    {
16153e519524SHoward Hinnant        while (__base::__map_.size() > 0)
16163e519524SHoward Hinnant        {
16173e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
16183e519524SHoward Hinnant            __base::__map_.pop_back();
16193e519524SHoward Hinnant        }
16203e519524SHoward Hinnant        __base::__start_ = 0;
16213e519524SHoward Hinnant    }
16223e519524SHoward Hinnant    else
16233e519524SHoward Hinnant    {
16243e519524SHoward Hinnant        if (__front_spare() >= __base::__block_size)
16253e519524SHoward Hinnant        {
16263e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
16273e519524SHoward Hinnant            __base::__map_.pop_front();
16283e519524SHoward Hinnant            __base::__start_ -= __base::__block_size;
16293e519524SHoward Hinnant        }
16303e519524SHoward Hinnant        if (__back_spare() >= __base::__block_size)
16313e519524SHoward Hinnant        {
16323e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
16333e519524SHoward Hinnant            __base::__map_.pop_back();
16343e519524SHoward Hinnant        }
16353e519524SHoward Hinnant    }
16363e519524SHoward Hinnant    __base::__map_.shrink_to_fit();
16373e519524SHoward Hinnant}
16383e519524SHoward Hinnant
16393e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1640fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16413e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
16423e519524SHoward Hinnantdeque<_Tp, _Allocator>::operator[](size_type __i)
16433e519524SHoward Hinnant{
16443e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
16453e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
16463e519524SHoward Hinnant}
16473e519524SHoward Hinnant
16483e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1649fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16503e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
16513e519524SHoward Hinnantdeque<_Tp, _Allocator>::operator[](size_type __i) const
16523e519524SHoward Hinnant{
16533e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
16543e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
16553e519524SHoward Hinnant}
16563e519524SHoward Hinnant
16573e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1658fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16593e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
16603e519524SHoward Hinnantdeque<_Tp, _Allocator>::at(size_type __i)
16613e519524SHoward Hinnant{
16623e519524SHoward Hinnant    if (__i >= __base::size())
16633e519524SHoward Hinnant        __base::__throw_out_of_range();
16643e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
16653e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
16663e519524SHoward Hinnant}
16673e519524SHoward Hinnant
16683e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1669fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16703e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
16713e519524SHoward Hinnantdeque<_Tp, _Allocator>::at(size_type __i) const
16723e519524SHoward Hinnant{
16733e519524SHoward Hinnant    if (__i >= __base::size())
16743e519524SHoward Hinnant        __base::__throw_out_of_range();
16753e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
16763e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
16773e519524SHoward Hinnant}
16783e519524SHoward Hinnant
16793e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1680fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16813e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
16823e519524SHoward Hinnantdeque<_Tp, _Allocator>::front()
16833e519524SHoward Hinnant{
16843e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
16853e519524SHoward Hinnant                                      + __base::__start_ % __base::__block_size);
16863e519524SHoward Hinnant}
16873e519524SHoward Hinnant
16883e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1689fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16903e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
16913e519524SHoward Hinnantdeque<_Tp, _Allocator>::front() const
16923e519524SHoward Hinnant{
16933e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
16943e519524SHoward Hinnant                                      + __base::__start_ % __base::__block_size);
16953e519524SHoward Hinnant}
16963e519524SHoward Hinnant
16973e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1698fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16993e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
17003e519524SHoward Hinnantdeque<_Tp, _Allocator>::back()
17013e519524SHoward Hinnant{
17023e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
17033e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
17043e519524SHoward Hinnant}
17053e519524SHoward Hinnant
17063e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1707fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
17083e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
17093e519524SHoward Hinnantdeque<_Tp, _Allocator>::back() const
17103e519524SHoward Hinnant{
17113e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
17123e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
17133e519524SHoward Hinnant}
17143e519524SHoward Hinnant
17153e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17163e519524SHoward Hinnantvoid
17173e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_back(const value_type& __v)
17183e519524SHoward Hinnant{
17193e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
17203e519524SHoward Hinnant    if (__back_spare() == 0)
17213e519524SHoward Hinnant        __add_back_capacity();
17223e519524SHoward Hinnant    // __back_spare() >= 1
172372c5e142SHoward Hinnant    __alloc_traits::construct(__a, _STD::addressof(*__base::end()), __v);
17243e519524SHoward Hinnant    ++__base::size();
17253e519524SHoward Hinnant}
17263e519524SHoward Hinnant
17277609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
17283e519524SHoward Hinnant
17293e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17303e519524SHoward Hinnantvoid
17313e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_back(value_type&& __v)
17323e519524SHoward Hinnant{
17333e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
17343e519524SHoward Hinnant    if (__back_spare() == 0)
17353e519524SHoward Hinnant        __add_back_capacity();
17363e519524SHoward Hinnant    // __back_spare() >= 1
173772c5e142SHoward Hinnant    __alloc_traits::construct(__a, _STD::addressof(*__base::end()), _STD::move(__v));
17383e519524SHoward Hinnant    ++__base::size();
17393e519524SHoward Hinnant}
17403e519524SHoward Hinnant
17417609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
17427609c9b6SHoward Hinnant
17433e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17443e519524SHoward Hinnanttemplate <class... _Args>
17453e519524SHoward Hinnantvoid
17463e519524SHoward Hinnantdeque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
17473e519524SHoward Hinnant{
17483e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
17493e519524SHoward Hinnant    if (__back_spare() == 0)
17503e519524SHoward Hinnant        __add_back_capacity();
17513e519524SHoward Hinnant    // __back_spare() >= 1
175272c5e142SHoward Hinnant    __alloc_traits::construct(__a, _STD::addressof(*__base::end()), _STD::forward<_Args>(__args)...);
17533e519524SHoward Hinnant    ++__base::size();
17543e519524SHoward Hinnant}
17553e519524SHoward Hinnant
17567609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
17577609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
17583e519524SHoward Hinnant
17593e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17603e519524SHoward Hinnantvoid
17613e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_front(const value_type& __v)
17623e519524SHoward Hinnant{
17633e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
17643e519524SHoward Hinnant    if (__front_spare() == 0)
17653e519524SHoward Hinnant        __add_front_capacity();
17663e519524SHoward Hinnant    // __front_spare() >= 1
176772c5e142SHoward Hinnant    __alloc_traits::construct(__a, _STD::addressof(*--__base::begin()), __v);
17683e519524SHoward Hinnant    --__base::__start_;
17693e519524SHoward Hinnant    ++__base::size();
17703e519524SHoward Hinnant}
17713e519524SHoward Hinnant
17727609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
17733e519524SHoward Hinnant
17743e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17753e519524SHoward Hinnantvoid
17763e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_front(value_type&& __v)
17773e519524SHoward Hinnant{
17783e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
17793e519524SHoward Hinnant    if (__front_spare() == 0)
17803e519524SHoward Hinnant        __add_front_capacity();
17813e519524SHoward Hinnant    // __front_spare() >= 1
178272c5e142SHoward Hinnant    __alloc_traits::construct(__a, _STD::addressof(*--__base::begin()), _STD::move(__v));
17833e519524SHoward Hinnant    --__base::__start_;
17843e519524SHoward Hinnant    ++__base::size();
17853e519524SHoward Hinnant}
17863e519524SHoward Hinnant
17877609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
17887609c9b6SHoward Hinnant
17893e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17903e519524SHoward Hinnanttemplate <class... _Args>
17913e519524SHoward Hinnantvoid
17923e519524SHoward Hinnantdeque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
17933e519524SHoward Hinnant{
17943e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
17953e519524SHoward Hinnant    if (__front_spare() == 0)
17963e519524SHoward Hinnant        __add_front_capacity();
17973e519524SHoward Hinnant    // __front_spare() >= 1
179872c5e142SHoward Hinnant    __alloc_traits::construct(__a, _STD::addressof(*--__base::begin()), _STD::forward<_Args>(__args)...);
17993e519524SHoward Hinnant    --__base::__start_;
18003e519524SHoward Hinnant    ++__base::size();
18013e519524SHoward Hinnant}
18023e519524SHoward Hinnant
18037609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
18047609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
18053e519524SHoward Hinnant
18063e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
18073e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
18083e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v)
18093e519524SHoward Hinnant{
18103e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
18113e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
18123e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
18133e519524SHoward Hinnant    if (__pos < __to_end)
18143e519524SHoward Hinnant    {   // insert by shifting things backward
18153e519524SHoward Hinnant        if (__front_spare() == 0)
18163e519524SHoward Hinnant            __add_front_capacity();
18173e519524SHoward Hinnant        // __front_spare() >= 1
18183e519524SHoward Hinnant        if (__pos == 0)
18193e519524SHoward Hinnant        {
182072c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*--__base::begin()), __v);
18213e519524SHoward Hinnant            --__base::__start_;
18223e519524SHoward Hinnant            ++__base::size();
18233e519524SHoward Hinnant        }
18243e519524SHoward Hinnant        else
18253e519524SHoward Hinnant        {
18263e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
18273e519524SHoward Hinnant            iterator __b = __base::begin();
1828a0fe8c43SHoward Hinnant            iterator __bm1 = _STD::prev(__b);
18293e519524SHoward Hinnant            if (__vt == pointer_traits<const_pointer>::pointer_to(*__b))
18303e519524SHoward Hinnant                __vt = pointer_traits<const_pointer>::pointer_to(*__bm1);
183172c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__bm1), _STD::move(*__b));
18323e519524SHoward Hinnant            --__base::__start_;
18333e519524SHoward Hinnant            ++__base::size();
18343e519524SHoward Hinnant            if (__pos > 1)
18356c38001eSDouglas Gregor                __b = __move_and_check(_STD::next(__b), __b + __pos, __b, __vt);
18363e519524SHoward Hinnant            *__b = *__vt;
18373e519524SHoward Hinnant        }
18383e519524SHoward Hinnant    }
18393e519524SHoward Hinnant    else
18403e519524SHoward Hinnant    {   // insert by shifting things forward
18413e519524SHoward Hinnant        if (__back_spare() == 0)
18423e519524SHoward Hinnant            __add_back_capacity();
18433e519524SHoward Hinnant        // __back_capacity >= 1
18443e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
18453e519524SHoward Hinnant        if (__de == 0)
18463e519524SHoward Hinnant        {
184772c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__base::end()), __v);
18483e519524SHoward Hinnant            ++__base::size();
18493e519524SHoward Hinnant        }
18503e519524SHoward Hinnant        else
18513e519524SHoward Hinnant        {
18523e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
18533e519524SHoward Hinnant            iterator __e = __base::end();
1854a0fe8c43SHoward Hinnant            iterator __em1 = _STD::prev(__e);
18553e519524SHoward Hinnant            if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1))
18563e519524SHoward Hinnant                __vt = pointer_traits<const_pointer>::pointer_to(*__e);
185772c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__e), _STD::move(*__em1));
18583e519524SHoward Hinnant            ++__base::size();
18593e519524SHoward Hinnant            if (__de > 1)
18603e519524SHoward Hinnant                __e = __move_backward_and_check(__e - __de, __em1, __e, __vt);
18613e519524SHoward Hinnant            *--__e = *__vt;
18623e519524SHoward Hinnant        }
18633e519524SHoward Hinnant    }
18643e519524SHoward Hinnant    return __base::begin() + __pos;
18653e519524SHoward Hinnant}
18663e519524SHoward Hinnant
18677609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
18683e519524SHoward Hinnant
18693e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
18703e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
18713e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v)
18723e519524SHoward Hinnant{
18733e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
18743e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
18753e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
18763e519524SHoward Hinnant    if (__pos < __to_end)
18773e519524SHoward Hinnant    {   // insert by shifting things backward
18783e519524SHoward Hinnant        if (__front_spare() == 0)
18793e519524SHoward Hinnant            __add_front_capacity();
18803e519524SHoward Hinnant        // __front_spare() >= 1
18813e519524SHoward Hinnant        if (__pos == 0)
18823e519524SHoward Hinnant        {
188372c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*--__base::begin()), _STD::move(__v));
18843e519524SHoward Hinnant            --__base::__start_;
18853e519524SHoward Hinnant            ++__base::size();
18863e519524SHoward Hinnant        }
18873e519524SHoward Hinnant        else
18883e519524SHoward Hinnant        {
18893e519524SHoward Hinnant            iterator __b = __base::begin();
1890a0fe8c43SHoward Hinnant            iterator __bm1 = _STD::prev(__b);
189172c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__bm1), _STD::move(*__b));
18923e519524SHoward Hinnant            --__base::__start_;
18933e519524SHoward Hinnant            ++__base::size();
18943e519524SHoward Hinnant            if (__pos > 1)
18956c38001eSDouglas Gregor                __b = _STD::move(_STD::next(__b), __b + __pos, __b);
18963e519524SHoward Hinnant            *__b = _STD::move(__v);
18973e519524SHoward Hinnant        }
18983e519524SHoward Hinnant    }
18993e519524SHoward Hinnant    else
19003e519524SHoward Hinnant    {   // insert by shifting things forward
19013e519524SHoward Hinnant        if (__back_spare() == 0)
19023e519524SHoward Hinnant            __add_back_capacity();
19033e519524SHoward Hinnant        // __back_capacity >= 1
19043e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
19053e519524SHoward Hinnant        if (__de == 0)
19063e519524SHoward Hinnant        {
190772c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__base::end()), _STD::move(__v));
19083e519524SHoward Hinnant            ++__base::size();
19093e519524SHoward Hinnant        }
19103e519524SHoward Hinnant        else
19113e519524SHoward Hinnant        {
19123e519524SHoward Hinnant            iterator __e = __base::end();
1913a0fe8c43SHoward Hinnant            iterator __em1 = _STD::prev(__e);
191472c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__e), _STD::move(*__em1));
19153e519524SHoward Hinnant            ++__base::size();
19163e519524SHoward Hinnant            if (__de > 1)
19173e519524SHoward Hinnant                __e = _STD::move_backward(__e - __de, __em1, __e);
19183e519524SHoward Hinnant            *--__e = _STD::move(__v);
19193e519524SHoward Hinnant        }
19203e519524SHoward Hinnant    }
19213e519524SHoward Hinnant    return __base::begin() + __pos;
19223e519524SHoward Hinnant}
19233e519524SHoward Hinnant
19247609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS
19257609c9b6SHoward Hinnant
19263e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19273e519524SHoward Hinnanttemplate <class... _Args>
19283e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
19293e519524SHoward Hinnantdeque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args)
19303e519524SHoward Hinnant{
19313e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
19323e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
19333e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19343e519524SHoward Hinnant    if (__pos < __to_end)
19353e519524SHoward Hinnant    {   // insert by shifting things backward
19363e519524SHoward Hinnant        if (__front_spare() == 0)
19373e519524SHoward Hinnant            __add_front_capacity();
19383e519524SHoward Hinnant        // __front_spare() >= 1
19393e519524SHoward Hinnant        if (__pos == 0)
19403e519524SHoward Hinnant        {
194172c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*--__base::begin()), _STD::forward<_Args>(__args)...);
19423e519524SHoward Hinnant            --__base::__start_;
19433e519524SHoward Hinnant            ++__base::size();
19443e519524SHoward Hinnant        }
19453e519524SHoward Hinnant        else
19463e519524SHoward Hinnant        {
19473e519524SHoward Hinnant            iterator __b = __base::begin();
1948a0fe8c43SHoward Hinnant            iterator __bm1 = _STD::prev(__b);
194972c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__bm1), _STD::move(*__b));
19503e519524SHoward Hinnant            --__base::__start_;
19513e519524SHoward Hinnant            ++__base::size();
19523e519524SHoward Hinnant            if (__pos > 1)
19536c38001eSDouglas Gregor                __b = _STD::move(_STD::next(__b), __b + __pos, __b);
19543e519524SHoward Hinnant            *__b = value_type(_STD::forward<_Args>(__args)...);
19553e519524SHoward Hinnant        }
19563e519524SHoward Hinnant    }
19573e519524SHoward Hinnant    else
19583e519524SHoward Hinnant    {   // insert by shifting things forward
19593e519524SHoward Hinnant        if (__back_spare() == 0)
19603e519524SHoward Hinnant            __add_back_capacity();
19613e519524SHoward Hinnant        // __back_capacity >= 1
19623e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
19633e519524SHoward Hinnant        if (__de == 0)
19643e519524SHoward Hinnant        {
196572c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__base::end()), _STD::forward<_Args>(__args)...);
19663e519524SHoward Hinnant            ++__base::size();
19673e519524SHoward Hinnant        }
19683e519524SHoward Hinnant        else
19693e519524SHoward Hinnant        {
19703e519524SHoward Hinnant            iterator __e = __base::end();
1971a0fe8c43SHoward Hinnant            iterator __em1 = _STD::prev(__e);
197272c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__e), _STD::move(*__em1));
19733e519524SHoward Hinnant            ++__base::size();
19743e519524SHoward Hinnant            if (__de > 1)
19753e519524SHoward Hinnant                __e = _STD::move_backward(__e - __de, __em1, __e);
19763e519524SHoward Hinnant            *--__e = value_type(_STD::forward<_Args>(__args)...);
19773e519524SHoward Hinnant        }
19783e519524SHoward Hinnant    }
19793e519524SHoward Hinnant    return __base::begin() + __pos;
19803e519524SHoward Hinnant}
19813e519524SHoward Hinnant
19827609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_VARIADICS
19837609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
19843e519524SHoward Hinnant
19853e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19863e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
19873e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v)
19883e519524SHoward Hinnant{
19893e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
19903e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
19913e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19923e519524SHoward Hinnant    if (__pos < __to_end)
19933e519524SHoward Hinnant    {   // insert by shifting things backward
19943e519524SHoward Hinnant        if (__n > __front_spare())
19953e519524SHoward Hinnant            __add_front_capacity(__n - __front_spare());
19963e519524SHoward Hinnant        // __n <= __front_spare()
19973e519524SHoward Hinnant        size_type __old_n = __n;
19983e519524SHoward Hinnant        iterator __old_begin = __base::begin();
19993e519524SHoward Hinnant        iterator __i = __old_begin;
20003e519524SHoward Hinnant        if (__n > __pos)
20013e519524SHoward Hinnant        {
20023e519524SHoward Hinnant            for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size())
200372c5e142SHoward Hinnant                __alloc_traits::construct(__a, _STD::addressof(*--__i), __v);
20043e519524SHoward Hinnant            __n = __pos;
20053e519524SHoward Hinnant        }
20063e519524SHoward Hinnant        if (__n > 0)
20073e519524SHoward Hinnant        {
20083e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
20093e519524SHoward Hinnant            iterator __obn = __old_begin + __n;
20103e519524SHoward Hinnant            __move_construct_backward_and_check(__old_begin, __obn, __i, __vt);
20113e519524SHoward Hinnant            if (__n < __pos)
20123e519524SHoward Hinnant                __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt);
20133e519524SHoward Hinnant            _STD::fill_n(__old_begin, __n, *__vt);
20143e519524SHoward Hinnant        }
20153e519524SHoward Hinnant    }
20163e519524SHoward Hinnant    else
20173e519524SHoward Hinnant    {   // insert by shifting things forward
20183e519524SHoward Hinnant        size_type __back_capacity = __back_spare();
20193e519524SHoward Hinnant        if (__n > __back_capacity)
20203e519524SHoward Hinnant            __add_back_capacity(__n - __back_capacity);
20213e519524SHoward Hinnant        // __n <= __back_capacity
20223e519524SHoward Hinnant        size_type __old_n = __n;
20233e519524SHoward Hinnant        iterator __old_end = __base::end();
20243e519524SHoward Hinnant        iterator __i = __old_end;
20253e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
20263e519524SHoward Hinnant        if (__n > __de)
20273e519524SHoward Hinnant        {
20283e519524SHoward Hinnant            for (size_type __m = __n - __de; __m; --__m, ++__i, ++__base::size())
202972c5e142SHoward Hinnant                __alloc_traits::construct(__a, _STD::addressof(*__i), __v);
20303e519524SHoward Hinnant            __n = __de;
20313e519524SHoward Hinnant        }
20323e519524SHoward Hinnant        if (__n > 0)
20333e519524SHoward Hinnant        {
20343e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
20353e519524SHoward Hinnant            iterator __oen = __old_end - __n;
20363e519524SHoward Hinnant            __move_construct_and_check(__oen, __old_end, __i, __vt);
20373e519524SHoward Hinnant            if (__n < __de)
20383e519524SHoward Hinnant                __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt);
20393e519524SHoward Hinnant            _STD::fill_n(__old_end - __n, __n, *__vt);
20403e519524SHoward Hinnant        }
20413e519524SHoward Hinnant    }
20423e519524SHoward Hinnant    return __base::begin() + __pos;
20433e519524SHoward Hinnant}
20443e519524SHoward Hinnant
20453e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
20463e519524SHoward Hinnanttemplate <class _InputIter>
20473e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
20483e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l,
20493e519524SHoward Hinnant                               typename enable_if<__is_input_iterator<_InputIter>::value
20503e519524SHoward Hinnant                                               &&!__is_bidirectional_iterator<_InputIter>::value>::type*)
20513e519524SHoward Hinnant{
20523e519524SHoward Hinnant    __split_buffer<value_type, allocator_type&> __buf(__base::__alloc());
20533e519524SHoward Hinnant    __buf.__construct_at_end(__f, __l);
20543e519524SHoward Hinnant    typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi;
20553e519524SHoward Hinnant    return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end()));
20563e519524SHoward Hinnant}
20573e519524SHoward Hinnant
20583e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
20593e519524SHoward Hinnanttemplate <class _BiIter>
20603e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
20613e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
20623e519524SHoward Hinnant                               typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type*)
20633e519524SHoward Hinnant{
20643e519524SHoward Hinnant    size_type __n = _STD::distance(__f, __l);
20653e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
20663e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
20673e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
20683e519524SHoward Hinnant    if (__pos < __to_end)
20693e519524SHoward Hinnant    {   // insert by shifting things backward
20703e519524SHoward Hinnant        if (__n > __front_spare())
20713e519524SHoward Hinnant            __add_front_capacity(__n - __front_spare());
20723e519524SHoward Hinnant        // __n <= __front_spare()
20733e519524SHoward Hinnant        size_type __old_n = __n;
20743e519524SHoward Hinnant        iterator __old_begin = __base::begin();
20753e519524SHoward Hinnant        iterator __i = __old_begin;
20763e519524SHoward Hinnant        _BiIter __m = __f;
20773e519524SHoward Hinnant        if (__n > __pos)
20783e519524SHoward Hinnant        {
20793e519524SHoward Hinnant            __m = __pos < __n / 2 ? _STD::prev(__l, __pos) : _STD::next(__f, __n - __pos);
20803e519524SHoward Hinnant            for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size())
208172c5e142SHoward Hinnant                __alloc_traits::construct(__a, _STD::addressof(*--__i), *--__j);
20823e519524SHoward Hinnant            __n = __pos;
20833e519524SHoward Hinnant        }
20843e519524SHoward Hinnant        if (__n > 0)
20853e519524SHoward Hinnant        {
20863e519524SHoward Hinnant            iterator __obn = __old_begin + __n;
20873e519524SHoward Hinnant            for (iterator __j = __obn; __j != __old_begin;)
20883e519524SHoward Hinnant            {
208972c5e142SHoward Hinnant                __alloc_traits::construct(__a, _STD::addressof(*--__i), _STD::move(*--__j));
20903e519524SHoward Hinnant                --__base::__start_;
20913e519524SHoward Hinnant                ++__base::size();
20923e519524SHoward Hinnant            }
20933e519524SHoward Hinnant            if (__n < __pos)
20943e519524SHoward Hinnant                __old_begin = _STD::move(__obn, __old_begin + __pos, __old_begin);
20953e519524SHoward Hinnant            _STD::copy(__m, __l, __old_begin);
20963e519524SHoward Hinnant        }
20973e519524SHoward Hinnant    }
20983e519524SHoward Hinnant    else
20993e519524SHoward Hinnant    {   // insert by shifting things forward
21003e519524SHoward Hinnant        size_type __back_capacity = __back_spare();
21013e519524SHoward Hinnant        if (__n > __back_capacity)
21023e519524SHoward Hinnant            __add_back_capacity(__n - __back_capacity);
21033e519524SHoward Hinnant        // __n <= __back_capacity
21043e519524SHoward Hinnant        size_type __old_n = __n;
21053e519524SHoward Hinnant        iterator __old_end = __base::end();
21063e519524SHoward Hinnant        iterator __i = __old_end;
21073e519524SHoward Hinnant        _BiIter __m = __l;
21083e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
21093e519524SHoward Hinnant        if (__n > __de)
21103e519524SHoward Hinnant        {
21113e519524SHoward Hinnant            __m = __de < __n / 2 ? _STD::next(__f, __de) : _STD::prev(__l, __n - __de);
21123e519524SHoward Hinnant            for (_BiIter __j = __m; __j != __l; ++__i, ++__j, ++__base::size())
211372c5e142SHoward Hinnant                __alloc_traits::construct(__a, _STD::addressof(*__i), *__j);
21143e519524SHoward Hinnant            __n = __de;
21153e519524SHoward Hinnant        }
21163e519524SHoward Hinnant        if (__n > 0)
21173e519524SHoward Hinnant        {
21183e519524SHoward Hinnant            iterator __oen = __old_end - __n;
21193e519524SHoward Hinnant            for (iterator __j = __oen; __j != __old_end; ++__i, ++__j, ++__base::size())
212072c5e142SHoward Hinnant                __alloc_traits::construct(__a, _STD::addressof(*__i), _STD::move(*__j));
21213e519524SHoward Hinnant            if (__n < __de)
21223e519524SHoward Hinnant                __old_end = _STD::move_backward(__old_end - __de, __oen, __old_end);
21233e519524SHoward Hinnant            _STD::copy_backward(__f, __m, __old_end);
21243e519524SHoward Hinnant        }
21253e519524SHoward Hinnant    }
21263e519524SHoward Hinnant    return __base::begin() + __pos;
21273e519524SHoward Hinnant}
21283e519524SHoward Hinnant
21293e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21303e519524SHoward Hinnanttemplate <class _InpIter>
21313e519524SHoward Hinnantvoid
21323e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l,
21333e519524SHoward Hinnant                                 typename enable_if<__is_input_iterator<_InpIter>::value &&
21343e519524SHoward Hinnant                                                   !__is_forward_iterator<_InpIter>::value>::type*)
21353e519524SHoward Hinnant{
21363e519524SHoward Hinnant    for (; __f != __l; ++__f)
21373e519524SHoward Hinnant        push_back(*__f);
21383e519524SHoward Hinnant}
21393e519524SHoward Hinnant
21403e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21413e519524SHoward Hinnanttemplate <class _ForIter>
21423e519524SHoward Hinnantvoid
21433e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
21443e519524SHoward Hinnant                                 typename enable_if<__is_forward_iterator<_ForIter>::value>::type*)
21453e519524SHoward Hinnant{
21463e519524SHoward Hinnant    size_type __n = _STD::distance(__f, __l);
21473e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
21483e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
21493e519524SHoward Hinnant    if (__n > __back_capacity)
21503e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
21513e519524SHoward Hinnant    // __n <= __back_capacity
21523e519524SHoward Hinnant    for (iterator __i = __base::end(); __f != __l; ++__i, ++__f, ++__base::size())
215372c5e142SHoward Hinnant        __alloc_traits::construct(__a, _STD::addressof(*__i), *__f);
21543e519524SHoward Hinnant}
21553e519524SHoward Hinnant
21563e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21573e519524SHoward Hinnantvoid
21583e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(size_type __n)
21593e519524SHoward Hinnant{
21603e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
21613e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
21623e519524SHoward Hinnant    if (__n > __back_capacity)
21633e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
21643e519524SHoward Hinnant    // __n <= __back_capacity
21653e519524SHoward Hinnant    for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
216672c5e142SHoward Hinnant        __alloc_traits::construct(__a, _STD::addressof(*__i));
21673e519524SHoward Hinnant}
21683e519524SHoward Hinnant
21693e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21703e519524SHoward Hinnantvoid
21713e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v)
21723e519524SHoward Hinnant{
21733e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
21743e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
21753e519524SHoward Hinnant    if (__n > __back_capacity)
21763e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
21773e519524SHoward Hinnant    // __n <= __back_capacity
21783e519524SHoward Hinnant    for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
217972c5e142SHoward Hinnant        __alloc_traits::construct(__a, _STD::addressof(*__i), __v);
21803e519524SHoward Hinnant}
21813e519524SHoward Hinnant
21823e519524SHoward Hinnant// Create front capacity for one block of elements.
21833e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
21843e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21853e519524SHoward Hinnantvoid
21863e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_front_capacity()
21873e519524SHoward Hinnant{
21883e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
21893e519524SHoward Hinnant    if (__back_spare() >= __base::__block_size)
21903e519524SHoward Hinnant    {
21913e519524SHoward Hinnant        __base::__start_ += __base::__block_size;
21923e519524SHoward Hinnant        pointer __pt = __base::__map_.back();
21933e519524SHoward Hinnant        __base::__map_.pop_back();
21943e519524SHoward Hinnant        __base::__map_.push_front(__pt);
21953e519524SHoward Hinnant    }
21963e519524SHoward Hinnant    // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer
21973e519524SHoward Hinnant    else if (__base::__map_.size() < __base::__map_.capacity())
21983e519524SHoward Hinnant    {   // we can put the new buffer into the map, but don't shift things around
21993e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
22003e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
22013e519524SHoward Hinnant        if (__base::__map_.__front_spare() > 0)
22023e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
22033e519524SHoward Hinnant        else
22043e519524SHoward Hinnant        {
22053e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
22063e519524SHoward Hinnant            // Done allocating, reorder capacity
22073e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
22083e519524SHoward Hinnant            __base::__map_.pop_back();
22093e519524SHoward Hinnant            __base::__map_.push_front(__pt);
22103e519524SHoward Hinnant        }
22113e519524SHoward Hinnant        __base::__start_ = __base::__map_.size() == 1 ?
22123e519524SHoward Hinnant                               __base::__block_size / 2 :
22133e519524SHoward Hinnant                               __base::__start_ + __base::__block_size;
22143e519524SHoward Hinnant    }
22153e519524SHoward Hinnant    // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
22163e519524SHoward Hinnant    else
22173e519524SHoward Hinnant    {
22183e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
22193e519524SHoward Hinnant            __buf(max<size_type>(2 * __base::__map_.capacity(), 1),
22203e519524SHoward Hinnant                  0, __base::__map_.__alloc());
22213e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
22223e519524SHoward Hinnant        try
22233e519524SHoward Hinnant        {
2224b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
22253e519524SHoward Hinnant            __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
22263e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
22273e519524SHoward Hinnant        }
22283e519524SHoward Hinnant        catch (...)
22293e519524SHoward Hinnant        {
22303e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __buf.front(), __base::__block_size);
22313e519524SHoward Hinnant            throw;
22323e519524SHoward Hinnant        }
2233b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
22343e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.begin();
22353e519524SHoward Hinnant                __i != __base::__map_.end(); ++__i)
22363e519524SHoward Hinnant            __buf.push_back(*__i);
22373e519524SHoward Hinnant        _STD::swap(__base::__map_.__first_, __buf.__first_);
22383e519524SHoward Hinnant        _STD::swap(__base::__map_.__begin_, __buf.__begin_);
22393e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_, __buf.__end_);
22403e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
22413e519524SHoward Hinnant        __base::__start_ = __base::__map_.size() == 1 ?
22423e519524SHoward Hinnant                               __base::__block_size / 2 :
22433e519524SHoward Hinnant                               __base::__start_ + __base::__block_size;
22443e519524SHoward Hinnant    }
22453e519524SHoward Hinnant}
22463e519524SHoward Hinnant
22473e519524SHoward Hinnant// Create front capacity for __n elements.
22483e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
22493e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
22503e519524SHoward Hinnantvoid
22513e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_front_capacity(size_type __n)
22523e519524SHoward Hinnant{
22533e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
22543e519524SHoward Hinnant    size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
22553e519524SHoward Hinnant    // Number of unused blocks at back:
22563e519524SHoward Hinnant    size_type __back_capacity = __back_spare() / __base::__block_size;
2257a0fe8c43SHoward Hinnant    __back_capacity = _STD::min(__back_capacity, __nb);  // don't take more than you need
22583e519524SHoward Hinnant    __nb -= __back_capacity;  // number of blocks need to allocate
22593e519524SHoward Hinnant    // If __nb == 0, then we have sufficient capacity.
22603e519524SHoward Hinnant    if (__nb == 0)
22613e519524SHoward Hinnant    {
22623e519524SHoward Hinnant        __base::__start_ += __base::__block_size * __back_capacity;
22633e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
22643e519524SHoward Hinnant        {
22653e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
22663e519524SHoward Hinnant            __base::__map_.pop_back();
22673e519524SHoward Hinnant            __base::__map_.push_front(__pt);
22683e519524SHoward Hinnant        }
22693e519524SHoward Hinnant    }
22703e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
22713e519524SHoward Hinnant    else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
22723e519524SHoward Hinnant    {   // we can put the new buffers into the map, but don't shift things around
22733e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
22743e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
22753e519524SHoward Hinnant        for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1))
22763e519524SHoward Hinnant        {
22773e519524SHoward Hinnant            if (__base::__map_.__front_spare() == 0)
22783e519524SHoward Hinnant                break;
22793e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
22803e519524SHoward Hinnant        }
22813e519524SHoward Hinnant        for (; __nb > 0; --__nb, ++__back_capacity)
22823e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
22833e519524SHoward Hinnant        // Done allocating, reorder capacity
22843e519524SHoward Hinnant        __base::__start_ += __back_capacity * __base::__block_size;
22853e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
22863e519524SHoward Hinnant        {
22873e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
22883e519524SHoward Hinnant            __base::__map_.pop_back();
22893e519524SHoward Hinnant            __base::__map_.push_front(__pt);
22903e519524SHoward Hinnant        }
22913e519524SHoward Hinnant    }
22923e519524SHoward Hinnant    // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
22933e519524SHoward Hinnant    else
22943e519524SHoward Hinnant    {
22953e519524SHoward Hinnant        size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty();
22963e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
22973e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(),
22983e519524SHoward Hinnant                                 __nb + __base::__map_.size()),
22993e519524SHoward Hinnant                  0, __base::__map_.__alloc());
23003e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
23013e519524SHoward Hinnant        try
23023e519524SHoward Hinnant        {
2303b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
23043e519524SHoward Hinnant            for (; __nb > 0; --__nb)
23053e519524SHoward Hinnant                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
23063e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
23073e519524SHoward Hinnant        }
23083e519524SHoward Hinnant        catch (...)
23093e519524SHoward Hinnant        {
23103e519524SHoward Hinnant            for (typename __base::__map_pointer __i = __buf.begin();
23113e519524SHoward Hinnant                    __i != __buf.end(); ++__i)
23123e519524SHoward Hinnant                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
23133e519524SHoward Hinnant            throw;
23143e519524SHoward Hinnant        }
2315b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
23163e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
23173e519524SHoward Hinnant        {
23183e519524SHoward Hinnant            __buf.push_back(__base::__map_.back());
23193e519524SHoward Hinnant            __base::__map_.pop_back();
23203e519524SHoward Hinnant        }
23213e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.begin();
23223e519524SHoward Hinnant                __i != __base::__map_.end(); ++__i)
23233e519524SHoward Hinnant            __buf.push_back(*__i);
23243e519524SHoward Hinnant        _STD::swap(__base::__map_.__first_, __buf.__first_);
23253e519524SHoward Hinnant        _STD::swap(__base::__map_.__begin_, __buf.__begin_);
23263e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_, __buf.__end_);
23273e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
23283e519524SHoward Hinnant        __base::__start_ += __ds;
23293e519524SHoward Hinnant    }
23303e519524SHoward Hinnant}
23313e519524SHoward Hinnant
23323e519524SHoward Hinnant// Create back capacity for one block of elements.
23333e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
23343e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23353e519524SHoward Hinnantvoid
23363e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_back_capacity()
23373e519524SHoward Hinnant{
23383e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
23393e519524SHoward Hinnant    if (__front_spare() >= __base::__block_size)
23403e519524SHoward Hinnant    {
23413e519524SHoward Hinnant        __base::__start_ -= __base::__block_size;
23423e519524SHoward Hinnant        pointer __pt = __base::__map_.front();
23433e519524SHoward Hinnant        __base::__map_.pop_front();
23443e519524SHoward Hinnant        __base::__map_.push_back(__pt);
23453e519524SHoward Hinnant    }
23463e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
23473e519524SHoward Hinnant    else if (__base::__map_.size() < __base::__map_.capacity())
23483e519524SHoward Hinnant    {   // we can put the new buffer into the map, but don't shift things around
23493e519524SHoward Hinnant        // until it is allocated.  If we throw, we don't need to fix
23503e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
23513e519524SHoward Hinnant        if (__base::__map_.__back_spare() != 0)
23523e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
23533e519524SHoward Hinnant        else
23543e519524SHoward Hinnant        {
23553e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
23563e519524SHoward Hinnant            // Done allocating, reorder capacity
23573e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
23583e519524SHoward Hinnant            __base::__map_.pop_front();
23593e519524SHoward Hinnant            __base::__map_.push_back(__pt);
23603e519524SHoward Hinnant        }
23613e519524SHoward Hinnant    }
23623e519524SHoward Hinnant    // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
23633e519524SHoward Hinnant    else
23643e519524SHoward Hinnant    {
23653e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
23663e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(), 1),
23673e519524SHoward Hinnant                  __base::__map_.size(),
23683e519524SHoward Hinnant                  __base::__map_.__alloc());
23693e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
23703e519524SHoward Hinnant        try
23713e519524SHoward Hinnant        {
2372b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
23733e519524SHoward Hinnant            __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
23743e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
23753e519524SHoward Hinnant        }
23763e519524SHoward Hinnant        catch (...)
23773e519524SHoward Hinnant        {
23783e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __buf.back(), __base::__block_size);
23793e519524SHoward Hinnant            throw;
23803e519524SHoward Hinnant        }
2381b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
23823e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.end();
23833e519524SHoward Hinnant                __i != __base::__map_.begin();)
23843e519524SHoward Hinnant            __buf.push_front(*--__i);
23853e519524SHoward Hinnant        _STD::swap(__base::__map_.__first_, __buf.__first_);
23863e519524SHoward Hinnant        _STD::swap(__base::__map_.__begin_, __buf.__begin_);
23873e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_, __buf.__end_);
23883e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
23893e519524SHoward Hinnant    }
23903e519524SHoward Hinnant}
23913e519524SHoward Hinnant
23923e519524SHoward Hinnant// Create back capacity for __n elements.
23933e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
23943e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23953e519524SHoward Hinnantvoid
23963e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_back_capacity(size_type __n)
23973e519524SHoward Hinnant{
23983e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
23993e519524SHoward Hinnant    size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
24003e519524SHoward Hinnant    // Number of unused blocks at front:
24013e519524SHoward Hinnant    size_type __front_capacity = __front_spare() / __base::__block_size;
2402a0fe8c43SHoward Hinnant    __front_capacity = _STD::min(__front_capacity, __nb);  // don't take more than you need
24033e519524SHoward Hinnant    __nb -= __front_capacity;  // number of blocks need to allocate
24043e519524SHoward Hinnant    // If __nb == 0, then we have sufficient capacity.
24053e519524SHoward Hinnant    if (__nb == 0)
24063e519524SHoward Hinnant    {
24073e519524SHoward Hinnant        __base::__start_ -= __base::__block_size * __front_capacity;
24083e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
24093e519524SHoward Hinnant        {
24103e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
24113e519524SHoward Hinnant            __base::__map_.pop_front();
24123e519524SHoward Hinnant            __base::__map_.push_back(__pt);
24133e519524SHoward Hinnant        }
24143e519524SHoward Hinnant    }
24153e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
24163e519524SHoward Hinnant    else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
24173e519524SHoward Hinnant    {   // we can put the new buffers into the map, but don't shift things around
24183e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
24193e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
24203e519524SHoward Hinnant        for (; __nb > 0; --__nb)
24213e519524SHoward Hinnant        {
24223e519524SHoward Hinnant            if (__base::__map_.__back_spare() == 0)
24233e519524SHoward Hinnant                break;
24243e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
24253e519524SHoward Hinnant        }
24263e519524SHoward Hinnant        for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ +=
24273e519524SHoward Hinnant                                 __base::__block_size - (__base::__map_.size() == 1))
24283e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
24293e519524SHoward Hinnant        // Done allocating, reorder capacity
24303e519524SHoward Hinnant        __base::__start_ -= __base::__block_size * __front_capacity;
24313e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
24323e519524SHoward Hinnant        {
24333e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
24343e519524SHoward Hinnant            __base::__map_.pop_front();
24353e519524SHoward Hinnant            __base::__map_.push_back(__pt);
24363e519524SHoward Hinnant        }
24373e519524SHoward Hinnant    }
24383e519524SHoward Hinnant    // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
24393e519524SHoward Hinnant    else
24403e519524SHoward Hinnant    {
24413e519524SHoward Hinnant        size_type __ds = __front_capacity * __base::__block_size;
24423e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
24433e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(),
24443e519524SHoward Hinnant                                 __nb + __base::__map_.size()),
24453e519524SHoward Hinnant                  __base::__map_.size() - __front_capacity,
24463e519524SHoward Hinnant                  __base::__map_.__alloc());
24473e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
24483e519524SHoward Hinnant        try
24493e519524SHoward Hinnant        {
2450b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
24513e519524SHoward Hinnant            for (; __nb > 0; --__nb)
24523e519524SHoward Hinnant                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
24533e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
24543e519524SHoward Hinnant        }
24553e519524SHoward Hinnant        catch (...)
24563e519524SHoward Hinnant        {
24573e519524SHoward Hinnant            for (typename __base::__map_pointer __i = __buf.begin();
24583e519524SHoward Hinnant                    __i != __buf.end(); ++__i)
24593e519524SHoward Hinnant                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
24603e519524SHoward Hinnant            throw;
24613e519524SHoward Hinnant        }
2462b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
24633e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
24643e519524SHoward Hinnant        {
24653e519524SHoward Hinnant            __buf.push_back(__base::__map_.front());
24663e519524SHoward Hinnant            __base::__map_.pop_front();
24673e519524SHoward Hinnant        }
24683e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.end();
24693e519524SHoward Hinnant                __i != __base::__map_.begin();)
24703e519524SHoward Hinnant            __buf.push_front(*--__i);
24713e519524SHoward Hinnant        _STD::swap(__base::__map_.__first_, __buf.__first_);
24723e519524SHoward Hinnant        _STD::swap(__base::__map_.__begin_, __buf.__begin_);
24733e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_, __buf.__end_);
24743e519524SHoward Hinnant        _STD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
24753e519524SHoward Hinnant        __base::__start_ -= __ds;
24763e519524SHoward Hinnant    }
24773e519524SHoward Hinnant}
24783e519524SHoward Hinnant
24793e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
24803e519524SHoward Hinnantvoid
24813e519524SHoward Hinnantdeque<_Tp, _Allocator>::pop_front()
24823e519524SHoward Hinnant{
24833e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
24843e519524SHoward Hinnant    __alloc_traits::destroy(__a, *(__base::__map_.begin() +
24853e519524SHoward Hinnant                                   __base::__start_ / __base::__block_size) +
24863e519524SHoward Hinnant                                   __base::__start_ % __base::__block_size);
24873e519524SHoward Hinnant    --__base::size();
24883e519524SHoward Hinnant    if (++__base::__start_ >= 2 * __base::__block_size)
24893e519524SHoward Hinnant    {
24903e519524SHoward Hinnant        __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
24913e519524SHoward Hinnant        __base::__map_.pop_front();
24923e519524SHoward Hinnant        __base::__start_ -= __base::__block_size;
24933e519524SHoward Hinnant    }
24943e519524SHoward Hinnant}
24953e519524SHoward Hinnant
24963e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
24973e519524SHoward Hinnantvoid
24983e519524SHoward Hinnantdeque<_Tp, _Allocator>::pop_back()
24993e519524SHoward Hinnant{
25003e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
25013e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
25023e519524SHoward Hinnant    __alloc_traits::destroy(__a, *(__base::__map_.begin() +
25033e519524SHoward Hinnant                                   __p / __base::__block_size) +
25043e519524SHoward Hinnant                                   __p % __base::__block_size);
25053e519524SHoward Hinnant    --__base::size();
25063e519524SHoward Hinnant    if (__back_spare() >= 2 * __base::__block_size)
25073e519524SHoward Hinnant    {
25083e519524SHoward Hinnant        __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
25093e519524SHoward Hinnant        __base::__map_.pop_back();
25103e519524SHoward Hinnant    }
25113e519524SHoward Hinnant}
25123e519524SHoward Hinnant
25133e519524SHoward Hinnant// move assign [__f, __l) to [__r, __r + (__l-__f)).
25143e519524SHoward Hinnant// If __vt points into [__f, __l), then subtract (__f - __r) from __vt.
25153e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
25163e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
25173e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r,
25183e519524SHoward Hinnant                                         const_pointer& __vt)
25193e519524SHoward Hinnant{
25203e519524SHoward Hinnant    // as if
25213e519524SHoward Hinnant    //   for (; __f != __l; ++__f, ++__r)
25223e519524SHoward Hinnant    //       *__r = _STD::move(*__f);
25233e519524SHoward Hinnant    difference_type __n = __l - __f;
25243e519524SHoward Hinnant    while (__n > 0)
25253e519524SHoward Hinnant    {
25263e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
25273e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + __base::__block_size;
25283e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
25293e519524SHoward Hinnant        if (__bs > __n)
25303e519524SHoward Hinnant        {
25313e519524SHoward Hinnant            __bs = __n;
25323e519524SHoward Hinnant            __fe = __fb + __bs;
25333e519524SHoward Hinnant        }
25343e519524SHoward Hinnant        if (__fb <= __vt && __vt < __fe)
25353e519524SHoward Hinnant            __vt = (const_iterator(__f.__m_iter_, __vt) -= __f - __r).__ptr_;
25363e519524SHoward Hinnant        __r = _STD::move(__fb, __fe, __r);
25373e519524SHoward Hinnant        __n -= __bs;
25383e519524SHoward Hinnant        __f += __bs;
25393e519524SHoward Hinnant    }
25403e519524SHoward Hinnant    return __r;
25413e519524SHoward Hinnant}
25423e519524SHoward Hinnant
25433e519524SHoward Hinnant// move assign [__f, __l) to [__r - (__l-__f), __r) backwards.
25443e519524SHoward Hinnant// If __vt points into [__f, __l), then add (__r - __l) to __vt.
25453e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
25463e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
25473e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r,
25483e519524SHoward Hinnant                                                  const_pointer& __vt)
25493e519524SHoward Hinnant{
25503e519524SHoward Hinnant    // as if
25513e519524SHoward Hinnant    //   while (__f != __l)
25523e519524SHoward Hinnant    //       *--__r = _STD::move(*--__l);
25533e519524SHoward Hinnant    difference_type __n = __l - __f;
25543e519524SHoward Hinnant    while (__n > 0)
25553e519524SHoward Hinnant    {
25563e519524SHoward Hinnant        --__l;
25573e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
25583e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
25593e519524SHoward Hinnant        difference_type __bs = __le - __lb;
25603e519524SHoward Hinnant        if (__bs > __n)
25613e519524SHoward Hinnant        {
25623e519524SHoward Hinnant            __bs = __n;
25633e519524SHoward Hinnant            __lb = __le - __bs;
25643e519524SHoward Hinnant        }
25653e519524SHoward Hinnant        if (__lb <= __vt && __vt < __le)
25663e519524SHoward Hinnant            __vt = (const_iterator(__l.__m_iter_, __vt) += __r - __l - 1).__ptr_;
25673e519524SHoward Hinnant        __r = _STD::move_backward(__lb, __le, __r);
25683e519524SHoward Hinnant        __n -= __bs;
25693e519524SHoward Hinnant        __l -= __bs - 1;
25703e519524SHoward Hinnant    }
25713e519524SHoward Hinnant    return __r;
25723e519524SHoward Hinnant}
25733e519524SHoward Hinnant
25743e519524SHoward Hinnant// move construct [__f, __l) to [__r, __r + (__l-__f)).
25753e519524SHoward Hinnant// If __vt points into [__f, __l), then add (__r - __f) to __vt.
25763e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
25773e519524SHoward Hinnantvoid
25783e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
25793e519524SHoward Hinnant                                                   iterator __r, const_pointer& __vt)
25803e519524SHoward Hinnant{
25813e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
25823e519524SHoward Hinnant    // as if
25833e519524SHoward Hinnant    //   for (; __f != __l; ++__r, ++__f, ++__base::size())
258472c5e142SHoward Hinnant    //       __alloc_traits::construct(__a, _STD::addressof(*__r), _STD::move(*__f));
25853e519524SHoward Hinnant    difference_type __n = __l - __f;
25863e519524SHoward Hinnant    while (__n > 0)
25873e519524SHoward Hinnant    {
25883e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
25893e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + __base::__block_size;
25903e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
25913e519524SHoward Hinnant        if (__bs > __n)
25923e519524SHoward Hinnant        {
25933e519524SHoward Hinnant            __bs = __n;
25943e519524SHoward Hinnant            __fe = __fb + __bs;
25953e519524SHoward Hinnant        }
25963e519524SHoward Hinnant        if (__fb <= __vt && __vt < __fe)
25973e519524SHoward Hinnant            __vt = (const_iterator(__f.__m_iter_, __vt) += __r - __f).__ptr_;
25983e519524SHoward Hinnant        for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
259972c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*__r), _STD::move(*__fb));
26003e519524SHoward Hinnant        __n -= __bs;
26013e519524SHoward Hinnant        __f += __bs;
26023e519524SHoward Hinnant    }
26033e519524SHoward Hinnant}
26043e519524SHoward Hinnant
26053e519524SHoward Hinnant// move construct [__f, __l) to [__r - (__l-__f), __r) backwards.
26063e519524SHoward Hinnant// If __vt points into [__f, __l), then subtract (__l - __r) from __vt.
26073e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
26083e519524SHoward Hinnantvoid
26093e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l,
26103e519524SHoward Hinnant                                                            iterator __r, const_pointer& __vt)
26113e519524SHoward Hinnant{
26123e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
26133e519524SHoward Hinnant    // as if
26143e519524SHoward Hinnant    //   for (iterator __j = __l; __j != __f;)
26153e519524SHoward Hinnant    //   {
261672c5e142SHoward Hinnant    //       __alloc_traitsconstruct(__a, _STD::addressof(*--__r), _STD::move(*--__j));
26173e519524SHoward Hinnant    //       --__base::__start_;
26183e519524SHoward Hinnant    //       ++__base::size();
26193e519524SHoward Hinnant    //   }
26203e519524SHoward Hinnant    difference_type __n = __l - __f;
26213e519524SHoward Hinnant    while (__n > 0)
26223e519524SHoward Hinnant    {
26233e519524SHoward Hinnant        --__l;
26243e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
26253e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
26263e519524SHoward Hinnant        difference_type __bs = __le - __lb;
26273e519524SHoward Hinnant        if (__bs > __n)
26283e519524SHoward Hinnant        {
26293e519524SHoward Hinnant            __bs = __n;
26303e519524SHoward Hinnant            __lb = __le - __bs;
26313e519524SHoward Hinnant        }
26323e519524SHoward Hinnant        if (__lb <= __vt && __vt < __le)
26333e519524SHoward Hinnant            __vt = (const_iterator(__l.__m_iter_, __vt) -= __l - __r + 1).__ptr_;
26343e519524SHoward Hinnant        while (__le != __lb)
26353e519524SHoward Hinnant        {
263672c5e142SHoward Hinnant            __alloc_traits::construct(__a, _STD::addressof(*--__r), _STD::move(*--__le));
26373e519524SHoward Hinnant            --__base::__start_;
26383e519524SHoward Hinnant            ++__base::size();
26393e519524SHoward Hinnant        }
26403e519524SHoward Hinnant        __n -= __bs;
26413e519524SHoward Hinnant        __l -= __bs - 1;
26423e519524SHoward Hinnant    }
26433e519524SHoward Hinnant}
26443e519524SHoward Hinnant
26453e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
26463e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
26473e519524SHoward Hinnantdeque<_Tp, _Allocator>::erase(const_iterator __f)
26483e519524SHoward Hinnant{
26493e519524SHoward Hinnant    difference_type __n = 1;
26503e519524SHoward Hinnant    iterator __b = __base::begin();
26513e519524SHoward Hinnant    difference_type __pos = __f - __b;
26523e519524SHoward Hinnant    iterator __p = __b + __pos;
26533e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
26543e519524SHoward Hinnant    if (__pos < (__base::size() - 1) / 2)
26553e519524SHoward Hinnant    {   // erase from front
2656a0fe8c43SHoward Hinnant        _STD::move_backward(__b, __p, _STD::next(__p));
265772c5e142SHoward Hinnant        __alloc_traits::destroy(__a, _STD::addressof(*__b));
26583e519524SHoward Hinnant        --__base::size();
26593e519524SHoward Hinnant        ++__base::__start_;
26603e519524SHoward Hinnant        if (__front_spare() >= 2 * __base::__block_size)
26613e519524SHoward Hinnant        {
26623e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
26633e519524SHoward Hinnant            __base::__map_.pop_front();
26643e519524SHoward Hinnant            __base::__start_ -= __base::__block_size;
26653e519524SHoward Hinnant        }
26663e519524SHoward Hinnant    }
26673e519524SHoward Hinnant    else
26683e519524SHoward Hinnant    {   // erase from back
26696c38001eSDouglas Gregor        iterator __i = _STD::move(_STD::next(__p), __base::end(), __p);
267072c5e142SHoward Hinnant        __alloc_traits::destroy(__a, _STD::addressof(*__i));
26713e519524SHoward Hinnant        --__base::size();
26723e519524SHoward Hinnant        if (__back_spare() >= 2 * __base::__block_size)
26733e519524SHoward Hinnant        {
26743e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
26753e519524SHoward Hinnant            __base::__map_.pop_back();
26763e519524SHoward Hinnant        }
26773e519524SHoward Hinnant    }
26783e519524SHoward Hinnant    return __base::begin() + __pos;
26793e519524SHoward Hinnant}
26803e519524SHoward Hinnant
26813e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
26823e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
26833e519524SHoward Hinnantdeque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l)
26843e519524SHoward Hinnant{
26853e519524SHoward Hinnant    difference_type __n = __l - __f;
26863e519524SHoward Hinnant    iterator __b = __base::begin();
26873e519524SHoward Hinnant    difference_type __pos = __f - __b;
26883e519524SHoward Hinnant    iterator __p = __b + __pos;
26893e519524SHoward Hinnant    if (__n > 0)
26903e519524SHoward Hinnant    {
26913e519524SHoward Hinnant        allocator_type& __a = __base::__alloc();
26923e519524SHoward Hinnant        if (__pos < (__base::size() - __n) / 2)
26933e519524SHoward Hinnant        {   // erase from front
26943e519524SHoward Hinnant            iterator __i = _STD::move_backward(__b, __p, __p + __n);
26953e519524SHoward Hinnant            for (; __b != __i; ++__b)
269672c5e142SHoward Hinnant                __alloc_traits::destroy(__a, _STD::addressof(*__b));
26973e519524SHoward Hinnant            __base::size() -= __n;
26983e519524SHoward Hinnant            __base::__start_ += __n;
26993e519524SHoward Hinnant            while (__front_spare() >= 2 * __base::__block_size)
27003e519524SHoward Hinnant            {
27013e519524SHoward Hinnant                __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
27023e519524SHoward Hinnant                __base::__map_.pop_front();
27033e519524SHoward Hinnant                __base::__start_ -= __base::__block_size;
27043e519524SHoward Hinnant            }
27053e519524SHoward Hinnant        }
27063e519524SHoward Hinnant        else
27073e519524SHoward Hinnant        {   // erase from back
27083e519524SHoward Hinnant            iterator __i = _STD::move(__p + __n, __base::end(), __p);
27093e519524SHoward Hinnant            for (iterator __e = __base::end(); __i != __e; ++__i)
271072c5e142SHoward Hinnant                __alloc_traits::destroy(__a, _STD::addressof(*__i));
27113e519524SHoward Hinnant            __base::size() -= __n;
27123e519524SHoward Hinnant            while (__back_spare() >= 2 * __base::__block_size)
27133e519524SHoward Hinnant            {
27143e519524SHoward Hinnant                __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
27153e519524SHoward Hinnant                __base::__map_.pop_back();
27163e519524SHoward Hinnant            }
27173e519524SHoward Hinnant        }
27183e519524SHoward Hinnant    }
27193e519524SHoward Hinnant    return __base::begin() + __pos;
27203e519524SHoward Hinnant}
27213e519524SHoward Hinnant
27223e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27233e519524SHoward Hinnantvoid
27243e519524SHoward Hinnantdeque<_Tp, _Allocator>::__erase_to_end(const_iterator __f)
27253e519524SHoward Hinnant{
27263e519524SHoward Hinnant    iterator __e = __base::end();
27273e519524SHoward Hinnant    difference_type __n = __e - __f;
27283e519524SHoward Hinnant    if (__n > 0)
27293e519524SHoward Hinnant    {
27303e519524SHoward Hinnant        allocator_type& __a = __base::__alloc();
27313e519524SHoward Hinnant        iterator __b = __base::begin();
27323e519524SHoward Hinnant        difference_type __pos = __f - __b;
27333e519524SHoward Hinnant        for (iterator __p = __b + __pos; __p != __e; ++__p)
273472c5e142SHoward Hinnant            __alloc_traits::destroy(__a, _STD::addressof(*__p));
27353e519524SHoward Hinnant        __base::size() -= __n;
27363e519524SHoward Hinnant        while (__back_spare() >= 2 * __base::__block_size)
27373e519524SHoward Hinnant        {
27383e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
27393e519524SHoward Hinnant            __base::__map_.pop_back();
27403e519524SHoward Hinnant        }
27413e519524SHoward Hinnant    }
27423e519524SHoward Hinnant}
27433e519524SHoward Hinnant
27443e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2745fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
27463e519524SHoward Hinnantvoid
27473e519524SHoward Hinnantdeque<_Tp, _Allocator>::swap(deque& __c)
27489eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
27499eebe11dSHoward Hinnant                   __is_nothrow_swappable<allocator_type>::value)
27503e519524SHoward Hinnant{
27513e519524SHoward Hinnant    __base::swap(__c);
27523e519524SHoward Hinnant}
27533e519524SHoward Hinnant
27543e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2755fb100021SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
27563e519524SHoward Hinnantvoid
2757a87e8360SHoward Hinnantdeque<_Tp, _Allocator>::clear() _NOEXCEPT
27583e519524SHoward Hinnant{
27593e519524SHoward Hinnant    __base::clear();
27603e519524SHoward Hinnant}
27613e519524SHoward Hinnant
27623e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27633e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
27643e519524SHoward Hinnantbool
27653e519524SHoward Hinnantoperator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
27663e519524SHoward Hinnant{
27673e519524SHoward Hinnant    const typename deque<_Tp, _Allocator>::size_type __sz = __x.size();
27683e519524SHoward Hinnant    return __sz == __y.size() && _STD::equal(__x.begin(), __x.end(), __y.begin());
27693e519524SHoward Hinnant}
27703e519524SHoward Hinnant
27713e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27723e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
27733e519524SHoward Hinnantbool
27743e519524SHoward Hinnantoperator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
27753e519524SHoward Hinnant{
27763e519524SHoward Hinnant    return !(__x == __y);
27773e519524SHoward Hinnant}
27783e519524SHoward Hinnant
27793e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27803e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
27813e519524SHoward Hinnantbool
27823e519524SHoward Hinnantoperator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
27833e519524SHoward Hinnant{
27843e519524SHoward Hinnant    return _STD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
27853e519524SHoward Hinnant}
27863e519524SHoward Hinnant
27873e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27883e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
27893e519524SHoward Hinnantbool
27903e519524SHoward Hinnantoperator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
27913e519524SHoward Hinnant{
27923e519524SHoward Hinnant    return __y < __x;
27933e519524SHoward Hinnant}
27943e519524SHoward Hinnant
27953e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27963e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
27973e519524SHoward Hinnantbool
27983e519524SHoward Hinnantoperator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
27993e519524SHoward Hinnant{
28003e519524SHoward Hinnant    return !(__x < __y);
28013e519524SHoward Hinnant}
28023e519524SHoward Hinnant
28033e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28043e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
28053e519524SHoward Hinnantbool
28063e519524SHoward Hinnantoperator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
28073e519524SHoward Hinnant{
28083e519524SHoward Hinnant    return !(__y < __x);
28093e519524SHoward Hinnant}
28103e519524SHoward Hinnant
28113e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28123e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline
28133e519524SHoward Hinnantvoid
28143e519524SHoward Hinnantswap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y)
28159eebe11dSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
28163e519524SHoward Hinnant{
28173e519524SHoward Hinnant    __x.swap(__y);
28183e519524SHoward Hinnant}
28193e519524SHoward Hinnant
28203e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
28213e519524SHoward Hinnant
28223e519524SHoward Hinnant#endif  // _LIBCPP_DEQUE
2823