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