xref: /llvm-project-15.0.7/libcxx/include/deque (revision 4e0ea2cf)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- deque -----------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_DEQUE
113e519524SHoward Hinnant#define _LIBCPP_DEQUE
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    deque synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnanttemplate <class T, class Allocator = allocator<T> >
203e519524SHoward Hinnantclass deque
213e519524SHoward Hinnant{
223e519524SHoward Hinnantpublic:
233e519524SHoward Hinnant    // types:
243e519524SHoward Hinnant    typedef T value_type;
253e519524SHoward Hinnant    typedef Allocator allocator_type;
263e519524SHoward Hinnant
273e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
283e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
293e519524SHoward Hinnant    typedef implementation-defined                   iterator;
303e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
313e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
323e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
333e519524SHoward Hinnant
343e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
353e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
363e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
373e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
383e519524SHoward Hinnant
393e519524SHoward Hinnant    // construct/copy/destroy:
4080129113SHoward Hinnant    deque() noexcept(is_nothrow_default_constructible<allocator_type>::value);
413e519524SHoward Hinnant    explicit deque(const allocator_type& a);
423e519524SHoward Hinnant    explicit deque(size_type n);
43f1b6d1b5SMarshall Clow    explicit deque(size_type n, const allocator_type& a); // C++14
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);
51b58f59cdSHoward Hinnant    deque(deque&& c)
52b58f59cdSHoward 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);
59b58f59cdSHoward Hinnant    deque& operator=(deque&& c)
60b58f59cdSHoward Hinnant        noexcept(
61b58f59cdSHoward Hinnant             allocator_type::propagate_on_container_move_assignment::value &&
62b58f59cdSHoward 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);
11263b560beSMarshall Clow    template <class... Args> reference emplace_front(Args&&... args);  // reference in C++17
11363b560beSMarshall Clow    template <class... Args> reference emplace_back(Args&&... args);   // reference in C++17
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);
125b58f59cdSHoward Hinnant    void swap(deque& c)
126e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value);  // C++17
127a87e8360SHoward Hinnant    void clear() noexcept;
1283e519524SHoward Hinnant};
1293e519524SHoward Hinnant
130dbb6f8a8SMarshall Clowtemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
131dbb6f8a8SMarshall Clow   deque(InputIterator, InputIterator, Allocator = Allocator())
132dbb6f8a8SMarshall Clow   -> deque<typename iterator_traits<InputIterator>::value_type, Allocator>;
133dbb6f8a8SMarshall Clow
1343e519524SHoward Hinnanttemplate <class T, class Allocator>
1353e519524SHoward Hinnant    bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1363e519524SHoward Hinnanttemplate <class T, class Allocator>
1373e519524SHoward Hinnant    bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1383e519524SHoward Hinnanttemplate <class T, class Allocator>
1393e519524SHoward Hinnant    bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1403e519524SHoward Hinnanttemplate <class T, class Allocator>
1413e519524SHoward Hinnant    bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1423e519524SHoward Hinnanttemplate <class T, class Allocator>
1433e519524SHoward Hinnant    bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1443e519524SHoward Hinnanttemplate <class T, class Allocator>
1453e519524SHoward Hinnant    bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1463e519524SHoward Hinnant
1473e519524SHoward Hinnant// specialized algorithms:
1483e519524SHoward Hinnanttemplate <class T, class Allocator>
14945900104SHoward Hinnant    void swap(deque<T,Allocator>& x, deque<T,Allocator>& y)
15045900104SHoward Hinnant         noexcept(noexcept(x.swap(y)));
1513e519524SHoward Hinnant
152f60c63c0SMarshall Clowtemplate <class T, class Allocator, class U>
1533e895085SMarek Kurdej    typename deque<T, Allocator>::size_type
1543e895085SMarek Kurdej    erase(deque<T, Allocator>& c, const U& value);       // C++20
155f60c63c0SMarshall Clowtemplate <class T, class Allocator, class Predicate>
1563e895085SMarek Kurdej    typename deque<T, Allocator>::size_type
1573e895085SMarek Kurdej    erase_if(deque<T, Allocator>& c, Predicate pred);    // C++20
158f60c63c0SMarshall Clow
1593e519524SHoward Hinnant}  // std
1603e519524SHoward Hinnant
1613e519524SHoward Hinnant*/
1623e519524SHoward Hinnant
1633e519524SHoward Hinnant#include <__config>
16406b40e80SArthur O'Dwyer#include <__debug>
1653e519524SHoward Hinnant#include <__split_buffer>
1666adbc83eSChristopher Di Bella#include <__utility/forward.h>
16706b40e80SArthur O'Dwyer#include <algorithm>
1682d0f1fa4SArthur O'Dwyer#include <compare>
1693e519524SHoward Hinnant#include <initializer_list>
1703e519524SHoward Hinnant#include <iterator>
17169d5a666SChristopher Di Bella#include <limits>
1723e519524SHoward Hinnant#include <stdexcept>
17306b40e80SArthur O'Dwyer#include <type_traits>
174f56972e2SMarshall Clow#include <version>
1753e519524SHoward Hinnant
176a016efb1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
177a016efb1SEric Fiselier#pragma GCC system_header
178a016efb1SEric Fiselier#endif
179a016efb1SEric Fiselier
180a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
181a016efb1SEric Fiselier#include <__undef_macros>
182a016efb1SEric Fiselier
183ab4f4382SHoward Hinnant
1843e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1853e519524SHoward Hinnant
1863e519524SHoward Hinnanttemplate <class _Tp, class _Allocator> class __deque_base;
187e2f2d1edSEric Fiseliertemplate <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS deque;
1883e519524SHoward Hinnant
1893e519524SHoward Hinnanttemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
1903e519524SHoward Hinnant          class _DiffType, _DiffType _BlockSize>
191e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __deque_iterator;
1923e519524SHoward Hinnant
1933e519524SHoward Hinnanttemplate <class _RAIter,
1943e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
1953e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
1963e519524SHoward Hinnantcopy(_RAIter __f,
1973e519524SHoward Hinnant     _RAIter __l,
1983e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
199f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2003e519524SHoward Hinnant
2013e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2023e519524SHoward Hinnant          class _OutputIterator>
2033e519524SHoward Hinnant_OutputIterator
2043e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2053e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2063e519524SHoward Hinnant     _OutputIterator __r);
2073e519524SHoward Hinnant
2083e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2093e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2103e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2113e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2123e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2133e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2143e519524SHoward Hinnant
2153e519524SHoward Hinnanttemplate <class _RAIter,
2163e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2173e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2183e519524SHoward Hinnantcopy_backward(_RAIter __f,
2193e519524SHoward Hinnant              _RAIter __l,
2203e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
221f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2223e519524SHoward Hinnant
2233e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2243e519524SHoward Hinnant          class _OutputIterator>
2253e519524SHoward Hinnant_OutputIterator
2263e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2273e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2283e519524SHoward Hinnant              _OutputIterator __r);
2293e519524SHoward Hinnant
2303e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2313e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2323e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2333e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2343e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2353e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2363e519524SHoward Hinnant
2373e519524SHoward Hinnanttemplate <class _RAIter,
2383e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2393e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2403e519524SHoward Hinnantmove(_RAIter __f,
2413e519524SHoward Hinnant     _RAIter __l,
2423e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
243f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2443e519524SHoward Hinnant
2453e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2463e519524SHoward Hinnant          class _OutputIterator>
2473e519524SHoward Hinnant_OutputIterator
2483e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2493e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2503e519524SHoward Hinnant     _OutputIterator __r);
2513e519524SHoward Hinnant
2523e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2533e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2543e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2553e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2563e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2573e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2583e519524SHoward Hinnant
2593e519524SHoward Hinnanttemplate <class _RAIter,
2603e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2613e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2623e519524SHoward Hinnantmove_backward(_RAIter __f,
2633e519524SHoward Hinnant              _RAIter __l,
2643e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
265f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2663e519524SHoward Hinnant
2673e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2683e519524SHoward Hinnant          class _OutputIterator>
2693e519524SHoward Hinnant_OutputIterator
2703e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2713e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2723e519524SHoward Hinnant              _OutputIterator __r);
2733e519524SHoward Hinnant
2743e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2753e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2763e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2773e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2783e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2793e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2803e519524SHoward Hinnant
28165da7bc3SEvgeniy Stepanovtemplate <class _ValueType, class _DiffType>
28265da7bc3SEvgeniy Stepanovstruct __deque_block_size {
28365da7bc3SEvgeniy Stepanov  static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16;
28465da7bc3SEvgeniy Stepanov};
28565da7bc3SEvgeniy Stepanov
2863e519524SHoward Hinnanttemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
28765da7bc3SEvgeniy Stepanov          class _DiffType, _DiffType _BS =
28865da7bc3SEvgeniy Stepanov#ifdef _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
28965da7bc3SEvgeniy Stepanov// Keep template parameter to avoid changing all template declarations thoughout
29065da7bc3SEvgeniy Stepanov// this file.
29165da7bc3SEvgeniy Stepanov                               0
29265da7bc3SEvgeniy Stepanov#else
29365da7bc3SEvgeniy Stepanov                               __deque_block_size<_ValueType, _DiffType>::value
29465da7bc3SEvgeniy Stepanov#endif
29565da7bc3SEvgeniy Stepanov          >
296e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __deque_iterator
2973e519524SHoward Hinnant{
2983e519524SHoward Hinnant    typedef _MapPointer __map_iterator;
2993e519524SHoward Hinnantpublic:
3003e519524SHoward Hinnant    typedef _Pointer  pointer;
3013e519524SHoward Hinnant    typedef _DiffType difference_type;
3023e519524SHoward Hinnantprivate:
3033e519524SHoward Hinnant    __map_iterator __m_iter_;
3043e519524SHoward Hinnant    pointer        __ptr_;
3053e519524SHoward Hinnant
30665da7bc3SEvgeniy Stepanov    static const difference_type __block_size;
3073e519524SHoward Hinnantpublic:
3083e519524SHoward Hinnant    typedef _ValueType                  value_type;
3093e519524SHoward Hinnant    typedef random_access_iterator_tag  iterator_category;
3103e519524SHoward Hinnant    typedef _Reference                  reference;
3113e519524SHoward Hinnant
3128fe0a372SMarshall Clow    _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT
3138fe0a372SMarshall Clow#if _LIBCPP_STD_VER > 11
3148fe0a372SMarshall Clow     : __m_iter_(nullptr), __ptr_(nullptr)
3158fe0a372SMarshall Clow#endif
3168fe0a372SMarshall Clow     {}
3173e519524SHoward Hinnant
318c003db1fSHoward Hinnant    template <class _Pp, class _Rp, class _MP>
3193e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
32065da7bc3SEvgeniy Stepanov    __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, _BS>& __it,
321c003db1fSHoward Hinnant                typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
3223e519524SHoward Hinnant        : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
3233e519524SHoward Hinnant
3243e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;}
3253e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;}
3263e519524SHoward Hinnant
3273e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++()
3283e519524SHoward Hinnant    {
3293e519524SHoward Hinnant        if (++__ptr_ - *__m_iter_ == __block_size)
3303e519524SHoward Hinnant        {
3313e519524SHoward Hinnant            ++__m_iter_;
3323e519524SHoward Hinnant            __ptr_ = *__m_iter_;
3333e519524SHoward Hinnant        }
3343e519524SHoward Hinnant        return *this;
3353e519524SHoward Hinnant    }
3363e519524SHoward Hinnant
3373e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int)
3383e519524SHoward Hinnant    {
3393e519524SHoward Hinnant        __deque_iterator __tmp = *this;
3403e519524SHoward Hinnant        ++(*this);
3413e519524SHoward Hinnant        return __tmp;
3423e519524SHoward Hinnant    }
3433e519524SHoward Hinnant
3443e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--()
3453e519524SHoward Hinnant    {
3463e519524SHoward Hinnant        if (__ptr_ == *__m_iter_)
3473e519524SHoward Hinnant        {
3483e519524SHoward Hinnant            --__m_iter_;
3493e519524SHoward Hinnant            __ptr_ = *__m_iter_ + __block_size;
3503e519524SHoward Hinnant        }
3513e519524SHoward Hinnant        --__ptr_;
3523e519524SHoward Hinnant        return *this;
3533e519524SHoward Hinnant    }
3543e519524SHoward Hinnant
3553e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int)
3563e519524SHoward Hinnant    {
3573e519524SHoward Hinnant        __deque_iterator __tmp = *this;
3583e519524SHoward Hinnant        --(*this);
3593e519524SHoward Hinnant        return __tmp;
3603e519524SHoward Hinnant    }
3613e519524SHoward Hinnant
3623e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n)
3633e519524SHoward Hinnant    {
3643e519524SHoward Hinnant        if (__n != 0)
3653e519524SHoward Hinnant        {
3663e519524SHoward Hinnant            __n += __ptr_ - *__m_iter_;
3673e519524SHoward Hinnant            if (__n > 0)
3683e519524SHoward Hinnant            {
3693e519524SHoward Hinnant                __m_iter_ += __n / __block_size;
3703e519524SHoward Hinnant                __ptr_ = *__m_iter_ + __n % __block_size;
3713e519524SHoward Hinnant            }
3723e519524SHoward Hinnant            else // (__n < 0)
3733e519524SHoward Hinnant            {
3743e519524SHoward Hinnant                difference_type __z = __block_size - 1 - __n;
3753e519524SHoward Hinnant                __m_iter_ -= __z / __block_size;
3763e519524SHoward Hinnant                __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size);
3773e519524SHoward Hinnant            }
3783e519524SHoward Hinnant        }
3793e519524SHoward Hinnant        return *this;
3803e519524SHoward Hinnant    }
3813e519524SHoward Hinnant
3823e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n)
3833e519524SHoward Hinnant    {
3843e519524SHoward Hinnant        return *this += -__n;
3853e519524SHoward Hinnant    }
3863e519524SHoward Hinnant
3873e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const
3883e519524SHoward Hinnant    {
3893e519524SHoward Hinnant        __deque_iterator __t(*this);
3903e519524SHoward Hinnant        __t += __n;
3913e519524SHoward Hinnant        return __t;
3923e519524SHoward Hinnant    }
3933e519524SHoward Hinnant
3943e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const
3953e519524SHoward Hinnant    {
3963e519524SHoward Hinnant        __deque_iterator __t(*this);
3973e519524SHoward Hinnant        __t -= __n;
3983e519524SHoward Hinnant        return __t;
3993e519524SHoward Hinnant    }
4003e519524SHoward Hinnant
4013e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4023e519524SHoward Hinnant    friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it)
4033e519524SHoward Hinnant        {return __it + __n;}
4043e519524SHoward Hinnant
4053e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4063e519524SHoward Hinnant    friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y)
4073e519524SHoward Hinnant    {
4083e519524SHoward Hinnant        if (__x != __y)
4093e519524SHoward Hinnant            return (__x.__m_iter_ - __y.__m_iter_) * __block_size
4103e519524SHoward Hinnant                 + (__x.__ptr_ - *__x.__m_iter_)
4113e519524SHoward Hinnant                 - (__y.__ptr_ - *__y.__m_iter_);
4123e519524SHoward Hinnant        return 0;
4133e519524SHoward Hinnant    }
4143e519524SHoward Hinnant
4153e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
4163e519524SHoward Hinnant        {return *(*this + __n);}
4173e519524SHoward Hinnant
4183e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4193e519524SHoward Hinnant        bool operator==(const __deque_iterator& __x, const __deque_iterator& __y)
4203e519524SHoward Hinnant        {return __x.__ptr_ == __y.__ptr_;}
4213e519524SHoward Hinnant
4223e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4233e519524SHoward Hinnant        bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y)
4243e519524SHoward Hinnant        {return !(__x == __y);}
4253e519524SHoward Hinnant
4263e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4273e519524SHoward Hinnant        bool operator<(const __deque_iterator& __x, const __deque_iterator& __y)
4283e519524SHoward Hinnant        {return __x.__m_iter_ < __y.__m_iter_ ||
4293e519524SHoward Hinnant               (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);}
4303e519524SHoward Hinnant
4313e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4323e519524SHoward Hinnant        bool operator>(const __deque_iterator& __x, const __deque_iterator& __y)
4333e519524SHoward Hinnant        {return __y < __x;}
4343e519524SHoward Hinnant
4353e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4363e519524SHoward Hinnant        bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y)
4373e519524SHoward Hinnant        {return !(__y < __x);}
4383e519524SHoward Hinnant
4393e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4403e519524SHoward Hinnant        bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y)
4413e519524SHoward Hinnant        {return !(__x < __y);}
4423e519524SHoward Hinnant
4433e519524SHoward Hinnantprivate:
444a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT
4453e519524SHoward Hinnant        : __m_iter_(__m), __ptr_(__p) {}
4463e519524SHoward Hinnant
447c003db1fSHoward Hinnant    template <class _Tp, class _Ap> friend class __deque_base;
448e2f2d1edSEric Fiselier    template <class _Tp, class _Ap> friend class _LIBCPP_TEMPLATE_VIS deque;
449c003db1fSHoward Hinnant    template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp>
450e2f2d1edSEric Fiselier        friend class _LIBCPP_TEMPLATE_VIS __deque_iterator;
4513e519524SHoward Hinnant
4523e519524SHoward Hinnant    template <class _RAIter,
4533e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4543e519524SHoward Hinnant    friend
4553e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4563e519524SHoward Hinnant    copy(_RAIter __f,
4573e519524SHoward Hinnant         _RAIter __l,
4583e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
459f82dba01SEric Fiselier         typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
4603e519524SHoward Hinnant
4613e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4623e519524SHoward Hinnant              class _OutputIterator>
4633e519524SHoward Hinnant    friend
4643e519524SHoward Hinnant    _OutputIterator
4653e519524SHoward Hinnant    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4663e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4673e519524SHoward Hinnant         _OutputIterator __r);
4683e519524SHoward Hinnant
4693e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4703e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4713e519524SHoward Hinnant    friend
4723e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4733e519524SHoward Hinnant    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4743e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4753e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
4763e519524SHoward Hinnant
4773e519524SHoward Hinnant    template <class _RAIter,
4783e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4793e519524SHoward Hinnant    friend
4803e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4813e519524SHoward Hinnant    copy_backward(_RAIter __f,
4823e519524SHoward Hinnant                  _RAIter __l,
4833e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
484f82dba01SEric Fiselier                  typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
4853e519524SHoward Hinnant
4863e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4873e519524SHoward Hinnant              class _OutputIterator>
4883e519524SHoward Hinnant    friend
4893e519524SHoward Hinnant    _OutputIterator
4903e519524SHoward Hinnant    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4913e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4923e519524SHoward Hinnant                  _OutputIterator __r);
4933e519524SHoward Hinnant
4943e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4953e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4963e519524SHoward Hinnant    friend
4973e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4983e519524SHoward Hinnant    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4993e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5003e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5013e519524SHoward Hinnant
5023e519524SHoward Hinnant    template <class _RAIter,
5033e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5043e519524SHoward Hinnant    friend
5053e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5063e519524SHoward Hinnant    move(_RAIter __f,
5073e519524SHoward Hinnant         _RAIter __l,
5083e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
509f82dba01SEric Fiselier         typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
5103e519524SHoward Hinnant
5113e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5123e519524SHoward Hinnant              class _OutputIterator>
5133e519524SHoward Hinnant    friend
5143e519524SHoward Hinnant    _OutputIterator
5153e519524SHoward Hinnant    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5163e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5173e519524SHoward Hinnant         _OutputIterator __r);
5183e519524SHoward Hinnant
5193e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5203e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5213e519524SHoward Hinnant    friend
5223e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5233e519524SHoward Hinnant    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5243e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5253e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5263e519524SHoward Hinnant
5273e519524SHoward Hinnant    template <class _RAIter,
5283e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5293e519524SHoward Hinnant    friend
5303e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5313e519524SHoward Hinnant    move_backward(_RAIter __f,
5323e519524SHoward Hinnant                  _RAIter __l,
5333e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
534f82dba01SEric Fiselier                  typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
5353e519524SHoward Hinnant
5363e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5373e519524SHoward Hinnant              class _OutputIterator>
5383e519524SHoward Hinnant    friend
5393e519524SHoward Hinnant    _OutputIterator
5403e519524SHoward Hinnant    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5413e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5423e519524SHoward Hinnant                  _OutputIterator __r);
5433e519524SHoward Hinnant
5443e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5453e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5463e519524SHoward Hinnant    friend
5473e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5483e519524SHoward Hinnant    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5493e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5503e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5513e519524SHoward Hinnant};
5523e519524SHoward Hinnant
55365da7bc3SEvgeniy Stepanovtemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
55465da7bc3SEvgeniy Stepanov          class _DiffType, _DiffType _BlockSize>
55565da7bc3SEvgeniy Stepanovconst _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer,
55665da7bc3SEvgeniy Stepanov                                 _DiffType, _BlockSize>::__block_size =
55765da7bc3SEvgeniy Stepanov    __deque_block_size<_ValueType, _DiffType>::value;
55865da7bc3SEvgeniy Stepanov
5593e519524SHoward Hinnant// copy
5603e519524SHoward Hinnant
5613e519524SHoward Hinnanttemplate <class _RAIter,
5623e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5633e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5643e519524SHoward Hinnantcopy(_RAIter __f,
5653e519524SHoward Hinnant     _RAIter __l,
5663e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
567f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
5683e519524SHoward Hinnant{
5693e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
5703e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
57165da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
5723e519524SHoward Hinnant    while (__f != __l)
5733e519524SHoward Hinnant    {
5743e519524SHoward Hinnant        pointer __rb = __r.__ptr_;
57565da7bc3SEvgeniy Stepanov        pointer __re = *__r.__m_iter_ + __block_size;
5763e519524SHoward Hinnant        difference_type __bs = __re - __rb;
5773e519524SHoward Hinnant        difference_type __n = __l - __f;
5783e519524SHoward Hinnant        _RAIter __m = __l;
5793e519524SHoward Hinnant        if (__n > __bs)
5803e519524SHoward Hinnant        {
5813e519524SHoward Hinnant            __n = __bs;
5823e519524SHoward Hinnant            __m = __f + __n;
5833e519524SHoward Hinnant        }
584ce48a113SHoward Hinnant        _VSTD::copy(__f, __m, __rb);
5853e519524SHoward Hinnant        __f = __m;
5863e519524SHoward Hinnant        __r += __n;
5873e519524SHoward Hinnant    }
5883e519524SHoward Hinnant    return __r;
5893e519524SHoward Hinnant}
5903e519524SHoward Hinnant
5913e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5923e519524SHoward Hinnant          class _OutputIterator>
5933e519524SHoward Hinnant_OutputIterator
5943e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5953e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5963e519524SHoward Hinnant     _OutputIterator __r)
5973e519524SHoward Hinnant{
5983e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
5993e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
60065da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
6013e519524SHoward Hinnant    difference_type __n = __l - __f;
6023e519524SHoward Hinnant    while (__n > 0)
6033e519524SHoward Hinnant    {
6043e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
60565da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
6063e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
6073e519524SHoward Hinnant        if (__bs > __n)
6083e519524SHoward Hinnant        {
6093e519524SHoward Hinnant            __bs = __n;
6103e519524SHoward Hinnant            __fe = __fb + __bs;
6113e519524SHoward Hinnant        }
612ce48a113SHoward Hinnant        __r = _VSTD::copy(__fb, __fe, __r);
6133e519524SHoward Hinnant        __n -= __bs;
6143e519524SHoward Hinnant        __f += __bs;
6153e519524SHoward Hinnant    }
6163e519524SHoward Hinnant    return __r;
6173e519524SHoward Hinnant}
6183e519524SHoward Hinnant
6193e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
6203e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
6213e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
6223e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
6233e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
6243e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
6253e519524SHoward Hinnant{
6263e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
6273e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
62865da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
6293e519524SHoward Hinnant    difference_type __n = __l - __f;
6303e519524SHoward Hinnant    while (__n > 0)
6313e519524SHoward Hinnant    {
6323e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
63365da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
6343e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
6353e519524SHoward Hinnant        if (__bs > __n)
6363e519524SHoward Hinnant        {
6373e519524SHoward Hinnant            __bs = __n;
6383e519524SHoward Hinnant            __fe = __fb + __bs;
6393e519524SHoward Hinnant        }
640ce48a113SHoward Hinnant        __r = _VSTD::copy(__fb, __fe, __r);
6413e519524SHoward Hinnant        __n -= __bs;
6423e519524SHoward Hinnant        __f += __bs;
6433e519524SHoward Hinnant    }
6443e519524SHoward Hinnant    return __r;
6453e519524SHoward Hinnant}
6463e519524SHoward Hinnant
6473e519524SHoward Hinnant// copy_backward
6483e519524SHoward Hinnant
6493e519524SHoward Hinnanttemplate <class _RAIter,
6503e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
6513e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
6523e519524SHoward Hinnantcopy_backward(_RAIter __f,
6533e519524SHoward Hinnant              _RAIter __l,
6543e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
655f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
6563e519524SHoward Hinnant{
6573e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
6583e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
6593e519524SHoward Hinnant    while (__f != __l)
6603e519524SHoward Hinnant    {
661ce48a113SHoward Hinnant        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
6623e519524SHoward Hinnant        pointer __rb = *__rp.__m_iter_;
6633e519524SHoward Hinnant        pointer __re = __rp.__ptr_ + 1;
6643e519524SHoward Hinnant        difference_type __bs = __re - __rb;
6653e519524SHoward Hinnant        difference_type __n = __l - __f;
6663e519524SHoward Hinnant        _RAIter __m = __f;
6673e519524SHoward Hinnant        if (__n > __bs)
6683e519524SHoward Hinnant        {
6693e519524SHoward Hinnant            __n = __bs;
6703e519524SHoward Hinnant            __m = __l - __n;
6713e519524SHoward Hinnant        }
672ce48a113SHoward Hinnant        _VSTD::copy_backward(__m, __l, __re);
6733e519524SHoward Hinnant        __l = __m;
6743e519524SHoward Hinnant        __r -= __n;
6753e519524SHoward Hinnant    }
6763e519524SHoward Hinnant    return __r;
6773e519524SHoward Hinnant}
6783e519524SHoward Hinnant
6793e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
6803e519524SHoward Hinnant          class _OutputIterator>
6813e519524SHoward Hinnant_OutputIterator
6823e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
6833e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
6843e519524SHoward Hinnant              _OutputIterator __r)
6853e519524SHoward Hinnant{
6863e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
6873e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
6883e519524SHoward Hinnant    difference_type __n = __l - __f;
6893e519524SHoward Hinnant    while (__n > 0)
6903e519524SHoward Hinnant    {
6913e519524SHoward Hinnant        --__l;
6923e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
6933e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
6943e519524SHoward Hinnant        difference_type __bs = __le - __lb;
6953e519524SHoward Hinnant        if (__bs > __n)
6963e519524SHoward Hinnant        {
6973e519524SHoward Hinnant            __bs = __n;
6983e519524SHoward Hinnant            __lb = __le - __bs;
6993e519524SHoward Hinnant        }
700ce48a113SHoward Hinnant        __r = _VSTD::copy_backward(__lb, __le, __r);
7013e519524SHoward Hinnant        __n -= __bs;
7023e519524SHoward Hinnant        __l -= __bs - 1;
7033e519524SHoward Hinnant    }
7043e519524SHoward Hinnant    return __r;
7053e519524SHoward Hinnant}
7063e519524SHoward Hinnant
7073e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7083e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
7093e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
7103e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
7113e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
7123e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
7133e519524SHoward Hinnant{
7143e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
7153e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
7163e519524SHoward Hinnant    difference_type __n = __l - __f;
7173e519524SHoward Hinnant    while (__n > 0)
7183e519524SHoward Hinnant    {
7193e519524SHoward Hinnant        --__l;
7203e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
7213e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
7223e519524SHoward Hinnant        difference_type __bs = __le - __lb;
7233e519524SHoward Hinnant        if (__bs > __n)
7243e519524SHoward Hinnant        {
7253e519524SHoward Hinnant            __bs = __n;
7263e519524SHoward Hinnant            __lb = __le - __bs;
7273e519524SHoward Hinnant        }
728ce48a113SHoward Hinnant        __r = _VSTD::copy_backward(__lb, __le, __r);
7293e519524SHoward Hinnant        __n -= __bs;
7303e519524SHoward Hinnant        __l -= __bs - 1;
7313e519524SHoward Hinnant    }
7323e519524SHoward Hinnant    return __r;
7333e519524SHoward Hinnant}
7343e519524SHoward Hinnant
7353e519524SHoward Hinnant// move
7363e519524SHoward Hinnant
7373e519524SHoward Hinnanttemplate <class _RAIter,
7383e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
7393e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
7403e519524SHoward Hinnantmove(_RAIter __f,
7413e519524SHoward Hinnant     _RAIter __l,
7423e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
743f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
7443e519524SHoward Hinnant{
7453e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
7463e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
74765da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
7483e519524SHoward Hinnant    while (__f != __l)
7493e519524SHoward Hinnant    {
7503e519524SHoward Hinnant        pointer __rb = __r.__ptr_;
75165da7bc3SEvgeniy Stepanov        pointer __re = *__r.__m_iter_ + __block_size;
7523e519524SHoward Hinnant        difference_type __bs = __re - __rb;
7533e519524SHoward Hinnant        difference_type __n = __l - __f;
7543e519524SHoward Hinnant        _RAIter __m = __l;
7553e519524SHoward Hinnant        if (__n > __bs)
7563e519524SHoward Hinnant        {
7573e519524SHoward Hinnant            __n = __bs;
7583e519524SHoward Hinnant            __m = __f + __n;
7593e519524SHoward Hinnant        }
760ce48a113SHoward Hinnant        _VSTD::move(__f, __m, __rb);
7613e519524SHoward Hinnant        __f = __m;
7623e519524SHoward Hinnant        __r += __n;
7633e519524SHoward Hinnant    }
7643e519524SHoward Hinnant    return __r;
7653e519524SHoward Hinnant}
7663e519524SHoward Hinnant
7673e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7683e519524SHoward Hinnant          class _OutputIterator>
7693e519524SHoward Hinnant_OutputIterator
7703e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
7713e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
7723e519524SHoward Hinnant     _OutputIterator __r)
7733e519524SHoward Hinnant{
7743e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
7753e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
77665da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
7773e519524SHoward Hinnant    difference_type __n = __l - __f;
7783e519524SHoward Hinnant    while (__n > 0)
7793e519524SHoward Hinnant    {
7803e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
78165da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
7823e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
7833e519524SHoward Hinnant        if (__bs > __n)
7843e519524SHoward Hinnant        {
7853e519524SHoward Hinnant            __bs = __n;
7863e519524SHoward Hinnant            __fe = __fb + __bs;
7873e519524SHoward Hinnant        }
788ce48a113SHoward Hinnant        __r = _VSTD::move(__fb, __fe, __r);
7893e519524SHoward Hinnant        __n -= __bs;
7903e519524SHoward Hinnant        __f += __bs;
7913e519524SHoward Hinnant    }
7923e519524SHoward Hinnant    return __r;
7933e519524SHoward Hinnant}
7943e519524SHoward Hinnant
7953e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7963e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
7973e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
7983e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
7993e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8003e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
8013e519524SHoward Hinnant{
8023e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8033e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
80465da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
8053e519524SHoward Hinnant    difference_type __n = __l - __f;
8063e519524SHoward Hinnant    while (__n > 0)
8073e519524SHoward Hinnant    {
8083e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
80965da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
8103e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
8113e519524SHoward Hinnant        if (__bs > __n)
8123e519524SHoward Hinnant        {
8133e519524SHoward Hinnant            __bs = __n;
8143e519524SHoward Hinnant            __fe = __fb + __bs;
8153e519524SHoward Hinnant        }
816ce48a113SHoward Hinnant        __r = _VSTD::move(__fb, __fe, __r);
8173e519524SHoward Hinnant        __n -= __bs;
8183e519524SHoward Hinnant        __f += __bs;
8193e519524SHoward Hinnant    }
8203e519524SHoward Hinnant    return __r;
8213e519524SHoward Hinnant}
8223e519524SHoward Hinnant
8233e519524SHoward Hinnant// move_backward
8243e519524SHoward Hinnant
8253e519524SHoward Hinnanttemplate <class _RAIter,
8263e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
8273e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
8283e519524SHoward Hinnantmove_backward(_RAIter __f,
8293e519524SHoward Hinnant              _RAIter __l,
8303e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
831f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
8323e519524SHoward Hinnant{
8333e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
8343e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
8353e519524SHoward Hinnant    while (__f != __l)
8363e519524SHoward Hinnant    {
837ce48a113SHoward Hinnant        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
8383e519524SHoward Hinnant        pointer __rb = *__rp.__m_iter_;
8393e519524SHoward Hinnant        pointer __re = __rp.__ptr_ + 1;
8403e519524SHoward Hinnant        difference_type __bs = __re - __rb;
8413e519524SHoward Hinnant        difference_type __n = __l - __f;
8423e519524SHoward Hinnant        _RAIter __m = __f;
8433e519524SHoward Hinnant        if (__n > __bs)
8443e519524SHoward Hinnant        {
8453e519524SHoward Hinnant            __n = __bs;
8463e519524SHoward Hinnant            __m = __l - __n;
8473e519524SHoward Hinnant        }
848ce48a113SHoward Hinnant        _VSTD::move_backward(__m, __l, __re);
8493e519524SHoward Hinnant        __l = __m;
8503e519524SHoward Hinnant        __r -= __n;
8513e519524SHoward Hinnant    }
8523e519524SHoward Hinnant    return __r;
8533e519524SHoward Hinnant}
8543e519524SHoward Hinnant
8553e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
8563e519524SHoward Hinnant          class _OutputIterator>
8573e519524SHoward Hinnant_OutputIterator
8583e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
8593e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8603e519524SHoward Hinnant              _OutputIterator __r)
8613e519524SHoward Hinnant{
8623e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8633e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
8643e519524SHoward Hinnant    difference_type __n = __l - __f;
8653e519524SHoward Hinnant    while (__n > 0)
8663e519524SHoward Hinnant    {
8673e519524SHoward Hinnant        --__l;
8683e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
8693e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
8703e519524SHoward Hinnant        difference_type __bs = __le - __lb;
8713e519524SHoward Hinnant        if (__bs > __n)
8723e519524SHoward Hinnant        {
8733e519524SHoward Hinnant            __bs = __n;
8743e519524SHoward Hinnant            __lb = __le - __bs;
8753e519524SHoward Hinnant        }
876ce48a113SHoward Hinnant        __r = _VSTD::move_backward(__lb, __le, __r);
8773e519524SHoward Hinnant        __n -= __bs;
8783e519524SHoward Hinnant        __l -= __bs - 1;
8793e519524SHoward Hinnant    }
8803e519524SHoward Hinnant    return __r;
8813e519524SHoward Hinnant}
8823e519524SHoward Hinnant
8833e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
8843e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
8853e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
8863e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
8873e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8883e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
8893e519524SHoward Hinnant{
8903e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8913e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
8923e519524SHoward Hinnant    difference_type __n = __l - __f;
8933e519524SHoward Hinnant    while (__n > 0)
8943e519524SHoward Hinnant    {
8953e519524SHoward Hinnant        --__l;
8963e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
8973e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
8983e519524SHoward Hinnant        difference_type __bs = __le - __lb;
8993e519524SHoward Hinnant        if (__bs > __n)
9003e519524SHoward Hinnant        {
9013e519524SHoward Hinnant            __bs = __n;
9023e519524SHoward Hinnant            __lb = __le - __bs;
9033e519524SHoward Hinnant        }
904ce48a113SHoward Hinnant        __r = _VSTD::move_backward(__lb, __le, __r);
9053e519524SHoward Hinnant        __n -= __bs;
9063e519524SHoward Hinnant        __l -= __bs - 1;
9073e519524SHoward Hinnant    }
9083e519524SHoward Hinnant    return __r;
9093e519524SHoward Hinnant}
9103e519524SHoward Hinnant
9113e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
9123e519524SHoward Hinnantclass __deque_base
9133e519524SHoward Hinnant{
9143e519524SHoward Hinnant    __deque_base(const __deque_base& __c);
9153e519524SHoward Hinnant    __deque_base& operator=(const __deque_base& __c);
916dbb6f8a8SMarshall Clowpublic:
9173e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
9183e519524SHoward Hinnant    typedef allocator_traits<allocator_type>         __alloc_traits;
919dbb6f8a8SMarshall Clow    typedef typename __alloc_traits::size_type       size_type;
920d544d144SEric Fiselier
921dbb6f8a8SMarshall Clow    typedef _Tp                                      value_type;
9223e519524SHoward Hinnant    typedef value_type&                              reference;
9233e519524SHoward Hinnant    typedef const value_type&                        const_reference;
9243e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type difference_type;
9253e519524SHoward Hinnant    typedef typename __alloc_traits::pointer         pointer;
9263e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer   const_pointer;
9273e519524SHoward Hinnant
92865da7bc3SEvgeniy Stepanov    static const difference_type __block_size;
9293e519524SHoward Hinnant
9301f508014SMarshall Clow    typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
9313e519524SHoward Hinnant    typedef allocator_traits<__pointer_allocator>        __map_traits;
9323e519524SHoward Hinnant    typedef typename __map_traits::pointer               __map_pointer;
9331f508014SMarshall Clow    typedef typename __rebind_alloc_helper<__alloc_traits, const_pointer>::type __const_pointer_allocator;
93414e200d1SHoward Hinnant    typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer;
9353e519524SHoward Hinnant    typedef __split_buffer<pointer, __pointer_allocator> __map;
9363e519524SHoward Hinnant
9373e519524SHoward Hinnant    typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
93865da7bc3SEvgeniy Stepanov                             difference_type>    iterator;
9393e519524SHoward Hinnant    typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
94065da7bc3SEvgeniy Stepanov                             difference_type>    const_iterator;
9413e519524SHoward Hinnant
942b0945e1bSEric Fiselier    struct __deque_block_range {
943b0945e1bSEric Fiselier      explicit __deque_block_range(pointer __b, pointer __e) _NOEXCEPT : __begin_(__b), __end_(__e) {}
944b0945e1bSEric Fiselier      const pointer __begin_;
945b0945e1bSEric Fiselier      const pointer __end_;
946b0945e1bSEric Fiselier    };
947b0945e1bSEric Fiselier
948b0945e1bSEric Fiselier    struct __deque_range {
949b0945e1bSEric Fiselier      iterator __pos_;
950b0945e1bSEric Fiselier      const iterator __end_;
951b0945e1bSEric Fiselier
952b0945e1bSEric Fiselier      __deque_range(iterator __pos, iterator __e) _NOEXCEPT
953b0945e1bSEric Fiselier        : __pos_(__pos), __end_(__e) {}
954b0945e1bSEric Fiselier
955b0945e1bSEric Fiselier      explicit operator bool() const _NOEXCEPT {
956b0945e1bSEric Fiselier        return __pos_ != __end_;
957b0945e1bSEric Fiselier      }
958b0945e1bSEric Fiselier
959b0945e1bSEric Fiselier      __deque_range begin() const {
960b0945e1bSEric Fiselier        return *this;
961b0945e1bSEric Fiselier      }
962b0945e1bSEric Fiselier
963b0945e1bSEric Fiselier      __deque_range end() const {
964b0945e1bSEric Fiselier        return __deque_range(__end_, __end_);
965b0945e1bSEric Fiselier      }
966b0945e1bSEric Fiselier      __deque_block_range operator*() const _NOEXCEPT {
967b0945e1bSEric Fiselier         if (__pos_.__m_iter_ == __end_.__m_iter_) {
968b0945e1bSEric Fiselier          return __deque_block_range(__pos_.__ptr_, __end_.__ptr_);
969b0945e1bSEric Fiselier        }
970b0945e1bSEric Fiselier        return __deque_block_range(__pos_.__ptr_, *__pos_.__m_iter_ + __block_size);
971b0945e1bSEric Fiselier      }
972b0945e1bSEric Fiselier
973b0945e1bSEric Fiselier      __deque_range& operator++() _NOEXCEPT {
974b0945e1bSEric Fiselier        if (__pos_.__m_iter_ == __end_.__m_iter_) {
975b0945e1bSEric Fiselier          __pos_ = __end_;
976b0945e1bSEric Fiselier        } else {
977b0945e1bSEric Fiselier          ++__pos_.__m_iter_;
978b0945e1bSEric Fiselier          __pos_.__ptr_ = *__pos_.__m_iter_;
979b0945e1bSEric Fiselier        }
980b0945e1bSEric Fiselier        return *this;
981b0945e1bSEric Fiselier      }
982b0945e1bSEric Fiselier
983b0945e1bSEric Fiselier
984b0945e1bSEric Fiselier      friend bool operator==(__deque_range const& __lhs, __deque_range const& __rhs) {
985b0945e1bSEric Fiselier        return __lhs.__pos_ == __rhs.__pos_;
986b0945e1bSEric Fiselier      }
987b0945e1bSEric Fiselier      friend bool operator!=(__deque_range const& __lhs, __deque_range const& __rhs) {
988b0945e1bSEric Fiselier        return !(__lhs == __rhs);
989b0945e1bSEric Fiselier      }
990b0945e1bSEric Fiselier    };
991b0945e1bSEric Fiselier
992b0945e1bSEric Fiselier
993b0945e1bSEric Fiselier
994b0945e1bSEric Fiselier    struct _ConstructTransaction {
995b0945e1bSEric Fiselier      _ConstructTransaction(__deque_base* __db, __deque_block_range& __r)
996b0945e1bSEric Fiselier        : __pos_(__r.__begin_), __end_(__r.__end_), __begin_(__r.__begin_), __base_(__db) {}
997b0945e1bSEric Fiselier
998b0945e1bSEric Fiselier
999b0945e1bSEric Fiselier      ~_ConstructTransaction() {
1000b0945e1bSEric Fiselier        __base_->size() += (__pos_ - __begin_);
1001b0945e1bSEric Fiselier      }
1002b0945e1bSEric Fiselier
1003b0945e1bSEric Fiselier      pointer __pos_;
1004b0945e1bSEric Fiselier      const pointer __end_;
1005b0945e1bSEric Fiselier    private:
1006b0945e1bSEric Fiselier      const pointer __begin_;
1007b0945e1bSEric Fiselier      __deque_base * const __base_;
1008b0945e1bSEric Fiselier    };
1009b0945e1bSEric Fiselier
1010dbb6f8a8SMarshall Clowprotected:
10113e519524SHoward Hinnant    __map __map_;
10123e519524SHoward Hinnant    size_type __start_;
10133e519524SHoward Hinnant    __compressed_pair<size_type, allocator_type> __size_;
10143e519524SHoward Hinnant
1015a87e8360SHoward Hinnant    iterator       begin() _NOEXCEPT;
1016a87e8360SHoward Hinnant    const_iterator begin() const _NOEXCEPT;
1017a87e8360SHoward Hinnant    iterator       end() _NOEXCEPT;
1018a87e8360SHoward Hinnant    const_iterator end() const _NOEXCEPT;
10193e519524SHoward Hinnant
10203e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY size_type&            size()          {return __size_.first();}
1021a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1022a87e8360SHoward Hinnant    const size_type& size() const _NOEXCEPT {return __size_.first();}
10233e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY allocator_type&       __alloc()       {return __size_.second();}
1024a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1025a87e8360SHoward Hinnant    const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
10263e519524SHoward Hinnant
1027906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
102880129113SHoward Hinnant    __deque_base()
102980129113SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
1030906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
10313e519524SHoward Hinnant    explicit __deque_base(const allocator_type& __a);
10329eebe11dSHoward Hinnantpublic:
10333e519524SHoward Hinnant    ~__deque_base();
10343e519524SHoward Hinnant
1035a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10369eebe11dSHoward Hinnant    __deque_base(__deque_base&& __c)
10379eebe11dSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
10383e519524SHoward Hinnant    __deque_base(__deque_base&& __c, const allocator_type& __a);
1039a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
10403e519524SHoward Hinnant
10419eebe11dSHoward Hinnant    void swap(__deque_base& __c)
1042e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
1043e3fbe143SMarshall Clow        _NOEXCEPT;
1044e3fbe143SMarshall Clow#else
10459eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
10469eebe11dSHoward Hinnant                    __is_nothrow_swappable<allocator_type>::value);
1047e3fbe143SMarshall Clow#endif
10489eebe11dSHoward Hinnantprotected:
1049a87e8360SHoward Hinnant    void clear() _NOEXCEPT;
10503e519524SHoward Hinnant
10513e519524SHoward Hinnant    bool __invariants() const;
10523e519524SHoward Hinnant
1053fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10543e519524SHoward Hinnant    void __move_assign(__deque_base& __c)
1055b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1056b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
10573e519524SHoward Hinnant    {
1058ce48a113SHoward Hinnant        __map_ = _VSTD::move(__c.__map_);
10593e519524SHoward Hinnant        __start_ = __c.__start_;
10603e519524SHoward Hinnant        size() = __c.size();
10613e519524SHoward Hinnant        __move_assign_alloc(__c);
10623e519524SHoward Hinnant        __c.__start_ = __c.size() = 0;
10633e519524SHoward Hinnant    }
10643e519524SHoward Hinnant
1065fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10663e519524SHoward Hinnant    void __move_assign_alloc(__deque_base& __c)
10679eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value ||
10689eebe11dSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
10693e519524SHoward Hinnant        {__move_assign_alloc(__c, integral_constant<bool,
10703e519524SHoward Hinnant                      __alloc_traits::propagate_on_container_move_assignment::value>());}
10713e519524SHoward Hinnant
10723e519524SHoward Hinnantprivate:
1073fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10748668139fSHoward Hinnant    void __move_assign_alloc(__deque_base& __c, true_type)
10759eebe11dSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
10763e519524SHoward Hinnant        {
1077ce48a113SHoward Hinnant            __alloc() = _VSTD::move(__c.__alloc());
10783e519524SHoward Hinnant        }
10793e519524SHoward Hinnant
1080fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1081c206366fSHoward Hinnant    void __move_assign_alloc(__deque_base&, false_type) _NOEXCEPT
10823e519524SHoward Hinnant        {}
10833e519524SHoward Hinnant};
10843e519524SHoward Hinnant
10853e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
108665da7bc3SEvgeniy Stepanovconst typename __deque_base<_Tp, _Allocator>::difference_type
108765da7bc3SEvgeniy Stepanov    __deque_base<_Tp, _Allocator>::__block_size =
108865da7bc3SEvgeniy Stepanov        __deque_block_size<value_type, difference_type>::value;
108965da7bc3SEvgeniy Stepanov
109065da7bc3SEvgeniy Stepanovtemplate <class _Tp, class _Allocator>
10913e519524SHoward Hinnantbool
10923e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__invariants() const
10933e519524SHoward Hinnant{
10943e519524SHoward Hinnant    if (!__map_.__invariants())
10953e519524SHoward Hinnant        return false;
10963e519524SHoward Hinnant    if (__map_.size() >= size_type(-1) / __block_size)
10973e519524SHoward Hinnant        return false;
10983e519524SHoward Hinnant    for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end();
10993e519524SHoward Hinnant         __i != __e; ++__i)
11003e519524SHoward Hinnant        if (*__i == nullptr)
11013e519524SHoward Hinnant            return false;
11023e519524SHoward Hinnant    if (__map_.size() != 0)
11033e519524SHoward Hinnant    {
11043e519524SHoward Hinnant        if (size() >= __map_.size() * __block_size)
11053e519524SHoward Hinnant            return false;
11063e519524SHoward Hinnant        if (__start_ >= __map_.size() * __block_size - size())
11073e519524SHoward Hinnant            return false;
11083e519524SHoward Hinnant    }
11093e519524SHoward Hinnant    else
11103e519524SHoward Hinnant    {
11113e519524SHoward Hinnant        if (size() != 0)
11123e519524SHoward Hinnant            return false;
11133e519524SHoward Hinnant        if (__start_ != 0)
11143e519524SHoward Hinnant            return false;
11153e519524SHoward Hinnant    }
11163e519524SHoward Hinnant    return true;
11173e519524SHoward Hinnant}
11183e519524SHoward Hinnant
11193e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11203e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::iterator
1121a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::begin() _NOEXCEPT
11223e519524SHoward Hinnant{
11233e519524SHoward Hinnant    __map_pointer __mp = __map_.begin() + __start_ / __block_size;
11243e519524SHoward Hinnant    return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
11253e519524SHoward Hinnant}
11263e519524SHoward Hinnant
11273e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11283e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::const_iterator
1129a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
11303e519524SHoward Hinnant{
113114e200d1SHoward Hinnant    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
11323e519524SHoward Hinnant    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
11333e519524SHoward Hinnant}
11343e519524SHoward Hinnant
11353e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11363e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::iterator
1137a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::end() _NOEXCEPT
11383e519524SHoward Hinnant{
11393e519524SHoward Hinnant    size_type __p = size() + __start_;
11403e519524SHoward Hinnant    __map_pointer __mp = __map_.begin() + __p / __block_size;
11413e519524SHoward Hinnant    return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
11423e519524SHoward Hinnant}
11433e519524SHoward Hinnant
11443e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11453e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::const_iterator
1146a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
11473e519524SHoward Hinnant{
11483e519524SHoward Hinnant    size_type __p = size() + __start_;
114914e200d1SHoward Hinnant    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
11503e519524SHoward Hinnant    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
11513e519524SHoward Hinnant}
11523e519524SHoward Hinnant
11533e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1154906c872dSEvgeniy Stepanovinline
11553e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base()
115680129113SHoward Hinnant    _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1157549545b6SEric Fiselier    : __start_(0), __size_(0, __default_init_tag()) {}
11583e519524SHoward Hinnant
11593e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1160906c872dSEvgeniy Stepanovinline
11613e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
11623e519524SHoward Hinnant    : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
11633e519524SHoward Hinnant
11643e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11653e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::~__deque_base()
11663e519524SHoward Hinnant{
11673e519524SHoward Hinnant    clear();
11683e519524SHoward Hinnant    typename __map::iterator __i = __map_.begin();
11693e519524SHoward Hinnant    typename __map::iterator __e = __map_.end();
11703e519524SHoward Hinnant    for (; __i != __e; ++__i)
11713e519524SHoward Hinnant        __alloc_traits::deallocate(__alloc(), *__i, __block_size);
11723e519524SHoward Hinnant}
11733e519524SHoward Hinnant
1174a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11753e519524SHoward Hinnant
11763e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11773e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c)
11789eebe11dSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
1179ce48a113SHoward Hinnant    : __map_(_VSTD::move(__c.__map_)),
1180ce48a113SHoward Hinnant      __start_(_VSTD::move(__c.__start_)),
1181ce48a113SHoward Hinnant      __size_(_VSTD::move(__c.__size_))
11823e519524SHoward Hinnant{
11833e519524SHoward Hinnant    __c.__start_ = 0;
11843e519524SHoward Hinnant    __c.size() = 0;
11853e519524SHoward Hinnant}
11863e519524SHoward Hinnant
11873e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11883e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a)
1189ce48a113SHoward Hinnant    : __map_(_VSTD::move(__c.__map_), __pointer_allocator(__a)),
1190ce48a113SHoward Hinnant      __start_(_VSTD::move(__c.__start_)),
1191ce48a113SHoward Hinnant      __size_(_VSTD::move(__c.size()), __a)
11923e519524SHoward Hinnant{
11933e519524SHoward Hinnant    if (__a == __c.__alloc())
11943e519524SHoward Hinnant    {
11953e519524SHoward Hinnant        __c.__start_ = 0;
11963e519524SHoward Hinnant        __c.size() = 0;
11973e519524SHoward Hinnant    }
11983e519524SHoward Hinnant    else
11993e519524SHoward Hinnant    {
12003e519524SHoward Hinnant        __map_.clear();
12013e519524SHoward Hinnant        __start_ = 0;
12023e519524SHoward Hinnant        size() = 0;
12033e519524SHoward Hinnant    }
12043e519524SHoward Hinnant}
12053e519524SHoward Hinnant
1206a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
12073e519524SHoward Hinnant
12083e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
12093e519524SHoward Hinnantvoid
12103e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::swap(__deque_base& __c)
1211e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
1212e3fbe143SMarshall Clow        _NOEXCEPT
1213e3fbe143SMarshall Clow#else
12149eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
12159eebe11dSHoward Hinnant                    __is_nothrow_swappable<allocator_type>::value)
1216e3fbe143SMarshall Clow#endif
12173e519524SHoward Hinnant{
12183e519524SHoward Hinnant    __map_.swap(__c.__map_);
1219ce48a113SHoward Hinnant    _VSTD::swap(__start_, __c.__start_);
1220ce48a113SHoward Hinnant    _VSTD::swap(size(), __c.size());
12216e965df6SArthur O'Dwyer    _VSTD::__swap_allocator(__alloc(), __c.__alloc());
12223e519524SHoward Hinnant}
12233e519524SHoward Hinnant
12243e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
12253e519524SHoward Hinnantvoid
1226a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::clear() _NOEXCEPT
12273e519524SHoward Hinnant{
12283e519524SHoward Hinnant    allocator_type& __a = __alloc();
12293e519524SHoward Hinnant    for (iterator __i = begin(), __e = end(); __i != __e; ++__i)
1230ce48a113SHoward Hinnant        __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
12313e519524SHoward Hinnant    size() = 0;
12323e519524SHoward Hinnant    while (__map_.size() > 2)
12333e519524SHoward Hinnant    {
12343e519524SHoward Hinnant        __alloc_traits::deallocate(__a, __map_.front(), __block_size);
12353e519524SHoward Hinnant        __map_.pop_front();
12363e519524SHoward Hinnant    }
12373e519524SHoward Hinnant    switch (__map_.size())
12383e519524SHoward Hinnant    {
12393e519524SHoward Hinnant    case 1:
12403e519524SHoward Hinnant        __start_ = __block_size / 2;
12413e519524SHoward Hinnant        break;
12423e519524SHoward Hinnant    case 2:
12433e519524SHoward Hinnant        __start_ = __block_size;
12443e519524SHoward Hinnant        break;
12453e519524SHoward Hinnant    }
12463e519524SHoward Hinnant}
12473e519524SHoward Hinnant
1248b5d34aa4SMarshall Clowtemplate <class _Tp, class _Allocator /*= allocator<_Tp>*/>
1249e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS deque
12503e519524SHoward Hinnant    : private __deque_base<_Tp, _Allocator>
12513e519524SHoward Hinnant{
12523e519524SHoward Hinnantpublic:
12533e519524SHoward Hinnant    // types:
12543e519524SHoward Hinnant
12553e519524SHoward Hinnant    typedef _Tp value_type;
12563e519524SHoward Hinnant    typedef _Allocator allocator_type;
12573e519524SHoward Hinnant
125894f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
125994f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
126094f89aeeSMarshall Clow
12613e519524SHoward Hinnant    typedef __deque_base<value_type, allocator_type> __base;
12623e519524SHoward Hinnant
12633e519524SHoward Hinnant    typedef typename __base::__alloc_traits        __alloc_traits;
12643e519524SHoward Hinnant    typedef typename __base::reference             reference;
12653e519524SHoward Hinnant    typedef typename __base::const_reference       const_reference;
12663e519524SHoward Hinnant    typedef typename __base::iterator              iterator;
12673e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
12683e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
12693e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
12703e519524SHoward Hinnant
12713e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
12723e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
1273ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
1274ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
12753e519524SHoward Hinnant
1276b0945e1bSEric Fiselier    using typename __base::__deque_range;
1277b0945e1bSEric Fiselier    using typename __base::__deque_block_range;
1278b0945e1bSEric Fiselier    using typename __base::_ConstructTransaction;
1279b0945e1bSEric Fiselier
12803e519524SHoward Hinnant    // construct/copy/destroy:
128180129113SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
128280129113SHoward Hinnant    deque()
128380129113SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
128480129113SHoward Hinnant        {}
128578a87e8aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY explicit deque(const allocator_type& __a) : __base(__a) {}
12863e519524SHoward Hinnant    explicit deque(size_type __n);
1287630c5e53SMarshall Clow#if _LIBCPP_STD_VER > 11
1288630c5e53SMarshall Clow    explicit deque(size_type __n, const _Allocator& __a);
1289630c5e53SMarshall Clow#endif
12903e519524SHoward Hinnant    deque(size_type __n, const value_type& __v);
12913e519524SHoward Hinnant    deque(size_type __n, const value_type& __v, const allocator_type& __a);
12923e519524SHoward Hinnant    template <class _InputIter>
12933e519524SHoward Hinnant        deque(_InputIter __f, _InputIter __l,
1294f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type* = 0);
12953e519524SHoward Hinnant    template <class _InputIter>
12963e519524SHoward Hinnant        deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
1297f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type* = 0);
12983e519524SHoward Hinnant    deque(const deque& __c);
1299dd15c272SArthur O'Dwyer    deque(const deque& __c, const __identity_t<allocator_type>& __a);
13003e519524SHoward Hinnant
13013e519524SHoward Hinnant    deque& operator=(const deque& __c);
1302a9d646a0SEric Fiselier
1303a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1304a9d646a0SEric Fiselier    deque(initializer_list<value_type> __il);
1305a9d646a0SEric Fiselier    deque(initializer_list<value_type> __il, const allocator_type& __a);
1306a9d646a0SEric Fiselier
1307fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13083e519524SHoward Hinnant    deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;}
13093e519524SHoward Hinnant
1310906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13119eebe11dSHoward Hinnant    deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
1312906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
1313dd15c272SArthur O'Dwyer    deque(deque&& __c, const __identity_t<allocator_type>& __a);
1314906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13159eebe11dSHoward Hinnant    deque& operator=(deque&& __c)
1316b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1317b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value);
1318a9d646a0SEric Fiselier
1319a9d646a0SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1320a9d646a0SEric Fiselier    void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
1321a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
13223e519524SHoward Hinnant
13233e519524SHoward Hinnant    template <class _InputIter>
13243e519524SHoward Hinnant        void assign(_InputIter __f, _InputIter __l,
1325f82dba01SEric Fiselier                    typename enable_if<__is_cpp17_input_iterator<_InputIter>::value &&
1326f82dba01SEric Fiselier                                      !__is_cpp17_random_access_iterator<_InputIter>::value>::type* = 0);
13273e519524SHoward Hinnant    template <class _RAIter>
13283e519524SHoward Hinnant        void assign(_RAIter __f, _RAIter __l,
1329f82dba01SEric Fiselier                    typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
13303e519524SHoward Hinnant    void assign(size_type __n, const value_type& __v);
13313e519524SHoward Hinnant
1332906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
1333a87e8360SHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT;
13343e519524SHoward Hinnant
13353e519524SHoward Hinnant    // iterators:
13363e519524SHoward Hinnant
1337fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1338a87e8360SHoward Hinnant    iterator       begin() _NOEXCEPT       {return __base::begin();}
1339fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1340a87e8360SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __base::begin();}
1341fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1342a87e8360SHoward Hinnant    iterator       end() _NOEXCEPT         {return __base::end();}
1343fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1344a87e8360SHoward Hinnant    const_iterator end()   const _NOEXCEPT {return __base::end();}
13453e519524SHoward Hinnant
1346fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1347a87e8360SHoward Hinnant    reverse_iterator       rbegin() _NOEXCEPT
1348a87e8360SHoward Hinnant        {return       reverse_iterator(__base::end());}
1349fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1350a87e8360SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
1351a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::end());}
1352fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1353a87e8360SHoward Hinnant    reverse_iterator       rend() _NOEXCEPT
1354a87e8360SHoward Hinnant        {return       reverse_iterator(__base::begin());}
1355fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1356a87e8360SHoward Hinnant    const_reverse_iterator rend()   const _NOEXCEPT
1357a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::begin());}
13583e519524SHoward Hinnant
1359fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1360a87e8360SHoward Hinnant    const_iterator         cbegin()  const _NOEXCEPT
1361a87e8360SHoward Hinnant        {return __base::begin();}
1362fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1363a87e8360SHoward Hinnant    const_iterator         cend()    const _NOEXCEPT
1364a87e8360SHoward Hinnant        {return __base::end();}
1365fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1366a87e8360SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT
1367a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::end());}
1368fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1369a87e8360SHoward Hinnant    const_reverse_iterator crend()   const _NOEXCEPT
1370a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::begin());}
13713e519524SHoward Hinnant
13723e519524SHoward Hinnant    // capacity:
1373fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1374a87e8360SHoward Hinnant    size_type size() const _NOEXCEPT {return __base::size();}
1375a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1376a87e8360SHoward Hinnant    size_type max_size() const _NOEXCEPT
1377d586f92cSArthur O'Dwyer        {return _VSTD::min<size_type>(
137855b31b4eSEric Fiselier            __alloc_traits::max_size(__base::__alloc()),
137955b31b4eSEric Fiselier            numeric_limits<difference_type>::max());}
13803e519524SHoward Hinnant    void resize(size_type __n);
13813e519524SHoward Hinnant    void resize(size_type __n, const value_type& __v);
1382b58f59cdSHoward Hinnant    void shrink_to_fit() _NOEXCEPT;
138372c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
1384a87e8360SHoward Hinnant    bool empty() const _NOEXCEPT {return __base::size() == 0;}
13853e519524SHoward Hinnant
13863e519524SHoward Hinnant    // element access:
1387906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13885f6a5ac1SMarshall Clow    reference operator[](size_type __i) _NOEXCEPT;
1389906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13905f6a5ac1SMarshall Clow    const_reference operator[](size_type __i) const _NOEXCEPT;
1391906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13923e519524SHoward Hinnant    reference at(size_type __i);
1393906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13943e519524SHoward Hinnant    const_reference at(size_type __i) const;
1395906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13969ea0e473SMarshall Clow    reference front() _NOEXCEPT;
1397906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13989ea0e473SMarshall Clow    const_reference front() const _NOEXCEPT;
1399906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14009ea0e473SMarshall Clow    reference back() _NOEXCEPT;
1401906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14029ea0e473SMarshall Clow    const_reference back() const _NOEXCEPT;
14033e519524SHoward Hinnant
14043e519524SHoward Hinnant    // 23.2.2.3 modifiers:
14053e519524SHoward Hinnant    void push_front(const value_type& __v);
14063e519524SHoward Hinnant    void push_back(const value_type& __v);
1407a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
140863b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
14090e411641SEric Fiselier    template <class... _Args> reference emplace_front(_Args&&... __args);
14100e411641SEric Fiselier    template <class... _Args> reference emplace_back (_Args&&... __args);
141163b560beSMarshall Clow#else
141263b560beSMarshall Clow    template <class... _Args> void      emplace_front(_Args&&... __args);
141363b560beSMarshall Clow    template <class... _Args> void      emplace_back (_Args&&... __args);
141463b560beSMarshall Clow#endif
14153e519524SHoward Hinnant    template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
1416a9d646a0SEric Fiselier
14173e519524SHoward Hinnant    void push_front(value_type&& __v);
14183e519524SHoward Hinnant    void push_back(value_type&& __v);
14193e519524SHoward Hinnant    iterator insert(const_iterator __p, value_type&& __v);
1420a9d646a0SEric Fiselier
1421a9d646a0SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1422a9d646a0SEric Fiselier    iterator insert(const_iterator __p, initializer_list<value_type> __il)
1423a9d646a0SEric Fiselier        {return insert(__p, __il.begin(), __il.end());}
1424a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
14253e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v);
14263e519524SHoward Hinnant    iterator insert(const_iterator __p, size_type __n, const value_type& __v);
14273e519524SHoward Hinnant    template <class _InputIter>
14283e519524SHoward Hinnant        iterator insert(const_iterator __p, _InputIter __f, _InputIter __l,
1429f82dba01SEric Fiselier                         typename enable_if<__is_cpp17_input_iterator<_InputIter>::value
1430f82dba01SEric Fiselier                                         &&!__is_cpp17_forward_iterator<_InputIter>::value>::type* = 0);
1431f15d7a58SMarshall Clow    template <class _ForwardIterator>
1432f15d7a58SMarshall Clow        iterator insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
1433f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value
1434f82dba01SEric Fiselier                                         &&!__is_cpp17_bidirectional_iterator<_ForwardIterator>::value>::type* = 0);
14353e519524SHoward Hinnant    template <class _BiIter>
14363e519524SHoward Hinnant        iterator insert(const_iterator __p, _BiIter __f, _BiIter __l,
1437f82dba01SEric Fiselier                         typename enable_if<__is_cpp17_bidirectional_iterator<_BiIter>::value>::type* = 0);
1438a9d646a0SEric Fiselier
14393e519524SHoward Hinnant    void pop_front();
14403e519524SHoward Hinnant    void pop_back();
14413e519524SHoward Hinnant    iterator erase(const_iterator __p);
14423e519524SHoward Hinnant    iterator erase(const_iterator __f, const_iterator __l);
14433e519524SHoward Hinnant
1444906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14459eebe11dSHoward Hinnant    void swap(deque& __c)
1446e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
1447e3fbe143SMarshall Clow        _NOEXCEPT;
1448e3fbe143SMarshall Clow#else
14499eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
14509eebe11dSHoward Hinnant                   __is_nothrow_swappable<allocator_type>::value);
1451e3fbe143SMarshall Clow#endif
1452906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
1453a87e8360SHoward Hinnant    void clear() _NOEXCEPT;
14543e519524SHoward Hinnant
1455fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14563e519524SHoward Hinnant    bool __invariants() const {return __base::__invariants();}
1457d544d144SEric Fiselier
145814e200d1SHoward Hinnant    typedef typename __base::__map_const_pointer __map_const_pointer;
145914e200d1SHoward Hinnant
1460fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14613e519524SHoward Hinnant    static size_type __recommend_blocks(size_type __n)
14623e519524SHoward Hinnant    {
14633e519524SHoward Hinnant        return __n / __base::__block_size + (__n % __base::__block_size != 0);
14643e519524SHoward Hinnant    }
1465fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14663e519524SHoward Hinnant    size_type __capacity() const
14673e519524SHoward Hinnant    {
14683e519524SHoward Hinnant        return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1;
14693e519524SHoward Hinnant    }
1470fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1471d544d144SEric Fiselier    size_type __block_count() const
1472d544d144SEric Fiselier    {
1473d544d144SEric Fiselier        return __base::__map_.size();
1474d544d144SEric Fiselier    }
1475d544d144SEric Fiselier
1476d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
14773e519524SHoward Hinnant    size_type __front_spare() const
14783e519524SHoward Hinnant    {
14793e519524SHoward Hinnant        return __base::__start_;
14803e519524SHoward Hinnant    }
1481fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1482d544d144SEric Fiselier    size_type __front_spare_blocks() const {
1483d544d144SEric Fiselier      return __front_spare() / __base::__block_size;
1484d544d144SEric Fiselier    }
1485d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
14863e519524SHoward Hinnant    size_type __back_spare() const
14873e519524SHoward Hinnant    {
14883e519524SHoward Hinnant        return __capacity() - (__base::__start_ + __base::size());
14893e519524SHoward Hinnant    }
1490d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1491d544d144SEric Fiselier    size_type __back_spare_blocks() const {
1492d544d144SEric Fiselier      return __back_spare() / __base::__block_size;
1493d544d144SEric Fiselier    }
1494d544d144SEric Fiselier
1495d544d144SEric Fiselier private:
1496d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1497d544d144SEric Fiselier    bool __maybe_remove_front_spare(bool __keep_one = true) {
1498d544d144SEric Fiselier      if (__front_spare_blocks() >= 2 || (!__keep_one && __front_spare_blocks())) {
1499d544d144SEric Fiselier        __alloc_traits::deallocate(__base::__alloc(), __base::__map_.front(),
1500d544d144SEric Fiselier                                   __base::__block_size);
1501d544d144SEric Fiselier        __base::__map_.pop_front();
1502d544d144SEric Fiselier        __base::__start_ -= __base::__block_size;
1503d544d144SEric Fiselier        return true;
1504d544d144SEric Fiselier      }
1505d544d144SEric Fiselier      return false;
1506d544d144SEric Fiselier    }
1507d544d144SEric Fiselier
1508d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1509d544d144SEric Fiselier    bool __maybe_remove_back_spare(bool __keep_one = true) {
1510d544d144SEric Fiselier      if (__back_spare_blocks() >= 2 || (!__keep_one && __back_spare_blocks())) {
1511d544d144SEric Fiselier        __alloc_traits::deallocate(__base::__alloc(), __base::__map_.back(),
1512d544d144SEric Fiselier                                   __base::__block_size);
1513d544d144SEric Fiselier        __base::__map_.pop_back();
1514d544d144SEric Fiselier        return true;
1515d544d144SEric Fiselier      }
1516d544d144SEric Fiselier      return false;
1517d544d144SEric Fiselier    }
15183e519524SHoward Hinnant
15193e519524SHoward Hinnant    template <class _InpIter>
15203e519524SHoward Hinnant        void __append(_InpIter __f, _InpIter __l,
1521f82dba01SEric Fiselier                 typename enable_if<__is_cpp17_input_iterator<_InpIter>::value &&
1522f82dba01SEric Fiselier                                   !__is_cpp17_forward_iterator<_InpIter>::value>::type* = 0);
15233e519524SHoward Hinnant    template <class _ForIter>
15243e519524SHoward Hinnant        void __append(_ForIter __f, _ForIter __l,
1525f82dba01SEric Fiselier                      typename enable_if<__is_cpp17_forward_iterator<_ForIter>::value>::type* = 0);
15263e519524SHoward Hinnant    void __append(size_type __n);
15273e519524SHoward Hinnant    void __append(size_type __n, const value_type& __v);
15283e519524SHoward Hinnant    void __erase_to_end(const_iterator __f);
15293e519524SHoward Hinnant    void __add_front_capacity();
15303e519524SHoward Hinnant    void __add_front_capacity(size_type __n);
15313e519524SHoward Hinnant    void __add_back_capacity();
15323e519524SHoward Hinnant    void __add_back_capacity(size_type __n);
15333e519524SHoward Hinnant    iterator __move_and_check(iterator __f, iterator __l, iterator __r,
15343e519524SHoward Hinnant                              const_pointer& __vt);
15353e519524SHoward Hinnant    iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r,
15363e519524SHoward Hinnant                                       const_pointer& __vt);
15373e519524SHoward Hinnant    void __move_construct_and_check(iterator __f, iterator __l,
15383e519524SHoward Hinnant                                    iterator __r, const_pointer& __vt);
15393e519524SHoward Hinnant    void __move_construct_backward_and_check(iterator __f, iterator __l,
15403e519524SHoward Hinnant                                             iterator __r, const_pointer& __vt);
15413e519524SHoward Hinnant
1542fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15433e519524SHoward Hinnant    void __copy_assign_alloc(const deque& __c)
15443e519524SHoward Hinnant        {__copy_assign_alloc(__c, integral_constant<bool,
15453e519524SHoward Hinnant                      __alloc_traits::propagate_on_container_copy_assignment::value>());}
15463e519524SHoward Hinnant
1547fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15483e519524SHoward Hinnant    void __copy_assign_alloc(const deque& __c, true_type)
15493e519524SHoward Hinnant        {
15503e519524SHoward Hinnant            if (__base::__alloc() != __c.__alloc())
15513e519524SHoward Hinnant            {
15523e519524SHoward Hinnant                clear();
15533e519524SHoward Hinnant                shrink_to_fit();
15543e519524SHoward Hinnant            }
15553e519524SHoward Hinnant            __base::__alloc() = __c.__alloc();
15563e519524SHoward Hinnant            __base::__map_.__alloc() = __c.__map_.__alloc();
15573e519524SHoward Hinnant        }
15583e519524SHoward Hinnant
1559fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1560c206366fSHoward Hinnant    void __copy_assign_alloc(const deque&, false_type)
15613e519524SHoward Hinnant        {}
15623e519524SHoward Hinnant
1563b58f59cdSHoward Hinnant    void __move_assign(deque& __c, true_type)
1564b58f59cdSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
15653e519524SHoward Hinnant    void __move_assign(deque& __c, false_type);
15663e519524SHoward Hinnant};
15673e519524SHoward Hinnant
156801666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1569dbb6f8a8SMarshall Clowtemplate<class _InputIterator,
1570199d2ebeSArthur O'Dwyer         class _Alloc = allocator<__iter_value_type<_InputIterator>>,
1571*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Alloc>::value>
1572dbb6f8a8SMarshall Clow         >
1573dbb6f8a8SMarshall Clowdeque(_InputIterator, _InputIterator)
1574199d2ebeSArthur O'Dwyer  -> deque<__iter_value_type<_InputIterator>, _Alloc>;
1575dbb6f8a8SMarshall Clow
1576dbb6f8a8SMarshall Clowtemplate<class _InputIterator,
1577dbb6f8a8SMarshall Clow         class _Alloc,
1578*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Alloc>::value>
1579dbb6f8a8SMarshall Clow         >
1580dbb6f8a8SMarshall Clowdeque(_InputIterator, _InputIterator, _Alloc)
1581199d2ebeSArthur O'Dwyer  -> deque<__iter_value_type<_InputIterator>, _Alloc>;
1582dbb6f8a8SMarshall Clow#endif
1583dbb6f8a8SMarshall Clow
1584dbb6f8a8SMarshall Clow
15853e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
15863e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n)
15873e519524SHoward Hinnant{
15883e519524SHoward Hinnant    if (__n > 0)
15893e519524SHoward Hinnant        __append(__n);
15903e519524SHoward Hinnant}
15913e519524SHoward Hinnant
1592630c5e53SMarshall Clow#if _LIBCPP_STD_VER > 11
1593630c5e53SMarshall Clowtemplate <class _Tp, class _Allocator>
1594630c5e53SMarshall Clowdeque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a)
1595630c5e53SMarshall Clow    : __base(__a)
1596630c5e53SMarshall Clow{
1597630c5e53SMarshall Clow    if (__n > 0)
1598630c5e53SMarshall Clow        __append(__n);
1599630c5e53SMarshall Clow}
1600630c5e53SMarshall Clow#endif
1601630c5e53SMarshall Clow
16023e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16033e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)
16043e519524SHoward Hinnant{
16053e519524SHoward Hinnant    if (__n > 0)
16063e519524SHoward Hinnant        __append(__n, __v);
16073e519524SHoward Hinnant}
16083e519524SHoward Hinnant
16093e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16103e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a)
16113e519524SHoward Hinnant    : __base(__a)
16123e519524SHoward Hinnant{
16133e519524SHoward Hinnant    if (__n > 0)
16143e519524SHoward Hinnant        __append(__n, __v);
16153e519524SHoward Hinnant}
16163e519524SHoward Hinnant
16173e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16183e519524SHoward Hinnanttemplate <class _InputIter>
16193e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l,
1620f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type*)
16213e519524SHoward Hinnant{
16223e519524SHoward Hinnant    __append(__f, __l);
16233e519524SHoward Hinnant}
16243e519524SHoward Hinnant
16253e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16263e519524SHoward Hinnanttemplate <class _InputIter>
16273e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
1628f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type*)
16293e519524SHoward Hinnant    : __base(__a)
16303e519524SHoward Hinnant{
16313e519524SHoward Hinnant    __append(__f, __l);
16323e519524SHoward Hinnant}
16333e519524SHoward Hinnant
16343e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16353e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(const deque& __c)
16363e519524SHoward Hinnant    : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc()))
16373e519524SHoward Hinnant{
16383e519524SHoward Hinnant    __append(__c.begin(), __c.end());
16393e519524SHoward Hinnant}
16403e519524SHoward Hinnant
16413e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1642dd15c272SArthur O'Dwyerdeque<_Tp, _Allocator>::deque(const deque& __c, const __identity_t<allocator_type>& __a)
16433e519524SHoward Hinnant    : __base(__a)
16443e519524SHoward Hinnant{
16453e519524SHoward Hinnant    __append(__c.begin(), __c.end());
16463e519524SHoward Hinnant}
16473e519524SHoward Hinnant
1648a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
1649a9d646a0SEric Fiselierdeque<_Tp, _Allocator>&
1650a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::operator=(const deque& __c)
1651a9d646a0SEric Fiselier{
1652a9d646a0SEric Fiselier    if (this != &__c)
1653a9d646a0SEric Fiselier    {
1654a9d646a0SEric Fiselier        __copy_assign_alloc(__c);
1655a9d646a0SEric Fiselier        assign(__c.begin(), __c.end());
1656a9d646a0SEric Fiselier    }
1657a9d646a0SEric Fiselier    return *this;
1658a9d646a0SEric Fiselier}
1659a9d646a0SEric Fiselier
1660a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
166154976f26SHoward Hinnant
16623e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16633e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il)
16643e519524SHoward Hinnant{
16653e519524SHoward Hinnant    __append(__il.begin(), __il.end());
16663e519524SHoward Hinnant}
16673e519524SHoward Hinnant
16683e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16693e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a)
16703e519524SHoward Hinnant    : __base(__a)
16713e519524SHoward Hinnant{
16723e519524SHoward Hinnant    __append(__il.begin(), __il.end());
16733e519524SHoward Hinnant}
16743e519524SHoward Hinnant
16753e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1676906c872dSEvgeniy Stepanovinline
16773e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(deque&& __c)
16789eebe11dSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1679ce48a113SHoward Hinnant    : __base(_VSTD::move(__c))
16803e519524SHoward Hinnant{
16813e519524SHoward Hinnant}
16823e519524SHoward Hinnant
16833e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1684906c872dSEvgeniy Stepanovinline
1685dd15c272SArthur O'Dwyerdeque<_Tp, _Allocator>::deque(deque&& __c, const __identity_t<allocator_type>& __a)
1686ce48a113SHoward Hinnant    : __base(_VSTD::move(__c), __a)
16873e519524SHoward Hinnant{
16883e519524SHoward Hinnant    if (__a != __c.__alloc())
16893e519524SHoward Hinnant    {
1690c003db1fSHoward Hinnant        typedef move_iterator<iterator> _Ip;
1691c003db1fSHoward Hinnant        assign(_Ip(__c.begin()), _Ip(__c.end()));
16923e519524SHoward Hinnant    }
16933e519524SHoward Hinnant}
16943e519524SHoward Hinnant
16953e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1696906c872dSEvgeniy Stepanovinline
16973e519524SHoward Hinnantdeque<_Tp, _Allocator>&
16983e519524SHoward Hinnantdeque<_Tp, _Allocator>::operator=(deque&& __c)
1699b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1700b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
17013e519524SHoward Hinnant{
17023e519524SHoward Hinnant    __move_assign(__c, integral_constant<bool,
17033e519524SHoward Hinnant          __alloc_traits::propagate_on_container_move_assignment::value>());
17043e519524SHoward Hinnant    return *this;
17053e519524SHoward Hinnant}
17063e519524SHoward Hinnant
17073e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17083e519524SHoward Hinnantvoid
17093e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_assign(deque& __c, false_type)
17103e519524SHoward Hinnant{
17113e519524SHoward Hinnant    if (__base::__alloc() != __c.__alloc())
17123e519524SHoward Hinnant    {
1713c003db1fSHoward Hinnant        typedef move_iterator<iterator> _Ip;
1714c003db1fSHoward Hinnant        assign(_Ip(__c.begin()), _Ip(__c.end()));
17153e519524SHoward Hinnant    }
17163e519524SHoward Hinnant    else
17173e519524SHoward Hinnant        __move_assign(__c, true_type());
17183e519524SHoward Hinnant}
17193e519524SHoward Hinnant
17203e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17213e519524SHoward Hinnantvoid
17223e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_assign(deque& __c, true_type)
1723b58f59cdSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
17243e519524SHoward Hinnant{
17253e519524SHoward Hinnant    clear();
17263e519524SHoward Hinnant    shrink_to_fit();
17273e519524SHoward Hinnant    __base::__move_assign(__c);
17283e519524SHoward Hinnant}
17293e519524SHoward Hinnant
1730a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
17313e519524SHoward Hinnant
17323e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17333e519524SHoward Hinnanttemplate <class _InputIter>
17343e519524SHoward Hinnantvoid
17353e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
1736f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_input_iterator<_InputIter>::value &&
1737f82dba01SEric Fiselier                                                 !__is_cpp17_random_access_iterator<_InputIter>::value>::type*)
17383e519524SHoward Hinnant{
17393e519524SHoward Hinnant    iterator __i = __base::begin();
17403e519524SHoward Hinnant    iterator __e = __base::end();
1741910285b2SEric Fiselier    for (; __f != __l && __i != __e; ++__f, (void) ++__i)
17423e519524SHoward Hinnant        *__i = *__f;
17433e519524SHoward Hinnant    if (__f != __l)
17443e519524SHoward Hinnant        __append(__f, __l);
17453e519524SHoward Hinnant    else
17463e519524SHoward Hinnant        __erase_to_end(__i);
17473e519524SHoward Hinnant}
17483e519524SHoward Hinnant
17493e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17503e519524SHoward Hinnanttemplate <class _RAIter>
17513e519524SHoward Hinnantvoid
17523e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l,
1753f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
17543e519524SHoward Hinnant{
17553e519524SHoward Hinnant    if (static_cast<size_type>(__l - __f) > __base::size())
17563e519524SHoward Hinnant    {
17573e519524SHoward Hinnant        _RAIter __m = __f + __base::size();
1758ce48a113SHoward Hinnant        _VSTD::copy(__f, __m, __base::begin());
17593e519524SHoward Hinnant        __append(__m, __l);
17603e519524SHoward Hinnant    }
17613e519524SHoward Hinnant    else
1762ce48a113SHoward Hinnant        __erase_to_end(_VSTD::copy(__f, __l, __base::begin()));
17633e519524SHoward Hinnant}
17643e519524SHoward Hinnant
17653e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17663e519524SHoward Hinnantvoid
17673e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v)
17683e519524SHoward Hinnant{
17693e519524SHoward Hinnant    if (__n > __base::size())
17703e519524SHoward Hinnant    {
1771ce48a113SHoward Hinnant        _VSTD::fill_n(__base::begin(), __base::size(), __v);
17723e519524SHoward Hinnant        __n -= __base::size();
17733e519524SHoward Hinnant        __append(__n, __v);
17743e519524SHoward Hinnant    }
17753e519524SHoward Hinnant    else
1776ce48a113SHoward Hinnant        __erase_to_end(_VSTD::fill_n(__base::begin(), __n, __v));
17773e519524SHoward Hinnant}
17783e519524SHoward Hinnant
17793e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1780906c872dSEvgeniy Stepanovinline
17813e519524SHoward Hinnant_Allocator
1782a87e8360SHoward Hinnantdeque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
17833e519524SHoward Hinnant{
17843e519524SHoward Hinnant    return __base::__alloc();
17853e519524SHoward Hinnant}
17863e519524SHoward Hinnant
17873e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17883e519524SHoward Hinnantvoid
17893e519524SHoward Hinnantdeque<_Tp, _Allocator>::resize(size_type __n)
17903e519524SHoward Hinnant{
17913e519524SHoward Hinnant    if (__n > __base::size())
17923e519524SHoward Hinnant        __append(__n - __base::size());
17933e519524SHoward Hinnant    else if (__n < __base::size())
17943e519524SHoward Hinnant        __erase_to_end(__base::begin() + __n);
17953e519524SHoward Hinnant}
17963e519524SHoward Hinnant
17973e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17983e519524SHoward Hinnantvoid
17993e519524SHoward Hinnantdeque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v)
18003e519524SHoward Hinnant{
18013e519524SHoward Hinnant    if (__n > __base::size())
18023e519524SHoward Hinnant        __append(__n - __base::size(), __v);
18033e519524SHoward Hinnant    else if (__n < __base::size())
18043e519524SHoward Hinnant        __erase_to_end(__base::begin() + __n);
18053e519524SHoward Hinnant}
18063e519524SHoward Hinnant
18073e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
18083e519524SHoward Hinnantvoid
1809b58f59cdSHoward Hinnantdeque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
18103e519524SHoward Hinnant{
18113e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
18123e519524SHoward Hinnant    if (empty())
18133e519524SHoward Hinnant    {
18143e519524SHoward Hinnant        while (__base::__map_.size() > 0)
18153e519524SHoward Hinnant        {
18163e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
18173e519524SHoward Hinnant            __base::__map_.pop_back();
18183e519524SHoward Hinnant        }
18193e519524SHoward Hinnant        __base::__start_ = 0;
18203e519524SHoward Hinnant    }
18213e519524SHoward Hinnant    else
18223e519524SHoward Hinnant    {
1823d544d144SEric Fiselier      __maybe_remove_front_spare(/*__keep_one=*/false);
1824d544d144SEric Fiselier      __maybe_remove_back_spare(/*__keep_one=*/false);
18253e519524SHoward Hinnant    }
18263e519524SHoward Hinnant    __base::__map_.shrink_to_fit();
18273e519524SHoward Hinnant}
18283e519524SHoward Hinnant
18293e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1830906c872dSEvgeniy Stepanovinline
18313e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
18325f6a5ac1SMarshall Clowdeque<_Tp, _Allocator>::operator[](size_type __i) _NOEXCEPT
18333e519524SHoward Hinnant{
18343e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18353e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18363e519524SHoward Hinnant}
18373e519524SHoward Hinnant
18383e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1839906c872dSEvgeniy Stepanovinline
18403e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
18415f6a5ac1SMarshall Clowdeque<_Tp, _Allocator>::operator[](size_type __i) const _NOEXCEPT
18423e519524SHoward Hinnant{
18433e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18443e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18453e519524SHoward Hinnant}
18463e519524SHoward Hinnant
18473e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1848906c872dSEvgeniy Stepanovinline
18493e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
18503e519524SHoward Hinnantdeque<_Tp, _Allocator>::at(size_type __i)
18513e519524SHoward Hinnant{
18523e519524SHoward Hinnant    if (__i >= __base::size())
1853475f831bSLouis Dionne        _VSTD::__throw_out_of_range("deque");
18543e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18553e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18563e519524SHoward Hinnant}
18573e519524SHoward Hinnant
18583e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1859906c872dSEvgeniy Stepanovinline
18603e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
18613e519524SHoward Hinnantdeque<_Tp, _Allocator>::at(size_type __i) const
18623e519524SHoward Hinnant{
18633e519524SHoward Hinnant    if (__i >= __base::size())
1864475f831bSLouis Dionne        _VSTD::__throw_out_of_range("deque");
18653e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18663e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18673e519524SHoward Hinnant}
18683e519524SHoward Hinnant
18693e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1870906c872dSEvgeniy Stepanovinline
18713e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
18729ea0e473SMarshall Clowdeque<_Tp, _Allocator>::front() _NOEXCEPT
18733e519524SHoward Hinnant{
18743e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
18753e519524SHoward Hinnant                                      + __base::__start_ % __base::__block_size);
18763e519524SHoward Hinnant}
18773e519524SHoward Hinnant
18783e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1879906c872dSEvgeniy Stepanovinline
18803e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
18819ea0e473SMarshall Clowdeque<_Tp, _Allocator>::front() const _NOEXCEPT
18823e519524SHoward Hinnant{
18833e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
18843e519524SHoward Hinnant                                      + __base::__start_ % __base::__block_size);
18853e519524SHoward Hinnant}
18863e519524SHoward Hinnant
18873e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1888906c872dSEvgeniy Stepanovinline
18893e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
18909ea0e473SMarshall Clowdeque<_Tp, _Allocator>::back() _NOEXCEPT
18913e519524SHoward Hinnant{
18923e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
18933e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18943e519524SHoward Hinnant}
18953e519524SHoward Hinnant
18963e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1897906c872dSEvgeniy Stepanovinline
18983e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
18999ea0e473SMarshall Clowdeque<_Tp, _Allocator>::back() const _NOEXCEPT
19003e519524SHoward Hinnant{
19013e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
19023e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
19033e519524SHoward Hinnant}
19043e519524SHoward Hinnant
19053e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19063e519524SHoward Hinnantvoid
19073e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_back(const value_type& __v)
19083e519524SHoward Hinnant{
19093e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19103e519524SHoward Hinnant    if (__back_spare() == 0)
19113e519524SHoward Hinnant        __add_back_capacity();
19123e519524SHoward Hinnant    // __back_spare() >= 1
1913ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
19143e519524SHoward Hinnant    ++__base::size();
19153e519524SHoward Hinnant}
19163e519524SHoward Hinnant
1917a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
1918a9d646a0SEric Fiseliervoid
1919a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::push_front(const value_type& __v)
1920a9d646a0SEric Fiselier{
1921a9d646a0SEric Fiselier    allocator_type& __a = __base::__alloc();
1922a9d646a0SEric Fiselier    if (__front_spare() == 0)
1923a9d646a0SEric Fiselier        __add_front_capacity();
1924a9d646a0SEric Fiselier    // __front_spare() >= 1
1925a9d646a0SEric Fiselier    __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
1926a9d646a0SEric Fiselier    --__base::__start_;
1927a9d646a0SEric Fiselier    ++__base::size();
1928a9d646a0SEric Fiselier}
19293e519524SHoward Hinnant
1930a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
19313e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19323e519524SHoward Hinnantvoid
19333e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_back(value_type&& __v)
19343e519524SHoward Hinnant{
19353e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19363e519524SHoward Hinnant    if (__back_spare() == 0)
19373e519524SHoward Hinnant        __add_back_capacity();
19383e519524SHoward Hinnant    // __back_spare() >= 1
1939ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
19403e519524SHoward Hinnant    ++__base::size();
19413e519524SHoward Hinnant}
19423e519524SHoward Hinnant
19433e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19443e519524SHoward Hinnanttemplate <class... _Args>
194563b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
19460e411641SEric Fiseliertypename deque<_Tp, _Allocator>::reference
194763b560beSMarshall Clow#else
194863b560beSMarshall Clowvoid
194963b560beSMarshall Clow#endif
19503e519524SHoward Hinnantdeque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
19513e519524SHoward Hinnant{
19523e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19533e519524SHoward Hinnant    if (__back_spare() == 0)
19543e519524SHoward Hinnant        __add_back_capacity();
19553e519524SHoward Hinnant    // __back_spare() >= 1
19560e411641SEric Fiselier    __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()),
19570e411641SEric Fiselier                              _VSTD::forward<_Args>(__args)...);
19583e519524SHoward Hinnant    ++__base::size();
195963b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
19600e411641SEric Fiselier    return *--__base::end();
196163b560beSMarshall Clow#endif
19623e519524SHoward Hinnant}
19633e519524SHoward Hinnant
19643e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19653e519524SHoward Hinnantvoid
19663e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_front(value_type&& __v)
19673e519524SHoward Hinnant{
19683e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19693e519524SHoward Hinnant    if (__front_spare() == 0)
19703e519524SHoward Hinnant        __add_front_capacity();
19713e519524SHoward Hinnant    // __front_spare() >= 1
1972ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
19733e519524SHoward Hinnant    --__base::__start_;
19743e519524SHoward Hinnant    ++__base::size();
19753e519524SHoward Hinnant}
19763e519524SHoward Hinnant
19777609c9b6SHoward Hinnant
19783e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19793e519524SHoward Hinnanttemplate <class... _Args>
198063b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
19810e411641SEric Fiseliertypename deque<_Tp, _Allocator>::reference
198263b560beSMarshall Clow#else
198363b560beSMarshall Clowvoid
198463b560beSMarshall Clow#endif
19853e519524SHoward Hinnantdeque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
19863e519524SHoward Hinnant{
19873e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19883e519524SHoward Hinnant    if (__front_spare() == 0)
19893e519524SHoward Hinnant        __add_front_capacity();
19903e519524SHoward Hinnant    // __front_spare() >= 1
1991ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
19923e519524SHoward Hinnant    --__base::__start_;
19933e519524SHoward Hinnant    ++__base::size();
199463b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
19950e411641SEric Fiselier    return *__base::begin();
199663b560beSMarshall Clow#endif
19973e519524SHoward Hinnant}
19983e519524SHoward Hinnant
1999a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
2000a9d646a0SEric Fiseliertypename deque<_Tp, _Allocator>::iterator
2001a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v)
2002a9d646a0SEric Fiselier{
2003a9d646a0SEric Fiselier    size_type __pos = __p - __base::begin();
2004a9d646a0SEric Fiselier    size_type __to_end = __base::size() - __pos;
2005a9d646a0SEric Fiselier    allocator_type& __a = __base::__alloc();
2006a9d646a0SEric Fiselier    if (__pos < __to_end)
2007a9d646a0SEric Fiselier    {   // insert by shifting things backward
2008a9d646a0SEric Fiselier        if (__front_spare() == 0)
2009a9d646a0SEric Fiselier            __add_front_capacity();
2010a9d646a0SEric Fiselier        // __front_spare() >= 1
2011a9d646a0SEric Fiselier        if (__pos == 0)
2012a9d646a0SEric Fiselier        {
2013a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
2014a9d646a0SEric Fiselier            --__base::__start_;
2015a9d646a0SEric Fiselier            ++__base::size();
2016a9d646a0SEric Fiselier        }
2017a9d646a0SEric Fiselier        else
2018a9d646a0SEric Fiselier        {
2019a9d646a0SEric Fiselier            iterator __b = __base::begin();
2020a9d646a0SEric Fiselier            iterator __bm1 = _VSTD::prev(__b);
2021a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
2022a9d646a0SEric Fiselier            --__base::__start_;
2023a9d646a0SEric Fiselier            ++__base::size();
2024a9d646a0SEric Fiselier            if (__pos > 1)
2025a9d646a0SEric Fiselier                __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
2026a9d646a0SEric Fiselier            *__b = _VSTD::move(__v);
2027a9d646a0SEric Fiselier        }
2028a9d646a0SEric Fiselier    }
2029a9d646a0SEric Fiselier    else
2030a9d646a0SEric Fiselier    {   // insert by shifting things forward
2031a9d646a0SEric Fiselier        if (__back_spare() == 0)
2032a9d646a0SEric Fiselier            __add_back_capacity();
2033a9d646a0SEric Fiselier        // __back_capacity >= 1
2034a9d646a0SEric Fiselier        size_type __de = __base::size() - __pos;
2035a9d646a0SEric Fiselier        if (__de == 0)
2036a9d646a0SEric Fiselier        {
2037a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
2038a9d646a0SEric Fiselier            ++__base::size();
2039a9d646a0SEric Fiselier        }
2040a9d646a0SEric Fiselier        else
2041a9d646a0SEric Fiselier        {
2042a9d646a0SEric Fiselier            iterator __e = __base::end();
2043a9d646a0SEric Fiselier            iterator __em1 = _VSTD::prev(__e);
2044a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
2045a9d646a0SEric Fiselier            ++__base::size();
2046a9d646a0SEric Fiselier            if (__de > 1)
2047a9d646a0SEric Fiselier                __e = _VSTD::move_backward(__e - __de, __em1, __e);
2048a9d646a0SEric Fiselier            *--__e = _VSTD::move(__v);
2049a9d646a0SEric Fiselier        }
2050a9d646a0SEric Fiselier    }
2051a9d646a0SEric Fiselier    return __base::begin() + __pos;
2052a9d646a0SEric Fiselier}
2053a9d646a0SEric Fiselier
2054a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
2055a9d646a0SEric Fiseliertemplate <class... _Args>
2056a9d646a0SEric Fiseliertypename deque<_Tp, _Allocator>::iterator
2057a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args)
2058a9d646a0SEric Fiselier{
2059a9d646a0SEric Fiselier    size_type __pos = __p - __base::begin();
2060a9d646a0SEric Fiselier    size_type __to_end = __base::size() - __pos;
2061a9d646a0SEric Fiselier    allocator_type& __a = __base::__alloc();
2062a9d646a0SEric Fiselier    if (__pos < __to_end)
2063a9d646a0SEric Fiselier    {   // insert by shifting things backward
2064a9d646a0SEric Fiselier        if (__front_spare() == 0)
2065a9d646a0SEric Fiselier            __add_front_capacity();
2066a9d646a0SEric Fiselier        // __front_spare() >= 1
2067a9d646a0SEric Fiselier        if (__pos == 0)
2068a9d646a0SEric Fiselier        {
2069a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
2070a9d646a0SEric Fiselier            --__base::__start_;
2071a9d646a0SEric Fiselier            ++__base::size();
2072a9d646a0SEric Fiselier        }
2073a9d646a0SEric Fiselier        else
2074a9d646a0SEric Fiselier        {
2075a9d646a0SEric Fiselier            __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
2076a9d646a0SEric Fiselier            iterator __b = __base::begin();
2077a9d646a0SEric Fiselier            iterator __bm1 = _VSTD::prev(__b);
2078a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
2079a9d646a0SEric Fiselier            --__base::__start_;
2080a9d646a0SEric Fiselier            ++__base::size();
2081a9d646a0SEric Fiselier            if (__pos > 1)
2082a9d646a0SEric Fiselier                __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
2083a9d646a0SEric Fiselier            *__b = _VSTD::move(__tmp.get());
2084a9d646a0SEric Fiselier        }
2085a9d646a0SEric Fiselier    }
2086a9d646a0SEric Fiselier    else
2087a9d646a0SEric Fiselier    {   // insert by shifting things forward
2088a9d646a0SEric Fiselier        if (__back_spare() == 0)
2089a9d646a0SEric Fiselier            __add_back_capacity();
2090a9d646a0SEric Fiselier        // __back_capacity >= 1
2091a9d646a0SEric Fiselier        size_type __de = __base::size() - __pos;
2092a9d646a0SEric Fiselier        if (__de == 0)
2093a9d646a0SEric Fiselier        {
2094a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...);
2095a9d646a0SEric Fiselier            ++__base::size();
2096a9d646a0SEric Fiselier        }
2097a9d646a0SEric Fiselier        else
2098a9d646a0SEric Fiselier        {
2099a9d646a0SEric Fiselier            __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
2100a9d646a0SEric Fiselier            iterator __e = __base::end();
2101a9d646a0SEric Fiselier            iterator __em1 = _VSTD::prev(__e);
2102a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
2103a9d646a0SEric Fiselier            ++__base::size();
2104a9d646a0SEric Fiselier            if (__de > 1)
2105a9d646a0SEric Fiselier                __e = _VSTD::move_backward(__e - __de, __em1, __e);
2106a9d646a0SEric Fiselier            *--__e = _VSTD::move(__tmp.get());
2107a9d646a0SEric Fiselier        }
2108a9d646a0SEric Fiselier    }
2109a9d646a0SEric Fiselier    return __base::begin() + __pos;
2110a9d646a0SEric Fiselier}
2111a9d646a0SEric Fiselier
2112a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
2113a9d646a0SEric Fiselier
21143e519524SHoward Hinnant
21153e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21163e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
21173e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v)
21183e519524SHoward Hinnant{
21193e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
21203e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
21213e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
21223e519524SHoward Hinnant    if (__pos < __to_end)
21233e519524SHoward Hinnant    {   // insert by shifting things backward
21243e519524SHoward Hinnant        if (__front_spare() == 0)
21253e519524SHoward Hinnant            __add_front_capacity();
21263e519524SHoward Hinnant        // __front_spare() >= 1
21273e519524SHoward Hinnant        if (__pos == 0)
21283e519524SHoward Hinnant        {
2129ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
21303e519524SHoward Hinnant            --__base::__start_;
21313e519524SHoward Hinnant            ++__base::size();
21323e519524SHoward Hinnant        }
21333e519524SHoward Hinnant        else
21343e519524SHoward Hinnant        {
21353e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
21363e519524SHoward Hinnant            iterator __b = __base::begin();
2137ce48a113SHoward Hinnant            iterator __bm1 = _VSTD::prev(__b);
21383e519524SHoward Hinnant            if (__vt == pointer_traits<const_pointer>::pointer_to(*__b))
21393e519524SHoward Hinnant                __vt = pointer_traits<const_pointer>::pointer_to(*__bm1);
2140ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
21413e519524SHoward Hinnant            --__base::__start_;
21423e519524SHoward Hinnant            ++__base::size();
21433e519524SHoward Hinnant            if (__pos > 1)
2144ce48a113SHoward Hinnant                __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt);
21453e519524SHoward Hinnant            *__b = *__vt;
21463e519524SHoward Hinnant        }
21473e519524SHoward Hinnant    }
21483e519524SHoward Hinnant    else
21493e519524SHoward Hinnant    {   // insert by shifting things forward
21503e519524SHoward Hinnant        if (__back_spare() == 0)
21513e519524SHoward Hinnant            __add_back_capacity();
21523e519524SHoward Hinnant        // __back_capacity >= 1
21533e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
21543e519524SHoward Hinnant        if (__de == 0)
21553e519524SHoward Hinnant        {
2156ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
21573e519524SHoward Hinnant            ++__base::size();
21583e519524SHoward Hinnant        }
21593e519524SHoward Hinnant        else
21603e519524SHoward Hinnant        {
21613e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
21623e519524SHoward Hinnant            iterator __e = __base::end();
2163ce48a113SHoward Hinnant            iterator __em1 = _VSTD::prev(__e);
21643e519524SHoward Hinnant            if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1))
21653e519524SHoward Hinnant                __vt = pointer_traits<const_pointer>::pointer_to(*__e);
2166ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
21673e519524SHoward Hinnant            ++__base::size();
21683e519524SHoward Hinnant            if (__de > 1)
21693e519524SHoward Hinnant                __e = __move_backward_and_check(__e - __de, __em1, __e, __vt);
21703e519524SHoward Hinnant            *--__e = *__vt;
21713e519524SHoward Hinnant        }
21723e519524SHoward Hinnant    }
21733e519524SHoward Hinnant    return __base::begin() + __pos;
21743e519524SHoward Hinnant}
21753e519524SHoward Hinnant
21763e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21773e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
21783e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v)
21793e519524SHoward Hinnant{
21803e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
21813e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
21823e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
21833e519524SHoward Hinnant    if (__pos < __to_end)
21843e519524SHoward Hinnant    {   // insert by shifting things backward
21853e519524SHoward Hinnant        if (__n > __front_spare())
21863e519524SHoward Hinnant            __add_front_capacity(__n - __front_spare());
21873e519524SHoward Hinnant        // __n <= __front_spare()
21883e519524SHoward Hinnant        iterator __old_begin = __base::begin();
21893e519524SHoward Hinnant        iterator __i = __old_begin;
21903e519524SHoward Hinnant        if (__n > __pos)
21913e519524SHoward Hinnant        {
21923e519524SHoward Hinnant            for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size())
2193ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v);
21943e519524SHoward Hinnant            __n = __pos;
21953e519524SHoward Hinnant        }
21963e519524SHoward Hinnant        if (__n > 0)
21973e519524SHoward Hinnant        {
21983e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
21993e519524SHoward Hinnant            iterator __obn = __old_begin + __n;
22003e519524SHoward Hinnant            __move_construct_backward_and_check(__old_begin, __obn, __i, __vt);
22013e519524SHoward Hinnant            if (__n < __pos)
22023e519524SHoward Hinnant                __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt);
2203ce48a113SHoward Hinnant            _VSTD::fill_n(__old_begin, __n, *__vt);
22043e519524SHoward Hinnant        }
22053e519524SHoward Hinnant    }
22063e519524SHoward Hinnant    else
22073e519524SHoward Hinnant    {   // insert by shifting things forward
22083e519524SHoward Hinnant        size_type __back_capacity = __back_spare();
22093e519524SHoward Hinnant        if (__n > __back_capacity)
22103e519524SHoward Hinnant            __add_back_capacity(__n - __back_capacity);
22113e519524SHoward Hinnant        // __n <= __back_capacity
22123e519524SHoward Hinnant        iterator __old_end = __base::end();
22133e519524SHoward Hinnant        iterator __i = __old_end;
22143e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
22153e519524SHoward Hinnant        if (__n > __de)
22163e519524SHoward Hinnant        {
22173e519524SHoward Hinnant            for (size_type __m = __n - __de; __m; --__m, ++__i, ++__base::size())
2218ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
22193e519524SHoward Hinnant            __n = __de;
22203e519524SHoward Hinnant        }
22213e519524SHoward Hinnant        if (__n > 0)
22223e519524SHoward Hinnant        {
22233e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
22243e519524SHoward Hinnant            iterator __oen = __old_end - __n;
22253e519524SHoward Hinnant            __move_construct_and_check(__oen, __old_end, __i, __vt);
22263e519524SHoward Hinnant            if (__n < __de)
22273e519524SHoward Hinnant                __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt);
2228ce48a113SHoward Hinnant            _VSTD::fill_n(__old_end - __n, __n, *__vt);
22293e519524SHoward Hinnant        }
22303e519524SHoward Hinnant    }
22313e519524SHoward Hinnant    return __base::begin() + __pos;
22323e519524SHoward Hinnant}
22333e519524SHoward Hinnant
22343e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
22353e519524SHoward Hinnanttemplate <class _InputIter>
22363e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
22373e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l,
2238f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_input_iterator<_InputIter>::value
2239f82dba01SEric Fiselier                                               &&!__is_cpp17_forward_iterator<_InputIter>::value>::type*)
22403e519524SHoward Hinnant{
22413e519524SHoward Hinnant    __split_buffer<value_type, allocator_type&> __buf(__base::__alloc());
22423e519524SHoward Hinnant    __buf.__construct_at_end(__f, __l);
22433e519524SHoward Hinnant    typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi;
22443e519524SHoward Hinnant    return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end()));
22453e519524SHoward Hinnant}
22463e519524SHoward Hinnant
22473e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2248f15d7a58SMarshall Clowtemplate <class _ForwardIterator>
2249f15d7a58SMarshall Clowtypename deque<_Tp, _Allocator>::iterator
2250f15d7a58SMarshall Clowdeque<_Tp, _Allocator>::insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
2251f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value
2252f82dba01SEric Fiselier                                               &&!__is_cpp17_bidirectional_iterator<_ForwardIterator>::value>::type*)
2253f15d7a58SMarshall Clow{
2254f15d7a58SMarshall Clow    size_type __n = _VSTD::distance(__f, __l);
2255f15d7a58SMarshall Clow    __split_buffer<value_type, allocator_type&> __buf(__n, 0, __base::__alloc());
2256f15d7a58SMarshall Clow    __buf.__construct_at_end(__f, __l);
2257f15d7a58SMarshall Clow    typedef typename __split_buffer<value_type, allocator_type&>::iterator __fwd;
2258f15d7a58SMarshall Clow    return insert(__p, move_iterator<__fwd>(__buf.begin()), move_iterator<__fwd>(__buf.end()));
2259f15d7a58SMarshall Clow}
2260f15d7a58SMarshall Clow
2261f15d7a58SMarshall Clowtemplate <class _Tp, class _Allocator>
22623e519524SHoward Hinnanttemplate <class _BiIter>
22633e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
22643e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
2265f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_bidirectional_iterator<_BiIter>::value>::type*)
22663e519524SHoward Hinnant{
2267ce48a113SHoward Hinnant    size_type __n = _VSTD::distance(__f, __l);
22683e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
22693e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
22703e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
22713e519524SHoward Hinnant    if (__pos < __to_end)
22723e519524SHoward Hinnant    {   // insert by shifting things backward
22733e519524SHoward Hinnant        if (__n > __front_spare())
22743e519524SHoward Hinnant            __add_front_capacity(__n - __front_spare());
22753e519524SHoward Hinnant        // __n <= __front_spare()
22763e519524SHoward Hinnant        iterator __old_begin = __base::begin();
22773e519524SHoward Hinnant        iterator __i = __old_begin;
22783e519524SHoward Hinnant        _BiIter __m = __f;
22793e519524SHoward Hinnant        if (__n > __pos)
22803e519524SHoward Hinnant        {
2281ce48a113SHoward Hinnant            __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos);
22823e519524SHoward Hinnant            for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size())
2283ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j);
22843e519524SHoward Hinnant            __n = __pos;
22853e519524SHoward Hinnant        }
22863e519524SHoward Hinnant        if (__n > 0)
22873e519524SHoward Hinnant        {
22883e519524SHoward Hinnant            iterator __obn = __old_begin + __n;
22893e519524SHoward Hinnant            for (iterator __j = __obn; __j != __old_begin;)
22903e519524SHoward Hinnant            {
2291ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j));
22923e519524SHoward Hinnant                --__base::__start_;
22933e519524SHoward Hinnant                ++__base::size();
22943e519524SHoward Hinnant            }
22953e519524SHoward Hinnant            if (__n < __pos)
2296ce48a113SHoward Hinnant                __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin);
2297ce48a113SHoward Hinnant            _VSTD::copy(__m, __l, __old_begin);
22983e519524SHoward Hinnant        }
22993e519524SHoward Hinnant    }
23003e519524SHoward Hinnant    else
23013e519524SHoward Hinnant    {   // insert by shifting things forward
23023e519524SHoward Hinnant        size_type __back_capacity = __back_spare();
23033e519524SHoward Hinnant        if (__n > __back_capacity)
23043e519524SHoward Hinnant            __add_back_capacity(__n - __back_capacity);
23053e519524SHoward Hinnant        // __n <= __back_capacity
23063e519524SHoward Hinnant        iterator __old_end = __base::end();
23073e519524SHoward Hinnant        iterator __i = __old_end;
23083e519524SHoward Hinnant        _BiIter __m = __l;
23093e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
23103e519524SHoward Hinnant        if (__n > __de)
23113e519524SHoward Hinnant        {
2312ce48a113SHoward Hinnant            __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
2313910285b2SEric Fiselier            for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
2314ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
23153e519524SHoward Hinnant            __n = __de;
23163e519524SHoward Hinnant        }
23173e519524SHoward Hinnant        if (__n > 0)
23183e519524SHoward Hinnant        {
23193e519524SHoward Hinnant            iterator __oen = __old_end - __n;
23203e519524SHoward Hinnant            for (iterator __j = __oen; __j != __old_end; ++__i, ++__j, ++__base::size())
2321ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j));
23223e519524SHoward Hinnant            if (__n < __de)
2323ce48a113SHoward Hinnant                __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end);
2324ce48a113SHoward Hinnant            _VSTD::copy_backward(__f, __m, __old_end);
23253e519524SHoward Hinnant        }
23263e519524SHoward Hinnant    }
23273e519524SHoward Hinnant    return __base::begin() + __pos;
23283e519524SHoward Hinnant}
23293e519524SHoward Hinnant
23303e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23313e519524SHoward Hinnanttemplate <class _InpIter>
23323e519524SHoward Hinnantvoid
23333e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l,
2334f82dba01SEric Fiselier                                 typename enable_if<__is_cpp17_input_iterator<_InpIter>::value &&
2335f82dba01SEric Fiselier                                                   !__is_cpp17_forward_iterator<_InpIter>::value>::type*)
23363e519524SHoward Hinnant{
23373e519524SHoward Hinnant    for (; __f != __l; ++__f)
23381c0cedccSEric Fiselier#ifdef _LIBCPP_CXX03_LANG
23393e519524SHoward Hinnant        push_back(*__f);
23401c0cedccSEric Fiselier#else
23411c0cedccSEric Fiselier        emplace_back(*__f);
23421c0cedccSEric Fiselier#endif
23433e519524SHoward Hinnant}
23443e519524SHoward Hinnant
23453e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23463e519524SHoward Hinnanttemplate <class _ForIter>
23473e519524SHoward Hinnantvoid
23483e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
2349f82dba01SEric Fiselier                                 typename enable_if<__is_cpp17_forward_iterator<_ForIter>::value>::type*)
23503e519524SHoward Hinnant{
2351ce48a113SHoward Hinnant    size_type __n = _VSTD::distance(__f, __l);
23523e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
23533e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
23543e519524SHoward Hinnant    if (__n > __back_capacity)
23553e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
23563e519524SHoward Hinnant    // __n <= __back_capacity
2357b0945e1bSEric Fiselier    for (__deque_block_range __br : __deque_range(__base::end(), __base::end() + __n)) {
2358b0945e1bSEric Fiselier      _ConstructTransaction __tx(this, __br);
2359b0945e1bSEric Fiselier      for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, (void)++__f) {
23606e965df6SArthur O'Dwyer        __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_), *__f);
2361b0945e1bSEric Fiselier      }
2362b0945e1bSEric Fiselier    }
23633e519524SHoward Hinnant}
23643e519524SHoward Hinnant
23653e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23663e519524SHoward Hinnantvoid
23673e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(size_type __n)
23683e519524SHoward Hinnant{
23693e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
23703e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
23713e519524SHoward Hinnant    if (__n > __back_capacity)
23723e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
23733e519524SHoward Hinnant    // __n <= __back_capacity
2374b0945e1bSEric Fiselier    for (__deque_block_range __br : __deque_range(__base::end(), __base::end() + __n)) {
2375b0945e1bSEric Fiselier      _ConstructTransaction __tx(this, __br);
2376b0945e1bSEric Fiselier      for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) {
23776e965df6SArthur O'Dwyer        __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_));
2378b0945e1bSEric Fiselier      }
2379b0945e1bSEric Fiselier    }
23803e519524SHoward Hinnant}
23813e519524SHoward Hinnant
23823e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23833e519524SHoward Hinnantvoid
23843e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v)
23853e519524SHoward Hinnant{
23863e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
23873e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
23883e519524SHoward Hinnant    if (__n > __back_capacity)
23893e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
23903e519524SHoward Hinnant    // __n <= __back_capacity
2391b0945e1bSEric Fiselier    for (__deque_block_range __br : __deque_range(__base::end(), __base::end() + __n)) {
2392b0945e1bSEric Fiselier      _ConstructTransaction __tx(this, __br);
2393b0945e1bSEric Fiselier      for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) {
23946e965df6SArthur O'Dwyer        __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_), __v);
2395b0945e1bSEric Fiselier      }
2396b0945e1bSEric Fiselier    }
2397b0945e1bSEric Fiselier
23983e519524SHoward Hinnant}
23993e519524SHoward Hinnant
24003e519524SHoward Hinnant// Create front capacity for one block of elements.
24013e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
24023e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
24033e519524SHoward Hinnantvoid
24043e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_front_capacity()
24053e519524SHoward Hinnant{
24063e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
24073e519524SHoward Hinnant    if (__back_spare() >= __base::__block_size)
24083e519524SHoward Hinnant    {
24093e519524SHoward Hinnant        __base::__start_ += __base::__block_size;
24103e519524SHoward Hinnant        pointer __pt = __base::__map_.back();
24113e519524SHoward Hinnant        __base::__map_.pop_back();
24123e519524SHoward Hinnant        __base::__map_.push_front(__pt);
24133e519524SHoward Hinnant    }
24143e519524SHoward Hinnant    // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer
24153e519524SHoward Hinnant    else if (__base::__map_.size() < __base::__map_.capacity())
24163e519524SHoward Hinnant    {   // we can put the new buffer into the map, but don't shift things around
24173e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
24183e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
24193e519524SHoward Hinnant        if (__base::__map_.__front_spare() > 0)
24203e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
24213e519524SHoward Hinnant        else
24223e519524SHoward Hinnant        {
24233e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
24243e519524SHoward Hinnant            // Done allocating, reorder capacity
24253e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
24263e519524SHoward Hinnant            __base::__map_.pop_back();
24273e519524SHoward Hinnant            __base::__map_.push_front(__pt);
24283e519524SHoward Hinnant        }
24293e519524SHoward Hinnant        __base::__start_ = __base::__map_.size() == 1 ?
24303e519524SHoward Hinnant                               __base::__block_size / 2 :
24313e519524SHoward Hinnant                               __base::__start_ + __base::__block_size;
24323e519524SHoward Hinnant    }
24333e519524SHoward Hinnant    // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
24343e519524SHoward Hinnant    else
24353e519524SHoward Hinnant    {
24363e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
24373e519524SHoward Hinnant            __buf(max<size_type>(2 * __base::__map_.capacity(), 1),
24383e519524SHoward Hinnant                  0, __base::__map_.__alloc());
2439f4903afdSMarshall Clow
2440f4903afdSMarshall Clow        typedef __allocator_destructor<_Allocator> _Dp;
2441f4903afdSMarshall Clow        unique_ptr<pointer, _Dp> __hold(
2442f4903afdSMarshall Clow            __alloc_traits::allocate(__a, __base::__block_size),
2443f4903afdSMarshall Clow                _Dp(__a, __base::__block_size));
2444f4903afdSMarshall Clow        __buf.push_back(__hold.get());
2445f4903afdSMarshall Clow        __hold.release();
2446f4903afdSMarshall Clow
24473e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.begin();
24483e519524SHoward Hinnant                __i != __base::__map_.end(); ++__i)
24493e519524SHoward Hinnant            __buf.push_back(*__i);
2450ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2451ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2452ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2453ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
24543e519524SHoward Hinnant        __base::__start_ = __base::__map_.size() == 1 ?
24553e519524SHoward Hinnant                               __base::__block_size / 2 :
24563e519524SHoward Hinnant                               __base::__start_ + __base::__block_size;
24573e519524SHoward Hinnant    }
24583e519524SHoward Hinnant}
24593e519524SHoward Hinnant
24603e519524SHoward Hinnant// Create front capacity for __n elements.
24613e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
24623e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
24633e519524SHoward Hinnantvoid
24643e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_front_capacity(size_type __n)
24653e519524SHoward Hinnant{
24663e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
24673e519524SHoward Hinnant    size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
24683e519524SHoward Hinnant    // Number of unused blocks at back:
24693e519524SHoward Hinnant    size_type __back_capacity = __back_spare() / __base::__block_size;
2470ce48a113SHoward Hinnant    __back_capacity = _VSTD::min(__back_capacity, __nb);  // don't take more than you need
24713e519524SHoward Hinnant    __nb -= __back_capacity;  // number of blocks need to allocate
24723e519524SHoward Hinnant    // If __nb == 0, then we have sufficient capacity.
24733e519524SHoward Hinnant    if (__nb == 0)
24743e519524SHoward Hinnant    {
24753e519524SHoward Hinnant        __base::__start_ += __base::__block_size * __back_capacity;
24763e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
24773e519524SHoward Hinnant        {
24783e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
24793e519524SHoward Hinnant            __base::__map_.pop_back();
24803e519524SHoward Hinnant            __base::__map_.push_front(__pt);
24813e519524SHoward Hinnant        }
24823e519524SHoward Hinnant    }
24833e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
24843e519524SHoward Hinnant    else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
24853e519524SHoward Hinnant    {   // we can put the new buffers into the map, but don't shift things around
24863e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
24873e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
24883e519524SHoward Hinnant        for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1))
24893e519524SHoward Hinnant        {
24903e519524SHoward Hinnant            if (__base::__map_.__front_spare() == 0)
24913e519524SHoward Hinnant                break;
24923e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
24933e519524SHoward Hinnant        }
24943e519524SHoward Hinnant        for (; __nb > 0; --__nb, ++__back_capacity)
24953e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
24963e519524SHoward Hinnant        // Done allocating, reorder capacity
24973e519524SHoward Hinnant        __base::__start_ += __back_capacity * __base::__block_size;
24983e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
24993e519524SHoward Hinnant        {
25003e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
25013e519524SHoward Hinnant            __base::__map_.pop_back();
25023e519524SHoward Hinnant            __base::__map_.push_front(__pt);
25033e519524SHoward Hinnant        }
25043e519524SHoward Hinnant    }
25053e519524SHoward Hinnant    // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
25063e519524SHoward Hinnant    else
25073e519524SHoward Hinnant    {
25083e519524SHoward Hinnant        size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty();
25093e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
25103e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(),
25113e519524SHoward Hinnant                                 __nb + __base::__map_.size()),
25123e519524SHoward Hinnant                  0, __base::__map_.__alloc());
25133e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
25143e519524SHoward Hinnant        try
25153e519524SHoward Hinnant        {
2516b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
25173e519524SHoward Hinnant            for (; __nb > 0; --__nb)
25183e519524SHoward Hinnant                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
25193e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
25203e519524SHoward Hinnant        }
25213e519524SHoward Hinnant        catch (...)
25223e519524SHoward Hinnant        {
25233e519524SHoward Hinnant            for (typename __base::__map_pointer __i = __buf.begin();
25243e519524SHoward Hinnant                    __i != __buf.end(); ++__i)
25253e519524SHoward Hinnant                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
25263e519524SHoward Hinnant            throw;
25273e519524SHoward Hinnant        }
2528b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
25293e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
25303e519524SHoward Hinnant        {
25313e519524SHoward Hinnant            __buf.push_back(__base::__map_.back());
25323e519524SHoward Hinnant            __base::__map_.pop_back();
25333e519524SHoward Hinnant        }
25343e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.begin();
25353e519524SHoward Hinnant                __i != __base::__map_.end(); ++__i)
25363e519524SHoward Hinnant            __buf.push_back(*__i);
2537ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2538ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2539ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2540ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
25413e519524SHoward Hinnant        __base::__start_ += __ds;
25423e519524SHoward Hinnant    }
25433e519524SHoward Hinnant}
25443e519524SHoward Hinnant
25453e519524SHoward Hinnant// Create back capacity for one block of elements.
25463e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
25473e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
25483e519524SHoward Hinnantvoid
25493e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_back_capacity()
25503e519524SHoward Hinnant{
25513e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
25523e519524SHoward Hinnant    if (__front_spare() >= __base::__block_size)
25533e519524SHoward Hinnant    {
25543e519524SHoward Hinnant        __base::__start_ -= __base::__block_size;
25553e519524SHoward Hinnant        pointer __pt = __base::__map_.front();
25563e519524SHoward Hinnant        __base::__map_.pop_front();
25573e519524SHoward Hinnant        __base::__map_.push_back(__pt);
25583e519524SHoward Hinnant    }
25593e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
25603e519524SHoward Hinnant    else if (__base::__map_.size() < __base::__map_.capacity())
25613e519524SHoward Hinnant    {   // we can put the new buffer into the map, but don't shift things around
25623e519524SHoward Hinnant        // until it is allocated.  If we throw, we don't need to fix
25633e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
25643e519524SHoward Hinnant        if (__base::__map_.__back_spare() != 0)
25653e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
25663e519524SHoward Hinnant        else
25673e519524SHoward Hinnant        {
25683e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
25693e519524SHoward Hinnant            // Done allocating, reorder capacity
25703e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
25713e519524SHoward Hinnant            __base::__map_.pop_front();
25723e519524SHoward Hinnant            __base::__map_.push_back(__pt);
25733e519524SHoward Hinnant        }
25743e519524SHoward Hinnant    }
25753e519524SHoward Hinnant    // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
25763e519524SHoward Hinnant    else
25773e519524SHoward Hinnant    {
25783e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
25793e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(), 1),
25803e519524SHoward Hinnant                  __base::__map_.size(),
25813e519524SHoward Hinnant                  __base::__map_.__alloc());
2582f4903afdSMarshall Clow
2583f4903afdSMarshall Clow        typedef __allocator_destructor<_Allocator> _Dp;
2584f4903afdSMarshall Clow        unique_ptr<pointer, _Dp> __hold(
2585f4903afdSMarshall Clow            __alloc_traits::allocate(__a, __base::__block_size),
2586f4903afdSMarshall Clow                _Dp(__a, __base::__block_size));
2587f4903afdSMarshall Clow        __buf.push_back(__hold.get());
2588f4903afdSMarshall Clow        __hold.release();
2589f4903afdSMarshall Clow
25903e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.end();
25913e519524SHoward Hinnant                __i != __base::__map_.begin();)
25923e519524SHoward Hinnant            __buf.push_front(*--__i);
2593ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2594ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2595ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2596ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
25973e519524SHoward Hinnant    }
25983e519524SHoward Hinnant}
25993e519524SHoward Hinnant
26003e519524SHoward Hinnant// Create back capacity for __n elements.
26013e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
26023e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
26033e519524SHoward Hinnantvoid
26043e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_back_capacity(size_type __n)
26053e519524SHoward Hinnant{
26063e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
26073e519524SHoward Hinnant    size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
26083e519524SHoward Hinnant    // Number of unused blocks at front:
26093e519524SHoward Hinnant    size_type __front_capacity = __front_spare() / __base::__block_size;
2610ce48a113SHoward Hinnant    __front_capacity = _VSTD::min(__front_capacity, __nb);  // don't take more than you need
26113e519524SHoward Hinnant    __nb -= __front_capacity;  // number of blocks need to allocate
26123e519524SHoward Hinnant    // If __nb == 0, then we have sufficient capacity.
26133e519524SHoward Hinnant    if (__nb == 0)
26143e519524SHoward Hinnant    {
26153e519524SHoward Hinnant        __base::__start_ -= __base::__block_size * __front_capacity;
26163e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
26173e519524SHoward Hinnant        {
26183e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
26193e519524SHoward Hinnant            __base::__map_.pop_front();
26203e519524SHoward Hinnant            __base::__map_.push_back(__pt);
26213e519524SHoward Hinnant        }
26223e519524SHoward Hinnant    }
26233e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
26243e519524SHoward Hinnant    else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
26253e519524SHoward Hinnant    {   // we can put the new buffers into the map, but don't shift things around
26263e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
26273e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
26283e519524SHoward Hinnant        for (; __nb > 0; --__nb)
26293e519524SHoward Hinnant        {
26303e519524SHoward Hinnant            if (__base::__map_.__back_spare() == 0)
26313e519524SHoward Hinnant                break;
26323e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
26333e519524SHoward Hinnant        }
26343e519524SHoward Hinnant        for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ +=
26353e519524SHoward Hinnant                                 __base::__block_size - (__base::__map_.size() == 1))
26363e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
26373e519524SHoward Hinnant        // Done allocating, reorder capacity
26383e519524SHoward Hinnant        __base::__start_ -= __base::__block_size * __front_capacity;
26393e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
26403e519524SHoward Hinnant        {
26413e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
26423e519524SHoward Hinnant            __base::__map_.pop_front();
26433e519524SHoward Hinnant            __base::__map_.push_back(__pt);
26443e519524SHoward Hinnant        }
26453e519524SHoward Hinnant    }
26463e519524SHoward Hinnant    // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
26473e519524SHoward Hinnant    else
26483e519524SHoward Hinnant    {
26493e519524SHoward Hinnant        size_type __ds = __front_capacity * __base::__block_size;
26503e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
26513e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(),
26523e519524SHoward Hinnant                                 __nb + __base::__map_.size()),
26533e519524SHoward Hinnant                  __base::__map_.size() - __front_capacity,
26543e519524SHoward Hinnant                  __base::__map_.__alloc());
26553e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
26563e519524SHoward Hinnant        try
26573e519524SHoward Hinnant        {
2658b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
26593e519524SHoward Hinnant            for (; __nb > 0; --__nb)
26603e519524SHoward Hinnant                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
26613e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
26623e519524SHoward Hinnant        }
26633e519524SHoward Hinnant        catch (...)
26643e519524SHoward Hinnant        {
26653e519524SHoward Hinnant            for (typename __base::__map_pointer __i = __buf.begin();
26663e519524SHoward Hinnant                    __i != __buf.end(); ++__i)
26673e519524SHoward Hinnant                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
26683e519524SHoward Hinnant            throw;
26693e519524SHoward Hinnant        }
2670b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
26713e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
26723e519524SHoward Hinnant        {
26733e519524SHoward Hinnant            __buf.push_back(__base::__map_.front());
26743e519524SHoward Hinnant            __base::__map_.pop_front();
26753e519524SHoward Hinnant        }
26763e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.end();
26773e519524SHoward Hinnant                __i != __base::__map_.begin();)
26783e519524SHoward Hinnant            __buf.push_front(*--__i);
2679ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2680ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2681ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2682ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
26833e519524SHoward Hinnant        __base::__start_ -= __ds;
26843e519524SHoward Hinnant    }
26853e519524SHoward Hinnant}
26863e519524SHoward Hinnant
26873e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
26883e519524SHoward Hinnantvoid
26893e519524SHoward Hinnantdeque<_Tp, _Allocator>::pop_front()
26903e519524SHoward Hinnant{
26913e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
26926e965df6SArthur O'Dwyer    __alloc_traits::destroy(__a, _VSTD::__to_address(*(__base::__map_.begin() +
26933e519524SHoward Hinnant                                                    __base::__start_ / __base::__block_size) +
269414e200d1SHoward Hinnant                                                    __base::__start_ % __base::__block_size));
26953e519524SHoward Hinnant    --__base::size();
2696d544d144SEric Fiselier    ++__base::__start_;
2697d544d144SEric Fiselier    __maybe_remove_front_spare();
26983e519524SHoward Hinnant}
26993e519524SHoward Hinnant
27003e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27013e519524SHoward Hinnantvoid
27023e519524SHoward Hinnantdeque<_Tp, _Allocator>::pop_back()
27033e519524SHoward Hinnant{
270496100f15SKristina Bessonova    _LIBCPP_ASSERT(!empty(), "deque::pop_back called on an empty deque");
27053e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
27063e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
27076e965df6SArthur O'Dwyer    __alloc_traits::destroy(__a, _VSTD::__to_address(*(__base::__map_.begin() +
27083e519524SHoward Hinnant                                                    __p / __base::__block_size) +
270914e200d1SHoward Hinnant                                                    __p % __base::__block_size));
27103e519524SHoward Hinnant    --__base::size();
2711d544d144SEric Fiselier    __maybe_remove_back_spare();
27123e519524SHoward Hinnant}
27133e519524SHoward Hinnant
27143e519524SHoward Hinnant// move assign [__f, __l) to [__r, __r + (__l-__f)).
27153e519524SHoward Hinnant// If __vt points into [__f, __l), then subtract (__f - __r) from __vt.
27163e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27173e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
27183e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r,
27193e519524SHoward Hinnant                                         const_pointer& __vt)
27203e519524SHoward Hinnant{
27213e519524SHoward Hinnant    // as if
27223e519524SHoward Hinnant    //   for (; __f != __l; ++__f, ++__r)
2723ce48a113SHoward Hinnant    //       *__r = _VSTD::move(*__f);
27243e519524SHoward Hinnant    difference_type __n = __l - __f;
27253e519524SHoward Hinnant    while (__n > 0)
27263e519524SHoward Hinnant    {
27273e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
27283e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + __base::__block_size;
27293e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
27303e519524SHoward Hinnant        if (__bs > __n)
27313e519524SHoward Hinnant        {
27323e519524SHoward Hinnant            __bs = __n;
27333e519524SHoward Hinnant            __fe = __fb + __bs;
27343e519524SHoward Hinnant        }
27353e519524SHoward Hinnant        if (__fb <= __vt && __vt < __fe)
273614e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_;
2737ce48a113SHoward Hinnant        __r = _VSTD::move(__fb, __fe, __r);
27383e519524SHoward Hinnant        __n -= __bs;
27393e519524SHoward Hinnant        __f += __bs;
27403e519524SHoward Hinnant    }
27413e519524SHoward Hinnant    return __r;
27423e519524SHoward Hinnant}
27433e519524SHoward Hinnant
27443e519524SHoward Hinnant// move assign [__f, __l) to [__r - (__l-__f), __r) backwards.
27453e519524SHoward Hinnant// If __vt points into [__f, __l), then add (__r - __l) to __vt.
27463e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27473e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
27483e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r,
27493e519524SHoward Hinnant                                                  const_pointer& __vt)
27503e519524SHoward Hinnant{
27513e519524SHoward Hinnant    // as if
27523e519524SHoward Hinnant    //   while (__f != __l)
2753ce48a113SHoward Hinnant    //       *--__r = _VSTD::move(*--__l);
27543e519524SHoward Hinnant    difference_type __n = __l - __f;
27553e519524SHoward Hinnant    while (__n > 0)
27563e519524SHoward Hinnant    {
27573e519524SHoward Hinnant        --__l;
27583e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
27593e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
27603e519524SHoward Hinnant        difference_type __bs = __le - __lb;
27613e519524SHoward Hinnant        if (__bs > __n)
27623e519524SHoward Hinnant        {
27633e519524SHoward Hinnant            __bs = __n;
27643e519524SHoward Hinnant            __lb = __le - __bs;
27653e519524SHoward Hinnant        }
27663e519524SHoward Hinnant        if (__lb <= __vt && __vt < __le)
276714e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_;
2768ce48a113SHoward Hinnant        __r = _VSTD::move_backward(__lb, __le, __r);
27693e519524SHoward Hinnant        __n -= __bs;
27703e519524SHoward Hinnant        __l -= __bs - 1;
27713e519524SHoward Hinnant    }
27723e519524SHoward Hinnant    return __r;
27733e519524SHoward Hinnant}
27743e519524SHoward Hinnant
27753e519524SHoward Hinnant// move construct [__f, __l) to [__r, __r + (__l-__f)).
27763e519524SHoward Hinnant// If __vt points into [__f, __l), then add (__r - __f) to __vt.
27773e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27783e519524SHoward Hinnantvoid
27793e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
27803e519524SHoward Hinnant                                                   iterator __r, const_pointer& __vt)
27813e519524SHoward Hinnant{
27823e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
27833e519524SHoward Hinnant    // as if
27843e519524SHoward Hinnant    //   for (; __f != __l; ++__r, ++__f, ++__base::size())
2785ce48a113SHoward Hinnant    //       __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f));
27863e519524SHoward Hinnant    difference_type __n = __l - __f;
27873e519524SHoward Hinnant    while (__n > 0)
27883e519524SHoward Hinnant    {
27893e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
27903e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + __base::__block_size;
27913e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
27923e519524SHoward Hinnant        if (__bs > __n)
27933e519524SHoward Hinnant        {
27943e519524SHoward Hinnant            __bs = __n;
27953e519524SHoward Hinnant            __fe = __fb + __bs;
27963e519524SHoward Hinnant        }
27973e519524SHoward Hinnant        if (__fb <= __vt && __vt < __fe)
279814e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_;
27993e519524SHoward Hinnant        for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
2800ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb));
28013e519524SHoward Hinnant        __n -= __bs;
28023e519524SHoward Hinnant        __f += __bs;
28033e519524SHoward Hinnant    }
28043e519524SHoward Hinnant}
28053e519524SHoward Hinnant
28063e519524SHoward Hinnant// move construct [__f, __l) to [__r - (__l-__f), __r) backwards.
28073e519524SHoward Hinnant// If __vt points into [__f, __l), then subtract (__l - __r) from __vt.
28083e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28093e519524SHoward Hinnantvoid
28103e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l,
28113e519524SHoward Hinnant                                                            iterator __r, const_pointer& __vt)
28123e519524SHoward Hinnant{
28133e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
28143e519524SHoward Hinnant    // as if
28153e519524SHoward Hinnant    //   for (iterator __j = __l; __j != __f;)
28163e519524SHoward Hinnant    //   {
2817ce48a113SHoward Hinnant    //       __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j));
28183e519524SHoward Hinnant    //       --__base::__start_;
28193e519524SHoward Hinnant    //       ++__base::size();
28203e519524SHoward Hinnant    //   }
28213e519524SHoward Hinnant    difference_type __n = __l - __f;
28223e519524SHoward Hinnant    while (__n > 0)
28233e519524SHoward Hinnant    {
28243e519524SHoward Hinnant        --__l;
28253e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
28263e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
28273e519524SHoward Hinnant        difference_type __bs = __le - __lb;
28283e519524SHoward Hinnant        if (__bs > __n)
28293e519524SHoward Hinnant        {
28303e519524SHoward Hinnant            __bs = __n;
28313e519524SHoward Hinnant            __lb = __le - __bs;
28323e519524SHoward Hinnant        }
28333e519524SHoward Hinnant        if (__lb <= __vt && __vt < __le)
283414e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_;
28353e519524SHoward Hinnant        while (__le != __lb)
28363e519524SHoward Hinnant        {
2837ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le));
28383e519524SHoward Hinnant            --__base::__start_;
28393e519524SHoward Hinnant            ++__base::size();
28403e519524SHoward Hinnant        }
28413e519524SHoward Hinnant        __n -= __bs;
28423e519524SHoward Hinnant        __l -= __bs - 1;
28433e519524SHoward Hinnant    }
28443e519524SHoward Hinnant}
28453e519524SHoward Hinnant
28463e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28473e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
28483e519524SHoward Hinnantdeque<_Tp, _Allocator>::erase(const_iterator __f)
28493e519524SHoward Hinnant{
28503e519524SHoward Hinnant    iterator __b = __base::begin();
28513e519524SHoward Hinnant    difference_type __pos = __f - __b;
28523e519524SHoward Hinnant    iterator __p = __b + __pos;
28533e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
2854aec08784SEric Fiselier    if (static_cast<size_t>(__pos) <= (__base::size() - 1) / 2)
28553e519524SHoward Hinnant    {   // erase from front
2856ce48a113SHoward Hinnant        _VSTD::move_backward(__b, __p, _VSTD::next(__p));
2857ce48a113SHoward Hinnant        __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
28583e519524SHoward Hinnant        --__base::size();
28593e519524SHoward Hinnant        ++__base::__start_;
2860d544d144SEric Fiselier        __maybe_remove_front_spare();
28613e519524SHoward Hinnant    }
28623e519524SHoward Hinnant    else
28633e519524SHoward Hinnant    {   // erase from back
2864ce48a113SHoward Hinnant        iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p);
2865ce48a113SHoward Hinnant        __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
28663e519524SHoward Hinnant        --__base::size();
2867d544d144SEric Fiselier        __maybe_remove_back_spare();
28683e519524SHoward Hinnant    }
28693e519524SHoward Hinnant    return __base::begin() + __pos;
28703e519524SHoward Hinnant}
28713e519524SHoward Hinnant
28723e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28733e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
28743e519524SHoward Hinnantdeque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l)
28753e519524SHoward Hinnant{
28763e519524SHoward Hinnant    difference_type __n = __l - __f;
28773e519524SHoward Hinnant    iterator __b = __base::begin();
28783e519524SHoward Hinnant    difference_type __pos = __f - __b;
28793e519524SHoward Hinnant    iterator __p = __b + __pos;
28803e519524SHoward Hinnant    if (__n > 0)
28813e519524SHoward Hinnant    {
28823e519524SHoward Hinnant        allocator_type& __a = __base::__alloc();
2883aec08784SEric Fiselier        if (static_cast<size_t>(__pos) <= (__base::size() - __n) / 2)
28843e519524SHoward Hinnant        {   // erase from front
2885ce48a113SHoward Hinnant            iterator __i = _VSTD::move_backward(__b, __p, __p + __n);
28863e519524SHoward Hinnant            for (; __b != __i; ++__b)
2887ce48a113SHoward Hinnant                __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
28883e519524SHoward Hinnant            __base::size() -= __n;
28893e519524SHoward Hinnant            __base::__start_ += __n;
2890d544d144SEric Fiselier            while (__maybe_remove_front_spare()) {
28913e519524SHoward Hinnant            }
28923e519524SHoward Hinnant        }
28933e519524SHoward Hinnant        else
28943e519524SHoward Hinnant        {   // erase from back
2895ce48a113SHoward Hinnant            iterator __i = _VSTD::move(__p + __n, __base::end(), __p);
28963e519524SHoward Hinnant            for (iterator __e = __base::end(); __i != __e; ++__i)
2897ce48a113SHoward Hinnant                __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
28983e519524SHoward Hinnant            __base::size() -= __n;
2899d544d144SEric Fiselier            while (__maybe_remove_back_spare()) {
29003e519524SHoward Hinnant            }
29013e519524SHoward Hinnant        }
29023e519524SHoward Hinnant    }
29033e519524SHoward Hinnant    return __base::begin() + __pos;
29043e519524SHoward Hinnant}
29053e519524SHoward Hinnant
29063e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29073e519524SHoward Hinnantvoid
29083e519524SHoward Hinnantdeque<_Tp, _Allocator>::__erase_to_end(const_iterator __f)
29093e519524SHoward Hinnant{
29103e519524SHoward Hinnant    iterator __e = __base::end();
29113e519524SHoward Hinnant    difference_type __n = __e - __f;
29123e519524SHoward Hinnant    if (__n > 0)
29133e519524SHoward Hinnant    {
29143e519524SHoward Hinnant        allocator_type& __a = __base::__alloc();
29153e519524SHoward Hinnant        iterator __b = __base::begin();
29163e519524SHoward Hinnant        difference_type __pos = __f - __b;
29173e519524SHoward Hinnant        for (iterator __p = __b + __pos; __p != __e; ++__p)
2918ce48a113SHoward Hinnant            __alloc_traits::destroy(__a, _VSTD::addressof(*__p));
29193e519524SHoward Hinnant        __base::size() -= __n;
2920d544d144SEric Fiselier        while (__maybe_remove_back_spare()) {
29213e519524SHoward Hinnant        }
29223e519524SHoward Hinnant    }
29233e519524SHoward Hinnant}
29243e519524SHoward Hinnant
29253e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2926906c872dSEvgeniy Stepanovinline
29273e519524SHoward Hinnantvoid
29283e519524SHoward Hinnantdeque<_Tp, _Allocator>::swap(deque& __c)
2929e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
2930e3fbe143SMarshall Clow        _NOEXCEPT
2931e3fbe143SMarshall Clow#else
29329eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
29339eebe11dSHoward Hinnant                    __is_nothrow_swappable<allocator_type>::value)
2934e3fbe143SMarshall Clow#endif
29353e519524SHoward Hinnant{
29363e519524SHoward Hinnant    __base::swap(__c);
29373e519524SHoward Hinnant}
29383e519524SHoward Hinnant
29393e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2940906c872dSEvgeniy Stepanovinline
29413e519524SHoward Hinnantvoid
2942a87e8360SHoward Hinnantdeque<_Tp, _Allocator>::clear() _NOEXCEPT
29433e519524SHoward Hinnant{
29443e519524SHoward Hinnant    __base::clear();
29453e519524SHoward Hinnant}
29463e519524SHoward Hinnant
29473e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29483af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29493e519524SHoward Hinnantbool
29503e519524SHoward Hinnantoperator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29513e519524SHoward Hinnant{
29523e519524SHoward Hinnant    const typename deque<_Tp, _Allocator>::size_type __sz = __x.size();
2953ce48a113SHoward Hinnant    return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
29543e519524SHoward Hinnant}
29553e519524SHoward Hinnant
29563e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29573af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29583e519524SHoward Hinnantbool
29593e519524SHoward Hinnantoperator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29603e519524SHoward Hinnant{
29613e519524SHoward Hinnant    return !(__x == __y);
29623e519524SHoward Hinnant}
29633e519524SHoward Hinnant
29643e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29653af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29663e519524SHoward Hinnantbool
29673e519524SHoward Hinnantoperator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29683e519524SHoward Hinnant{
2969ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
29703e519524SHoward Hinnant}
29713e519524SHoward Hinnant
29723e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29733af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29743e519524SHoward Hinnantbool
29753e519524SHoward Hinnantoperator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29763e519524SHoward Hinnant{
29773e519524SHoward Hinnant    return __y < __x;
29783e519524SHoward Hinnant}
29793e519524SHoward Hinnant
29803e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29813af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29823e519524SHoward Hinnantbool
29833e519524SHoward Hinnantoperator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29843e519524SHoward Hinnant{
29853e519524SHoward Hinnant    return !(__x < __y);
29863e519524SHoward Hinnant}
29873e519524SHoward Hinnant
29883e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29893af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29903e519524SHoward Hinnantbool
29913e519524SHoward Hinnantoperator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29923e519524SHoward Hinnant{
29933e519524SHoward Hinnant    return !(__y < __x);
29943e519524SHoward Hinnant}
29953e519524SHoward Hinnant
29963e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29973af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29983e519524SHoward Hinnantvoid
29993e519524SHoward Hinnantswap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y)
30009eebe11dSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
30013e519524SHoward Hinnant{
30023e519524SHoward Hinnant    __x.swap(__y);
30033e519524SHoward Hinnant}
30043e519524SHoward Hinnant
3005f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
3006f60c63c0SMarshall Clowtemplate <class _Tp, class _Allocator, class _Up>
30073e895085SMarek Kurdejinline _LIBCPP_INLINE_VISIBILITY typename deque<_Tp, _Allocator>::size_type
30083e895085SMarek Kurdejerase(deque<_Tp, _Allocator>& __c, const _Up& __v) {
30093e895085SMarek Kurdej  auto __old_size = __c.size();
30103e895085SMarek Kurdej  __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end());
30113e895085SMarek Kurdej  return __old_size - __c.size();
30123e895085SMarek Kurdej}
3013f60c63c0SMarshall Clow
3014f60c63c0SMarshall Clowtemplate <class _Tp, class _Allocator, class _Predicate>
30153e895085SMarek Kurdejinline _LIBCPP_INLINE_VISIBILITY typename deque<_Tp, _Allocator>::size_type
30163e895085SMarek Kurdejerase_if(deque<_Tp, _Allocator>& __c, _Predicate __pred) {
30173e895085SMarek Kurdej  auto __old_size = __c.size();
30183e895085SMarek Kurdej  __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end());
30193e895085SMarek Kurdej  return __old_size - __c.size();
30203e895085SMarek Kurdej}
3021f60c63c0SMarshall Clow#endif
3022f60c63c0SMarshall Clow
3023f60c63c0SMarshall Clow
30243e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
30253e519524SHoward Hinnant
3026a016efb1SEric Fiselier_LIBCPP_POP_MACROS
3027a016efb1SEric Fiselier
30283e519524SHoward Hinnant#endif // _LIBCPP_DEQUE
3029