xref: /llvm-project-15.0.7/libcxx/include/deque (revision 00927334)
13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_DEQUE
113e519524SHoward Hinnant#define _LIBCPP_DEQUE
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    deque synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnanttemplate <class T, class Allocator = allocator<T> >
203e519524SHoward Hinnantclass deque
213e519524SHoward Hinnant{
223e519524SHoward Hinnantpublic:
233e519524SHoward Hinnant    // types:
243e519524SHoward Hinnant    typedef T value_type;
253e519524SHoward Hinnant    typedef Allocator allocator_type;
263e519524SHoward Hinnant
273e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
283e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
293e519524SHoward Hinnant    typedef implementation-defined                   iterator;
303e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
313e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
323e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
333e519524SHoward Hinnant
343e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
353e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
363e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
373e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
383e519524SHoward Hinnant
393e519524SHoward Hinnant    // construct/copy/destroy:
4080129113SHoward Hinnant    deque() noexcept(is_nothrow_default_constructible<allocator_type>::value);
413e519524SHoward Hinnant    explicit deque(const allocator_type& a);
423e519524SHoward Hinnant    explicit deque(size_type n);
43f1b6d1b5SMarshall Clow    explicit deque(size_type n, const allocator_type& a); // C++14
443e519524SHoward Hinnant    deque(size_type n, const value_type& v);
453e519524SHoward Hinnant    deque(size_type n, const value_type& v, const allocator_type& a);
463e519524SHoward Hinnant    template <class InputIterator>
473e519524SHoward Hinnant        deque(InputIterator f, InputIterator l);
483e519524SHoward Hinnant    template <class InputIterator>
493e519524SHoward Hinnant        deque(InputIterator f, InputIterator l, const allocator_type& a);
503e519524SHoward Hinnant    deque(const deque& c);
51b58f59cdSHoward Hinnant    deque(deque&& c)
52b58f59cdSHoward Hinnant        noexcept(is_nothrow_move_constructible<allocator_type>::value);
533e519524SHoward Hinnant    deque(initializer_list<value_type> il, const Allocator& a = allocator_type());
543e519524SHoward Hinnant    deque(const deque& c, const allocator_type& a);
553e519524SHoward Hinnant    deque(deque&& c, const allocator_type& a);
563e519524SHoward Hinnant    ~deque();
573e519524SHoward Hinnant
583e519524SHoward Hinnant    deque& operator=(const deque& c);
59b58f59cdSHoward Hinnant    deque& operator=(deque&& c)
60b58f59cdSHoward Hinnant        noexcept(
61b58f59cdSHoward Hinnant             allocator_type::propagate_on_container_move_assignment::value &&
62b58f59cdSHoward Hinnant             is_nothrow_move_assignable<allocator_type>::value);
633e519524SHoward Hinnant    deque& operator=(initializer_list<value_type> il);
643e519524SHoward Hinnant
653e519524SHoward Hinnant    template <class InputIterator>
663e519524SHoward Hinnant        void assign(InputIterator f, InputIterator l);
673e519524SHoward Hinnant    void assign(size_type n, const value_type& v);
683e519524SHoward Hinnant    void assign(initializer_list<value_type> il);
693e519524SHoward Hinnant
70a87e8360SHoward Hinnant    allocator_type get_allocator() const noexcept;
713e519524SHoward Hinnant
723e519524SHoward Hinnant    // iterators:
733e519524SHoward Hinnant
74a87e8360SHoward Hinnant    iterator       begin() noexcept;
75a87e8360SHoward Hinnant    const_iterator begin() const noexcept;
76a87e8360SHoward Hinnant    iterator       end() noexcept;
77a87e8360SHoward Hinnant    const_iterator end() const noexcept;
783e519524SHoward Hinnant
79a87e8360SHoward Hinnant    reverse_iterator       rbegin() noexcept;
80a87e8360SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
81a87e8360SHoward Hinnant    reverse_iterator       rend() noexcept;
82a87e8360SHoward Hinnant    const_reverse_iterator rend() const noexcept;
833e519524SHoward Hinnant
84a87e8360SHoward Hinnant    const_iterator         cbegin() const noexcept;
85a87e8360SHoward Hinnant    const_iterator         cend() const noexcept;
86a87e8360SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
87a87e8360SHoward Hinnant    const_reverse_iterator crend() const noexcept;
883e519524SHoward Hinnant
893e519524SHoward Hinnant    // capacity:
90a87e8360SHoward Hinnant    size_type size() const noexcept;
91a87e8360SHoward Hinnant    size_type max_size() const noexcept;
923e519524SHoward Hinnant    void resize(size_type n);
933e519524SHoward Hinnant    void resize(size_type n, const value_type& v);
943e519524SHoward Hinnant    void shrink_to_fit();
95a87e8360SHoward Hinnant    bool empty() const noexcept;
963e519524SHoward Hinnant
973e519524SHoward Hinnant    // element access:
983e519524SHoward Hinnant    reference operator[](size_type i);
993e519524SHoward Hinnant    const_reference operator[](size_type i) const;
1003e519524SHoward Hinnant    reference at(size_type i);
1013e519524SHoward Hinnant    const_reference at(size_type i) const;
1023e519524SHoward Hinnant    reference front();
1033e519524SHoward Hinnant    const_reference front() const;
1043e519524SHoward Hinnant    reference back();
1053e519524SHoward Hinnant    const_reference back() const;
1063e519524SHoward Hinnant
1073e519524SHoward Hinnant    // modifiers:
1083e519524SHoward Hinnant    void push_front(const value_type& v);
1093e519524SHoward Hinnant    void push_front(value_type&& v);
1103e519524SHoward Hinnant    void push_back(const value_type& v);
1113e519524SHoward Hinnant    void push_back(value_type&& v);
11263b560beSMarshall Clow    template <class... Args> reference emplace_front(Args&&... args);  // reference in C++17
11363b560beSMarshall Clow    template <class... Args> reference emplace_back(Args&&... args);   // reference in C++17
1143e519524SHoward Hinnant    template <class... Args> iterator emplace(const_iterator p, Args&&... args);
1153e519524SHoward Hinnant    iterator insert(const_iterator p, const value_type& v);
1163e519524SHoward Hinnant    iterator insert(const_iterator p, value_type&& v);
1173e519524SHoward Hinnant    iterator insert(const_iterator p, size_type n, const value_type& v);
1183e519524SHoward Hinnant    template <class InputIterator>
1193e519524SHoward Hinnant        iterator insert(const_iterator p, InputIterator f, InputIterator l);
1203e519524SHoward Hinnant    iterator insert(const_iterator p, initializer_list<value_type> il);
1213e519524SHoward Hinnant    void pop_front();
1223e519524SHoward Hinnant    void pop_back();
1233e519524SHoward Hinnant    iterator erase(const_iterator p);
1243e519524SHoward Hinnant    iterator erase(const_iterator f, const_iterator l);
125b58f59cdSHoward Hinnant    void swap(deque& c)
126e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value);  // C++17
127a87e8360SHoward Hinnant    void clear() noexcept;
1283e519524SHoward Hinnant};
1293e519524SHoward Hinnant
130dbb6f8a8SMarshall Clowtemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
131dbb6f8a8SMarshall Clow   deque(InputIterator, InputIterator, Allocator = Allocator())
13268072a71SKonstantin Varlamov   -> deque<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17
133dbb6f8a8SMarshall Clow
1343e519524SHoward Hinnanttemplate <class T, class Allocator>
1353e519524SHoward Hinnant    bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1363e519524SHoward Hinnanttemplate <class T, class Allocator>
1373e519524SHoward Hinnant    bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1383e519524SHoward Hinnanttemplate <class T, class Allocator>
1393e519524SHoward Hinnant    bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1403e519524SHoward Hinnanttemplate <class T, class Allocator>
1413e519524SHoward Hinnant    bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1423e519524SHoward Hinnanttemplate <class T, class Allocator>
1433e519524SHoward Hinnant    bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1443e519524SHoward Hinnanttemplate <class T, class Allocator>
1453e519524SHoward Hinnant    bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
1463e519524SHoward Hinnant
1473e519524SHoward Hinnant// specialized algorithms:
1483e519524SHoward Hinnanttemplate <class T, class Allocator>
14945900104SHoward Hinnant    void swap(deque<T,Allocator>& x, deque<T,Allocator>& y)
15045900104SHoward Hinnant         noexcept(noexcept(x.swap(y)));
1513e519524SHoward Hinnant
152f60c63c0SMarshall Clowtemplate <class T, class Allocator, class U>
1533e895085SMarek Kurdej    typename deque<T, Allocator>::size_type
1543e895085SMarek Kurdej    erase(deque<T, Allocator>& c, const U& value);       // C++20
155f60c63c0SMarshall Clowtemplate <class T, class Allocator, class Predicate>
1563e895085SMarek Kurdej    typename deque<T, Allocator>::size_type
1573e895085SMarek Kurdej    erase_if(deque<T, Allocator>& c, Predicate pred);    // C++20
158f60c63c0SMarshall Clow
1593e519524SHoward Hinnant}  // std
1603e519524SHoward Hinnant
1613e519524SHoward Hinnant*/
1623e519524SHoward Hinnant
1632e2f3158SNikolas Klauser#include <__algorithm/copy.h>
1642e2f3158SNikolas Klauser#include <__algorithm/copy_backward.h>
1652e2f3158SNikolas Klauser#include <__algorithm/equal.h>
1662e2f3158SNikolas Klauser#include <__algorithm/fill_n.h>
1672e2f3158SNikolas Klauser#include <__algorithm/lexicographical_compare.h>
1682e2f3158SNikolas Klauser#include <__algorithm/min.h>
1692e2f3158SNikolas Klauser#include <__algorithm/remove.h>
1702e2f3158SNikolas Klauser#include <__algorithm/remove_if.h>
1712e2f3158SNikolas Klauser#include <__algorithm/unwrap_iter.h>
172385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1733e519524SHoward Hinnant#include <__config>
17488930229SMark de Wever#include <__format/enable_insertable.h>
17568072a71SKonstantin Varlamov#include <__iterator/iterator_traits.h>
1763cd4531bSNikolas Klauser#include <__iterator/next.h>
1773cd4531bSNikolas Klauser#include <__iterator/prev.h>
1783cd4531bSNikolas Klauser#include <__iterator/reverse_iterator.h>
1793e519524SHoward Hinnant#include <__split_buffer>
1806adbc83eSChristopher Di Bella#include <__utility/forward.h>
18152915d78SNikolas Klauser#include <__utility/move.h>
18252915d78SNikolas Klauser#include <__utility/swap.h>
18369d5a666SChristopher Di Bella#include <limits>
1843e519524SHoward Hinnant#include <stdexcept>
18506b40e80SArthur O'Dwyer#include <type_traits>
186f56972e2SMarshall Clow#include <version>
1873e519524SHoward Hinnant
188de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
189de4a57cbSLouis Dionne#  include <algorithm>
190de4a57cbSLouis Dionne#  include <functional>
191de4a57cbSLouis Dionne#  include <iterator>
192de4a57cbSLouis Dionne#endif
193de4a57cbSLouis Dionne
194db1978b6SNikolas Klauser// standard-mandated includes
195db1978b6SNikolas Klauser
196db1978b6SNikolas Klauser// [iterator.range]
197db1978b6SNikolas Klauser#include <__iterator/access.h>
198db1978b6SNikolas Klauser#include <__iterator/data.h>
199db1978b6SNikolas Klauser#include <__iterator/empty.h>
200db1978b6SNikolas Klauser#include <__iterator/reverse_access.h>
201db1978b6SNikolas Klauser#include <__iterator/size.h>
202db1978b6SNikolas Klauser
203db1978b6SNikolas Klauser// [deque.syn]
204db1978b6SNikolas Klauser#include <compare>
205db1978b6SNikolas Klauser#include <initializer_list>
206db1978b6SNikolas Klauser
207a016efb1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
208a016efb1SEric Fiselier#  pragma GCC system_header
209a016efb1SEric Fiselier#endif
210a016efb1SEric Fiselier
211a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
212a016efb1SEric Fiselier#include <__undef_macros>
213a016efb1SEric Fiselier
214ab4f4382SHoward Hinnant
2153e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
2163e519524SHoward Hinnant
2173e519524SHoward Hinnanttemplate <class _Tp, class _Allocator> class __deque_base;
218e2f2d1edSEric Fiseliertemplate <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS deque;
2193e519524SHoward Hinnant
2203e519524SHoward Hinnanttemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
2213e519524SHoward Hinnant          class _DiffType, _DiffType _BlockSize>
222e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __deque_iterator;
2233e519524SHoward Hinnant
2243e519524SHoward Hinnanttemplate <class _RAIter,
2253e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2263e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2273e519524SHoward Hinnantcopy(_RAIter __f,
2283e519524SHoward Hinnant     _RAIter __l,
2293e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
230f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2313e519524SHoward Hinnant
2323e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2333e519524SHoward Hinnant          class _OutputIterator>
2343e519524SHoward Hinnant_OutputIterator
2353e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2363e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2373e519524SHoward Hinnant     _OutputIterator __r);
2383e519524SHoward Hinnant
2393e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2403e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2413e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2423e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2433e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2443e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2453e519524SHoward Hinnant
2463e519524SHoward Hinnanttemplate <class _RAIter,
2473e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2483e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2493e519524SHoward Hinnantcopy_backward(_RAIter __f,
2503e519524SHoward Hinnant              _RAIter __l,
2513e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
252f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2533e519524SHoward Hinnant
2543e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2553e519524SHoward Hinnant          class _OutputIterator>
2563e519524SHoward Hinnant_OutputIterator
2573e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2583e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2593e519524SHoward Hinnant              _OutputIterator __r);
2603e519524SHoward Hinnant
2613e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2623e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2633e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2643e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2653e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2663e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2673e519524SHoward Hinnant
2683e519524SHoward Hinnanttemplate <class _RAIter,
2693e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2703e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2713e519524SHoward Hinnantmove(_RAIter __f,
2723e519524SHoward Hinnant     _RAIter __l,
2733e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
274f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2753e519524SHoward Hinnant
2763e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2773e519524SHoward Hinnant          class _OutputIterator>
2783e519524SHoward Hinnant_OutputIterator
2793e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2803e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2813e519524SHoward Hinnant     _OutputIterator __r);
2823e519524SHoward Hinnant
2833e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2843e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2853e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2863e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
2873e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
2883e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
2893e519524SHoward Hinnant
2903e519524SHoward Hinnanttemplate <class _RAIter,
2913e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
2923e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
2933e519524SHoward Hinnantmove_backward(_RAIter __f,
2943e519524SHoward Hinnant              _RAIter __l,
2953e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
296f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
2973e519524SHoward Hinnant
2983e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
2993e519524SHoward Hinnant          class _OutputIterator>
3003e519524SHoward Hinnant_OutputIterator
3013e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
3023e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
3033e519524SHoward Hinnant              _OutputIterator __r);
3043e519524SHoward Hinnant
3053e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
3063e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
3073e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
3083e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
3093e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
3103e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
3113e519524SHoward Hinnant
31265da7bc3SEvgeniy Stepanovtemplate <class _ValueType, class _DiffType>
31365da7bc3SEvgeniy Stepanovstruct __deque_block_size {
31465da7bc3SEvgeniy Stepanov  static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16;
31565da7bc3SEvgeniy Stepanov};
31665da7bc3SEvgeniy Stepanov
3173e519524SHoward Hinnanttemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
31865da7bc3SEvgeniy Stepanov          class _DiffType, _DiffType _BS =
31965da7bc3SEvgeniy Stepanov#ifdef _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
32065da7bc3SEvgeniy Stepanov// Keep template parameter to avoid changing all template declarations thoughout
32165da7bc3SEvgeniy Stepanov// this file.
32265da7bc3SEvgeniy Stepanov                               0
32365da7bc3SEvgeniy Stepanov#else
32465da7bc3SEvgeniy Stepanov                               __deque_block_size<_ValueType, _DiffType>::value
32565da7bc3SEvgeniy Stepanov#endif
32665da7bc3SEvgeniy Stepanov          >
327e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __deque_iterator
3283e519524SHoward Hinnant{
3293e519524SHoward Hinnant    typedef _MapPointer __map_iterator;
3303e519524SHoward Hinnantpublic:
3313e519524SHoward Hinnant    typedef _Pointer  pointer;
3323e519524SHoward Hinnant    typedef _DiffType difference_type;
3333e519524SHoward Hinnantprivate:
3343e519524SHoward Hinnant    __map_iterator __m_iter_;
3353e519524SHoward Hinnant    pointer        __ptr_;
3363e519524SHoward Hinnant
33765da7bc3SEvgeniy Stepanov    static const difference_type __block_size;
3383e519524SHoward Hinnantpublic:
3393e519524SHoward Hinnant    typedef _ValueType                  value_type;
3403e519524SHoward Hinnant    typedef random_access_iterator_tag  iterator_category;
3413e519524SHoward Hinnant    typedef _Reference                  reference;
3423e519524SHoward Hinnant
3438fe0a372SMarshall Clow    _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT
3448fe0a372SMarshall Clow#if _LIBCPP_STD_VER > 11
3458fe0a372SMarshall Clow     : __m_iter_(nullptr), __ptr_(nullptr)
3468fe0a372SMarshall Clow#endif
3478fe0a372SMarshall Clow     {}
3483e519524SHoward Hinnant
349c003db1fSHoward Hinnant    template <class _Pp, class _Rp, class _MP>
3503e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
35165da7bc3SEvgeniy Stepanov    __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, _BS>& __it,
352c003db1fSHoward Hinnant                typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
3533e519524SHoward Hinnant        : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
3543e519524SHoward Hinnant
3553e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;}
3563e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;}
3573e519524SHoward Hinnant
3583e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++()
3593e519524SHoward Hinnant    {
3603e519524SHoward Hinnant        if (++__ptr_ - *__m_iter_ == __block_size)
3613e519524SHoward Hinnant        {
3623e519524SHoward Hinnant            ++__m_iter_;
3633e519524SHoward Hinnant            __ptr_ = *__m_iter_;
3643e519524SHoward Hinnant        }
3653e519524SHoward Hinnant        return *this;
3663e519524SHoward Hinnant    }
3673e519524SHoward Hinnant
3683e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int)
3693e519524SHoward Hinnant    {
3703e519524SHoward Hinnant        __deque_iterator __tmp = *this;
3713e519524SHoward Hinnant        ++(*this);
3723e519524SHoward Hinnant        return __tmp;
3733e519524SHoward Hinnant    }
3743e519524SHoward Hinnant
3753e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--()
3763e519524SHoward Hinnant    {
3773e519524SHoward Hinnant        if (__ptr_ == *__m_iter_)
3783e519524SHoward Hinnant        {
3793e519524SHoward Hinnant            --__m_iter_;
3803e519524SHoward Hinnant            __ptr_ = *__m_iter_ + __block_size;
3813e519524SHoward Hinnant        }
3823e519524SHoward Hinnant        --__ptr_;
3833e519524SHoward Hinnant        return *this;
3843e519524SHoward Hinnant    }
3853e519524SHoward Hinnant
3863e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int)
3873e519524SHoward Hinnant    {
3883e519524SHoward Hinnant        __deque_iterator __tmp = *this;
3893e519524SHoward Hinnant        --(*this);
3903e519524SHoward Hinnant        return __tmp;
3913e519524SHoward Hinnant    }
3923e519524SHoward Hinnant
3933e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n)
3943e519524SHoward Hinnant    {
3953e519524SHoward Hinnant        if (__n != 0)
3963e519524SHoward Hinnant        {
3973e519524SHoward Hinnant            __n += __ptr_ - *__m_iter_;
3983e519524SHoward Hinnant            if (__n > 0)
3993e519524SHoward Hinnant            {
4003e519524SHoward Hinnant                __m_iter_ += __n / __block_size;
4013e519524SHoward Hinnant                __ptr_ = *__m_iter_ + __n % __block_size;
4023e519524SHoward Hinnant            }
4033e519524SHoward Hinnant            else // (__n < 0)
4043e519524SHoward Hinnant            {
4053e519524SHoward Hinnant                difference_type __z = __block_size - 1 - __n;
4063e519524SHoward Hinnant                __m_iter_ -= __z / __block_size;
4073e519524SHoward Hinnant                __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size);
4083e519524SHoward Hinnant            }
4093e519524SHoward Hinnant        }
4103e519524SHoward Hinnant        return *this;
4113e519524SHoward Hinnant    }
4123e519524SHoward Hinnant
4133e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n)
4143e519524SHoward Hinnant    {
4153e519524SHoward Hinnant        return *this += -__n;
4163e519524SHoward Hinnant    }
4173e519524SHoward Hinnant
4183e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const
4193e519524SHoward Hinnant    {
4203e519524SHoward Hinnant        __deque_iterator __t(*this);
4213e519524SHoward Hinnant        __t += __n;
4223e519524SHoward Hinnant        return __t;
4233e519524SHoward Hinnant    }
4243e519524SHoward Hinnant
4253e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const
4263e519524SHoward Hinnant    {
4273e519524SHoward Hinnant        __deque_iterator __t(*this);
4283e519524SHoward Hinnant        __t -= __n;
4293e519524SHoward Hinnant        return __t;
4303e519524SHoward Hinnant    }
4313e519524SHoward Hinnant
4323e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4333e519524SHoward Hinnant    friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it)
4343e519524SHoward Hinnant        {return __it + __n;}
4353e519524SHoward Hinnant
4363e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4373e519524SHoward Hinnant    friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y)
4383e519524SHoward Hinnant    {
4393e519524SHoward Hinnant        if (__x != __y)
4403e519524SHoward Hinnant            return (__x.__m_iter_ - __y.__m_iter_) * __block_size
4413e519524SHoward Hinnant                 + (__x.__ptr_ - *__x.__m_iter_)
4423e519524SHoward Hinnant                 - (__y.__ptr_ - *__y.__m_iter_);
4433e519524SHoward Hinnant        return 0;
4443e519524SHoward Hinnant    }
4453e519524SHoward Hinnant
4463e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
4473e519524SHoward Hinnant        {return *(*this + __n);}
4483e519524SHoward Hinnant
4493e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4503e519524SHoward Hinnant        bool operator==(const __deque_iterator& __x, const __deque_iterator& __y)
4513e519524SHoward Hinnant        {return __x.__ptr_ == __y.__ptr_;}
4523e519524SHoward Hinnant
4533e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4543e519524SHoward Hinnant        bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y)
4553e519524SHoward Hinnant        {return !(__x == __y);}
4563e519524SHoward Hinnant
4573e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4583e519524SHoward Hinnant        bool operator<(const __deque_iterator& __x, const __deque_iterator& __y)
4593e519524SHoward Hinnant        {return __x.__m_iter_ < __y.__m_iter_ ||
4603e519524SHoward Hinnant               (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);}
4613e519524SHoward Hinnant
4623e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4633e519524SHoward Hinnant        bool operator>(const __deque_iterator& __x, const __deque_iterator& __y)
4643e519524SHoward Hinnant        {return __y < __x;}
4653e519524SHoward Hinnant
4663e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4673e519524SHoward Hinnant        bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y)
4683e519524SHoward Hinnant        {return !(__y < __x);}
4693e519524SHoward Hinnant
4703e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY friend
4713e519524SHoward Hinnant        bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y)
4723e519524SHoward Hinnant        {return !(__x < __y);}
4733e519524SHoward Hinnant
4743e519524SHoward Hinnantprivate:
475f86c2b6fSArthur O'Dwyer    _LIBCPP_INLINE_VISIBILITY explicit __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT
4763e519524SHoward Hinnant        : __m_iter_(__m), __ptr_(__p) {}
4773e519524SHoward Hinnant
478c003db1fSHoward Hinnant    template <class _Tp, class _Ap> friend class __deque_base;
479e2f2d1edSEric Fiselier    template <class _Tp, class _Ap> friend class _LIBCPP_TEMPLATE_VIS deque;
480c003db1fSHoward Hinnant    template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp>
481e2f2d1edSEric Fiselier        friend class _LIBCPP_TEMPLATE_VIS __deque_iterator;
4823e519524SHoward Hinnant
4833e519524SHoward Hinnant    template <class _RAIter,
4843e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
4853e519524SHoward Hinnant    friend
4863e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
4873e519524SHoward Hinnant    copy(_RAIter __f,
4883e519524SHoward Hinnant         _RAIter __l,
4893e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
490f82dba01SEric Fiselier         typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
4913e519524SHoward Hinnant
4923e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
4933e519524SHoward Hinnant              class _OutputIterator>
4943e519524SHoward Hinnant    friend
4953e519524SHoward Hinnant    _OutputIterator
4963e519524SHoward Hinnant    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
4973e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
4983e519524SHoward Hinnant         _OutputIterator __r);
4993e519524SHoward Hinnant
5003e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5013e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5023e519524SHoward Hinnant    friend
5033e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5043e519524SHoward Hinnant    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5053e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5063e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5073e519524SHoward Hinnant
5083e519524SHoward Hinnant    template <class _RAIter,
5093e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5103e519524SHoward Hinnant    friend
5113e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5123e519524SHoward Hinnant    copy_backward(_RAIter __f,
5133e519524SHoward Hinnant                  _RAIter __l,
5143e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
515f82dba01SEric Fiselier                  typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
5163e519524SHoward Hinnant
5173e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5183e519524SHoward Hinnant              class _OutputIterator>
5193e519524SHoward Hinnant    friend
5203e519524SHoward Hinnant    _OutputIterator
5213e519524SHoward Hinnant    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5223e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5233e519524SHoward Hinnant                  _OutputIterator __r);
5243e519524SHoward Hinnant
5253e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5263e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5273e519524SHoward Hinnant    friend
5283e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5293e519524SHoward Hinnant    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5303e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5313e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5323e519524SHoward Hinnant
5333e519524SHoward Hinnant    template <class _RAIter,
5343e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5353e519524SHoward Hinnant    friend
5363e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5373e519524SHoward Hinnant    move(_RAIter __f,
5383e519524SHoward Hinnant         _RAIter __l,
5393e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
540f82dba01SEric Fiselier         typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
5413e519524SHoward Hinnant
5423e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5433e519524SHoward Hinnant              class _OutputIterator>
5443e519524SHoward Hinnant    friend
5453e519524SHoward Hinnant    _OutputIterator
5463e519524SHoward Hinnant    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5473e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5483e519524SHoward Hinnant         _OutputIterator __r);
5493e519524SHoward Hinnant
5503e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5513e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5523e519524SHoward Hinnant    friend
5533e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5543e519524SHoward Hinnant    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5553e519524SHoward Hinnant         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5563e519524SHoward Hinnant         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5573e519524SHoward Hinnant
5583e519524SHoward Hinnant    template <class _RAIter,
5593e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5603e519524SHoward Hinnant    friend
5613e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5623e519524SHoward Hinnant    move_backward(_RAIter __f,
5633e519524SHoward Hinnant                  _RAIter __l,
5643e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
565f82dba01SEric Fiselier                  typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*);
5663e519524SHoward Hinnant
5673e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5683e519524SHoward Hinnant              class _OutputIterator>
5693e519524SHoward Hinnant    friend
5703e519524SHoward Hinnant    _OutputIterator
5713e519524SHoward Hinnant    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5723e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5733e519524SHoward Hinnant                  _OutputIterator __r);
5743e519524SHoward Hinnant
5753e519524SHoward Hinnant    template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
5763e519524SHoward Hinnant              class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5773e519524SHoward Hinnant    friend
5783e519524SHoward Hinnant    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5793e519524SHoward Hinnant    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
5803e519524SHoward Hinnant                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
5813e519524SHoward Hinnant                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
5823e519524SHoward Hinnant};
5833e519524SHoward Hinnant
58465da7bc3SEvgeniy Stepanovtemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
58565da7bc3SEvgeniy Stepanov          class _DiffType, _DiffType _BlockSize>
58665da7bc3SEvgeniy Stepanovconst _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer,
58765da7bc3SEvgeniy Stepanov                                 _DiffType, _BlockSize>::__block_size =
58865da7bc3SEvgeniy Stepanov    __deque_block_size<_ValueType, _DiffType>::value;
58965da7bc3SEvgeniy Stepanov
5903e519524SHoward Hinnant// copy
5913e519524SHoward Hinnant
5923e519524SHoward Hinnanttemplate <class _RAIter,
5933e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
5943e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
5953e519524SHoward Hinnantcopy(_RAIter __f,
5963e519524SHoward Hinnant     _RAIter __l,
5973e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
598f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
5993e519524SHoward Hinnant{
6003e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
6013e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
60265da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
6033e519524SHoward Hinnant    while (__f != __l)
6043e519524SHoward Hinnant    {
6053e519524SHoward Hinnant        pointer __rb = __r.__ptr_;
60665da7bc3SEvgeniy Stepanov        pointer __re = *__r.__m_iter_ + __block_size;
6073e519524SHoward Hinnant        difference_type __bs = __re - __rb;
6083e519524SHoward Hinnant        difference_type __n = __l - __f;
6093e519524SHoward Hinnant        _RAIter __m = __l;
6103e519524SHoward Hinnant        if (__n > __bs)
6113e519524SHoward Hinnant        {
6123e519524SHoward Hinnant            __n = __bs;
6133e519524SHoward Hinnant            __m = __f + __n;
6143e519524SHoward Hinnant        }
615ce48a113SHoward Hinnant        _VSTD::copy(__f, __m, __rb);
6163e519524SHoward Hinnant        __f = __m;
6173e519524SHoward Hinnant        __r += __n;
6183e519524SHoward Hinnant    }
6193e519524SHoward Hinnant    return __r;
6203e519524SHoward Hinnant}
6213e519524SHoward Hinnant
6223e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
6233e519524SHoward Hinnant          class _OutputIterator>
6243e519524SHoward Hinnant_OutputIterator
6253e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
6263e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
6273e519524SHoward Hinnant     _OutputIterator __r)
6283e519524SHoward Hinnant{
6293e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
6303e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
63165da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
6323e519524SHoward Hinnant    difference_type __n = __l - __f;
6333e519524SHoward Hinnant    while (__n > 0)
6343e519524SHoward Hinnant    {
6353e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
63665da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
6373e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
6383e519524SHoward Hinnant        if (__bs > __n)
6393e519524SHoward Hinnant        {
6403e519524SHoward Hinnant            __bs = __n;
6413e519524SHoward Hinnant            __fe = __fb + __bs;
6423e519524SHoward Hinnant        }
643ce48a113SHoward Hinnant        __r = _VSTD::copy(__fb, __fe, __r);
6443e519524SHoward Hinnant        __n -= __bs;
6453e519524SHoward Hinnant        __f += __bs;
6463e519524SHoward Hinnant    }
6473e519524SHoward Hinnant    return __r;
6483e519524SHoward Hinnant}
6493e519524SHoward Hinnant
6503e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
6513e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
6523e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
6533e519524SHoward Hinnantcopy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
6543e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
6553e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
6563e519524SHoward Hinnant{
6573e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
6583e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
65965da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
6603e519524SHoward Hinnant    difference_type __n = __l - __f;
6613e519524SHoward Hinnant    while (__n > 0)
6623e519524SHoward Hinnant    {
6633e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
66465da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
6653e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
6663e519524SHoward Hinnant        if (__bs > __n)
6673e519524SHoward Hinnant        {
6683e519524SHoward Hinnant            __bs = __n;
6693e519524SHoward Hinnant            __fe = __fb + __bs;
6703e519524SHoward Hinnant        }
671ce48a113SHoward Hinnant        __r = _VSTD::copy(__fb, __fe, __r);
6723e519524SHoward Hinnant        __n -= __bs;
6733e519524SHoward Hinnant        __f += __bs;
6743e519524SHoward Hinnant    }
6753e519524SHoward Hinnant    return __r;
6763e519524SHoward Hinnant}
6773e519524SHoward Hinnant
6783e519524SHoward Hinnant// copy_backward
6793e519524SHoward Hinnant
6803e519524SHoward Hinnanttemplate <class _RAIter,
6813e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
6823e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
6833e519524SHoward Hinnantcopy_backward(_RAIter __f,
6843e519524SHoward Hinnant              _RAIter __l,
6853e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
686f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
6873e519524SHoward Hinnant{
6883e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
6893e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
6903e519524SHoward Hinnant    while (__f != __l)
6913e519524SHoward Hinnant    {
692ce48a113SHoward Hinnant        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
6933e519524SHoward Hinnant        pointer __rb = *__rp.__m_iter_;
6943e519524SHoward Hinnant        pointer __re = __rp.__ptr_ + 1;
6953e519524SHoward Hinnant        difference_type __bs = __re - __rb;
6963e519524SHoward Hinnant        difference_type __n = __l - __f;
6973e519524SHoward Hinnant        _RAIter __m = __f;
6983e519524SHoward Hinnant        if (__n > __bs)
6993e519524SHoward Hinnant        {
7003e519524SHoward Hinnant            __n = __bs;
7013e519524SHoward Hinnant            __m = __l - __n;
7023e519524SHoward Hinnant        }
703ce48a113SHoward Hinnant        _VSTD::copy_backward(__m, __l, __re);
7043e519524SHoward Hinnant        __l = __m;
7053e519524SHoward Hinnant        __r -= __n;
7063e519524SHoward Hinnant    }
7073e519524SHoward Hinnant    return __r;
7083e519524SHoward Hinnant}
7093e519524SHoward Hinnant
7103e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7113e519524SHoward Hinnant          class _OutputIterator>
7123e519524SHoward Hinnant_OutputIterator
7133e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
7143e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
7153e519524SHoward Hinnant              _OutputIterator __r)
7163e519524SHoward Hinnant{
7173e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
7183e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
7193e519524SHoward Hinnant    difference_type __n = __l - __f;
7203e519524SHoward Hinnant    while (__n > 0)
7213e519524SHoward Hinnant    {
7223e519524SHoward Hinnant        --__l;
7233e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
7243e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
7253e519524SHoward Hinnant        difference_type __bs = __le - __lb;
7263e519524SHoward Hinnant        if (__bs > __n)
7273e519524SHoward Hinnant        {
7283e519524SHoward Hinnant            __bs = __n;
7293e519524SHoward Hinnant            __lb = __le - __bs;
7303e519524SHoward Hinnant        }
731ce48a113SHoward Hinnant        __r = _VSTD::copy_backward(__lb, __le, __r);
7323e519524SHoward Hinnant        __n -= __bs;
7333e519524SHoward Hinnant        __l -= __bs - 1;
7343e519524SHoward Hinnant    }
7353e519524SHoward Hinnant    return __r;
7363e519524SHoward Hinnant}
7373e519524SHoward Hinnant
7383e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7393e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
7403e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
7413e519524SHoward Hinnantcopy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
7423e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
7433e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
7443e519524SHoward Hinnant{
7453e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
7463e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
7473e519524SHoward Hinnant    difference_type __n = __l - __f;
7483e519524SHoward Hinnant    while (__n > 0)
7493e519524SHoward Hinnant    {
7503e519524SHoward Hinnant        --__l;
7513e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
7523e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
7533e519524SHoward Hinnant        difference_type __bs = __le - __lb;
7543e519524SHoward Hinnant        if (__bs > __n)
7553e519524SHoward Hinnant        {
7563e519524SHoward Hinnant            __bs = __n;
7573e519524SHoward Hinnant            __lb = __le - __bs;
7583e519524SHoward Hinnant        }
759ce48a113SHoward Hinnant        __r = _VSTD::copy_backward(__lb, __le, __r);
7603e519524SHoward Hinnant        __n -= __bs;
7613e519524SHoward Hinnant        __l -= __bs - 1;
7623e519524SHoward Hinnant    }
7633e519524SHoward Hinnant    return __r;
7643e519524SHoward Hinnant}
7653e519524SHoward Hinnant
7663e519524SHoward Hinnant// move
7673e519524SHoward Hinnant
7683e519524SHoward Hinnanttemplate <class _RAIter,
7693e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
7703e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
7713e519524SHoward Hinnantmove(_RAIter __f,
7723e519524SHoward Hinnant     _RAIter __l,
7733e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
774f82dba01SEric Fiselier     typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
7753e519524SHoward Hinnant{
7763e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
7773e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
77865da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
7793e519524SHoward Hinnant    while (__f != __l)
7803e519524SHoward Hinnant    {
7813e519524SHoward Hinnant        pointer __rb = __r.__ptr_;
78265da7bc3SEvgeniy Stepanov        pointer __re = *__r.__m_iter_ + __block_size;
7833e519524SHoward Hinnant        difference_type __bs = __re - __rb;
7843e519524SHoward Hinnant        difference_type __n = __l - __f;
7853e519524SHoward Hinnant        _RAIter __m = __l;
7863e519524SHoward Hinnant        if (__n > __bs)
7873e519524SHoward Hinnant        {
7883e519524SHoward Hinnant            __n = __bs;
7893e519524SHoward Hinnant            __m = __f + __n;
7903e519524SHoward Hinnant        }
791ce48a113SHoward Hinnant        _VSTD::move(__f, __m, __rb);
7923e519524SHoward Hinnant        __f = __m;
7933e519524SHoward Hinnant        __r += __n;
7943e519524SHoward Hinnant    }
7953e519524SHoward Hinnant    return __r;
7963e519524SHoward Hinnant}
7973e519524SHoward Hinnant
7983e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
7993e519524SHoward Hinnant          class _OutputIterator>
8003e519524SHoward Hinnant_OutputIterator
8013e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
8023e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8033e519524SHoward Hinnant     _OutputIterator __r)
8043e519524SHoward Hinnant{
8053e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8063e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
80765da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
8083e519524SHoward Hinnant    difference_type __n = __l - __f;
8093e519524SHoward Hinnant    while (__n > 0)
8103e519524SHoward Hinnant    {
8113e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
81265da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
8133e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
8143e519524SHoward Hinnant        if (__bs > __n)
8153e519524SHoward Hinnant        {
8163e519524SHoward Hinnant            __bs = __n;
8173e519524SHoward Hinnant            __fe = __fb + __bs;
8183e519524SHoward Hinnant        }
819ce48a113SHoward Hinnant        __r = _VSTD::move(__fb, __fe, __r);
8203e519524SHoward Hinnant        __n -= __bs;
8213e519524SHoward Hinnant        __f += __bs;
8223e519524SHoward Hinnant    }
8233e519524SHoward Hinnant    return __r;
8243e519524SHoward Hinnant}
8253e519524SHoward Hinnant
8263e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
8273e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
8283e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
8293e519524SHoward Hinnantmove(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
8303e519524SHoward Hinnant     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8313e519524SHoward Hinnant     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
8323e519524SHoward Hinnant{
8333e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8343e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
83565da7bc3SEvgeniy Stepanov    const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
8363e519524SHoward Hinnant    difference_type __n = __l - __f;
8373e519524SHoward Hinnant    while (__n > 0)
8383e519524SHoward Hinnant    {
8393e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
84065da7bc3SEvgeniy Stepanov        pointer __fe = *__f.__m_iter_ + __block_size;
8413e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
8423e519524SHoward Hinnant        if (__bs > __n)
8433e519524SHoward Hinnant        {
8443e519524SHoward Hinnant            __bs = __n;
8453e519524SHoward Hinnant            __fe = __fb + __bs;
8463e519524SHoward Hinnant        }
847ce48a113SHoward Hinnant        __r = _VSTD::move(__fb, __fe, __r);
8483e519524SHoward Hinnant        __n -= __bs;
8493e519524SHoward Hinnant        __f += __bs;
8503e519524SHoward Hinnant    }
8513e519524SHoward Hinnant    return __r;
8523e519524SHoward Hinnant}
8533e519524SHoward Hinnant
8543e519524SHoward Hinnant// move_backward
8553e519524SHoward Hinnant
8563e519524SHoward Hinnanttemplate <class _RAIter,
8573e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
8583e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
8593e519524SHoward Hinnantmove_backward(_RAIter __f,
8603e519524SHoward Hinnant              _RAIter __l,
8613e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
862f82dba01SEric Fiselier              typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
8633e519524SHoward Hinnant{
8643e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
8653e519524SHoward Hinnant    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
8663e519524SHoward Hinnant    while (__f != __l)
8673e519524SHoward Hinnant    {
868ce48a113SHoward Hinnant        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
8693e519524SHoward Hinnant        pointer __rb = *__rp.__m_iter_;
8703e519524SHoward Hinnant        pointer __re = __rp.__ptr_ + 1;
8713e519524SHoward Hinnant        difference_type __bs = __re - __rb;
8723e519524SHoward Hinnant        difference_type __n = __l - __f;
8733e519524SHoward Hinnant        _RAIter __m = __f;
8743e519524SHoward Hinnant        if (__n > __bs)
8753e519524SHoward Hinnant        {
8763e519524SHoward Hinnant            __n = __bs;
8773e519524SHoward Hinnant            __m = __l - __n;
8783e519524SHoward Hinnant        }
879ce48a113SHoward Hinnant        _VSTD::move_backward(__m, __l, __re);
8803e519524SHoward Hinnant        __l = __m;
8813e519524SHoward Hinnant        __r -= __n;
8823e519524SHoward Hinnant    }
8833e519524SHoward Hinnant    return __r;
8843e519524SHoward Hinnant}
8853e519524SHoward Hinnant
8863e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
8873e519524SHoward Hinnant          class _OutputIterator>
8883e519524SHoward Hinnant_OutputIterator
8893e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
8903e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
8913e519524SHoward Hinnant              _OutputIterator __r)
8923e519524SHoward Hinnant{
8933e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
8943e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
8953e519524SHoward Hinnant    difference_type __n = __l - __f;
8963e519524SHoward Hinnant    while (__n > 0)
8973e519524SHoward Hinnant    {
8983e519524SHoward Hinnant        --__l;
8993e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
9003e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
9013e519524SHoward Hinnant        difference_type __bs = __le - __lb;
9023e519524SHoward Hinnant        if (__bs > __n)
9033e519524SHoward Hinnant        {
9043e519524SHoward Hinnant            __bs = __n;
9053e519524SHoward Hinnant            __lb = __le - __bs;
9063e519524SHoward Hinnant        }
907ce48a113SHoward Hinnant        __r = _VSTD::move_backward(__lb, __le, __r);
9083e519524SHoward Hinnant        __n -= __bs;
9093e519524SHoward Hinnant        __l -= __bs - 1;
9103e519524SHoward Hinnant    }
9113e519524SHoward Hinnant    return __r;
9123e519524SHoward Hinnant}
9133e519524SHoward Hinnant
9143e519524SHoward Hinnanttemplate <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
9153e519524SHoward Hinnant          class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
9163e519524SHoward Hinnant__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
9173e519524SHoward Hinnantmove_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
9183e519524SHoward Hinnant              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
9193e519524SHoward Hinnant              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
9203e519524SHoward Hinnant{
9213e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
9223e519524SHoward Hinnant    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
9233e519524SHoward Hinnant    difference_type __n = __l - __f;
9243e519524SHoward Hinnant    while (__n > 0)
9253e519524SHoward Hinnant    {
9263e519524SHoward Hinnant        --__l;
9273e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
9283e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
9293e519524SHoward Hinnant        difference_type __bs = __le - __lb;
9303e519524SHoward Hinnant        if (__bs > __n)
9313e519524SHoward Hinnant        {
9323e519524SHoward Hinnant            __bs = __n;
9333e519524SHoward Hinnant            __lb = __le - __bs;
9343e519524SHoward Hinnant        }
935ce48a113SHoward Hinnant        __r = _VSTD::move_backward(__lb, __le, __r);
9363e519524SHoward Hinnant        __n -= __bs;
9373e519524SHoward Hinnant        __l -= __bs - 1;
9383e519524SHoward Hinnant    }
9393e519524SHoward Hinnant    return __r;
9403e519524SHoward Hinnant}
9413e519524SHoward Hinnant
9423e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
9433e519524SHoward Hinnantclass __deque_base
9443e519524SHoward Hinnant{
9453e519524SHoward Hinnant    __deque_base(const __deque_base& __c);
9463e519524SHoward Hinnant    __deque_base& operator=(const __deque_base& __c);
947dbb6f8a8SMarshall Clowpublic:
9483e519524SHoward Hinnant    typedef _Allocator                                allocator_type;
9493e519524SHoward Hinnant    typedef allocator_traits<allocator_type>          __alloc_traits;
950dbb6f8a8SMarshall Clow    typedef typename __alloc_traits::size_type        size_type;
951d544d144SEric Fiselier
952dbb6f8a8SMarshall Clow    typedef _Tp                                       value_type;
9533e519524SHoward Hinnant    typedef value_type&                               reference;
9543e519524SHoward Hinnant    typedef const value_type&                         const_reference;
9553e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type  difference_type;
9563e519524SHoward Hinnant    typedef typename __alloc_traits::pointer          pointer;
9573e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer    const_pointer;
9583e519524SHoward Hinnant
95965da7bc3SEvgeniy Stepanov    static const difference_type __block_size;
9603e519524SHoward Hinnant
9611f508014SMarshall Clow    typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
9623e519524SHoward Hinnant    typedef allocator_traits<__pointer_allocator>        __map_traits;
9633e519524SHoward Hinnant    typedef typename __map_traits::pointer               __map_pointer;
9641f508014SMarshall Clow    typedef typename __rebind_alloc_helper<__alloc_traits, const_pointer>::type __const_pointer_allocator;
96514e200d1SHoward Hinnant    typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer;
9663e519524SHoward Hinnant    typedef __split_buffer<pointer, __pointer_allocator> __map;
9673e519524SHoward Hinnant
9683e519524SHoward Hinnant    typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
96965da7bc3SEvgeniy Stepanov                             difference_type>    iterator;
9703e519524SHoward Hinnant    typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
97165da7bc3SEvgeniy Stepanov                             difference_type>    const_iterator;
9723e519524SHoward Hinnant
973b0945e1bSEric Fiselier    struct __deque_block_range {
974b0945e1bSEric Fiselier      explicit __deque_block_range(pointer __b, pointer __e) _NOEXCEPT : __begin_(__b), __end_(__e) {}
975b0945e1bSEric Fiselier      const pointer __begin_;
976b0945e1bSEric Fiselier      const pointer __end_;
977b0945e1bSEric Fiselier    };
978b0945e1bSEric Fiselier
979b0945e1bSEric Fiselier    struct __deque_range {
980b0945e1bSEric Fiselier      iterator __pos_;
981b0945e1bSEric Fiselier      const iterator __end_;
982b0945e1bSEric Fiselier
983b0945e1bSEric Fiselier      __deque_range(iterator __pos, iterator __e) _NOEXCEPT
984b0945e1bSEric Fiselier        : __pos_(__pos), __end_(__e) {}
985b0945e1bSEric Fiselier
986b0945e1bSEric Fiselier      explicit operator bool() const _NOEXCEPT {
987b0945e1bSEric Fiselier        return __pos_ != __end_;
988b0945e1bSEric Fiselier      }
989b0945e1bSEric Fiselier
990b0945e1bSEric Fiselier      __deque_range begin() const {
991b0945e1bSEric Fiselier        return *this;
992b0945e1bSEric Fiselier      }
993b0945e1bSEric Fiselier
994b0945e1bSEric Fiselier      __deque_range end() const {
995b0945e1bSEric Fiselier        return __deque_range(__end_, __end_);
996b0945e1bSEric Fiselier      }
997b0945e1bSEric Fiselier      __deque_block_range operator*() const _NOEXCEPT {
998b0945e1bSEric Fiselier         if (__pos_.__m_iter_ == __end_.__m_iter_) {
999b0945e1bSEric Fiselier          return __deque_block_range(__pos_.__ptr_, __end_.__ptr_);
1000b0945e1bSEric Fiselier        }
1001b0945e1bSEric Fiselier        return __deque_block_range(__pos_.__ptr_, *__pos_.__m_iter_ + __block_size);
1002b0945e1bSEric Fiselier      }
1003b0945e1bSEric Fiselier
1004b0945e1bSEric Fiselier      __deque_range& operator++() _NOEXCEPT {
1005b0945e1bSEric Fiselier        if (__pos_.__m_iter_ == __end_.__m_iter_) {
1006b0945e1bSEric Fiselier          __pos_ = __end_;
1007b0945e1bSEric Fiselier        } else {
1008b0945e1bSEric Fiselier          ++__pos_.__m_iter_;
1009b0945e1bSEric Fiselier          __pos_.__ptr_ = *__pos_.__m_iter_;
1010b0945e1bSEric Fiselier        }
1011b0945e1bSEric Fiselier        return *this;
1012b0945e1bSEric Fiselier      }
1013b0945e1bSEric Fiselier
1014b0945e1bSEric Fiselier
1015b0945e1bSEric Fiselier      friend bool operator==(__deque_range const& __lhs, __deque_range const& __rhs) {
1016b0945e1bSEric Fiselier        return __lhs.__pos_ == __rhs.__pos_;
1017b0945e1bSEric Fiselier      }
1018b0945e1bSEric Fiselier      friend bool operator!=(__deque_range const& __lhs, __deque_range const& __rhs) {
1019b0945e1bSEric Fiselier        return !(__lhs == __rhs);
1020b0945e1bSEric Fiselier      }
1021b0945e1bSEric Fiselier    };
1022b0945e1bSEric Fiselier
1023b0945e1bSEric Fiselier
1024b0945e1bSEric Fiselier
1025b0945e1bSEric Fiselier    struct _ConstructTransaction {
1026b0945e1bSEric Fiselier      _ConstructTransaction(__deque_base* __db, __deque_block_range& __r)
1027b0945e1bSEric Fiselier        : __pos_(__r.__begin_), __end_(__r.__end_), __begin_(__r.__begin_), __base_(__db) {}
1028b0945e1bSEric Fiselier
1029b0945e1bSEric Fiselier
1030b0945e1bSEric Fiselier      ~_ConstructTransaction() {
1031b0945e1bSEric Fiselier        __base_->size() += (__pos_ - __begin_);
1032b0945e1bSEric Fiselier      }
1033b0945e1bSEric Fiselier
1034b0945e1bSEric Fiselier      pointer __pos_;
1035b0945e1bSEric Fiselier      const pointer __end_;
1036b0945e1bSEric Fiselier    private:
1037b0945e1bSEric Fiselier      const pointer __begin_;
1038b0945e1bSEric Fiselier      __deque_base * const __base_;
1039b0945e1bSEric Fiselier    };
1040b0945e1bSEric Fiselier
1041dbb6f8a8SMarshall Clowprotected:
10423e519524SHoward Hinnant    __map __map_;
10433e519524SHoward Hinnant    size_type __start_;
10443e519524SHoward Hinnant    __compressed_pair<size_type, allocator_type> __size_;
10453e519524SHoward Hinnant
1046a87e8360SHoward Hinnant    iterator       begin() _NOEXCEPT;
1047a87e8360SHoward Hinnant    const_iterator begin() const _NOEXCEPT;
1048a87e8360SHoward Hinnant    iterator       end() _NOEXCEPT;
1049a87e8360SHoward Hinnant    const_iterator end() const _NOEXCEPT;
10503e519524SHoward Hinnant
10513e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY size_type&            size()          {return __size_.first();}
1052a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1053a87e8360SHoward Hinnant    const size_type& size() const _NOEXCEPT {return __size_.first();}
10543e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY allocator_type&       __alloc()       {return __size_.second();}
1055a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1056a87e8360SHoward Hinnant    const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
10573e519524SHoward Hinnant
1058906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
105980129113SHoward Hinnant    __deque_base()
106080129113SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
1061906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
10623e519524SHoward Hinnant    explicit __deque_base(const allocator_type& __a);
10639eebe11dSHoward Hinnantpublic:
10643e519524SHoward Hinnant    ~__deque_base();
10653e519524SHoward Hinnant
1066a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10679eebe11dSHoward Hinnant    __deque_base(__deque_base&& __c)
10689eebe11dSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
10693e519524SHoward Hinnant    __deque_base(__deque_base&& __c, const allocator_type& __a);
1070a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
10713e519524SHoward Hinnant
10729eebe11dSHoward Hinnant    void swap(__deque_base& __c)
1073e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
1074e3fbe143SMarshall Clow        _NOEXCEPT;
1075e3fbe143SMarshall Clow#else
10769eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
10779eebe11dSHoward Hinnant                    __is_nothrow_swappable<allocator_type>::value);
1078e3fbe143SMarshall Clow#endif
10799eebe11dSHoward Hinnantprotected:
1080a87e8360SHoward Hinnant    void clear() _NOEXCEPT;
10813e519524SHoward Hinnant
10823e519524SHoward Hinnant    bool __invariants() const;
10833e519524SHoward Hinnant
1084fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10853e519524SHoward Hinnant    void __move_assign(__deque_base& __c)
1086b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1087b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
10883e519524SHoward Hinnant    {
1089ce48a113SHoward Hinnant        __map_ = _VSTD::move(__c.__map_);
10903e519524SHoward Hinnant        __start_ = __c.__start_;
10913e519524SHoward Hinnant        size() = __c.size();
10923e519524SHoward Hinnant        __move_assign_alloc(__c);
10933e519524SHoward Hinnant        __c.__start_ = __c.size() = 0;
10943e519524SHoward Hinnant    }
10953e519524SHoward Hinnant
1096fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10973e519524SHoward Hinnant    void __move_assign_alloc(__deque_base& __c)
10989eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value ||
10999eebe11dSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
11003e519524SHoward Hinnant        {__move_assign_alloc(__c, integral_constant<bool,
11013e519524SHoward Hinnant                      __alloc_traits::propagate_on_container_move_assignment::value>());}
11023e519524SHoward Hinnant
11033e519524SHoward Hinnantprivate:
1104fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11058668139fSHoward Hinnant    void __move_assign_alloc(__deque_base& __c, true_type)
11069eebe11dSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
11073e519524SHoward Hinnant        {
1108ce48a113SHoward Hinnant            __alloc() = _VSTD::move(__c.__alloc());
11093e519524SHoward Hinnant        }
11103e519524SHoward Hinnant
1111fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1112c206366fSHoward Hinnant    void __move_assign_alloc(__deque_base&, false_type) _NOEXCEPT
11133e519524SHoward Hinnant        {}
11143e519524SHoward Hinnant};
11153e519524SHoward Hinnant
11163e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
111765da7bc3SEvgeniy Stepanovconst typename __deque_base<_Tp, _Allocator>::difference_type
111865da7bc3SEvgeniy Stepanov    __deque_base<_Tp, _Allocator>::__block_size =
111965da7bc3SEvgeniy Stepanov        __deque_block_size<value_type, difference_type>::value;
112065da7bc3SEvgeniy Stepanov
112165da7bc3SEvgeniy Stepanovtemplate <class _Tp, class _Allocator>
11223e519524SHoward Hinnantbool
11233e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__invariants() const
11243e519524SHoward Hinnant{
11253e519524SHoward Hinnant    if (!__map_.__invariants())
11263e519524SHoward Hinnant        return false;
11273e519524SHoward Hinnant    if (__map_.size() >= size_type(-1) / __block_size)
11283e519524SHoward Hinnant        return false;
11293e519524SHoward Hinnant    for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end();
11303e519524SHoward Hinnant         __i != __e; ++__i)
11313e519524SHoward Hinnant        if (*__i == nullptr)
11323e519524SHoward Hinnant            return false;
11333e519524SHoward Hinnant    if (__map_.size() != 0)
11343e519524SHoward Hinnant    {
11353e519524SHoward Hinnant        if (size() >= __map_.size() * __block_size)
11363e519524SHoward Hinnant            return false;
11373e519524SHoward Hinnant        if (__start_ >= __map_.size() * __block_size - size())
11383e519524SHoward Hinnant            return false;
11393e519524SHoward Hinnant    }
11403e519524SHoward Hinnant    else
11413e519524SHoward Hinnant    {
11423e519524SHoward Hinnant        if (size() != 0)
11433e519524SHoward Hinnant            return false;
11443e519524SHoward Hinnant        if (__start_ != 0)
11453e519524SHoward Hinnant            return false;
11463e519524SHoward Hinnant    }
11473e519524SHoward Hinnant    return true;
11483e519524SHoward Hinnant}
11493e519524SHoward Hinnant
11503e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11513e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::iterator
1152a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::begin() _NOEXCEPT
11533e519524SHoward Hinnant{
11543e519524SHoward Hinnant    __map_pointer __mp = __map_.begin() + __start_ / __block_size;
11553e519524SHoward Hinnant    return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
11563e519524SHoward Hinnant}
11573e519524SHoward Hinnant
11583e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11593e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::const_iterator
1160a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
11613e519524SHoward Hinnant{
116214e200d1SHoward Hinnant    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
11633e519524SHoward Hinnant    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
11643e519524SHoward Hinnant}
11653e519524SHoward Hinnant
11663e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11673e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::iterator
1168a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::end() _NOEXCEPT
11693e519524SHoward Hinnant{
11703e519524SHoward Hinnant    size_type __p = size() + __start_;
11713e519524SHoward Hinnant    __map_pointer __mp = __map_.begin() + __p / __block_size;
11723e519524SHoward Hinnant    return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
11733e519524SHoward Hinnant}
11743e519524SHoward Hinnant
11753e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11763e519524SHoward Hinnanttypename __deque_base<_Tp, _Allocator>::const_iterator
1177a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
11783e519524SHoward Hinnant{
11793e519524SHoward Hinnant    size_type __p = size() + __start_;
118014e200d1SHoward Hinnant    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
11813e519524SHoward Hinnant    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
11823e519524SHoward Hinnant}
11833e519524SHoward Hinnant
11843e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1185906c872dSEvgeniy Stepanovinline
11863e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base()
118780129113SHoward Hinnant    _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1188549545b6SEric Fiselier    : __start_(0), __size_(0, __default_init_tag()) {}
11893e519524SHoward Hinnant
11903e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1191906c872dSEvgeniy Stepanovinline
11923e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
11933e519524SHoward Hinnant    : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
11943e519524SHoward Hinnant
11953e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
11963e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::~__deque_base()
11973e519524SHoward Hinnant{
11983e519524SHoward Hinnant    clear();
11993e519524SHoward Hinnant    typename __map::iterator __i = __map_.begin();
12003e519524SHoward Hinnant    typename __map::iterator __e = __map_.end();
12013e519524SHoward Hinnant    for (; __i != __e; ++__i)
12023e519524SHoward Hinnant        __alloc_traits::deallocate(__alloc(), *__i, __block_size);
12033e519524SHoward Hinnant}
12043e519524SHoward Hinnant
1205a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12063e519524SHoward Hinnant
12073e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
12083e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c)
12099eebe11dSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
1210ce48a113SHoward Hinnant    : __map_(_VSTD::move(__c.__map_)),
1211ce48a113SHoward Hinnant      __start_(_VSTD::move(__c.__start_)),
1212ce48a113SHoward Hinnant      __size_(_VSTD::move(__c.__size_))
12133e519524SHoward Hinnant{
12143e519524SHoward Hinnant    __c.__start_ = 0;
12153e519524SHoward Hinnant    __c.size() = 0;
12163e519524SHoward Hinnant}
12173e519524SHoward Hinnant
12183e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
12193e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a)
1220ce48a113SHoward Hinnant    : __map_(_VSTD::move(__c.__map_), __pointer_allocator(__a)),
1221ce48a113SHoward Hinnant      __start_(_VSTD::move(__c.__start_)),
1222ce48a113SHoward Hinnant      __size_(_VSTD::move(__c.size()), __a)
12233e519524SHoward Hinnant{
12243e519524SHoward Hinnant    if (__a == __c.__alloc())
12253e519524SHoward Hinnant    {
12263e519524SHoward Hinnant        __c.__start_ = 0;
12273e519524SHoward Hinnant        __c.size() = 0;
12283e519524SHoward Hinnant    }
12293e519524SHoward Hinnant    else
12303e519524SHoward Hinnant    {
12313e519524SHoward Hinnant        __map_.clear();
12323e519524SHoward Hinnant        __start_ = 0;
12333e519524SHoward Hinnant        size() = 0;
12343e519524SHoward Hinnant    }
12353e519524SHoward Hinnant}
12363e519524SHoward Hinnant
1237a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
12383e519524SHoward Hinnant
12393e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
12403e519524SHoward Hinnantvoid
12413e519524SHoward Hinnant__deque_base<_Tp, _Allocator>::swap(__deque_base& __c)
1242e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
1243e3fbe143SMarshall Clow        _NOEXCEPT
1244e3fbe143SMarshall Clow#else
12459eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
12469eebe11dSHoward Hinnant                    __is_nothrow_swappable<allocator_type>::value)
1247e3fbe143SMarshall Clow#endif
12483e519524SHoward Hinnant{
12493e519524SHoward Hinnant    __map_.swap(__c.__map_);
1250ce48a113SHoward Hinnant    _VSTD::swap(__start_, __c.__start_);
1251ce48a113SHoward Hinnant    _VSTD::swap(size(), __c.size());
12526e965df6SArthur O'Dwyer    _VSTD::__swap_allocator(__alloc(), __c.__alloc());
12533e519524SHoward Hinnant}
12543e519524SHoward Hinnant
12553e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
12563e519524SHoward Hinnantvoid
1257a87e8360SHoward Hinnant__deque_base<_Tp, _Allocator>::clear() _NOEXCEPT
12583e519524SHoward Hinnant{
12593e519524SHoward Hinnant    allocator_type& __a = __alloc();
12603e519524SHoward Hinnant    for (iterator __i = begin(), __e = end(); __i != __e; ++__i)
1261ce48a113SHoward Hinnant        __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
12623e519524SHoward Hinnant    size() = 0;
12633e519524SHoward Hinnant    while (__map_.size() > 2)
12643e519524SHoward Hinnant    {
12653e519524SHoward Hinnant        __alloc_traits::deallocate(__a, __map_.front(), __block_size);
12663e519524SHoward Hinnant        __map_.pop_front();
12673e519524SHoward Hinnant    }
12683e519524SHoward Hinnant    switch (__map_.size())
12693e519524SHoward Hinnant    {
12703e519524SHoward Hinnant    case 1:
12713e519524SHoward Hinnant        __start_ = __block_size / 2;
12723e519524SHoward Hinnant        break;
12733e519524SHoward Hinnant    case 2:
12743e519524SHoward Hinnant        __start_ = __block_size;
12753e519524SHoward Hinnant        break;
12763e519524SHoward Hinnant    }
12773e519524SHoward Hinnant}
12783e519524SHoward Hinnant
1279b5d34aa4SMarshall Clowtemplate <class _Tp, class _Allocator /*= allocator<_Tp>*/>
1280e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS deque
12813e519524SHoward Hinnant    : private __deque_base<_Tp, _Allocator>
12823e519524SHoward Hinnant{
12833e519524SHoward Hinnantpublic:
12843e519524SHoward Hinnant    // types:
12853e519524SHoward Hinnant
12863e519524SHoward Hinnant    typedef _Tp value_type;
12873e519524SHoward Hinnant    typedef _Allocator allocator_type;
12883e519524SHoward Hinnant
128994f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
129094f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
129194f89aeeSMarshall Clow
12923e519524SHoward Hinnant    typedef __deque_base<value_type, allocator_type>      __base;
12933e519524SHoward Hinnant
12943e519524SHoward Hinnant    typedef typename __base::__alloc_traits               __alloc_traits;
12953e519524SHoward Hinnant    typedef typename __base::reference                    reference;
12963e519524SHoward Hinnant    typedef typename __base::const_reference              const_reference;
12973e519524SHoward Hinnant    typedef typename __base::iterator                     iterator;
12983e519524SHoward Hinnant    typedef typename __base::const_iterator               const_iterator;
12997da4ee6fSKonstantin Varlamov    typedef typename __base::size_type                    size_type;
13003e519524SHoward Hinnant    typedef typename __base::difference_type              difference_type;
13013e519524SHoward Hinnant
13023e519524SHoward Hinnant    typedef typename __base::pointer                      pointer;
13033e519524SHoward Hinnant    typedef typename __base::const_pointer                const_pointer;
1304ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>             reverse_iterator;
1305ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>       const_reverse_iterator;
13063e519524SHoward Hinnant
1307b0945e1bSEric Fiselier    using typename __base::__deque_range;
1308b0945e1bSEric Fiselier    using typename __base::__deque_block_range;
1309b0945e1bSEric Fiselier    using typename __base::_ConstructTransaction;
1310b0945e1bSEric Fiselier
13113e519524SHoward Hinnant    // construct/copy/destroy:
131280129113SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
131380129113SHoward Hinnant    deque()
131480129113SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
131580129113SHoward Hinnant        {}
131678a87e8aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY explicit deque(const allocator_type& __a) : __base(__a) {}
13173e519524SHoward Hinnant    explicit deque(size_type __n);
1318630c5e53SMarshall Clow#if _LIBCPP_STD_VER > 11
1319630c5e53SMarshall Clow    explicit deque(size_type __n, const _Allocator& __a);
1320630c5e53SMarshall Clow#endif
13213e519524SHoward Hinnant    deque(size_type __n, const value_type& __v);
13227da4ee6fSKonstantin Varlamov
13237da4ee6fSKonstantin Varlamov    template <class = __enable_if_t<__is_allocator<_Allocator>::value> >
13247da4ee6fSKonstantin Varlamov    deque(size_type __n, const value_type& __v, const allocator_type& __a) : __base(__a)
13257da4ee6fSKonstantin Varlamov    {
13267da4ee6fSKonstantin Varlamov        if (__n > 0)
13277da4ee6fSKonstantin Varlamov            __append(__n, __v);
13287da4ee6fSKonstantin Varlamov    }
13297da4ee6fSKonstantin Varlamov
13303e519524SHoward Hinnant    template <class _InputIter>
13313e519524SHoward Hinnant        deque(_InputIter __f, _InputIter __l,
1332f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type* = 0);
13333e519524SHoward Hinnant    template <class _InputIter>
13343e519524SHoward Hinnant        deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
1335f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type* = 0);
13363e519524SHoward Hinnant    deque(const deque& __c);
13373c6bd176SNikolas Klauser    deque(const deque& __c, const __type_identity_t<allocator_type>& __a);
13383e519524SHoward Hinnant
13393e519524SHoward Hinnant    deque& operator=(const deque& __c);
1340a9d646a0SEric Fiselier
1341a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1342a9d646a0SEric Fiselier    deque(initializer_list<value_type> __il);
1343a9d646a0SEric Fiselier    deque(initializer_list<value_type> __il, const allocator_type& __a);
1344a9d646a0SEric Fiselier
1345fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13463e519524SHoward Hinnant    deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;}
13473e519524SHoward Hinnant
1348906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13499eebe11dSHoward Hinnant    deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
1350906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13513c6bd176SNikolas Klauser    deque(deque&& __c, const __type_identity_t<allocator_type>& __a);
1352906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
13539eebe11dSHoward Hinnant    deque& operator=(deque&& __c)
1354b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1355b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value);
1356a9d646a0SEric Fiselier
1357a9d646a0SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1358a9d646a0SEric Fiselier    void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
1359a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
13603e519524SHoward Hinnant
13613e519524SHoward Hinnant    template <class _InputIter>
13623e519524SHoward Hinnant        void assign(_InputIter __f, _InputIter __l,
1363f82dba01SEric Fiselier                    typename enable_if<__is_cpp17_input_iterator<_InputIter>::value &&
1364f82dba01SEric Fiselier                                      !__is_cpp17_random_access_iterator<_InputIter>::value>::type* = 0);
13653e519524SHoward Hinnant    template <class _RAIter>
13663e519524SHoward Hinnant        void assign(_RAIter __f, _RAIter __l,
1367f82dba01SEric Fiselier                    typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0);
13683e519524SHoward Hinnant    void assign(size_type __n, const value_type& __v);
13693e519524SHoward Hinnant
1370906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
1371a87e8360SHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT;
13723e519524SHoward Hinnant
13733e519524SHoward Hinnant    // iterators:
13743e519524SHoward Hinnant
1375fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1376a87e8360SHoward Hinnant    iterator       begin() _NOEXCEPT       {return __base::begin();}
1377fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1378a87e8360SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __base::begin();}
1379fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1380a87e8360SHoward Hinnant    iterator       end() _NOEXCEPT         {return __base::end();}
1381fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1382a87e8360SHoward Hinnant    const_iterator end()   const _NOEXCEPT {return __base::end();}
13833e519524SHoward Hinnant
1384fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1385a87e8360SHoward Hinnant    reverse_iterator       rbegin() _NOEXCEPT
1386a87e8360SHoward Hinnant        {return       reverse_iterator(__base::end());}
1387fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1388a87e8360SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
1389a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::end());}
1390fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1391a87e8360SHoward Hinnant    reverse_iterator       rend() _NOEXCEPT
1392a87e8360SHoward Hinnant        {return       reverse_iterator(__base::begin());}
1393fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1394a87e8360SHoward Hinnant    const_reverse_iterator rend()   const _NOEXCEPT
1395a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::begin());}
13963e519524SHoward Hinnant
1397fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1398a87e8360SHoward Hinnant    const_iterator         cbegin()  const _NOEXCEPT
1399a87e8360SHoward Hinnant        {return __base::begin();}
1400fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1401a87e8360SHoward Hinnant    const_iterator         cend()    const _NOEXCEPT
1402a87e8360SHoward Hinnant        {return __base::end();}
1403fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1404a87e8360SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT
1405a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::end());}
1406fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1407a87e8360SHoward Hinnant    const_reverse_iterator crend()   const _NOEXCEPT
1408a87e8360SHoward Hinnant        {return const_reverse_iterator(__base::begin());}
14093e519524SHoward Hinnant
14103e519524SHoward Hinnant    // capacity:
1411fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1412a87e8360SHoward Hinnant    size_type size() const _NOEXCEPT {return __base::size();}
1413a87e8360SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1414a87e8360SHoward Hinnant    size_type max_size() const _NOEXCEPT
1415d586f92cSArthur O'Dwyer        {return _VSTD::min<size_type>(
141655b31b4eSEric Fiselier            __alloc_traits::max_size(__base::__alloc()),
141755b31b4eSEric Fiselier            numeric_limits<difference_type>::max());}
14183e519524SHoward Hinnant    void resize(size_type __n);
14193e519524SHoward Hinnant    void resize(size_type __n, const value_type& __v);
1420b58f59cdSHoward Hinnant    void shrink_to_fit() _NOEXCEPT;
142172c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
1422a87e8360SHoward Hinnant    bool empty() const _NOEXCEPT {return __base::size() == 0;}
14233e519524SHoward Hinnant
14243e519524SHoward Hinnant    // element access:
1425906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14265f6a5ac1SMarshall Clow    reference operator[](size_type __i) _NOEXCEPT;
1427906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14285f6a5ac1SMarshall Clow    const_reference operator[](size_type __i) const _NOEXCEPT;
1429906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14303e519524SHoward Hinnant    reference at(size_type __i);
1431906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14323e519524SHoward Hinnant    const_reference at(size_type __i) const;
1433906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14349ea0e473SMarshall Clow    reference front() _NOEXCEPT;
1435906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14369ea0e473SMarshall Clow    const_reference front() const _NOEXCEPT;
1437906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14389ea0e473SMarshall Clow    reference back() _NOEXCEPT;
1439906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14409ea0e473SMarshall Clow    const_reference back() const _NOEXCEPT;
14413e519524SHoward Hinnant
14423e519524SHoward Hinnant    // 23.2.2.3 modifiers:
14433e519524SHoward Hinnant    void push_front(const value_type& __v);
14443e519524SHoward Hinnant    void push_back(const value_type& __v);
1445a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
144663b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
14470e411641SEric Fiselier    template <class... _Args> reference emplace_front(_Args&&... __args);
14480e411641SEric Fiselier    template <class... _Args> reference emplace_back (_Args&&... __args);
144963b560beSMarshall Clow#else
145063b560beSMarshall Clow    template <class... _Args> void      emplace_front(_Args&&... __args);
145163b560beSMarshall Clow    template <class... _Args> void      emplace_back (_Args&&... __args);
145263b560beSMarshall Clow#endif
14533e519524SHoward Hinnant    template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
1454a9d646a0SEric Fiselier
14553e519524SHoward Hinnant    void push_front(value_type&& __v);
14563e519524SHoward Hinnant    void push_back(value_type&& __v);
14573e519524SHoward Hinnant    iterator insert(const_iterator __p, value_type&& __v);
1458a9d646a0SEric Fiselier
1459a9d646a0SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1460a9d646a0SEric Fiselier    iterator insert(const_iterator __p, initializer_list<value_type> __il)
1461a9d646a0SEric Fiselier        {return insert(__p, __il.begin(), __il.end());}
1462a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
14633e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v);
14643e519524SHoward Hinnant    iterator insert(const_iterator __p, size_type __n, const value_type& __v);
14653e519524SHoward Hinnant    template <class _InputIter>
14663e519524SHoward Hinnant        iterator insert(const_iterator __p, _InputIter __f, _InputIter __l,
1467*00927334SNikolas Klauser                         typename enable_if<__is_exactly_cpp17_input_iterator<_InputIter>::value>::type* = 0);
1468f15d7a58SMarshall Clow    template <class _ForwardIterator>
1469f15d7a58SMarshall Clow        iterator insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
1470*00927334SNikolas Klauser                        typename enable_if<__is_exactly_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0);
14713e519524SHoward Hinnant    template <class _BiIter>
14723e519524SHoward Hinnant        iterator insert(const_iterator __p, _BiIter __f, _BiIter __l,
1473f82dba01SEric Fiselier                         typename enable_if<__is_cpp17_bidirectional_iterator<_BiIter>::value>::type* = 0);
1474a9d646a0SEric Fiselier
14753e519524SHoward Hinnant    void pop_front();
14763e519524SHoward Hinnant    void pop_back();
14773e519524SHoward Hinnant    iterator erase(const_iterator __p);
14783e519524SHoward Hinnant    iterator erase(const_iterator __f, const_iterator __l);
14793e519524SHoward Hinnant
1480906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
14819eebe11dSHoward Hinnant    void swap(deque& __c)
1482e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
1483e3fbe143SMarshall Clow        _NOEXCEPT;
1484e3fbe143SMarshall Clow#else
14859eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
14869eebe11dSHoward Hinnant                   __is_nothrow_swappable<allocator_type>::value);
1487e3fbe143SMarshall Clow#endif
1488906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
1489a87e8360SHoward Hinnant    void clear() _NOEXCEPT;
14903e519524SHoward Hinnant
1491fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14923e519524SHoward Hinnant    bool __invariants() const {return __base::__invariants();}
1493d544d144SEric Fiselier
149414e200d1SHoward Hinnant    typedef typename __base::__map_const_pointer __map_const_pointer;
149514e200d1SHoward Hinnant
1496fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14973e519524SHoward Hinnant    static size_type __recommend_blocks(size_type __n)
14983e519524SHoward Hinnant    {
14993e519524SHoward Hinnant        return __n / __base::__block_size + (__n % __base::__block_size != 0);
15003e519524SHoward Hinnant    }
1501fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15023e519524SHoward Hinnant    size_type __capacity() const
15033e519524SHoward Hinnant    {
15043e519524SHoward Hinnant        return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1;
15053e519524SHoward Hinnant    }
1506fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1507d544d144SEric Fiselier    size_type __block_count() const
1508d544d144SEric Fiselier    {
1509d544d144SEric Fiselier        return __base::__map_.size();
1510d544d144SEric Fiselier    }
1511d544d144SEric Fiselier
1512d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15133e519524SHoward Hinnant    size_type __front_spare() const
15143e519524SHoward Hinnant    {
15153e519524SHoward Hinnant        return __base::__start_;
15163e519524SHoward Hinnant    }
1517fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1518d544d144SEric Fiselier    size_type __front_spare_blocks() const {
1519d544d144SEric Fiselier      return __front_spare() / __base::__block_size;
1520d544d144SEric Fiselier    }
1521d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
15223e519524SHoward Hinnant    size_type __back_spare() const
15233e519524SHoward Hinnant    {
15243e519524SHoward Hinnant        return __capacity() - (__base::__start_ + __base::size());
15253e519524SHoward Hinnant    }
1526d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1527d544d144SEric Fiselier    size_type __back_spare_blocks() const {
1528d544d144SEric Fiselier      return __back_spare() / __base::__block_size;
1529d544d144SEric Fiselier    }
1530d544d144SEric Fiselier
1531d544d144SEric Fiselier private:
1532d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1533d544d144SEric Fiselier    bool __maybe_remove_front_spare(bool __keep_one = true) {
1534d544d144SEric Fiselier      if (__front_spare_blocks() >= 2 || (!__keep_one && __front_spare_blocks())) {
1535d544d144SEric Fiselier        __alloc_traits::deallocate(__base::__alloc(), __base::__map_.front(),
1536d544d144SEric Fiselier                                   __base::__block_size);
1537d544d144SEric Fiselier        __base::__map_.pop_front();
1538d544d144SEric Fiselier        __base::__start_ -= __base::__block_size;
1539d544d144SEric Fiselier        return true;
1540d544d144SEric Fiselier      }
1541d544d144SEric Fiselier      return false;
1542d544d144SEric Fiselier    }
1543d544d144SEric Fiselier
1544d544d144SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1545d544d144SEric Fiselier    bool __maybe_remove_back_spare(bool __keep_one = true) {
1546d544d144SEric Fiselier      if (__back_spare_blocks() >= 2 || (!__keep_one && __back_spare_blocks())) {
1547d544d144SEric Fiselier        __alloc_traits::deallocate(__base::__alloc(), __base::__map_.back(),
1548d544d144SEric Fiselier                                   __base::__block_size);
1549d544d144SEric Fiselier        __base::__map_.pop_back();
1550d544d144SEric Fiselier        return true;
1551d544d144SEric Fiselier      }
1552d544d144SEric Fiselier      return false;
1553d544d144SEric Fiselier    }
15543e519524SHoward Hinnant
15553e519524SHoward Hinnant    template <class _InpIter>
15563e519524SHoward Hinnant        void __append(_InpIter __f, _InpIter __l,
1557*00927334SNikolas Klauser                 typename enable_if<__is_exactly_cpp17_input_iterator<_InpIter>::value>::type* = 0);
15583e519524SHoward Hinnant    template <class _ForIter>
15593e519524SHoward Hinnant        void __append(_ForIter __f, _ForIter __l,
1560f82dba01SEric Fiselier                      typename enable_if<__is_cpp17_forward_iterator<_ForIter>::value>::type* = 0);
15613e519524SHoward Hinnant    void __append(size_type __n);
15623e519524SHoward Hinnant    void __append(size_type __n, const value_type& __v);
15633e519524SHoward Hinnant    void __erase_to_end(const_iterator __f);
15643e519524SHoward Hinnant    void __add_front_capacity();
15653e519524SHoward Hinnant    void __add_front_capacity(size_type __n);
15663e519524SHoward Hinnant    void __add_back_capacity();
15673e519524SHoward Hinnant    void __add_back_capacity(size_type __n);
15683e519524SHoward Hinnant    iterator __move_and_check(iterator __f, iterator __l, iterator __r,
15693e519524SHoward Hinnant                              const_pointer& __vt);
15703e519524SHoward Hinnant    iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r,
15713e519524SHoward Hinnant                                       const_pointer& __vt);
15723e519524SHoward Hinnant    void __move_construct_and_check(iterator __f, iterator __l,
15733e519524SHoward Hinnant                                    iterator __r, const_pointer& __vt);
15743e519524SHoward Hinnant    void __move_construct_backward_and_check(iterator __f, iterator __l,
15753e519524SHoward Hinnant                                             iterator __r, const_pointer& __vt);
15763e519524SHoward Hinnant
1577fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15783e519524SHoward Hinnant    void __copy_assign_alloc(const deque& __c)
15793e519524SHoward Hinnant        {__copy_assign_alloc(__c, integral_constant<bool,
15803e519524SHoward Hinnant                      __alloc_traits::propagate_on_container_copy_assignment::value>());}
15813e519524SHoward Hinnant
1582fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15833e519524SHoward Hinnant    void __copy_assign_alloc(const deque& __c, true_type)
15843e519524SHoward Hinnant        {
15853e519524SHoward Hinnant            if (__base::__alloc() != __c.__alloc())
15863e519524SHoward Hinnant            {
15873e519524SHoward Hinnant                clear();
15883e519524SHoward Hinnant                shrink_to_fit();
15893e519524SHoward Hinnant            }
15903e519524SHoward Hinnant            __base::__alloc() = __c.__alloc();
15913e519524SHoward Hinnant            __base::__map_.__alloc() = __c.__map_.__alloc();
15923e519524SHoward Hinnant        }
15933e519524SHoward Hinnant
1594fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1595c206366fSHoward Hinnant    void __copy_assign_alloc(const deque&, false_type)
15963e519524SHoward Hinnant        {}
15973e519524SHoward Hinnant
1598b58f59cdSHoward Hinnant    void __move_assign(deque& __c, true_type)
1599b58f59cdSHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
16003e519524SHoward Hinnant    void __move_assign(deque& __c, false_type);
16013e519524SHoward Hinnant};
16023e519524SHoward Hinnant
160301666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1604dbb6f8a8SMarshall Clowtemplate<class _InputIterator,
1605199d2ebeSArthur O'Dwyer         class _Alloc = allocator<__iter_value_type<_InputIterator>>,
160668072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
16074e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Alloc>::value>
1608dbb6f8a8SMarshall Clow         >
1609dbb6f8a8SMarshall Clowdeque(_InputIterator, _InputIterator)
1610199d2ebeSArthur O'Dwyer  -> deque<__iter_value_type<_InputIterator>, _Alloc>;
1611dbb6f8a8SMarshall Clow
1612dbb6f8a8SMarshall Clowtemplate<class _InputIterator,
1613dbb6f8a8SMarshall Clow         class _Alloc,
161468072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
16154e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Alloc>::value>
1616dbb6f8a8SMarshall Clow         >
1617dbb6f8a8SMarshall Clowdeque(_InputIterator, _InputIterator, _Alloc)
1618199d2ebeSArthur O'Dwyer  -> deque<__iter_value_type<_InputIterator>, _Alloc>;
1619dbb6f8a8SMarshall Clow#endif
1620dbb6f8a8SMarshall Clow
16213e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16223e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n)
16233e519524SHoward Hinnant{
16243e519524SHoward Hinnant    if (__n > 0)
16253e519524SHoward Hinnant        __append(__n);
16263e519524SHoward Hinnant}
16273e519524SHoward Hinnant
1628630c5e53SMarshall Clow#if _LIBCPP_STD_VER > 11
1629630c5e53SMarshall Clowtemplate <class _Tp, class _Allocator>
1630630c5e53SMarshall Clowdeque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a)
1631630c5e53SMarshall Clow    : __base(__a)
1632630c5e53SMarshall Clow{
1633630c5e53SMarshall Clow    if (__n > 0)
1634630c5e53SMarshall Clow        __append(__n);
1635630c5e53SMarshall Clow}
1636630c5e53SMarshall Clow#endif
1637630c5e53SMarshall Clow
16383e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16393e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)
16403e519524SHoward Hinnant{
16413e519524SHoward Hinnant    if (__n > 0)
16423e519524SHoward Hinnant        __append(__n, __v);
16433e519524SHoward Hinnant}
16443e519524SHoward Hinnant
16453e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16463e519524SHoward Hinnanttemplate <class _InputIter>
16473e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l,
1648f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type*)
16493e519524SHoward Hinnant{
16503e519524SHoward Hinnant    __append(__f, __l);
16513e519524SHoward Hinnant}
16523e519524SHoward Hinnant
16533e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16543e519524SHoward Hinnanttemplate <class _InputIter>
16553e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
1656f82dba01SEric Fiselier              typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type*)
16573e519524SHoward Hinnant    : __base(__a)
16583e519524SHoward Hinnant{
16593e519524SHoward Hinnant    __append(__f, __l);
16603e519524SHoward Hinnant}
16613e519524SHoward Hinnant
16623e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16633e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(const deque& __c)
16643e519524SHoward Hinnant    : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc()))
16653e519524SHoward Hinnant{
16663e519524SHoward Hinnant    __append(__c.begin(), __c.end());
16673e519524SHoward Hinnant}
16683e519524SHoward Hinnant
16693e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16703c6bd176SNikolas Klauserdeque<_Tp, _Allocator>::deque(const deque& __c, const __type_identity_t<allocator_type>& __a)
16713e519524SHoward Hinnant    : __base(__a)
16723e519524SHoward Hinnant{
16733e519524SHoward Hinnant    __append(__c.begin(), __c.end());
16743e519524SHoward Hinnant}
16753e519524SHoward Hinnant
1676a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
1677a9d646a0SEric Fiselierdeque<_Tp, _Allocator>&
1678a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::operator=(const deque& __c)
1679a9d646a0SEric Fiselier{
1680b8608b87SMark de Wever    if (this != _VSTD::addressof(__c))
1681a9d646a0SEric Fiselier    {
1682a9d646a0SEric Fiselier        __copy_assign_alloc(__c);
1683a9d646a0SEric Fiselier        assign(__c.begin(), __c.end());
1684a9d646a0SEric Fiselier    }
1685a9d646a0SEric Fiselier    return *this;
1686a9d646a0SEric Fiselier}
1687a9d646a0SEric Fiselier
1688a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
168954976f26SHoward Hinnant
16903e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16913e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il)
16923e519524SHoward Hinnant{
16933e519524SHoward Hinnant    __append(__il.begin(), __il.end());
16943e519524SHoward Hinnant}
16953e519524SHoward Hinnant
16963e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
16973e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a)
16983e519524SHoward Hinnant    : __base(__a)
16993e519524SHoward Hinnant{
17003e519524SHoward Hinnant    __append(__il.begin(), __il.end());
17013e519524SHoward Hinnant}
17023e519524SHoward Hinnant
17033e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1704906c872dSEvgeniy Stepanovinline
17053e519524SHoward Hinnantdeque<_Tp, _Allocator>::deque(deque&& __c)
17069eebe11dSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1707ce48a113SHoward Hinnant    : __base(_VSTD::move(__c))
17083e519524SHoward Hinnant{
17093e519524SHoward Hinnant}
17103e519524SHoward Hinnant
17113e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1712906c872dSEvgeniy Stepanovinline
17133c6bd176SNikolas Klauserdeque<_Tp, _Allocator>::deque(deque&& __c, const __type_identity_t<allocator_type>& __a)
1714ce48a113SHoward Hinnant    : __base(_VSTD::move(__c), __a)
17153e519524SHoward Hinnant{
17163e519524SHoward Hinnant    if (__a != __c.__alloc())
17173e519524SHoward Hinnant    {
1718c003db1fSHoward Hinnant        typedef move_iterator<iterator> _Ip;
1719c003db1fSHoward Hinnant        assign(_Ip(__c.begin()), _Ip(__c.end()));
17203e519524SHoward Hinnant    }
17213e519524SHoward Hinnant}
17223e519524SHoward Hinnant
17233e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1724906c872dSEvgeniy Stepanovinline
17253e519524SHoward Hinnantdeque<_Tp, _Allocator>&
17263e519524SHoward Hinnantdeque<_Tp, _Allocator>::operator=(deque&& __c)
1727b58f59cdSHoward Hinnant        _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1728b58f59cdSHoward Hinnant                   is_nothrow_move_assignable<allocator_type>::value)
17293e519524SHoward Hinnant{
17303e519524SHoward Hinnant    __move_assign(__c, integral_constant<bool,
17313e519524SHoward Hinnant          __alloc_traits::propagate_on_container_move_assignment::value>());
17323e519524SHoward Hinnant    return *this;
17333e519524SHoward Hinnant}
17343e519524SHoward Hinnant
17353e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17363e519524SHoward Hinnantvoid
17373e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_assign(deque& __c, false_type)
17383e519524SHoward Hinnant{
17393e519524SHoward Hinnant    if (__base::__alloc() != __c.__alloc())
17403e519524SHoward Hinnant    {
1741c003db1fSHoward Hinnant        typedef move_iterator<iterator> _Ip;
1742c003db1fSHoward Hinnant        assign(_Ip(__c.begin()), _Ip(__c.end()));
17433e519524SHoward Hinnant    }
17443e519524SHoward Hinnant    else
17453e519524SHoward Hinnant        __move_assign(__c, true_type());
17463e519524SHoward Hinnant}
17473e519524SHoward Hinnant
17483e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17493e519524SHoward Hinnantvoid
17503e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_assign(deque& __c, true_type)
1751b58f59cdSHoward Hinnant    _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
17523e519524SHoward Hinnant{
17533e519524SHoward Hinnant    clear();
17543e519524SHoward Hinnant    shrink_to_fit();
17553e519524SHoward Hinnant    __base::__move_assign(__c);
17563e519524SHoward Hinnant}
17573e519524SHoward Hinnant
1758a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
17593e519524SHoward Hinnant
17603e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17613e519524SHoward Hinnanttemplate <class _InputIter>
17623e519524SHoward Hinnantvoid
17633e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
1764f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_input_iterator<_InputIter>::value &&
1765f82dba01SEric Fiselier                                                 !__is_cpp17_random_access_iterator<_InputIter>::value>::type*)
17663e519524SHoward Hinnant{
17673e519524SHoward Hinnant    iterator __i = __base::begin();
17683e519524SHoward Hinnant    iterator __e = __base::end();
1769910285b2SEric Fiselier    for (; __f != __l && __i != __e; ++__f, (void) ++__i)
17703e519524SHoward Hinnant        *__i = *__f;
17713e519524SHoward Hinnant    if (__f != __l)
17723e519524SHoward Hinnant        __append(__f, __l);
17733e519524SHoward Hinnant    else
17743e519524SHoward Hinnant        __erase_to_end(__i);
17753e519524SHoward Hinnant}
17763e519524SHoward Hinnant
17773e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17783e519524SHoward Hinnanttemplate <class _RAIter>
17793e519524SHoward Hinnantvoid
17803e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l,
1781f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*)
17823e519524SHoward Hinnant{
17833e519524SHoward Hinnant    if (static_cast<size_type>(__l - __f) > __base::size())
17843e519524SHoward Hinnant    {
17853e519524SHoward Hinnant        _RAIter __m = __f + __base::size();
1786ce48a113SHoward Hinnant        _VSTD::copy(__f, __m, __base::begin());
17873e519524SHoward Hinnant        __append(__m, __l);
17883e519524SHoward Hinnant    }
17893e519524SHoward Hinnant    else
1790ce48a113SHoward Hinnant        __erase_to_end(_VSTD::copy(__f, __l, __base::begin()));
17913e519524SHoward Hinnant}
17923e519524SHoward Hinnant
17933e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
17943e519524SHoward Hinnantvoid
17953e519524SHoward Hinnantdeque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v)
17963e519524SHoward Hinnant{
17973e519524SHoward Hinnant    if (__n > __base::size())
17983e519524SHoward Hinnant    {
1799ce48a113SHoward Hinnant        _VSTD::fill_n(__base::begin(), __base::size(), __v);
18003e519524SHoward Hinnant        __n -= __base::size();
18013e519524SHoward Hinnant        __append(__n, __v);
18023e519524SHoward Hinnant    }
18033e519524SHoward Hinnant    else
1804ce48a113SHoward Hinnant        __erase_to_end(_VSTD::fill_n(__base::begin(), __n, __v));
18053e519524SHoward Hinnant}
18063e519524SHoward Hinnant
18073e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1808906c872dSEvgeniy Stepanovinline
18093e519524SHoward Hinnant_Allocator
1810a87e8360SHoward Hinnantdeque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
18113e519524SHoward Hinnant{
18123e519524SHoward Hinnant    return __base::__alloc();
18133e519524SHoward Hinnant}
18143e519524SHoward Hinnant
18153e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
18163e519524SHoward Hinnantvoid
18173e519524SHoward Hinnantdeque<_Tp, _Allocator>::resize(size_type __n)
18183e519524SHoward Hinnant{
18193e519524SHoward Hinnant    if (__n > __base::size())
18203e519524SHoward Hinnant        __append(__n - __base::size());
18213e519524SHoward Hinnant    else if (__n < __base::size())
18223e519524SHoward Hinnant        __erase_to_end(__base::begin() + __n);
18233e519524SHoward Hinnant}
18243e519524SHoward Hinnant
18253e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
18263e519524SHoward Hinnantvoid
18273e519524SHoward Hinnantdeque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v)
18283e519524SHoward Hinnant{
18293e519524SHoward Hinnant    if (__n > __base::size())
18303e519524SHoward Hinnant        __append(__n - __base::size(), __v);
18313e519524SHoward Hinnant    else if (__n < __base::size())
18323e519524SHoward Hinnant        __erase_to_end(__base::begin() + __n);
18333e519524SHoward Hinnant}
18343e519524SHoward Hinnant
18353e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
18363e519524SHoward Hinnantvoid
1837b58f59cdSHoward Hinnantdeque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
18383e519524SHoward Hinnant{
18393e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
18403e519524SHoward Hinnant    if (empty())
18413e519524SHoward Hinnant    {
18423e519524SHoward Hinnant        while (__base::__map_.size() > 0)
18433e519524SHoward Hinnant        {
18443e519524SHoward Hinnant            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
18453e519524SHoward Hinnant            __base::__map_.pop_back();
18463e519524SHoward Hinnant        }
18473e519524SHoward Hinnant        __base::__start_ = 0;
18483e519524SHoward Hinnant    }
18493e519524SHoward Hinnant    else
18503e519524SHoward Hinnant    {
1851d544d144SEric Fiselier      __maybe_remove_front_spare(/*__keep_one=*/false);
1852d544d144SEric Fiselier      __maybe_remove_back_spare(/*__keep_one=*/false);
18533e519524SHoward Hinnant    }
18543e519524SHoward Hinnant    __base::__map_.shrink_to_fit();
18553e519524SHoward Hinnant}
18563e519524SHoward Hinnant
18573e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1858906c872dSEvgeniy Stepanovinline
18593e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
18605f6a5ac1SMarshall Clowdeque<_Tp, _Allocator>::operator[](size_type __i) _NOEXCEPT
18613e519524SHoward Hinnant{
18623e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18633e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18643e519524SHoward Hinnant}
18653e519524SHoward Hinnant
18663e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1867906c872dSEvgeniy Stepanovinline
18683e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
18695f6a5ac1SMarshall Clowdeque<_Tp, _Allocator>::operator[](size_type __i) const _NOEXCEPT
18703e519524SHoward Hinnant{
18713e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18723e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18733e519524SHoward Hinnant}
18743e519524SHoward Hinnant
18753e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1876906c872dSEvgeniy Stepanovinline
18773e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
18783e519524SHoward Hinnantdeque<_Tp, _Allocator>::at(size_type __i)
18793e519524SHoward Hinnant{
18803e519524SHoward Hinnant    if (__i >= __base::size())
1881475f831bSLouis Dionne        _VSTD::__throw_out_of_range("deque");
18823e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18833e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18843e519524SHoward Hinnant}
18853e519524SHoward Hinnant
18863e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1887906c872dSEvgeniy Stepanovinline
18883e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
18893e519524SHoward Hinnantdeque<_Tp, _Allocator>::at(size_type __i) const
18903e519524SHoward Hinnant{
18913e519524SHoward Hinnant    if (__i >= __base::size())
1892475f831bSLouis Dionne        _VSTD::__throw_out_of_range("deque");
18933e519524SHoward Hinnant    size_type __p = __base::__start_ + __i;
18943e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
18953e519524SHoward Hinnant}
18963e519524SHoward Hinnant
18973e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1898906c872dSEvgeniy Stepanovinline
18993e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
19009ea0e473SMarshall Clowdeque<_Tp, _Allocator>::front() _NOEXCEPT
19013e519524SHoward Hinnant{
19023e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
19033e519524SHoward Hinnant                                      + __base::__start_ % __base::__block_size);
19043e519524SHoward Hinnant}
19053e519524SHoward Hinnant
19063e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1907906c872dSEvgeniy Stepanovinline
19083e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
19099ea0e473SMarshall Clowdeque<_Tp, _Allocator>::front() const _NOEXCEPT
19103e519524SHoward Hinnant{
19113e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
19123e519524SHoward Hinnant                                      + __base::__start_ % __base::__block_size);
19133e519524SHoward Hinnant}
19143e519524SHoward Hinnant
19153e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1916906c872dSEvgeniy Stepanovinline
19173e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::reference
19189ea0e473SMarshall Clowdeque<_Tp, _Allocator>::back() _NOEXCEPT
19193e519524SHoward Hinnant{
19203e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
19213e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
19223e519524SHoward Hinnant}
19233e519524SHoward Hinnant
19243e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
1925906c872dSEvgeniy Stepanovinline
19263e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::const_reference
19279ea0e473SMarshall Clowdeque<_Tp, _Allocator>::back() const _NOEXCEPT
19283e519524SHoward Hinnant{
19293e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
19303e519524SHoward Hinnant    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
19313e519524SHoward Hinnant}
19323e519524SHoward Hinnant
19333e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19343e519524SHoward Hinnantvoid
19353e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_back(const value_type& __v)
19363e519524SHoward Hinnant{
19373e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19383e519524SHoward Hinnant    if (__back_spare() == 0)
19393e519524SHoward Hinnant        __add_back_capacity();
19403e519524SHoward Hinnant    // __back_spare() >= 1
1941ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
19423e519524SHoward Hinnant    ++__base::size();
19433e519524SHoward Hinnant}
19443e519524SHoward Hinnant
1945a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
1946a9d646a0SEric Fiseliervoid
1947a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::push_front(const value_type& __v)
1948a9d646a0SEric Fiselier{
1949a9d646a0SEric Fiselier    allocator_type& __a = __base::__alloc();
1950a9d646a0SEric Fiselier    if (__front_spare() == 0)
1951a9d646a0SEric Fiselier        __add_front_capacity();
1952a9d646a0SEric Fiselier    // __front_spare() >= 1
1953a9d646a0SEric Fiselier    __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
1954a9d646a0SEric Fiselier    --__base::__start_;
1955a9d646a0SEric Fiselier    ++__base::size();
1956a9d646a0SEric Fiselier}
19573e519524SHoward Hinnant
1958a9d646a0SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
19593e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19603e519524SHoward Hinnantvoid
19613e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_back(value_type&& __v)
19623e519524SHoward Hinnant{
19633e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19643e519524SHoward Hinnant    if (__back_spare() == 0)
19653e519524SHoward Hinnant        __add_back_capacity();
19663e519524SHoward Hinnant    // __back_spare() >= 1
1967ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
19683e519524SHoward Hinnant    ++__base::size();
19693e519524SHoward Hinnant}
19703e519524SHoward Hinnant
19713e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19723e519524SHoward Hinnanttemplate <class... _Args>
197363b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
19740e411641SEric Fiseliertypename deque<_Tp, _Allocator>::reference
197563b560beSMarshall Clow#else
197663b560beSMarshall Clowvoid
197763b560beSMarshall Clow#endif
19783e519524SHoward Hinnantdeque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
19793e519524SHoward Hinnant{
19803e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19813e519524SHoward Hinnant    if (__back_spare() == 0)
19823e519524SHoward Hinnant        __add_back_capacity();
19833e519524SHoward Hinnant    // __back_spare() >= 1
19840e411641SEric Fiselier    __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()),
19850e411641SEric Fiselier                              _VSTD::forward<_Args>(__args)...);
19863e519524SHoward Hinnant    ++__base::size();
198763b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
19880e411641SEric Fiselier    return *--__base::end();
198963b560beSMarshall Clow#endif
19903e519524SHoward Hinnant}
19913e519524SHoward Hinnant
19923e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
19933e519524SHoward Hinnantvoid
19943e519524SHoward Hinnantdeque<_Tp, _Allocator>::push_front(value_type&& __v)
19953e519524SHoward Hinnant{
19963e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
19973e519524SHoward Hinnant    if (__front_spare() == 0)
19983e519524SHoward Hinnant        __add_front_capacity();
19993e519524SHoward Hinnant    // __front_spare() >= 1
2000ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
20013e519524SHoward Hinnant    --__base::__start_;
20023e519524SHoward Hinnant    ++__base::size();
20033e519524SHoward Hinnant}
20043e519524SHoward Hinnant
20057609c9b6SHoward Hinnant
20063e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
20073e519524SHoward Hinnanttemplate <class... _Args>
200863b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
20090e411641SEric Fiseliertypename deque<_Tp, _Allocator>::reference
201063b560beSMarshall Clow#else
201163b560beSMarshall Clowvoid
201263b560beSMarshall Clow#endif
20133e519524SHoward Hinnantdeque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
20143e519524SHoward Hinnant{
20153e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
20163e519524SHoward Hinnant    if (__front_spare() == 0)
20173e519524SHoward Hinnant        __add_front_capacity();
20183e519524SHoward Hinnant    // __front_spare() >= 1
2019ce48a113SHoward Hinnant    __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
20203e519524SHoward Hinnant    --__base::__start_;
20213e519524SHoward Hinnant    ++__base::size();
202263b560beSMarshall Clow#if _LIBCPP_STD_VER > 14
20230e411641SEric Fiselier    return *__base::begin();
202463b560beSMarshall Clow#endif
20253e519524SHoward Hinnant}
20263e519524SHoward Hinnant
2027a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
2028a9d646a0SEric Fiseliertypename deque<_Tp, _Allocator>::iterator
2029a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v)
2030a9d646a0SEric Fiselier{
2031a9d646a0SEric Fiselier    size_type __pos = __p - __base::begin();
2032a9d646a0SEric Fiselier    size_type __to_end = __base::size() - __pos;
2033a9d646a0SEric Fiselier    allocator_type& __a = __base::__alloc();
2034a9d646a0SEric Fiselier    if (__pos < __to_end)
2035a9d646a0SEric Fiselier    {   // insert by shifting things backward
2036a9d646a0SEric Fiselier        if (__front_spare() == 0)
2037a9d646a0SEric Fiselier            __add_front_capacity();
2038a9d646a0SEric Fiselier        // __front_spare() >= 1
2039a9d646a0SEric Fiselier        if (__pos == 0)
2040a9d646a0SEric Fiselier        {
2041a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
2042a9d646a0SEric Fiselier            --__base::__start_;
2043a9d646a0SEric Fiselier            ++__base::size();
2044a9d646a0SEric Fiselier        }
2045a9d646a0SEric Fiselier        else
2046a9d646a0SEric Fiselier        {
2047a9d646a0SEric Fiselier            iterator __b = __base::begin();
2048a9d646a0SEric Fiselier            iterator __bm1 = _VSTD::prev(__b);
2049a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
2050a9d646a0SEric Fiselier            --__base::__start_;
2051a9d646a0SEric Fiselier            ++__base::size();
2052a9d646a0SEric Fiselier            if (__pos > 1)
2053a9d646a0SEric Fiselier                __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
2054a9d646a0SEric Fiselier            *__b = _VSTD::move(__v);
2055a9d646a0SEric Fiselier        }
2056a9d646a0SEric Fiselier    }
2057a9d646a0SEric Fiselier    else
2058a9d646a0SEric Fiselier    {   // insert by shifting things forward
2059a9d646a0SEric Fiselier        if (__back_spare() == 0)
2060a9d646a0SEric Fiselier            __add_back_capacity();
2061a9d646a0SEric Fiselier        // __back_capacity >= 1
2062a9d646a0SEric Fiselier        size_type __de = __base::size() - __pos;
2063a9d646a0SEric Fiselier        if (__de == 0)
2064a9d646a0SEric Fiselier        {
2065a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
2066a9d646a0SEric Fiselier            ++__base::size();
2067a9d646a0SEric Fiselier        }
2068a9d646a0SEric Fiselier        else
2069a9d646a0SEric Fiselier        {
2070a9d646a0SEric Fiselier            iterator __e = __base::end();
2071a9d646a0SEric Fiselier            iterator __em1 = _VSTD::prev(__e);
2072a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
2073a9d646a0SEric Fiselier            ++__base::size();
2074a9d646a0SEric Fiselier            if (__de > 1)
2075a9d646a0SEric Fiselier                __e = _VSTD::move_backward(__e - __de, __em1, __e);
2076a9d646a0SEric Fiselier            *--__e = _VSTD::move(__v);
2077a9d646a0SEric Fiselier        }
2078a9d646a0SEric Fiselier    }
2079a9d646a0SEric Fiselier    return __base::begin() + __pos;
2080a9d646a0SEric Fiselier}
2081a9d646a0SEric Fiselier
2082a9d646a0SEric Fiseliertemplate <class _Tp, class _Allocator>
2083a9d646a0SEric Fiseliertemplate <class... _Args>
2084a9d646a0SEric Fiseliertypename deque<_Tp, _Allocator>::iterator
2085a9d646a0SEric Fiselierdeque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args)
2086a9d646a0SEric Fiselier{
2087a9d646a0SEric Fiselier    size_type __pos = __p - __base::begin();
2088a9d646a0SEric Fiselier    size_type __to_end = __base::size() - __pos;
2089a9d646a0SEric Fiselier    allocator_type& __a = __base::__alloc();
2090a9d646a0SEric Fiselier    if (__pos < __to_end)
2091a9d646a0SEric Fiselier    {   // insert by shifting things backward
2092a9d646a0SEric Fiselier        if (__front_spare() == 0)
2093a9d646a0SEric Fiselier            __add_front_capacity();
2094a9d646a0SEric Fiselier        // __front_spare() >= 1
2095a9d646a0SEric Fiselier        if (__pos == 0)
2096a9d646a0SEric Fiselier        {
2097a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
2098a9d646a0SEric Fiselier            --__base::__start_;
2099a9d646a0SEric Fiselier            ++__base::size();
2100a9d646a0SEric Fiselier        }
2101a9d646a0SEric Fiselier        else
2102a9d646a0SEric Fiselier        {
2103a9d646a0SEric Fiselier            __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
2104a9d646a0SEric Fiselier            iterator __b = __base::begin();
2105a9d646a0SEric Fiselier            iterator __bm1 = _VSTD::prev(__b);
2106a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
2107a9d646a0SEric Fiselier            --__base::__start_;
2108a9d646a0SEric Fiselier            ++__base::size();
2109a9d646a0SEric Fiselier            if (__pos > 1)
2110a9d646a0SEric Fiselier                __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
2111a9d646a0SEric Fiselier            *__b = _VSTD::move(__tmp.get());
2112a9d646a0SEric Fiselier        }
2113a9d646a0SEric Fiselier    }
2114a9d646a0SEric Fiselier    else
2115a9d646a0SEric Fiselier    {   // insert by shifting things forward
2116a9d646a0SEric Fiselier        if (__back_spare() == 0)
2117a9d646a0SEric Fiselier            __add_back_capacity();
2118a9d646a0SEric Fiselier        // __back_capacity >= 1
2119a9d646a0SEric Fiselier        size_type __de = __base::size() - __pos;
2120a9d646a0SEric Fiselier        if (__de == 0)
2121a9d646a0SEric Fiselier        {
2122a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...);
2123a9d646a0SEric Fiselier            ++__base::size();
2124a9d646a0SEric Fiselier        }
2125a9d646a0SEric Fiselier        else
2126a9d646a0SEric Fiselier        {
2127a9d646a0SEric Fiselier            __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
2128a9d646a0SEric Fiselier            iterator __e = __base::end();
2129a9d646a0SEric Fiselier            iterator __em1 = _VSTD::prev(__e);
2130a9d646a0SEric Fiselier            __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
2131a9d646a0SEric Fiselier            ++__base::size();
2132a9d646a0SEric Fiselier            if (__de > 1)
2133a9d646a0SEric Fiselier                __e = _VSTD::move_backward(__e - __de, __em1, __e);
2134a9d646a0SEric Fiselier            *--__e = _VSTD::move(__tmp.get());
2135a9d646a0SEric Fiselier        }
2136a9d646a0SEric Fiselier    }
2137a9d646a0SEric Fiselier    return __base::begin() + __pos;
2138a9d646a0SEric Fiselier}
2139a9d646a0SEric Fiselier
2140a9d646a0SEric Fiselier#endif // _LIBCPP_CXX03_LANG
2141a9d646a0SEric Fiselier
21423e519524SHoward Hinnant
21433e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
21443e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
21453e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v)
21463e519524SHoward Hinnant{
21473e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
21483e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
21493e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
21503e519524SHoward Hinnant    if (__pos < __to_end)
21513e519524SHoward Hinnant    {   // insert by shifting things backward
21523e519524SHoward Hinnant        if (__front_spare() == 0)
21533e519524SHoward Hinnant            __add_front_capacity();
21543e519524SHoward Hinnant        // __front_spare() >= 1
21553e519524SHoward Hinnant        if (__pos == 0)
21563e519524SHoward Hinnant        {
2157ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
21583e519524SHoward Hinnant            --__base::__start_;
21593e519524SHoward Hinnant            ++__base::size();
21603e519524SHoward Hinnant        }
21613e519524SHoward Hinnant        else
21623e519524SHoward Hinnant        {
21633e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
21643e519524SHoward Hinnant            iterator __b = __base::begin();
2165ce48a113SHoward Hinnant            iterator __bm1 = _VSTD::prev(__b);
21663e519524SHoward Hinnant            if (__vt == pointer_traits<const_pointer>::pointer_to(*__b))
21673e519524SHoward Hinnant                __vt = pointer_traits<const_pointer>::pointer_to(*__bm1);
2168ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
21693e519524SHoward Hinnant            --__base::__start_;
21703e519524SHoward Hinnant            ++__base::size();
21713e519524SHoward Hinnant            if (__pos > 1)
2172ce48a113SHoward Hinnant                __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt);
21733e519524SHoward Hinnant            *__b = *__vt;
21743e519524SHoward Hinnant        }
21753e519524SHoward Hinnant    }
21763e519524SHoward Hinnant    else
21773e519524SHoward Hinnant    {   // insert by shifting things forward
21783e519524SHoward Hinnant        if (__back_spare() == 0)
21793e519524SHoward Hinnant            __add_back_capacity();
21803e519524SHoward Hinnant        // __back_capacity >= 1
21813e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
21823e519524SHoward Hinnant        if (__de == 0)
21833e519524SHoward Hinnant        {
2184ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
21853e519524SHoward Hinnant            ++__base::size();
21863e519524SHoward Hinnant        }
21873e519524SHoward Hinnant        else
21883e519524SHoward Hinnant        {
21893e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
21903e519524SHoward Hinnant            iterator __e = __base::end();
2191ce48a113SHoward Hinnant            iterator __em1 = _VSTD::prev(__e);
21923e519524SHoward Hinnant            if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1))
21933e519524SHoward Hinnant                __vt = pointer_traits<const_pointer>::pointer_to(*__e);
2194ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
21953e519524SHoward Hinnant            ++__base::size();
21963e519524SHoward Hinnant            if (__de > 1)
21973e519524SHoward Hinnant                __e = __move_backward_and_check(__e - __de, __em1, __e, __vt);
21983e519524SHoward Hinnant            *--__e = *__vt;
21993e519524SHoward Hinnant        }
22003e519524SHoward Hinnant    }
22013e519524SHoward Hinnant    return __base::begin() + __pos;
22023e519524SHoward Hinnant}
22033e519524SHoward Hinnant
22043e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
22053e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
22063e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v)
22073e519524SHoward Hinnant{
22083e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
22093e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
22103e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
22113e519524SHoward Hinnant    if (__pos < __to_end)
22123e519524SHoward Hinnant    {   // insert by shifting things backward
22133e519524SHoward Hinnant        if (__n > __front_spare())
22143e519524SHoward Hinnant            __add_front_capacity(__n - __front_spare());
22153e519524SHoward Hinnant        // __n <= __front_spare()
22163e519524SHoward Hinnant        iterator __old_begin = __base::begin();
22173e519524SHoward Hinnant        iterator __i = __old_begin;
22183e519524SHoward Hinnant        if (__n > __pos)
22193e519524SHoward Hinnant        {
22203e519524SHoward Hinnant            for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size())
2221ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v);
22223e519524SHoward Hinnant            __n = __pos;
22233e519524SHoward Hinnant        }
22243e519524SHoward Hinnant        if (__n > 0)
22253e519524SHoward Hinnant        {
22263e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
22273e519524SHoward Hinnant            iterator __obn = __old_begin + __n;
22283e519524SHoward Hinnant            __move_construct_backward_and_check(__old_begin, __obn, __i, __vt);
22293e519524SHoward Hinnant            if (__n < __pos)
22303e519524SHoward Hinnant                __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt);
2231ce48a113SHoward Hinnant            _VSTD::fill_n(__old_begin, __n, *__vt);
22323e519524SHoward Hinnant        }
22333e519524SHoward Hinnant    }
22343e519524SHoward Hinnant    else
22353e519524SHoward Hinnant    {   // insert by shifting things forward
22363e519524SHoward Hinnant        size_type __back_capacity = __back_spare();
22373e519524SHoward Hinnant        if (__n > __back_capacity)
22383e519524SHoward Hinnant            __add_back_capacity(__n - __back_capacity);
22393e519524SHoward Hinnant        // __n <= __back_capacity
22403e519524SHoward Hinnant        iterator __old_end = __base::end();
22413e519524SHoward Hinnant        iterator __i = __old_end;
22423e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
22433e519524SHoward Hinnant        if (__n > __de)
22443e519524SHoward Hinnant        {
224516bf4339SArthur O'Dwyer            for (size_type __m = __n - __de; __m; --__m, (void) ++__i, ++__base::size())
2246ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
22473e519524SHoward Hinnant            __n = __de;
22483e519524SHoward Hinnant        }
22493e519524SHoward Hinnant        if (__n > 0)
22503e519524SHoward Hinnant        {
22513e519524SHoward Hinnant            const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
22523e519524SHoward Hinnant            iterator __oen = __old_end - __n;
22533e519524SHoward Hinnant            __move_construct_and_check(__oen, __old_end, __i, __vt);
22543e519524SHoward Hinnant            if (__n < __de)
22553e519524SHoward Hinnant                __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt);
2256ce48a113SHoward Hinnant            _VSTD::fill_n(__old_end - __n, __n, *__vt);
22573e519524SHoward Hinnant        }
22583e519524SHoward Hinnant    }
22593e519524SHoward Hinnant    return __base::begin() + __pos;
22603e519524SHoward Hinnant}
22613e519524SHoward Hinnant
22623e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
22633e519524SHoward Hinnanttemplate <class _InputIter>
22643e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
22653e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l,
2266*00927334SNikolas Klauser                               typename enable_if<__is_exactly_cpp17_input_iterator<_InputIter>::value>::type*)
22673e519524SHoward Hinnant{
22683e519524SHoward Hinnant    __split_buffer<value_type, allocator_type&> __buf(__base::__alloc());
22693e519524SHoward Hinnant    __buf.__construct_at_end(__f, __l);
22703e519524SHoward Hinnant    typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi;
22713e519524SHoward Hinnant    return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end()));
22723e519524SHoward Hinnant}
22733e519524SHoward Hinnant
22743e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2275f15d7a58SMarshall Clowtemplate <class _ForwardIterator>
2276f15d7a58SMarshall Clowtypename deque<_Tp, _Allocator>::iterator
2277f15d7a58SMarshall Clowdeque<_Tp, _Allocator>::insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
2278*00927334SNikolas Klauser                               typename enable_if<__is_exactly_cpp17_forward_iterator<_ForwardIterator>::value>::type*)
2279f15d7a58SMarshall Clow{
2280f15d7a58SMarshall Clow    size_type __n = _VSTD::distance(__f, __l);
2281f15d7a58SMarshall Clow    __split_buffer<value_type, allocator_type&> __buf(__n, 0, __base::__alloc());
2282f15d7a58SMarshall Clow    __buf.__construct_at_end(__f, __l);
2283f15d7a58SMarshall Clow    typedef typename __split_buffer<value_type, allocator_type&>::iterator __fwd;
2284f15d7a58SMarshall Clow    return insert(__p, move_iterator<__fwd>(__buf.begin()), move_iterator<__fwd>(__buf.end()));
2285f15d7a58SMarshall Clow}
2286f15d7a58SMarshall Clow
2287f15d7a58SMarshall Clowtemplate <class _Tp, class _Allocator>
22883e519524SHoward Hinnanttemplate <class _BiIter>
22893e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
22903e519524SHoward Hinnantdeque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
2291f82dba01SEric Fiselier                               typename enable_if<__is_cpp17_bidirectional_iterator<_BiIter>::value>::type*)
22923e519524SHoward Hinnant{
2293ce48a113SHoward Hinnant    size_type __n = _VSTD::distance(__f, __l);
22943e519524SHoward Hinnant    size_type __pos = __p - __base::begin();
22953e519524SHoward Hinnant    size_type __to_end = __base::size() - __pos;
22963e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
22973e519524SHoward Hinnant    if (__pos < __to_end)
22983e519524SHoward Hinnant    {   // insert by shifting things backward
22993e519524SHoward Hinnant        if (__n > __front_spare())
23003e519524SHoward Hinnant            __add_front_capacity(__n - __front_spare());
23013e519524SHoward Hinnant        // __n <= __front_spare()
23023e519524SHoward Hinnant        iterator __old_begin = __base::begin();
23033e519524SHoward Hinnant        iterator __i = __old_begin;
23043e519524SHoward Hinnant        _BiIter __m = __f;
23053e519524SHoward Hinnant        if (__n > __pos)
23063e519524SHoward Hinnant        {
2307ce48a113SHoward Hinnant            __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos);
23083e519524SHoward Hinnant            for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size())
2309ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j);
23103e519524SHoward Hinnant            __n = __pos;
23113e519524SHoward Hinnant        }
23123e519524SHoward Hinnant        if (__n > 0)
23133e519524SHoward Hinnant        {
23143e519524SHoward Hinnant            iterator __obn = __old_begin + __n;
23153e519524SHoward Hinnant            for (iterator __j = __obn; __j != __old_begin;)
23163e519524SHoward Hinnant            {
2317ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j));
23183e519524SHoward Hinnant                --__base::__start_;
23193e519524SHoward Hinnant                ++__base::size();
23203e519524SHoward Hinnant            }
23213e519524SHoward Hinnant            if (__n < __pos)
2322ce48a113SHoward Hinnant                __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin);
2323ce48a113SHoward Hinnant            _VSTD::copy(__m, __l, __old_begin);
23243e519524SHoward Hinnant        }
23253e519524SHoward Hinnant    }
23263e519524SHoward Hinnant    else
23273e519524SHoward Hinnant    {   // insert by shifting things forward
23283e519524SHoward Hinnant        size_type __back_capacity = __back_spare();
23293e519524SHoward Hinnant        if (__n > __back_capacity)
23303e519524SHoward Hinnant            __add_back_capacity(__n - __back_capacity);
23313e519524SHoward Hinnant        // __n <= __back_capacity
23323e519524SHoward Hinnant        iterator __old_end = __base::end();
23333e519524SHoward Hinnant        iterator __i = __old_end;
23343e519524SHoward Hinnant        _BiIter __m = __l;
23353e519524SHoward Hinnant        size_type __de = __base::size() - __pos;
23363e519524SHoward Hinnant        if (__n > __de)
23373e519524SHoward Hinnant        {
2338ce48a113SHoward Hinnant            __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
2339910285b2SEric Fiselier            for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
2340ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
23413e519524SHoward Hinnant            __n = __de;
23423e519524SHoward Hinnant        }
23433e519524SHoward Hinnant        if (__n > 0)
23443e519524SHoward Hinnant        {
23453e519524SHoward Hinnant            iterator __oen = __old_end - __n;
234616bf4339SArthur O'Dwyer            for (iterator __j = __oen; __j != __old_end; ++__i, (void) ++__j, ++__base::size())
2347ce48a113SHoward Hinnant                __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j));
23483e519524SHoward Hinnant            if (__n < __de)
2349ce48a113SHoward Hinnant                __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end);
2350ce48a113SHoward Hinnant            _VSTD::copy_backward(__f, __m, __old_end);
23513e519524SHoward Hinnant        }
23523e519524SHoward Hinnant    }
23533e519524SHoward Hinnant    return __base::begin() + __pos;
23543e519524SHoward Hinnant}
23553e519524SHoward Hinnant
23563e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23573e519524SHoward Hinnanttemplate <class _InpIter>
23583e519524SHoward Hinnantvoid
23593e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l,
2360*00927334SNikolas Klauser                                 typename enable_if<__is_exactly_cpp17_input_iterator<_InpIter>::value>::type*)
23613e519524SHoward Hinnant{
23623e519524SHoward Hinnant    for (; __f != __l; ++__f)
23631c0cedccSEric Fiselier#ifdef _LIBCPP_CXX03_LANG
23643e519524SHoward Hinnant        push_back(*__f);
23651c0cedccSEric Fiselier#else
23661c0cedccSEric Fiselier        emplace_back(*__f);
23671c0cedccSEric Fiselier#endif
23683e519524SHoward Hinnant}
23693e519524SHoward Hinnant
23703e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23713e519524SHoward Hinnanttemplate <class _ForIter>
23723e519524SHoward Hinnantvoid
23733e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
2374f82dba01SEric Fiselier                                 typename enable_if<__is_cpp17_forward_iterator<_ForIter>::value>::type*)
23753e519524SHoward Hinnant{
2376ce48a113SHoward Hinnant    size_type __n = _VSTD::distance(__f, __l);
23773e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
23783e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
23793e519524SHoward Hinnant    if (__n > __back_capacity)
23803e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
23813e519524SHoward Hinnant    // __n <= __back_capacity
2382b0945e1bSEric Fiselier    for (__deque_block_range __br : __deque_range(__base::end(), __base::end() + __n)) {
2383b0945e1bSEric Fiselier      _ConstructTransaction __tx(this, __br);
2384b0945e1bSEric Fiselier      for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, (void)++__f) {
23856e965df6SArthur O'Dwyer        __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_), *__f);
2386b0945e1bSEric Fiselier      }
2387b0945e1bSEric Fiselier    }
23883e519524SHoward Hinnant}
23893e519524SHoward Hinnant
23903e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
23913e519524SHoward Hinnantvoid
23923e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(size_type __n)
23933e519524SHoward Hinnant{
23943e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
23953e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
23963e519524SHoward Hinnant    if (__n > __back_capacity)
23973e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
23983e519524SHoward Hinnant    // __n <= __back_capacity
2399b0945e1bSEric Fiselier    for (__deque_block_range __br : __deque_range(__base::end(), __base::end() + __n)) {
2400b0945e1bSEric Fiselier      _ConstructTransaction __tx(this, __br);
2401b0945e1bSEric Fiselier      for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) {
24026e965df6SArthur O'Dwyer        __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_));
2403b0945e1bSEric Fiselier      }
2404b0945e1bSEric Fiselier    }
24053e519524SHoward Hinnant}
24063e519524SHoward Hinnant
24073e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
24083e519524SHoward Hinnantvoid
24093e519524SHoward Hinnantdeque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v)
24103e519524SHoward Hinnant{
24113e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
24123e519524SHoward Hinnant    size_type __back_capacity = __back_spare();
24133e519524SHoward Hinnant    if (__n > __back_capacity)
24143e519524SHoward Hinnant        __add_back_capacity(__n - __back_capacity);
24153e519524SHoward Hinnant    // __n <= __back_capacity
2416b0945e1bSEric Fiselier    for (__deque_block_range __br : __deque_range(__base::end(), __base::end() + __n)) {
2417b0945e1bSEric Fiselier      _ConstructTransaction __tx(this, __br);
2418b0945e1bSEric Fiselier      for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) {
24196e965df6SArthur O'Dwyer        __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_), __v);
2420b0945e1bSEric Fiselier      }
2421b0945e1bSEric Fiselier    }
2422b0945e1bSEric Fiselier
24233e519524SHoward Hinnant}
24243e519524SHoward Hinnant
24253e519524SHoward Hinnant// Create front capacity for one block of elements.
24263e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
24273e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
24283e519524SHoward Hinnantvoid
24293e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_front_capacity()
24303e519524SHoward Hinnant{
24313e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
24323e519524SHoward Hinnant    if (__back_spare() >= __base::__block_size)
24333e519524SHoward Hinnant    {
24343e519524SHoward Hinnant        __base::__start_ += __base::__block_size;
24353e519524SHoward Hinnant        pointer __pt = __base::__map_.back();
24363e519524SHoward Hinnant        __base::__map_.pop_back();
24373e519524SHoward Hinnant        __base::__map_.push_front(__pt);
24383e519524SHoward Hinnant    }
24393e519524SHoward Hinnant    // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer
24403e519524SHoward Hinnant    else if (__base::__map_.size() < __base::__map_.capacity())
24413e519524SHoward Hinnant    {   // we can put the new buffer into the map, but don't shift things around
24423e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
24433e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
24443e519524SHoward Hinnant        if (__base::__map_.__front_spare() > 0)
24453e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
24463e519524SHoward Hinnant        else
24473e519524SHoward Hinnant        {
24483e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
24493e519524SHoward Hinnant            // Done allocating, reorder capacity
24503e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
24513e519524SHoward Hinnant            __base::__map_.pop_back();
24523e519524SHoward Hinnant            __base::__map_.push_front(__pt);
24533e519524SHoward Hinnant        }
24543e519524SHoward Hinnant        __base::__start_ = __base::__map_.size() == 1 ?
24553e519524SHoward Hinnant                               __base::__block_size / 2 :
24563e519524SHoward Hinnant                               __base::__start_ + __base::__block_size;
24573e519524SHoward Hinnant    }
24583e519524SHoward Hinnant    // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
24593e519524SHoward Hinnant    else
24603e519524SHoward Hinnant    {
24613e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
24623e519524SHoward Hinnant            __buf(max<size_type>(2 * __base::__map_.capacity(), 1),
24633e519524SHoward Hinnant                  0, __base::__map_.__alloc());
2464f4903afdSMarshall Clow
2465f4903afdSMarshall Clow        typedef __allocator_destructor<_Allocator> _Dp;
2466f4903afdSMarshall Clow        unique_ptr<pointer, _Dp> __hold(
2467f4903afdSMarshall Clow            __alloc_traits::allocate(__a, __base::__block_size),
2468f4903afdSMarshall Clow                _Dp(__a, __base::__block_size));
2469f4903afdSMarshall Clow        __buf.push_back(__hold.get());
2470f4903afdSMarshall Clow        __hold.release();
2471f4903afdSMarshall Clow
24723e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.begin();
24733e519524SHoward Hinnant                __i != __base::__map_.end(); ++__i)
24743e519524SHoward Hinnant            __buf.push_back(*__i);
2475ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2476ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2477ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2478ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
24793e519524SHoward Hinnant        __base::__start_ = __base::__map_.size() == 1 ?
24803e519524SHoward Hinnant                               __base::__block_size / 2 :
24813e519524SHoward Hinnant                               __base::__start_ + __base::__block_size;
24823e519524SHoward Hinnant    }
24833e519524SHoward Hinnant}
24843e519524SHoward Hinnant
24853e519524SHoward Hinnant// Create front capacity for __n elements.
24863e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
24873e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
24883e519524SHoward Hinnantvoid
24893e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_front_capacity(size_type __n)
24903e519524SHoward Hinnant{
24913e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
24923e519524SHoward Hinnant    size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
24933e519524SHoward Hinnant    // Number of unused blocks at back:
24943e519524SHoward Hinnant    size_type __back_capacity = __back_spare() / __base::__block_size;
2495ce48a113SHoward Hinnant    __back_capacity = _VSTD::min(__back_capacity, __nb);  // don't take more than you need
24963e519524SHoward Hinnant    __nb -= __back_capacity;  // number of blocks need to allocate
24973e519524SHoward Hinnant    // If __nb == 0, then we have sufficient capacity.
24983e519524SHoward Hinnant    if (__nb == 0)
24993e519524SHoward Hinnant    {
25003e519524SHoward Hinnant        __base::__start_ += __base::__block_size * __back_capacity;
25013e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
25023e519524SHoward Hinnant        {
25033e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
25043e519524SHoward Hinnant            __base::__map_.pop_back();
25053e519524SHoward Hinnant            __base::__map_.push_front(__pt);
25063e519524SHoward Hinnant        }
25073e519524SHoward Hinnant    }
25083e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
25093e519524SHoward Hinnant    else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
25103e519524SHoward Hinnant    {   // we can put the new buffers into the map, but don't shift things around
25113e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
25123e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
25133e519524SHoward Hinnant        for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1))
25143e519524SHoward Hinnant        {
25153e519524SHoward Hinnant            if (__base::__map_.__front_spare() == 0)
25163e519524SHoward Hinnant                break;
25173e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
25183e519524SHoward Hinnant        }
25193e519524SHoward Hinnant        for (; __nb > 0; --__nb, ++__back_capacity)
25203e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
25213e519524SHoward Hinnant        // Done allocating, reorder capacity
25223e519524SHoward Hinnant        __base::__start_ += __back_capacity * __base::__block_size;
25233e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
25243e519524SHoward Hinnant        {
25253e519524SHoward Hinnant            pointer __pt = __base::__map_.back();
25263e519524SHoward Hinnant            __base::__map_.pop_back();
25273e519524SHoward Hinnant            __base::__map_.push_front(__pt);
25283e519524SHoward Hinnant        }
25293e519524SHoward Hinnant    }
25303e519524SHoward Hinnant    // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
25313e519524SHoward Hinnant    else
25323e519524SHoward Hinnant    {
25333e519524SHoward Hinnant        size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty();
25343e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
25353e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(),
25363e519524SHoward Hinnant                                 __nb + __base::__map_.size()),
25373e519524SHoward Hinnant                  0, __base::__map_.__alloc());
25383e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
25393e519524SHoward Hinnant        try
25403e519524SHoward Hinnant        {
2541b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
25423e519524SHoward Hinnant            for (; __nb > 0; --__nb)
25433e519524SHoward Hinnant                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
25443e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
25453e519524SHoward Hinnant        }
25463e519524SHoward Hinnant        catch (...)
25473e519524SHoward Hinnant        {
25483e519524SHoward Hinnant            for (typename __base::__map_pointer __i = __buf.begin();
25493e519524SHoward Hinnant                    __i != __buf.end(); ++__i)
25503e519524SHoward Hinnant                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
25513e519524SHoward Hinnant            throw;
25523e519524SHoward Hinnant        }
2553b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
25543e519524SHoward Hinnant        for (; __back_capacity > 0; --__back_capacity)
25553e519524SHoward Hinnant        {
25563e519524SHoward Hinnant            __buf.push_back(__base::__map_.back());
25573e519524SHoward Hinnant            __base::__map_.pop_back();
25583e519524SHoward Hinnant        }
25593e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.begin();
25603e519524SHoward Hinnant                __i != __base::__map_.end(); ++__i)
25613e519524SHoward Hinnant            __buf.push_back(*__i);
2562ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2563ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2564ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2565ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
25663e519524SHoward Hinnant        __base::__start_ += __ds;
25673e519524SHoward Hinnant    }
25683e519524SHoward Hinnant}
25693e519524SHoward Hinnant
25703e519524SHoward Hinnant// Create back capacity for one block of elements.
25713e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
25723e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
25733e519524SHoward Hinnantvoid
25743e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_back_capacity()
25753e519524SHoward Hinnant{
25763e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
25773e519524SHoward Hinnant    if (__front_spare() >= __base::__block_size)
25783e519524SHoward Hinnant    {
25793e519524SHoward Hinnant        __base::__start_ -= __base::__block_size;
25803e519524SHoward Hinnant        pointer __pt = __base::__map_.front();
25813e519524SHoward Hinnant        __base::__map_.pop_front();
25823e519524SHoward Hinnant        __base::__map_.push_back(__pt);
25833e519524SHoward Hinnant    }
25843e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
25853e519524SHoward Hinnant    else if (__base::__map_.size() < __base::__map_.capacity())
25863e519524SHoward Hinnant    {   // we can put the new buffer into the map, but don't shift things around
25873e519524SHoward Hinnant        // until it is allocated.  If we throw, we don't need to fix
25883e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
25893e519524SHoward Hinnant        if (__base::__map_.__back_spare() != 0)
25903e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
25913e519524SHoward Hinnant        else
25923e519524SHoward Hinnant        {
25933e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
25943e519524SHoward Hinnant            // Done allocating, reorder capacity
25953e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
25963e519524SHoward Hinnant            __base::__map_.pop_front();
25973e519524SHoward Hinnant            __base::__map_.push_back(__pt);
25983e519524SHoward Hinnant        }
25993e519524SHoward Hinnant    }
26003e519524SHoward Hinnant    // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
26013e519524SHoward Hinnant    else
26023e519524SHoward Hinnant    {
26033e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
26043e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(), 1),
26053e519524SHoward Hinnant                  __base::__map_.size(),
26063e519524SHoward Hinnant                  __base::__map_.__alloc());
2607f4903afdSMarshall Clow
2608f4903afdSMarshall Clow        typedef __allocator_destructor<_Allocator> _Dp;
2609f4903afdSMarshall Clow        unique_ptr<pointer, _Dp> __hold(
2610f4903afdSMarshall Clow            __alloc_traits::allocate(__a, __base::__block_size),
2611f4903afdSMarshall Clow                _Dp(__a, __base::__block_size));
2612f4903afdSMarshall Clow        __buf.push_back(__hold.get());
2613f4903afdSMarshall Clow        __hold.release();
2614f4903afdSMarshall Clow
26153e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.end();
26163e519524SHoward Hinnant                __i != __base::__map_.begin();)
26173e519524SHoward Hinnant            __buf.push_front(*--__i);
2618ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2619ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2620ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2621ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
26223e519524SHoward Hinnant    }
26233e519524SHoward Hinnant}
26243e519524SHoward Hinnant
26253e519524SHoward Hinnant// Create back capacity for __n elements.
26263e519524SHoward Hinnant// Strong guarantee.  Either do it or don't touch anything.
26273e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
26283e519524SHoward Hinnantvoid
26293e519524SHoward Hinnantdeque<_Tp, _Allocator>::__add_back_capacity(size_type __n)
26303e519524SHoward Hinnant{
26313e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
26323e519524SHoward Hinnant    size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
26333e519524SHoward Hinnant    // Number of unused blocks at front:
26343e519524SHoward Hinnant    size_type __front_capacity = __front_spare() / __base::__block_size;
2635ce48a113SHoward Hinnant    __front_capacity = _VSTD::min(__front_capacity, __nb);  // don't take more than you need
26363e519524SHoward Hinnant    __nb -= __front_capacity;  // number of blocks need to allocate
26373e519524SHoward Hinnant    // If __nb == 0, then we have sufficient capacity.
26383e519524SHoward Hinnant    if (__nb == 0)
26393e519524SHoward Hinnant    {
26403e519524SHoward Hinnant        __base::__start_ -= __base::__block_size * __front_capacity;
26413e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
26423e519524SHoward Hinnant        {
26433e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
26443e519524SHoward Hinnant            __base::__map_.pop_front();
26453e519524SHoward Hinnant            __base::__map_.push_back(__pt);
26463e519524SHoward Hinnant        }
26473e519524SHoward Hinnant    }
26483e519524SHoward Hinnant    // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
26493e519524SHoward Hinnant    else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
26503e519524SHoward Hinnant    {   // we can put the new buffers into the map, but don't shift things around
26513e519524SHoward Hinnant        // until all buffers are allocated.  If we throw, we don't need to fix
26523e519524SHoward Hinnant        // anything up (any added buffers are undetectible)
26533e519524SHoward Hinnant        for (; __nb > 0; --__nb)
26543e519524SHoward Hinnant        {
26553e519524SHoward Hinnant            if (__base::__map_.__back_spare() == 0)
26563e519524SHoward Hinnant                break;
26573e519524SHoward Hinnant            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
26583e519524SHoward Hinnant        }
26593e519524SHoward Hinnant        for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ +=
26603e519524SHoward Hinnant                                 __base::__block_size - (__base::__map_.size() == 1))
26613e519524SHoward Hinnant            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
26623e519524SHoward Hinnant        // Done allocating, reorder capacity
26633e519524SHoward Hinnant        __base::__start_ -= __base::__block_size * __front_capacity;
26643e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
26653e519524SHoward Hinnant        {
26663e519524SHoward Hinnant            pointer __pt = __base::__map_.front();
26673e519524SHoward Hinnant            __base::__map_.pop_front();
26683e519524SHoward Hinnant            __base::__map_.push_back(__pt);
26693e519524SHoward Hinnant        }
26703e519524SHoward Hinnant    }
26713e519524SHoward Hinnant    // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
26723e519524SHoward Hinnant    else
26733e519524SHoward Hinnant    {
26743e519524SHoward Hinnant        size_type __ds = __front_capacity * __base::__block_size;
26753e519524SHoward Hinnant        __split_buffer<pointer, typename __base::__pointer_allocator&>
26763e519524SHoward Hinnant            __buf(max<size_type>(2* __base::__map_.capacity(),
26773e519524SHoward Hinnant                                 __nb + __base::__map_.size()),
26783e519524SHoward Hinnant                  __base::__map_.size() - __front_capacity,
26793e519524SHoward Hinnant                  __base::__map_.__alloc());
26803e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
26813e519524SHoward Hinnant        try
26823e519524SHoward Hinnant        {
2683b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
26843e519524SHoward Hinnant            for (; __nb > 0; --__nb)
26853e519524SHoward Hinnant                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
26863e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
26873e519524SHoward Hinnant        }
26883e519524SHoward Hinnant        catch (...)
26893e519524SHoward Hinnant        {
26903e519524SHoward Hinnant            for (typename __base::__map_pointer __i = __buf.begin();
26913e519524SHoward Hinnant                    __i != __buf.end(); ++__i)
26923e519524SHoward Hinnant                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
26933e519524SHoward Hinnant            throw;
26943e519524SHoward Hinnant        }
2695b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
26963e519524SHoward Hinnant        for (; __front_capacity > 0; --__front_capacity)
26973e519524SHoward Hinnant        {
26983e519524SHoward Hinnant            __buf.push_back(__base::__map_.front());
26993e519524SHoward Hinnant            __base::__map_.pop_front();
27003e519524SHoward Hinnant        }
27013e519524SHoward Hinnant        for (typename __base::__map_pointer __i = __base::__map_.end();
27023e519524SHoward Hinnant                __i != __base::__map_.begin();)
27033e519524SHoward Hinnant            __buf.push_front(*--__i);
2704ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2705ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2706ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2707ce48a113SHoward Hinnant        _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
27083e519524SHoward Hinnant        __base::__start_ -= __ds;
27093e519524SHoward Hinnant    }
27103e519524SHoward Hinnant}
27113e519524SHoward Hinnant
27123e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27133e519524SHoward Hinnantvoid
27143e519524SHoward Hinnantdeque<_Tp, _Allocator>::pop_front()
27153e519524SHoward Hinnant{
27163e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
27176e965df6SArthur O'Dwyer    __alloc_traits::destroy(__a, _VSTD::__to_address(*(__base::__map_.begin() +
27183e519524SHoward Hinnant                                                    __base::__start_ / __base::__block_size) +
271914e200d1SHoward Hinnant                                                    __base::__start_ % __base::__block_size));
27203e519524SHoward Hinnant    --__base::size();
2721d544d144SEric Fiselier    ++__base::__start_;
2722d544d144SEric Fiselier    __maybe_remove_front_spare();
27233e519524SHoward Hinnant}
27243e519524SHoward Hinnant
27253e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27263e519524SHoward Hinnantvoid
27273e519524SHoward Hinnantdeque<_Tp, _Allocator>::pop_back()
27283e519524SHoward Hinnant{
272996100f15SKristina Bessonova    _LIBCPP_ASSERT(!empty(), "deque::pop_back called on an empty deque");
27303e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
27313e519524SHoward Hinnant    size_type __p = __base::size() + __base::__start_ - 1;
27326e965df6SArthur O'Dwyer    __alloc_traits::destroy(__a, _VSTD::__to_address(*(__base::__map_.begin() +
27333e519524SHoward Hinnant                                                    __p / __base::__block_size) +
273414e200d1SHoward Hinnant                                                    __p % __base::__block_size));
27353e519524SHoward Hinnant    --__base::size();
2736d544d144SEric Fiselier    __maybe_remove_back_spare();
27373e519524SHoward Hinnant}
27383e519524SHoward Hinnant
27393e519524SHoward Hinnant// move assign [__f, __l) to [__r, __r + (__l-__f)).
27403e519524SHoward Hinnant// If __vt points into [__f, __l), then subtract (__f - __r) from __vt.
27413e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27423e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
27433e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r,
27443e519524SHoward Hinnant                                         const_pointer& __vt)
27453e519524SHoward Hinnant{
27463e519524SHoward Hinnant    // as if
27473e519524SHoward Hinnant    //   for (; __f != __l; ++__f, ++__r)
2748ce48a113SHoward Hinnant    //       *__r = _VSTD::move(*__f);
27493e519524SHoward Hinnant    difference_type __n = __l - __f;
27503e519524SHoward Hinnant    while (__n > 0)
27513e519524SHoward Hinnant    {
27523e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
27533e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + __base::__block_size;
27543e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
27553e519524SHoward Hinnant        if (__bs > __n)
27563e519524SHoward Hinnant        {
27573e519524SHoward Hinnant            __bs = __n;
27583e519524SHoward Hinnant            __fe = __fb + __bs;
27593e519524SHoward Hinnant        }
27603e519524SHoward Hinnant        if (__fb <= __vt && __vt < __fe)
276114e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_;
2762ce48a113SHoward Hinnant        __r = _VSTD::move(__fb, __fe, __r);
27633e519524SHoward Hinnant        __n -= __bs;
27643e519524SHoward Hinnant        __f += __bs;
27653e519524SHoward Hinnant    }
27663e519524SHoward Hinnant    return __r;
27673e519524SHoward Hinnant}
27683e519524SHoward Hinnant
27693e519524SHoward Hinnant// move assign [__f, __l) to [__r - (__l-__f), __r) backwards.
27703e519524SHoward Hinnant// If __vt points into [__f, __l), then add (__r - __l) to __vt.
27713e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
27723e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
27733e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r,
27743e519524SHoward Hinnant                                                  const_pointer& __vt)
27753e519524SHoward Hinnant{
27763e519524SHoward Hinnant    // as if
27773e519524SHoward Hinnant    //   while (__f != __l)
2778ce48a113SHoward Hinnant    //       *--__r = _VSTD::move(*--__l);
27793e519524SHoward Hinnant    difference_type __n = __l - __f;
27803e519524SHoward Hinnant    while (__n > 0)
27813e519524SHoward Hinnant    {
27823e519524SHoward Hinnant        --__l;
27833e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
27843e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
27853e519524SHoward Hinnant        difference_type __bs = __le - __lb;
27863e519524SHoward Hinnant        if (__bs > __n)
27873e519524SHoward Hinnant        {
27883e519524SHoward Hinnant            __bs = __n;
27893e519524SHoward Hinnant            __lb = __le - __bs;
27903e519524SHoward Hinnant        }
27913e519524SHoward Hinnant        if (__lb <= __vt && __vt < __le)
279214e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_;
2793ce48a113SHoward Hinnant        __r = _VSTD::move_backward(__lb, __le, __r);
27943e519524SHoward Hinnant        __n -= __bs;
27953e519524SHoward Hinnant        __l -= __bs - 1;
27963e519524SHoward Hinnant    }
27973e519524SHoward Hinnant    return __r;
27983e519524SHoward Hinnant}
27993e519524SHoward Hinnant
28003e519524SHoward Hinnant// move construct [__f, __l) to [__r, __r + (__l-__f)).
28013e519524SHoward Hinnant// If __vt points into [__f, __l), then add (__r - __f) to __vt.
28023e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28033e519524SHoward Hinnantvoid
28043e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
28053e519524SHoward Hinnant                                                   iterator __r, const_pointer& __vt)
28063e519524SHoward Hinnant{
28073e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
28083e519524SHoward Hinnant    // as if
28093e519524SHoward Hinnant    //   for (; __f != __l; ++__r, ++__f, ++__base::size())
2810ce48a113SHoward Hinnant    //       __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f));
28113e519524SHoward Hinnant    difference_type __n = __l - __f;
28123e519524SHoward Hinnant    while (__n > 0)
28133e519524SHoward Hinnant    {
28143e519524SHoward Hinnant        pointer __fb = __f.__ptr_;
28153e519524SHoward Hinnant        pointer __fe = *__f.__m_iter_ + __base::__block_size;
28163e519524SHoward Hinnant        difference_type __bs = __fe - __fb;
28173e519524SHoward Hinnant        if (__bs > __n)
28183e519524SHoward Hinnant        {
28193e519524SHoward Hinnant            __bs = __n;
28203e519524SHoward Hinnant            __fe = __fb + __bs;
28213e519524SHoward Hinnant        }
28223e519524SHoward Hinnant        if (__fb <= __vt && __vt < __fe)
282314e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_;
28243e519524SHoward Hinnant        for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
2825ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb));
28263e519524SHoward Hinnant        __n -= __bs;
28273e519524SHoward Hinnant        __f += __bs;
28283e519524SHoward Hinnant    }
28293e519524SHoward Hinnant}
28303e519524SHoward Hinnant
28313e519524SHoward Hinnant// move construct [__f, __l) to [__r - (__l-__f), __r) backwards.
28323e519524SHoward Hinnant// If __vt points into [__f, __l), then subtract (__l - __r) from __vt.
28333e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28343e519524SHoward Hinnantvoid
28353e519524SHoward Hinnantdeque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l,
28363e519524SHoward Hinnant                                                            iterator __r, const_pointer& __vt)
28373e519524SHoward Hinnant{
28383e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
28393e519524SHoward Hinnant    // as if
28403e519524SHoward Hinnant    //   for (iterator __j = __l; __j != __f;)
28413e519524SHoward Hinnant    //   {
2842ce48a113SHoward Hinnant    //       __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j));
28433e519524SHoward Hinnant    //       --__base::__start_;
28443e519524SHoward Hinnant    //       ++__base::size();
28453e519524SHoward Hinnant    //   }
28463e519524SHoward Hinnant    difference_type __n = __l - __f;
28473e519524SHoward Hinnant    while (__n > 0)
28483e519524SHoward Hinnant    {
28493e519524SHoward Hinnant        --__l;
28503e519524SHoward Hinnant        pointer __lb = *__l.__m_iter_;
28513e519524SHoward Hinnant        pointer __le = __l.__ptr_ + 1;
28523e519524SHoward Hinnant        difference_type __bs = __le - __lb;
28533e519524SHoward Hinnant        if (__bs > __n)
28543e519524SHoward Hinnant        {
28553e519524SHoward Hinnant            __bs = __n;
28563e519524SHoward Hinnant            __lb = __le - __bs;
28573e519524SHoward Hinnant        }
28583e519524SHoward Hinnant        if (__lb <= __vt && __vt < __le)
285914e200d1SHoward Hinnant            __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_;
28603e519524SHoward Hinnant        while (__le != __lb)
28613e519524SHoward Hinnant        {
2862ce48a113SHoward Hinnant            __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le));
28633e519524SHoward Hinnant            --__base::__start_;
28643e519524SHoward Hinnant            ++__base::size();
28653e519524SHoward Hinnant        }
28663e519524SHoward Hinnant        __n -= __bs;
28673e519524SHoward Hinnant        __l -= __bs - 1;
28683e519524SHoward Hinnant    }
28693e519524SHoward Hinnant}
28703e519524SHoward Hinnant
28713e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28723e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
28733e519524SHoward Hinnantdeque<_Tp, _Allocator>::erase(const_iterator __f)
28743e519524SHoward Hinnant{
28753e519524SHoward Hinnant    iterator __b = __base::begin();
28763e519524SHoward Hinnant    difference_type __pos = __f - __b;
28773e519524SHoward Hinnant    iterator __p = __b + __pos;
28783e519524SHoward Hinnant    allocator_type& __a = __base::__alloc();
2879aec08784SEric Fiselier    if (static_cast<size_t>(__pos) <= (__base::size() - 1) / 2)
28803e519524SHoward Hinnant    {   // erase from front
2881ce48a113SHoward Hinnant        _VSTD::move_backward(__b, __p, _VSTD::next(__p));
2882ce48a113SHoward Hinnant        __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
28833e519524SHoward Hinnant        --__base::size();
28843e519524SHoward Hinnant        ++__base::__start_;
2885d544d144SEric Fiselier        __maybe_remove_front_spare();
28863e519524SHoward Hinnant    }
28873e519524SHoward Hinnant    else
28883e519524SHoward Hinnant    {   // erase from back
2889ce48a113SHoward Hinnant        iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p);
2890ce48a113SHoward Hinnant        __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
28913e519524SHoward Hinnant        --__base::size();
2892d544d144SEric Fiselier        __maybe_remove_back_spare();
28933e519524SHoward Hinnant    }
28943e519524SHoward Hinnant    return __base::begin() + __pos;
28953e519524SHoward Hinnant}
28963e519524SHoward Hinnant
28973e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
28983e519524SHoward Hinnanttypename deque<_Tp, _Allocator>::iterator
28993e519524SHoward Hinnantdeque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l)
29003e519524SHoward Hinnant{
29013e519524SHoward Hinnant    difference_type __n = __l - __f;
29023e519524SHoward Hinnant    iterator __b = __base::begin();
29033e519524SHoward Hinnant    difference_type __pos = __f - __b;
29043e519524SHoward Hinnant    iterator __p = __b + __pos;
29053e519524SHoward Hinnant    if (__n > 0)
29063e519524SHoward Hinnant    {
29073e519524SHoward Hinnant        allocator_type& __a = __base::__alloc();
2908aec08784SEric Fiselier        if (static_cast<size_t>(__pos) <= (__base::size() - __n) / 2)
29093e519524SHoward Hinnant        {   // erase from front
2910ce48a113SHoward Hinnant            iterator __i = _VSTD::move_backward(__b, __p, __p + __n);
29113e519524SHoward Hinnant            for (; __b != __i; ++__b)
2912ce48a113SHoward Hinnant                __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
29133e519524SHoward Hinnant            __base::size() -= __n;
29143e519524SHoward Hinnant            __base::__start_ += __n;
2915d544d144SEric Fiselier            while (__maybe_remove_front_spare()) {
29163e519524SHoward Hinnant            }
29173e519524SHoward Hinnant        }
29183e519524SHoward Hinnant        else
29193e519524SHoward Hinnant        {   // erase from back
2920ce48a113SHoward Hinnant            iterator __i = _VSTD::move(__p + __n, __base::end(), __p);
29213e519524SHoward Hinnant            for (iterator __e = __base::end(); __i != __e; ++__i)
2922ce48a113SHoward Hinnant                __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
29233e519524SHoward Hinnant            __base::size() -= __n;
2924d544d144SEric Fiselier            while (__maybe_remove_back_spare()) {
29253e519524SHoward Hinnant            }
29263e519524SHoward Hinnant        }
29273e519524SHoward Hinnant    }
29283e519524SHoward Hinnant    return __base::begin() + __pos;
29293e519524SHoward Hinnant}
29303e519524SHoward Hinnant
29313e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29323e519524SHoward Hinnantvoid
29333e519524SHoward Hinnantdeque<_Tp, _Allocator>::__erase_to_end(const_iterator __f)
29343e519524SHoward Hinnant{
29353e519524SHoward Hinnant    iterator __e = __base::end();
29363e519524SHoward Hinnant    difference_type __n = __e - __f;
29373e519524SHoward Hinnant    if (__n > 0)
29383e519524SHoward Hinnant    {
29393e519524SHoward Hinnant        allocator_type& __a = __base::__alloc();
29403e519524SHoward Hinnant        iterator __b = __base::begin();
29413e519524SHoward Hinnant        difference_type __pos = __f - __b;
29423e519524SHoward Hinnant        for (iterator __p = __b + __pos; __p != __e; ++__p)
2943ce48a113SHoward Hinnant            __alloc_traits::destroy(__a, _VSTD::addressof(*__p));
29443e519524SHoward Hinnant        __base::size() -= __n;
2945d544d144SEric Fiselier        while (__maybe_remove_back_spare()) {
29463e519524SHoward Hinnant        }
29473e519524SHoward Hinnant    }
29483e519524SHoward Hinnant}
29493e519524SHoward Hinnant
29503e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2951906c872dSEvgeniy Stepanovinline
29523e519524SHoward Hinnantvoid
29533e519524SHoward Hinnantdeque<_Tp, _Allocator>::swap(deque& __c)
2954e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
2955e3fbe143SMarshall Clow        _NOEXCEPT
2956e3fbe143SMarshall Clow#else
29579eebe11dSHoward Hinnant        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
29589eebe11dSHoward Hinnant                    __is_nothrow_swappable<allocator_type>::value)
2959e3fbe143SMarshall Clow#endif
29603e519524SHoward Hinnant{
29613e519524SHoward Hinnant    __base::swap(__c);
29623e519524SHoward Hinnant}
29633e519524SHoward Hinnant
29643e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
2965906c872dSEvgeniy Stepanovinline
29663e519524SHoward Hinnantvoid
2967a87e8360SHoward Hinnantdeque<_Tp, _Allocator>::clear() _NOEXCEPT
29683e519524SHoward Hinnant{
29693e519524SHoward Hinnant    __base::clear();
29703e519524SHoward Hinnant}
29713e519524SHoward Hinnant
29723e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29733af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29743e519524SHoward Hinnantbool
29753e519524SHoward Hinnantoperator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29763e519524SHoward Hinnant{
29773e519524SHoward Hinnant    const typename deque<_Tp, _Allocator>::size_type __sz = __x.size();
2978ce48a113SHoward Hinnant    return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
29793e519524SHoward Hinnant}
29803e519524SHoward Hinnant
29813e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29823af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29833e519524SHoward Hinnantbool
29843e519524SHoward Hinnantoperator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29853e519524SHoward Hinnant{
29863e519524SHoward Hinnant    return !(__x == __y);
29873e519524SHoward Hinnant}
29883e519524SHoward Hinnant
29893e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29903af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29913e519524SHoward Hinnantbool
29923e519524SHoward Hinnantoperator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
29933e519524SHoward Hinnant{
2994ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
29953e519524SHoward Hinnant}
29963e519524SHoward Hinnant
29973e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
29983af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
29993e519524SHoward Hinnantbool
30003e519524SHoward Hinnantoperator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
30013e519524SHoward Hinnant{
30023e519524SHoward Hinnant    return __y < __x;
30033e519524SHoward Hinnant}
30043e519524SHoward Hinnant
30053e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
30063af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
30073e519524SHoward Hinnantbool
30083e519524SHoward Hinnantoperator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
30093e519524SHoward Hinnant{
30103e519524SHoward Hinnant    return !(__x < __y);
30113e519524SHoward Hinnant}
30123e519524SHoward Hinnant
30133e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
30143af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
30153e519524SHoward Hinnantbool
30163e519524SHoward Hinnantoperator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
30173e519524SHoward Hinnant{
30183e519524SHoward Hinnant    return !(__y < __x);
30193e519524SHoward Hinnant}
30203e519524SHoward Hinnant
30213e519524SHoward Hinnanttemplate <class _Tp, class _Allocator>
30223af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
30233e519524SHoward Hinnantvoid
30243e519524SHoward Hinnantswap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y)
30259eebe11dSHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
30263e519524SHoward Hinnant{
30273e519524SHoward Hinnant    __x.swap(__y);
30283e519524SHoward Hinnant}
30293e519524SHoward Hinnant
3030f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
3031f60c63c0SMarshall Clowtemplate <class _Tp, class _Allocator, class _Up>
30323e895085SMarek Kurdejinline _LIBCPP_INLINE_VISIBILITY typename deque<_Tp, _Allocator>::size_type
30333e895085SMarek Kurdejerase(deque<_Tp, _Allocator>& __c, const _Up& __v) {
30343e895085SMarek Kurdej  auto __old_size = __c.size();
30353e895085SMarek Kurdej  __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end());
30363e895085SMarek Kurdej  return __old_size - __c.size();
30373e895085SMarek Kurdej}
3038f60c63c0SMarshall Clow
3039f60c63c0SMarshall Clowtemplate <class _Tp, class _Allocator, class _Predicate>
30403e895085SMarek Kurdejinline _LIBCPP_INLINE_VISIBILITY typename deque<_Tp, _Allocator>::size_type
30413e895085SMarek Kurdejerase_if(deque<_Tp, _Allocator>& __c, _Predicate __pred) {
30423e895085SMarek Kurdej  auto __old_size = __c.size();
30433e895085SMarek Kurdej  __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end());
30443e895085SMarek Kurdej  return __old_size - __c.size();
30453e895085SMarek Kurdej}
304688930229SMark de Wever
304788930229SMark de Wevertemplate <>
304888930229SMark de Weverinline constexpr bool __format::__enable_insertable<std::deque<char>> = true;
304988930229SMark de Wever#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
305088930229SMark de Wevertemplate <>
305188930229SMark de Weverinline constexpr bool __format::__enable_insertable<std::deque<wchar_t>> = true;
3052f60c63c0SMarshall Clow#endif
3053f60c63c0SMarshall Clow
305488930229SMark de Wever#endif // _LIBCPP_STD_VER > 17
3055f60c63c0SMarshall Clow
30563e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
30573e519524SHoward Hinnant
3058a016efb1SEric Fiselier_LIBCPP_POP_MACROS
3059a016efb1SEric Fiselier
30603e519524SHoward Hinnant#endif // _LIBCPP_DEQUE
3061