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