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