146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_DEQUE 1146035553Spatrick#define _LIBCPP_DEQUE 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick deque synopsis 1546035553Spatrick 1646035553Spatricknamespace std 1746035553Spatrick{ 1846035553Spatrick 1946035553Spatricktemplate <class T, class Allocator = allocator<T> > 2046035553Spatrickclass deque 2146035553Spatrick{ 2246035553Spatrickpublic: 2346035553Spatrick // types: 2446035553Spatrick typedef T value_type; 2546035553Spatrick typedef Allocator allocator_type; 2646035553Spatrick 2746035553Spatrick typedef typename allocator_type::reference reference; 2846035553Spatrick typedef typename allocator_type::const_reference const_reference; 2946035553Spatrick typedef implementation-defined iterator; 3046035553Spatrick typedef implementation-defined const_iterator; 3146035553Spatrick typedef typename allocator_type::size_type size_type; 3246035553Spatrick typedef typename allocator_type::difference_type difference_type; 3346035553Spatrick 3446035553Spatrick typedef typename allocator_type::pointer pointer; 3546035553Spatrick typedef typename allocator_type::const_pointer const_pointer; 3646035553Spatrick typedef std::reverse_iterator<iterator> reverse_iterator; 3746035553Spatrick typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 3846035553Spatrick 3946035553Spatrick // construct/copy/destroy: 4046035553Spatrick deque() noexcept(is_nothrow_default_constructible<allocator_type>::value); 4146035553Spatrick explicit deque(const allocator_type& a); 4246035553Spatrick explicit deque(size_type n); 4346035553Spatrick explicit deque(size_type n, const allocator_type& a); // C++14 4446035553Spatrick deque(size_type n, const value_type& v); 4546035553Spatrick deque(size_type n, const value_type& v, const allocator_type& a); 4646035553Spatrick template <class InputIterator> 4746035553Spatrick deque(InputIterator f, InputIterator l); 4846035553Spatrick template <class InputIterator> 4946035553Spatrick deque(InputIterator f, InputIterator l, const allocator_type& a); 5046035553Spatrick deque(const deque& c); 5146035553Spatrick deque(deque&& c) 5246035553Spatrick noexcept(is_nothrow_move_constructible<allocator_type>::value); 5346035553Spatrick deque(initializer_list<value_type> il, const Allocator& a = allocator_type()); 5446035553Spatrick deque(const deque& c, const allocator_type& a); 5546035553Spatrick deque(deque&& c, const allocator_type& a); 5646035553Spatrick ~deque(); 5746035553Spatrick 5846035553Spatrick deque& operator=(const deque& c); 5946035553Spatrick deque& operator=(deque&& c) 6046035553Spatrick noexcept( 6146035553Spatrick allocator_type::propagate_on_container_move_assignment::value && 6246035553Spatrick is_nothrow_move_assignable<allocator_type>::value); 6346035553Spatrick deque& operator=(initializer_list<value_type> il); 6446035553Spatrick 6546035553Spatrick template <class InputIterator> 6646035553Spatrick void assign(InputIterator f, InputIterator l); 6746035553Spatrick void assign(size_type n, const value_type& v); 6846035553Spatrick void assign(initializer_list<value_type> il); 6946035553Spatrick 7046035553Spatrick allocator_type get_allocator() const noexcept; 7146035553Spatrick 7246035553Spatrick // iterators: 7346035553Spatrick 7446035553Spatrick iterator begin() noexcept; 7546035553Spatrick const_iterator begin() const noexcept; 7646035553Spatrick iterator end() noexcept; 7746035553Spatrick const_iterator end() const noexcept; 7846035553Spatrick 7946035553Spatrick reverse_iterator rbegin() noexcept; 8046035553Spatrick const_reverse_iterator rbegin() const noexcept; 8146035553Spatrick reverse_iterator rend() noexcept; 8246035553Spatrick const_reverse_iterator rend() const noexcept; 8346035553Spatrick 8446035553Spatrick const_iterator cbegin() const noexcept; 8546035553Spatrick const_iterator cend() const noexcept; 8646035553Spatrick const_reverse_iterator crbegin() const noexcept; 8746035553Spatrick const_reverse_iterator crend() const noexcept; 8846035553Spatrick 8946035553Spatrick // capacity: 9046035553Spatrick size_type size() const noexcept; 9146035553Spatrick size_type max_size() const noexcept; 9246035553Spatrick void resize(size_type n); 9346035553Spatrick void resize(size_type n, const value_type& v); 9446035553Spatrick void shrink_to_fit(); 9546035553Spatrick bool empty() const noexcept; 9646035553Spatrick 9746035553Spatrick // element access: 9846035553Spatrick reference operator[](size_type i); 9946035553Spatrick const_reference operator[](size_type i) const; 10046035553Spatrick reference at(size_type i); 10146035553Spatrick const_reference at(size_type i) const; 10246035553Spatrick reference front(); 10346035553Spatrick const_reference front() const; 10446035553Spatrick reference back(); 10546035553Spatrick const_reference back() const; 10646035553Spatrick 10746035553Spatrick // modifiers: 10846035553Spatrick void push_front(const value_type& v); 10946035553Spatrick void push_front(value_type&& v); 11046035553Spatrick void push_back(const value_type& v); 11146035553Spatrick void push_back(value_type&& v); 11246035553Spatrick template <class... Args> reference emplace_front(Args&&... args); // reference in C++17 11346035553Spatrick template <class... Args> reference emplace_back(Args&&... args); // reference in C++17 11446035553Spatrick template <class... Args> iterator emplace(const_iterator p, Args&&... args); 11546035553Spatrick iterator insert(const_iterator p, const value_type& v); 11646035553Spatrick iterator insert(const_iterator p, value_type&& v); 11746035553Spatrick iterator insert(const_iterator p, size_type n, const value_type& v); 11846035553Spatrick template <class InputIterator> 11946035553Spatrick iterator insert(const_iterator p, InputIterator f, InputIterator l); 12046035553Spatrick iterator insert(const_iterator p, initializer_list<value_type> il); 12146035553Spatrick void pop_front(); 12246035553Spatrick void pop_back(); 12346035553Spatrick iterator erase(const_iterator p); 12446035553Spatrick iterator erase(const_iterator f, const_iterator l); 12546035553Spatrick void swap(deque& c) 12646035553Spatrick noexcept(allocator_traits<allocator_type>::is_always_equal::value); // C++17 12746035553Spatrick void clear() noexcept; 12846035553Spatrick}; 12946035553Spatrick 13046035553Spatricktemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 13146035553Spatrick deque(InputIterator, InputIterator, Allocator = Allocator()) 132*4bdff4beSrobert -> deque<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17 13346035553Spatrick 13446035553Spatricktemplate <class T, class Allocator> 13546035553Spatrick bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 13646035553Spatricktemplate <class T, class Allocator> 13746035553Spatrick bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y); 13846035553Spatricktemplate <class T, class Allocator> 13946035553Spatrick bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 14046035553Spatricktemplate <class T, class Allocator> 14146035553Spatrick bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y); 14246035553Spatricktemplate <class T, class Allocator> 14346035553Spatrick bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 14446035553Spatricktemplate <class T, class Allocator> 14546035553Spatrick bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 14646035553Spatrick 14746035553Spatrick// specialized algorithms: 14846035553Spatricktemplate <class T, class Allocator> 14946035553Spatrick void swap(deque<T,Allocator>& x, deque<T,Allocator>& y) 15046035553Spatrick noexcept(noexcept(x.swap(y))); 15146035553Spatrick 15246035553Spatricktemplate <class T, class Allocator, class U> 153037e7968Spatrick typename deque<T, Allocator>::size_type 154037e7968Spatrick erase(deque<T, Allocator>& c, const U& value); // C++20 15546035553Spatricktemplate <class T, class Allocator, class Predicate> 156037e7968Spatrick typename deque<T, Allocator>::size_type 157037e7968Spatrick erase_if(deque<T, Allocator>& c, Predicate pred); // C++20 15846035553Spatrick 15946035553Spatrick} // std 16046035553Spatrick 16146035553Spatrick*/ 16246035553Spatrick 163*4bdff4beSrobert#include <__algorithm/copy.h> 164*4bdff4beSrobert#include <__algorithm/copy_backward.h> 165*4bdff4beSrobert#include <__algorithm/equal.h> 166*4bdff4beSrobert#include <__algorithm/fill_n.h> 167*4bdff4beSrobert#include <__algorithm/lexicographical_compare.h> 168*4bdff4beSrobert#include <__algorithm/min.h> 169*4bdff4beSrobert#include <__algorithm/remove.h> 170*4bdff4beSrobert#include <__algorithm/remove_if.h> 171*4bdff4beSrobert#include <__algorithm/unwrap_iter.h> 172*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 17346035553Spatrick#include <__config> 174*4bdff4beSrobert#include <__format/enable_insertable.h> 175*4bdff4beSrobert#include <__iterator/iterator_traits.h> 176*4bdff4beSrobert#include <__iterator/next.h> 177*4bdff4beSrobert#include <__iterator/prev.h> 178*4bdff4beSrobert#include <__iterator/reverse_iterator.h> 179*4bdff4beSrobert#include <__iterator/segmented_iterator.h> 180*4bdff4beSrobert#include <__memory/allocator_destructor.h> 181*4bdff4beSrobert#include <__memory/pointer_traits.h> 182*4bdff4beSrobert#include <__memory/temp_value.h> 183*4bdff4beSrobert#include <__memory/unique_ptr.h> 184*4bdff4beSrobert#include <__memory_resource/polymorphic_allocator.h> 18546035553Spatrick#include <__split_buffer> 186*4bdff4beSrobert#include <__type_traits/is_allocator.h> 18776d0caaeSpatrick#include <__utility/forward.h> 188*4bdff4beSrobert#include <__utility/move.h> 189*4bdff4beSrobert#include <__utility/swap.h> 19076d0caaeSpatrick#include <limits> 19146035553Spatrick#include <stdexcept> 19276d0caaeSpatrick#include <type_traits> 19346035553Spatrick#include <version> 19446035553Spatrick 195*4bdff4beSrobert// standard-mandated includes 196*4bdff4beSrobert 197*4bdff4beSrobert// [iterator.range] 198*4bdff4beSrobert#include <__iterator/access.h> 199*4bdff4beSrobert#include <__iterator/data.h> 200*4bdff4beSrobert#include <__iterator/empty.h> 201*4bdff4beSrobert#include <__iterator/reverse_access.h> 202*4bdff4beSrobert#include <__iterator/size.h> 203*4bdff4beSrobert 204*4bdff4beSrobert// [deque.syn] 205*4bdff4beSrobert#include <compare> 206*4bdff4beSrobert#include <initializer_list> 207*4bdff4beSrobert 20846035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 20946035553Spatrick# pragma GCC system_header 21046035553Spatrick#endif 21146035553Spatrick 21246035553Spatrick_LIBCPP_PUSH_MACROS 21346035553Spatrick#include <__undef_macros> 21446035553Spatrick 21546035553Spatrick 21646035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 21746035553Spatrick 21846035553Spatricktemplate <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS deque; 21946035553Spatrick 22046035553Spatricktemplate <class _ValueType, class _DiffType> 22146035553Spatrickstruct __deque_block_size { 22246035553Spatrick static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16; 22346035553Spatrick}; 22446035553Spatrick 22546035553Spatricktemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer, 22646035553Spatrick class _DiffType, _DiffType _BS = 22746035553Spatrick#ifdef _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE 22846035553Spatrick// Keep template parameter to avoid changing all template declarations thoughout 22946035553Spatrick// this file. 23046035553Spatrick 0 23146035553Spatrick#else 23246035553Spatrick __deque_block_size<_ValueType, _DiffType>::value 23346035553Spatrick#endif 23446035553Spatrick > 23546035553Spatrickclass _LIBCPP_TEMPLATE_VIS __deque_iterator 23646035553Spatrick{ 23746035553Spatrick typedef _MapPointer __map_iterator; 23846035553Spatrickpublic: 23946035553Spatrick typedef _Pointer pointer; 24046035553Spatrick typedef _DiffType difference_type; 24146035553Spatrickprivate: 24246035553Spatrick __map_iterator __m_iter_; 24346035553Spatrick pointer __ptr_; 24446035553Spatrick 24546035553Spatrick static const difference_type __block_size; 24646035553Spatrickpublic: 24746035553Spatrick typedef _ValueType value_type; 24846035553Spatrick typedef random_access_iterator_tag iterator_category; 24946035553Spatrick typedef _Reference reference; 25046035553Spatrick 251*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator() _NOEXCEPT 25246035553Spatrick#if _LIBCPP_STD_VER > 11 25346035553Spatrick : __m_iter_(nullptr), __ptr_(nullptr) 25446035553Spatrick#endif 25546035553Spatrick {} 25646035553Spatrick 25746035553Spatrick template <class _Pp, class _Rp, class _MP> 258*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 25946035553Spatrick __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, _BS>& __it, 26046035553Spatrick typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT 26146035553Spatrick : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {} 26246035553Spatrick 263*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI reference operator*() const {return *__ptr_;} 264*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI pointer operator->() const {return __ptr_;} 26546035553Spatrick 266*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator& operator++() 26746035553Spatrick { 26846035553Spatrick if (++__ptr_ - *__m_iter_ == __block_size) 26946035553Spatrick { 27046035553Spatrick ++__m_iter_; 27146035553Spatrick __ptr_ = *__m_iter_; 27246035553Spatrick } 27346035553Spatrick return *this; 27446035553Spatrick } 27546035553Spatrick 276*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator operator++(int) 27746035553Spatrick { 27846035553Spatrick __deque_iterator __tmp = *this; 27946035553Spatrick ++(*this); 28046035553Spatrick return __tmp; 28146035553Spatrick } 28246035553Spatrick 283*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator& operator--() 28446035553Spatrick { 28546035553Spatrick if (__ptr_ == *__m_iter_) 28646035553Spatrick { 28746035553Spatrick --__m_iter_; 28846035553Spatrick __ptr_ = *__m_iter_ + __block_size; 28946035553Spatrick } 29046035553Spatrick --__ptr_; 29146035553Spatrick return *this; 29246035553Spatrick } 29346035553Spatrick 294*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator operator--(int) 29546035553Spatrick { 29646035553Spatrick __deque_iterator __tmp = *this; 29746035553Spatrick --(*this); 29846035553Spatrick return __tmp; 29946035553Spatrick } 30046035553Spatrick 301*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator& operator+=(difference_type __n) 30246035553Spatrick { 30346035553Spatrick if (__n != 0) 30446035553Spatrick { 30546035553Spatrick __n += __ptr_ - *__m_iter_; 30646035553Spatrick if (__n > 0) 30746035553Spatrick { 30846035553Spatrick __m_iter_ += __n / __block_size; 30946035553Spatrick __ptr_ = *__m_iter_ + __n % __block_size; 31046035553Spatrick } 31146035553Spatrick else // (__n < 0) 31246035553Spatrick { 31346035553Spatrick difference_type __z = __block_size - 1 - __n; 31446035553Spatrick __m_iter_ -= __z / __block_size; 31546035553Spatrick __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size); 31646035553Spatrick } 31746035553Spatrick } 31846035553Spatrick return *this; 31946035553Spatrick } 32046035553Spatrick 321*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator& operator-=(difference_type __n) 32246035553Spatrick { 32346035553Spatrick return *this += -__n; 32446035553Spatrick } 32546035553Spatrick 326*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator operator+(difference_type __n) const 32746035553Spatrick { 32846035553Spatrick __deque_iterator __t(*this); 32946035553Spatrick __t += __n; 33046035553Spatrick return __t; 33146035553Spatrick } 33246035553Spatrick 333*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_iterator operator-(difference_type __n) const 33446035553Spatrick { 33546035553Spatrick __deque_iterator __t(*this); 33646035553Spatrick __t -= __n; 33746035553Spatrick return __t; 33846035553Spatrick } 33946035553Spatrick 340*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 34146035553Spatrick friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it) 34246035553Spatrick {return __it + __n;} 34346035553Spatrick 344*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 34546035553Spatrick friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y) 34646035553Spatrick { 34746035553Spatrick if (__x != __y) 34846035553Spatrick return (__x.__m_iter_ - __y.__m_iter_) * __block_size 34946035553Spatrick + (__x.__ptr_ - *__x.__m_iter_) 35046035553Spatrick - (__y.__ptr_ - *__y.__m_iter_); 35146035553Spatrick return 0; 35246035553Spatrick } 35346035553Spatrick 354*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI reference operator[](difference_type __n) const 35546035553Spatrick {return *(*this + __n);} 35646035553Spatrick 357*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend 35846035553Spatrick bool operator==(const __deque_iterator& __x, const __deque_iterator& __y) 35946035553Spatrick {return __x.__ptr_ == __y.__ptr_;} 36046035553Spatrick 361*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend 36246035553Spatrick bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y) 36346035553Spatrick {return !(__x == __y);} 36446035553Spatrick 365*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend 36646035553Spatrick bool operator<(const __deque_iterator& __x, const __deque_iterator& __y) 36746035553Spatrick {return __x.__m_iter_ < __y.__m_iter_ || 36846035553Spatrick (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);} 36946035553Spatrick 370*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend 37146035553Spatrick bool operator>(const __deque_iterator& __x, const __deque_iterator& __y) 37246035553Spatrick {return __y < __x;} 37346035553Spatrick 374*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend 37546035553Spatrick bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y) 37646035553Spatrick {return !(__y < __x);} 37746035553Spatrick 378*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend 37946035553Spatrick bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y) 38046035553Spatrick {return !(__x < __y);} 38146035553Spatrick 38246035553Spatrickprivate: 383*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI explicit __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT 38446035553Spatrick : __m_iter_(__m), __ptr_(__p) {} 38546035553Spatrick 38646035553Spatrick template <class _Tp, class _Ap> friend class _LIBCPP_TEMPLATE_VIS deque; 38746035553Spatrick template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp> 38846035553Spatrick friend class _LIBCPP_TEMPLATE_VIS __deque_iterator; 38946035553Spatrick 390*4bdff4beSrobert template <class> 391*4bdff4beSrobert friend struct __segmented_iterator_traits; 392*4bdff4beSrobert}; 39346035553Spatrick 394*4bdff4beSroberttemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer, class _DiffType, _DiffType _BlockSize> 395*4bdff4beSrobertstruct __segmented_iterator_traits< 396*4bdff4beSrobert __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer, _DiffType, _BlockSize> > { 397*4bdff4beSrobertprivate: 398*4bdff4beSrobert using _Iterator = __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer, _DiffType, _BlockSize>; 39946035553Spatrick 400*4bdff4beSrobertpublic: 401*4bdff4beSrobert using __is_segmented_iterator = true_type; 402*4bdff4beSrobert using __segment_iterator = _MapPointer; 403*4bdff4beSrobert using __local_iterator = _Pointer; 40446035553Spatrick 405*4bdff4beSrobert static _LIBCPP_HIDE_FROM_ABI __segment_iterator __segment(_Iterator __iter) { return __iter.__m_iter_; } 406*4bdff4beSrobert static _LIBCPP_HIDE_FROM_ABI __local_iterator __local(_Iterator __iter) { return __iter.__ptr_; } 407*4bdff4beSrobert static _LIBCPP_HIDE_FROM_ABI __local_iterator __begin(__segment_iterator __iter) { return *__iter; } 40846035553Spatrick 409*4bdff4beSrobert static _LIBCPP_HIDE_FROM_ABI __local_iterator __end(__segment_iterator __iter) { 410*4bdff4beSrobert return *__iter + _Iterator::__block_size; 411*4bdff4beSrobert } 41246035553Spatrick 413*4bdff4beSrobert static _LIBCPP_HIDE_FROM_ABI _Iterator __compose(__segment_iterator __segment, __local_iterator __local) { 414*4bdff4beSrobert if (__local == __end(__segment)) { 415*4bdff4beSrobert ++__segment; 416*4bdff4beSrobert return _Iterator(__segment, *__segment); 417*4bdff4beSrobert } 418*4bdff4beSrobert return _Iterator(__segment, __local); 419*4bdff4beSrobert } 42046035553Spatrick}; 42146035553Spatrick 42246035553Spatricktemplate <class _ValueType, class _Pointer, class _Reference, class _MapPointer, 42346035553Spatrick class _DiffType, _DiffType _BlockSize> 42446035553Spatrickconst _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer, 42546035553Spatrick _DiffType, _BlockSize>::__block_size = 42646035553Spatrick __deque_block_size<_ValueType, _DiffType>::value; 42746035553Spatrick 428*4bdff4beSroberttemplate <class _Tp, class _Allocator /*= allocator<_Tp>*/> 429*4bdff4beSrobertclass _LIBCPP_TEMPLATE_VIS deque 43046035553Spatrick{ 43146035553Spatrickpublic: 432*4bdff4beSrobert // types: 43346035553Spatrick 434*4bdff4beSrobert using value_type = _Tp; 43546035553Spatrick 436*4bdff4beSrobert static_assert((is_same<typename _Allocator::value_type, value_type>::value), 437*4bdff4beSrobert "Allocator::value_type must be same type as value_type"); 43846035553Spatrick 439*4bdff4beSrobert using allocator_type = _Allocator; 440*4bdff4beSrobert using __alloc_traits = allocator_traits<allocator_type>; 44146035553Spatrick 442*4bdff4beSrobert using size_type = typename __alloc_traits::size_type; 443*4bdff4beSrobert using difference_type = typename __alloc_traits::difference_type; 44446035553Spatrick 445*4bdff4beSrobert using pointer = typename __alloc_traits::pointer; 446*4bdff4beSrobert using const_pointer = typename __alloc_traits::const_pointer; 447*4bdff4beSrobert 448*4bdff4beSrobert using __pointer_allocator = __rebind_alloc<__alloc_traits, pointer>; 449*4bdff4beSrobert using __const_pointer_allocator = __rebind_alloc<__alloc_traits, const_pointer>; 450*4bdff4beSrobert using __map = __split_buffer<pointer, __pointer_allocator>; 451*4bdff4beSrobert using __map_alloc_traits = allocator_traits<__pointer_allocator>; 452*4bdff4beSrobert using __map_pointer = typename __map_alloc_traits::pointer; 453*4bdff4beSrobert using __map_const_pointer = typename allocator_traits<__const_pointer_allocator>::const_pointer; 454*4bdff4beSrobert 455*4bdff4beSrobert using reference = value_type&; 456*4bdff4beSrobert using const_reference = const value_type&; 457*4bdff4beSrobert 458*4bdff4beSrobert using iterator = __deque_iterator<value_type, pointer, reference, __map_pointer, difference_type>; 459*4bdff4beSrobert using const_iterator = 460*4bdff4beSrobert __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer, difference_type>; 461*4bdff4beSrobert using reverse_iterator = std::reverse_iterator<iterator>; 462*4bdff4beSrobert using const_reverse_iterator = std::reverse_iterator<const_iterator>; 463*4bdff4beSrobert 464*4bdff4beSrobert static_assert(is_same<allocator_type, __rebind_alloc<__alloc_traits, value_type> >::value, 465*4bdff4beSrobert "[allocator.requirements] states that rebinding an allocator to the same type should result in the " 466*4bdff4beSrobert "original allocator"); 467*4bdff4beSrobert static_assert(is_nothrow_default_constructible<allocator_type>::value == 468*4bdff4beSrobert is_nothrow_default_constructible<__pointer_allocator>::value, 469*4bdff4beSrobert "rebinding an allocator should not change excpetion guarantees"); 470*4bdff4beSrobert static_assert(is_nothrow_move_constructible<allocator_type>::value == 471*4bdff4beSrobert is_nothrow_move_constructible<typename __map::allocator_type>::value, 472*4bdff4beSrobert "rebinding an allocator should not change excpetion guarantees"); 473*4bdff4beSrobert 474*4bdff4beSrobertprivate: 47546035553Spatrick struct __deque_block_range { 476*4bdff4beSrobert explicit _LIBCPP_HIDE_FROM_ABI 477*4bdff4beSrobert __deque_block_range(pointer __b, pointer __e) _NOEXCEPT : __begin_(__b), __end_(__e) {} 47846035553Spatrick const pointer __begin_; 47946035553Spatrick const pointer __end_; 48046035553Spatrick }; 48146035553Spatrick 48246035553Spatrick struct __deque_range { 48346035553Spatrick iterator __pos_; 48446035553Spatrick const iterator __end_; 48546035553Spatrick 486*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_range(iterator __pos, iterator __e) _NOEXCEPT 48746035553Spatrick : __pos_(__pos), __end_(__e) {} 48846035553Spatrick 489*4bdff4beSrobert explicit _LIBCPP_HIDE_FROM_ABI operator bool() const _NOEXCEPT { 49046035553Spatrick return __pos_ != __end_; 49146035553Spatrick } 49246035553Spatrick 493*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_range begin() const { 49446035553Spatrick return *this; 49546035553Spatrick } 49646035553Spatrick 497*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_range end() const { 49846035553Spatrick return __deque_range(__end_, __end_); 49946035553Spatrick } 500*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_block_range operator*() const _NOEXCEPT { 50146035553Spatrick if (__pos_.__m_iter_ == __end_.__m_iter_) { 50246035553Spatrick return __deque_block_range(__pos_.__ptr_, __end_.__ptr_); 50346035553Spatrick } 50446035553Spatrick return __deque_block_range(__pos_.__ptr_, *__pos_.__m_iter_ + __block_size); 50546035553Spatrick } 50646035553Spatrick 507*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI __deque_range& operator++() _NOEXCEPT { 50846035553Spatrick if (__pos_.__m_iter_ == __end_.__m_iter_) { 50946035553Spatrick __pos_ = __end_; 51046035553Spatrick } else { 51146035553Spatrick ++__pos_.__m_iter_; 51246035553Spatrick __pos_.__ptr_ = *__pos_.__m_iter_; 51346035553Spatrick } 51446035553Spatrick return *this; 51546035553Spatrick } 51646035553Spatrick 51746035553Spatrick 518*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend bool operator==(__deque_range const& __lhs, __deque_range const& __rhs) { 51946035553Spatrick return __lhs.__pos_ == __rhs.__pos_; 52046035553Spatrick } 521*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI friend bool operator!=(__deque_range const& __lhs, __deque_range const& __rhs) { 52246035553Spatrick return !(__lhs == __rhs); 52346035553Spatrick } 52446035553Spatrick }; 52546035553Spatrick 52646035553Spatrick struct _ConstructTransaction { 527*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _ConstructTransaction(deque* __db, __deque_block_range& __r) 52846035553Spatrick : __pos_(__r.__begin_), __end_(__r.__end_), __begin_(__r.__begin_), __base_(__db) {} 52946035553Spatrick 53046035553Spatrick 531*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI ~_ConstructTransaction() { 532*4bdff4beSrobert __base_->__size() += (__pos_ - __begin_); 53346035553Spatrick } 53446035553Spatrick 53546035553Spatrick pointer __pos_; 53646035553Spatrick const pointer __end_; 53746035553Spatrick private: 53846035553Spatrick const pointer __begin_; 539*4bdff4beSrobert deque* const __base_; 54046035553Spatrick }; 54146035553Spatrick 542*4bdff4beSrobert static const difference_type __block_size; 543*4bdff4beSrobert 54446035553Spatrick __map __map_; 54546035553Spatrick size_type __start_; 54646035553Spatrick __compressed_pair<size_type, allocator_type> __size_; 54746035553Spatrick 54846035553Spatrickpublic: 549*4bdff4beSrobert 550*4bdff4beSrobert // construct/copy/destroy: 551*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 552*4bdff4beSrobert deque() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 553*4bdff4beSrobert : __start_(0), __size_(0, __default_init_tag()) {} 554*4bdff4beSrobert 555*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI ~deque() { 556*4bdff4beSrobert clear(); 557*4bdff4beSrobert typename __map::iterator __i = __map_.begin(); 558*4bdff4beSrobert typename __map::iterator __e = __map_.end(); 559*4bdff4beSrobert for (; __i != __e; ++__i) 560*4bdff4beSrobert __alloc_traits::deallocate(__alloc(), *__i, __block_size); 561*4bdff4beSrobert } 562*4bdff4beSrobert 563*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI explicit deque(const allocator_type& __a) 564*4bdff4beSrobert : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {} 565*4bdff4beSrobert 566*4bdff4beSrobert explicit _LIBCPP_HIDE_FROM_ABI deque(size_type __n); 567*4bdff4beSrobert#if _LIBCPP_STD_VER > 11 568*4bdff4beSrobert explicit _LIBCPP_HIDE_FROM_ABI deque(size_type __n, const _Allocator& __a); 569*4bdff4beSrobert#endif 570*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(size_type __n, const value_type& __v); 571*4bdff4beSrobert 572*4bdff4beSrobert template <class = __enable_if_t<__is_allocator<_Allocator>::value> > 573*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(size_type __n, const value_type& __v, const allocator_type& __a) 574*4bdff4beSrobert : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) 575*4bdff4beSrobert { 576*4bdff4beSrobert if (__n > 0) 577*4bdff4beSrobert __append(__n, __v); 578*4bdff4beSrobert } 579*4bdff4beSrobert 580*4bdff4beSrobert template <class _InputIter> 581*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(_InputIter __f, _InputIter __l, 582*4bdff4beSrobert typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type* = 0); 583*4bdff4beSrobert template <class _InputIter> 584*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(_InputIter __f, _InputIter __l, const allocator_type& __a, 585*4bdff4beSrobert typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type* = 0); 586*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(const deque& __c); 587*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(const deque& __c, const __type_identity_t<allocator_type>& __a); 588*4bdff4beSrobert 589*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque& operator=(const deque& __c); 59046035553Spatrick 59146035553Spatrick#ifndef _LIBCPP_CXX03_LANG 592*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(initializer_list<value_type> __il); 593*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI deque(initializer_list<value_type> __il, const allocator_type& __a); 594*4bdff4beSrobert 595*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 596*4bdff4beSrobert deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;} 597*4bdff4beSrobert 598*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 599*4bdff4beSrobert deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 600*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 601*4bdff4beSrobert deque(deque&& __c, const __type_identity_t<allocator_type>& __a); 602*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 603*4bdff4beSrobert deque& operator=(deque&& __c) 604*4bdff4beSrobert _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 605*4bdff4beSrobert is_nothrow_move_assignable<allocator_type>::value); 606*4bdff4beSrobert 607*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 608*4bdff4beSrobert void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());} 60946035553Spatrick#endif // _LIBCPP_CXX03_LANG 61046035553Spatrick 611*4bdff4beSrobert template <class _InputIter> 612*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void assign(_InputIter __f, _InputIter __l, 613*4bdff4beSrobert typename enable_if<__is_cpp17_input_iterator<_InputIter>::value && 614*4bdff4beSrobert !__is_cpp17_random_access_iterator<_InputIter>::value>::type* = 0); 615*4bdff4beSrobert template <class _RAIter> 616*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void assign(_RAIter __f, _RAIter __l, 617*4bdff4beSrobert typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type* = 0); 618*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void assign(size_type __n, const value_type& __v); 619*4bdff4beSrobert 620*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 621*4bdff4beSrobert allocator_type get_allocator() const _NOEXCEPT; 622*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI allocator_type& __alloc() _NOEXCEPT { return __size_.second(); } 623*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI const allocator_type& __alloc() const _NOEXCEPT { return __size_.second(); } 624*4bdff4beSrobert 625*4bdff4beSrobert // iterators: 626*4bdff4beSrobert 627*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { 628*4bdff4beSrobert __map_pointer __mp = __map_.begin() + __start_ / __block_size; 629*4bdff4beSrobert return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size); 630*4bdff4beSrobert } 631*4bdff4beSrobert 632*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { 633*4bdff4beSrobert __map_const_pointer __mp = 634*4bdff4beSrobert static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size); 635*4bdff4beSrobert return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size); 636*4bdff4beSrobert } 637*4bdff4beSrobert 638*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT { 639*4bdff4beSrobert size_type __p = size() + __start_; 640*4bdff4beSrobert __map_pointer __mp = __map_.begin() + __p / __block_size; 641*4bdff4beSrobert return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size); 642*4bdff4beSrobert } 643*4bdff4beSrobert 644*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { 645*4bdff4beSrobert size_type __p = size() + __start_; 646*4bdff4beSrobert __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size); 647*4bdff4beSrobert return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size); 648*4bdff4beSrobert } 649*4bdff4beSrobert 650*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 651*4bdff4beSrobert reverse_iterator rbegin() _NOEXCEPT 652*4bdff4beSrobert {return reverse_iterator(end());} 653*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 654*4bdff4beSrobert const_reverse_iterator rbegin() const _NOEXCEPT 655*4bdff4beSrobert {return const_reverse_iterator(end());} 656*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 657*4bdff4beSrobert reverse_iterator rend() _NOEXCEPT 658*4bdff4beSrobert {return reverse_iterator(begin());} 659*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 660*4bdff4beSrobert const_reverse_iterator rend() const _NOEXCEPT 661*4bdff4beSrobert {return const_reverse_iterator(begin());} 662*4bdff4beSrobert 663*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 664*4bdff4beSrobert const_iterator cbegin() const _NOEXCEPT 665*4bdff4beSrobert {return begin();} 666*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 667*4bdff4beSrobert const_iterator cend() const _NOEXCEPT 668*4bdff4beSrobert {return end();} 669*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 670*4bdff4beSrobert const_reverse_iterator crbegin() const _NOEXCEPT 671*4bdff4beSrobert {return const_reverse_iterator(end());} 672*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 673*4bdff4beSrobert const_reverse_iterator crend() const _NOEXCEPT 674*4bdff4beSrobert {return const_reverse_iterator(begin());} 675*4bdff4beSrobert 676*4bdff4beSrobert // capacity: 677*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 678*4bdff4beSrobert size_type size() const _NOEXCEPT {return __size();} 679*4bdff4beSrobert 680*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI size_type& __size() _NOEXCEPT { return __size_.first(); } 681*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI const size_type& __size() const _NOEXCEPT { return __size_.first(); } 682*4bdff4beSrobert 683*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 684*4bdff4beSrobert size_type max_size() const _NOEXCEPT 685*4bdff4beSrobert {return _VSTD::min<size_type>( 686*4bdff4beSrobert __alloc_traits::max_size(__alloc()), 687*4bdff4beSrobert numeric_limits<difference_type>::max());} 688*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void resize(size_type __n); 689*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void resize(size_type __n, const value_type& __v); 690*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void shrink_to_fit() _NOEXCEPT; 691*4bdff4beSrobert _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI 692*4bdff4beSrobert bool empty() const _NOEXCEPT {return size() == 0;} 693*4bdff4beSrobert 694*4bdff4beSrobert // element access: 695*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 696*4bdff4beSrobert reference operator[](size_type __i) _NOEXCEPT; 697*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 698*4bdff4beSrobert const_reference operator[](size_type __i) const _NOEXCEPT; 699*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 700*4bdff4beSrobert reference at(size_type __i); 701*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 702*4bdff4beSrobert const_reference at(size_type __i) const; 703*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 704*4bdff4beSrobert reference front() _NOEXCEPT; 705*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 706*4bdff4beSrobert const_reference front() const _NOEXCEPT; 707*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 708*4bdff4beSrobert reference back() _NOEXCEPT; 709*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 710*4bdff4beSrobert const_reference back() const _NOEXCEPT; 711*4bdff4beSrobert 712*4bdff4beSrobert // 23.2.2.3 modifiers: 713*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void push_front(const value_type& __v); 714*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void push_back(const value_type& __v); 715*4bdff4beSrobert#ifndef _LIBCPP_CXX03_LANG 716*4bdff4beSrobert#if _LIBCPP_STD_VER > 14 717*4bdff4beSrobert template <class... _Args> _LIBCPP_HIDE_FROM_ABI reference emplace_front(_Args&&... __args); 718*4bdff4beSrobert template <class... _Args> _LIBCPP_HIDE_FROM_ABI reference emplace_back (_Args&&... __args); 719*4bdff4beSrobert#else 720*4bdff4beSrobert template <class... _Args> _LIBCPP_HIDE_FROM_ABI void emplace_front(_Args&&... __args); 721*4bdff4beSrobert template <class... _Args> _LIBCPP_HIDE_FROM_ABI void emplace_back (_Args&&... __args); 722*4bdff4beSrobert#endif 723*4bdff4beSrobert template <class... _Args> _LIBCPP_HIDE_FROM_ABI iterator emplace(const_iterator __p, _Args&&... __args); 724*4bdff4beSrobert 725*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void push_front(value_type&& __v); 726*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void push_back(value_type&& __v); 727*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, value_type&& __v); 728*4bdff4beSrobert 729*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 730*4bdff4beSrobert iterator insert(const_iterator __p, initializer_list<value_type> __il) 731*4bdff4beSrobert {return insert(__p, __il.begin(), __il.end());} 732*4bdff4beSrobert#endif // _LIBCPP_CXX03_LANG 733*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, const value_type& __v); 734*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, size_type __n, const value_type& __v); 735*4bdff4beSrobert template <class _InputIter> 736*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, _InputIter __f, _InputIter __l, 737*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InputIter>::value>::type* = 0); 738*4bdff4beSrobert template <class _ForwardIterator> 739*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l, 740*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0); 741*4bdff4beSrobert template <class _BiIter> 742*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, _BiIter __f, _BiIter __l, 743*4bdff4beSrobert typename enable_if<__is_cpp17_bidirectional_iterator<_BiIter>::value>::type* = 0); 744*4bdff4beSrobert 745*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void pop_front(); 746*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void pop_back(); 747*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __p); 748*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __f, const_iterator __l); 749*4bdff4beSrobert 750*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 751*4bdff4beSrobert void swap(deque& __c) 75246035553Spatrick#if _LIBCPP_STD_VER >= 14 75346035553Spatrick _NOEXCEPT; 75446035553Spatrick#else 75546035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 75646035553Spatrick __is_nothrow_swappable<allocator_type>::value); 75746035553Spatrick#endif 758*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 75946035553Spatrick void clear() _NOEXCEPT; 76046035553Spatrick 761*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 762*4bdff4beSrobert bool __invariants() const { 76346035553Spatrick if (!__map_.__invariants()) 76446035553Spatrick return false; 76546035553Spatrick if (__map_.size() >= size_type(-1) / __block_size) 76646035553Spatrick return false; 76746035553Spatrick for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end(); 76846035553Spatrick __i != __e; ++__i) 76946035553Spatrick if (*__i == nullptr) 77046035553Spatrick return false; 77146035553Spatrick if (__map_.size() != 0) 77246035553Spatrick { 77346035553Spatrick if (size() >= __map_.size() * __block_size) 77446035553Spatrick return false; 77546035553Spatrick if (__start_ >= __map_.size() * __block_size - size()) 77646035553Spatrick return false; 77746035553Spatrick } 77846035553Spatrick else 77946035553Spatrick { 78046035553Spatrick if (size() != 0) 78146035553Spatrick return false; 78246035553Spatrick if (__start_ != 0) 78346035553Spatrick return false; 78446035553Spatrick } 78546035553Spatrick return true; 78646035553Spatrick } 78746035553Spatrick 788*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 789*4bdff4beSrobert void __move_assign_alloc(deque& __c) 790*4bdff4beSrobert _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value || 791*4bdff4beSrobert is_nothrow_move_assignable<allocator_type>::value) 792*4bdff4beSrobert {__move_assign_alloc(__c, integral_constant<bool, 793*4bdff4beSrobert __alloc_traits::propagate_on_container_move_assignment::value>());} 794*4bdff4beSrobert 795*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 796*4bdff4beSrobert void __move_assign_alloc(deque& __c, true_type) 797*4bdff4beSrobert _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 79846035553Spatrick { 799*4bdff4beSrobert __alloc() = _VSTD::move(__c.__alloc()); 80046035553Spatrick } 80146035553Spatrick 802*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 803*4bdff4beSrobert void __move_assign_alloc(deque&, false_type) _NOEXCEPT 80446035553Spatrick {} 80546035553Spatrick 806*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 807*4bdff4beSrobert void __move_assign(deque& __c) 80846035553Spatrick _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 809*4bdff4beSrobert is_nothrow_move_assignable<allocator_type>::value) 810*4bdff4beSrobert { 811*4bdff4beSrobert __map_ = _VSTD::move(__c.__map_); 812*4bdff4beSrobert __start_ = __c.__start_; 813*4bdff4beSrobert __size() = __c.size(); 814*4bdff4beSrobert __move_assign_alloc(__c); 815*4bdff4beSrobert __c.__start_ = __c.__size() = 0; 816*4bdff4beSrobert } 81746035553Spatrick 818*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 81946035553Spatrick static size_type __recommend_blocks(size_type __n) 82046035553Spatrick { 821*4bdff4beSrobert return __n / __block_size + (__n % __block_size != 0); 82246035553Spatrick } 823*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 82446035553Spatrick size_type __capacity() const 82546035553Spatrick { 826*4bdff4beSrobert return __map_.size() == 0 ? 0 : __map_.size() * __block_size - 1; 82746035553Spatrick } 828*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 82946035553Spatrick size_type __block_count() const 83046035553Spatrick { 831*4bdff4beSrobert return __map_.size(); 83246035553Spatrick } 83346035553Spatrick 834*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 83546035553Spatrick size_type __front_spare() const 83646035553Spatrick { 837*4bdff4beSrobert return __start_; 83846035553Spatrick } 839*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 84046035553Spatrick size_type __front_spare_blocks() const { 841*4bdff4beSrobert return __front_spare() / __block_size; 84246035553Spatrick } 843*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 84446035553Spatrick size_type __back_spare() const 84546035553Spatrick { 846*4bdff4beSrobert return __capacity() - (__start_ + size()); 84746035553Spatrick } 848*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 84946035553Spatrick size_type __back_spare_blocks() const { 850*4bdff4beSrobert return __back_spare() / __block_size; 85146035553Spatrick } 85246035553Spatrick 85346035553Spatrick private: 854*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 85546035553Spatrick bool __maybe_remove_front_spare(bool __keep_one = true) { 85646035553Spatrick if (__front_spare_blocks() >= 2 || (!__keep_one && __front_spare_blocks())) { 857*4bdff4beSrobert __alloc_traits::deallocate(__alloc(), __map_.front(), 858*4bdff4beSrobert __block_size); 859*4bdff4beSrobert __map_.pop_front(); 860*4bdff4beSrobert __start_ -= __block_size; 86146035553Spatrick return true; 86246035553Spatrick } 86346035553Spatrick return false; 86446035553Spatrick } 86546035553Spatrick 866*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 86746035553Spatrick bool __maybe_remove_back_spare(bool __keep_one = true) { 86846035553Spatrick if (__back_spare_blocks() >= 2 || (!__keep_one && __back_spare_blocks())) { 869*4bdff4beSrobert __alloc_traits::deallocate(__alloc(), __map_.back(), 870*4bdff4beSrobert __block_size); 871*4bdff4beSrobert __map_.pop_back(); 87246035553Spatrick return true; 87346035553Spatrick } 87446035553Spatrick return false; 87546035553Spatrick } 87646035553Spatrick 87746035553Spatrick template <class _InpIter> 878*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __append(_InpIter __f, _InpIter __l, 879*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InpIter>::value>::type* = 0); 88046035553Spatrick template <class _ForIter> 881*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __append(_ForIter __f, _ForIter __l, 88246035553Spatrick typename enable_if<__is_cpp17_forward_iterator<_ForIter>::value>::type* = 0); 883*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __append(size_type __n); 884*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __append(size_type __n, const value_type& __v); 885*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __erase_to_end(const_iterator __f); 886*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __add_front_capacity(); 887*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __add_front_capacity(size_type __n); 888*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __add_back_capacity(); 889*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __add_back_capacity(size_type __n); 890*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator __move_and_check(iterator __f, iterator __l, iterator __r, 89146035553Spatrick const_pointer& __vt); 892*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r, 89346035553Spatrick const_pointer& __vt); 894*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __move_construct_and_check(iterator __f, iterator __l, 89546035553Spatrick iterator __r, const_pointer& __vt); 896*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __move_construct_backward_and_check(iterator __f, iterator __l, 89746035553Spatrick iterator __r, const_pointer& __vt); 89846035553Spatrick 899*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 90046035553Spatrick void __copy_assign_alloc(const deque& __c) 90146035553Spatrick {__copy_assign_alloc(__c, integral_constant<bool, 90246035553Spatrick __alloc_traits::propagate_on_container_copy_assignment::value>());} 90346035553Spatrick 904*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 90546035553Spatrick void __copy_assign_alloc(const deque& __c, true_type) 90646035553Spatrick { 907*4bdff4beSrobert if (__alloc() != __c.__alloc()) 90846035553Spatrick { 90946035553Spatrick clear(); 91046035553Spatrick shrink_to_fit(); 91146035553Spatrick } 912*4bdff4beSrobert __alloc() = __c.__alloc(); 913*4bdff4beSrobert __map_.__alloc() = __c.__map_.__alloc(); 91446035553Spatrick } 91546035553Spatrick 916*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI 91746035553Spatrick void __copy_assign_alloc(const deque&, false_type) 91846035553Spatrick {} 91946035553Spatrick 920*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __move_assign(deque& __c, true_type) 92146035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 922*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __move_assign(deque& __c, false_type); 92346035553Spatrick}; 92446035553Spatrick 925*4bdff4beSroberttemplate <class _Tp, class _Alloc> 926*4bdff4beSrobert_LIBCPP_CONSTEXPR const typename allocator_traits<_Alloc>::difference_type deque<_Tp, _Alloc>::__block_size = 927*4bdff4beSrobert __deque_block_size<value_type, difference_type>::value; 928*4bdff4beSrobert 929*4bdff4beSrobert#if _LIBCPP_STD_VER >= 17 93046035553Spatricktemplate<class _InputIterator, 93176d0caaeSpatrick class _Alloc = allocator<__iter_value_type<_InputIterator>>, 932*4bdff4beSrobert class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 933*4bdff4beSrobert class = enable_if_t<__is_allocator<_Alloc>::value> 93446035553Spatrick > 93546035553Spatrickdeque(_InputIterator, _InputIterator) 93676d0caaeSpatrick -> deque<__iter_value_type<_InputIterator>, _Alloc>; 93746035553Spatrick 93846035553Spatricktemplate<class _InputIterator, 93946035553Spatrick class _Alloc, 940*4bdff4beSrobert class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 941*4bdff4beSrobert class = enable_if_t<__is_allocator<_Alloc>::value> 94246035553Spatrick > 94346035553Spatrickdeque(_InputIterator, _InputIterator, _Alloc) 94476d0caaeSpatrick -> deque<__iter_value_type<_InputIterator>, _Alloc>; 94546035553Spatrick#endif 94646035553Spatrick 94746035553Spatricktemplate <class _Tp, class _Allocator> 94846035553Spatrickdeque<_Tp, _Allocator>::deque(size_type __n) 949*4bdff4beSrobert : __start_(0), __size_(0, __default_init_tag()) 95046035553Spatrick{ 95146035553Spatrick if (__n > 0) 95246035553Spatrick __append(__n); 95346035553Spatrick} 95446035553Spatrick 95546035553Spatrick#if _LIBCPP_STD_VER > 11 95646035553Spatricktemplate <class _Tp, class _Allocator> 95746035553Spatrickdeque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a) 958*4bdff4beSrobert : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) 95946035553Spatrick{ 96046035553Spatrick if (__n > 0) 96146035553Spatrick __append(__n); 96246035553Spatrick} 96346035553Spatrick#endif 96446035553Spatrick 96546035553Spatricktemplate <class _Tp, class _Allocator> 96646035553Spatrickdeque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v) 967*4bdff4beSrobert : __start_(0), __size_(0, __default_init_tag()) 96846035553Spatrick{ 96946035553Spatrick if (__n > 0) 97046035553Spatrick __append(__n, __v); 97146035553Spatrick} 97246035553Spatrick 97346035553Spatricktemplate <class _Tp, class _Allocator> 97446035553Spatricktemplate <class _InputIter> 97546035553Spatrickdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, 97646035553Spatrick typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type*) 977*4bdff4beSrobert : __start_(0), __size_(0, __default_init_tag()) 97846035553Spatrick{ 97946035553Spatrick __append(__f, __l); 98046035553Spatrick} 98146035553Spatrick 98246035553Spatricktemplate <class _Tp, class _Allocator> 98346035553Spatricktemplate <class _InputIter> 98446035553Spatrickdeque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a, 98546035553Spatrick typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type*) 986*4bdff4beSrobert : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) 98746035553Spatrick{ 98846035553Spatrick __append(__f, __l); 98946035553Spatrick} 99046035553Spatrick 99146035553Spatricktemplate <class _Tp, class _Allocator> 99246035553Spatrickdeque<_Tp, _Allocator>::deque(const deque& __c) 993*4bdff4beSrobert : __map_(__pointer_allocator(__alloc_traits::select_on_container_copy_construction(__c.__alloc()))), 994*4bdff4beSrobert __start_(0), 995*4bdff4beSrobert __size_(0, __map_.__alloc()) 99646035553Spatrick{ 99746035553Spatrick __append(__c.begin(), __c.end()); 99846035553Spatrick} 99946035553Spatrick 100046035553Spatricktemplate <class _Tp, class _Allocator> 1001*4bdff4beSrobertdeque<_Tp, _Allocator>::deque(const deque& __c, const __type_identity_t<allocator_type>& __a) 1002*4bdff4beSrobert : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) 100346035553Spatrick{ 100446035553Spatrick __append(__c.begin(), __c.end()); 100546035553Spatrick} 100646035553Spatrick 100746035553Spatricktemplate <class _Tp, class _Allocator> 100846035553Spatrickdeque<_Tp, _Allocator>& 100946035553Spatrickdeque<_Tp, _Allocator>::operator=(const deque& __c) 101046035553Spatrick{ 1011*4bdff4beSrobert if (this != _VSTD::addressof(__c)) 101246035553Spatrick { 101346035553Spatrick __copy_assign_alloc(__c); 101446035553Spatrick assign(__c.begin(), __c.end()); 101546035553Spatrick } 101646035553Spatrick return *this; 101746035553Spatrick} 101846035553Spatrick 101946035553Spatrick#ifndef _LIBCPP_CXX03_LANG 102046035553Spatrick 102146035553Spatricktemplate <class _Tp, class _Allocator> 102246035553Spatrickdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il) 1023*4bdff4beSrobert : __start_(0), __size_(0, __default_init_tag()) 102446035553Spatrick{ 102546035553Spatrick __append(__il.begin(), __il.end()); 102646035553Spatrick} 102746035553Spatrick 102846035553Spatricktemplate <class _Tp, class _Allocator> 102946035553Spatrickdeque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a) 1030*4bdff4beSrobert : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) 103146035553Spatrick{ 103246035553Spatrick __append(__il.begin(), __il.end()); 103346035553Spatrick} 103446035553Spatrick 103546035553Spatricktemplate <class _Tp, class _Allocator> 103646035553Spatrickinline 103746035553Spatrickdeque<_Tp, _Allocator>::deque(deque&& __c) 1038*4bdff4beSrobert _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 1039*4bdff4beSrobert : __map_(std::move(__c.__map_)), __start_(std::move(__c.__start_)), __size_(std::move(__c.__size_)) 104046035553Spatrick{ 1041*4bdff4beSrobert __c.__start_ = 0; 1042*4bdff4beSrobert __c.__size() = 0; 104346035553Spatrick} 104446035553Spatrick 104546035553Spatricktemplate <class _Tp, class _Allocator> 104646035553Spatrickinline 1047*4bdff4beSrobertdeque<_Tp, _Allocator>::deque(deque&& __c, const __type_identity_t<allocator_type>& __a) 1048*4bdff4beSrobert : __map_(std::move(__c.__map_), __pointer_allocator(__a)), 1049*4bdff4beSrobert __start_(std::move(__c.__start_)), 1050*4bdff4beSrobert __size_(std::move(__c.__size()), __a) 105146035553Spatrick{ 1052*4bdff4beSrobert if (__a == __c.__alloc()) 105346035553Spatrick { 1054*4bdff4beSrobert __c.__start_ = 0; 1055*4bdff4beSrobert __c.__size() = 0; 1056*4bdff4beSrobert } 1057*4bdff4beSrobert else 1058*4bdff4beSrobert { 1059*4bdff4beSrobert __map_.clear(); 1060*4bdff4beSrobert __start_ = 0; 1061*4bdff4beSrobert __size() = 0; 106246035553Spatrick typedef move_iterator<iterator> _Ip; 106346035553Spatrick assign(_Ip(__c.begin()), _Ip(__c.end())); 106446035553Spatrick } 106546035553Spatrick} 106646035553Spatrick 106746035553Spatricktemplate <class _Tp, class _Allocator> 106846035553Spatrickinline 106946035553Spatrickdeque<_Tp, _Allocator>& 107046035553Spatrickdeque<_Tp, _Allocator>::operator=(deque&& __c) 107146035553Spatrick _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 107246035553Spatrick is_nothrow_move_assignable<allocator_type>::value) 107346035553Spatrick{ 107446035553Spatrick __move_assign(__c, integral_constant<bool, 107546035553Spatrick __alloc_traits::propagate_on_container_move_assignment::value>()); 107646035553Spatrick return *this; 107746035553Spatrick} 107846035553Spatrick 107946035553Spatricktemplate <class _Tp, class _Allocator> 108046035553Spatrickvoid 108146035553Spatrickdeque<_Tp, _Allocator>::__move_assign(deque& __c, false_type) 108246035553Spatrick{ 1083*4bdff4beSrobert if (__alloc() != __c.__alloc()) 108446035553Spatrick { 108546035553Spatrick typedef move_iterator<iterator> _Ip; 108646035553Spatrick assign(_Ip(__c.begin()), _Ip(__c.end())); 108746035553Spatrick } 108846035553Spatrick else 108946035553Spatrick __move_assign(__c, true_type()); 109046035553Spatrick} 109146035553Spatrick 109246035553Spatricktemplate <class _Tp, class _Allocator> 109346035553Spatrickvoid 109446035553Spatrickdeque<_Tp, _Allocator>::__move_assign(deque& __c, true_type) 109546035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 109646035553Spatrick{ 109746035553Spatrick clear(); 109846035553Spatrick shrink_to_fit(); 1099*4bdff4beSrobert __move_assign(__c); 110046035553Spatrick} 110146035553Spatrick 110246035553Spatrick#endif // _LIBCPP_CXX03_LANG 110346035553Spatrick 110446035553Spatricktemplate <class _Tp, class _Allocator> 110546035553Spatricktemplate <class _InputIter> 110646035553Spatrickvoid 110746035553Spatrickdeque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l, 110846035553Spatrick typename enable_if<__is_cpp17_input_iterator<_InputIter>::value && 110946035553Spatrick !__is_cpp17_random_access_iterator<_InputIter>::value>::type*) 111046035553Spatrick{ 1111*4bdff4beSrobert iterator __i = begin(); 1112*4bdff4beSrobert iterator __e = end(); 111346035553Spatrick for (; __f != __l && __i != __e; ++__f, (void) ++__i) 111446035553Spatrick *__i = *__f; 111546035553Spatrick if (__f != __l) 111646035553Spatrick __append(__f, __l); 111746035553Spatrick else 111846035553Spatrick __erase_to_end(__i); 111946035553Spatrick} 112046035553Spatrick 112146035553Spatricktemplate <class _Tp, class _Allocator> 112246035553Spatricktemplate <class _RAIter> 112346035553Spatrickvoid 112446035553Spatrickdeque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l, 112546035553Spatrick typename enable_if<__is_cpp17_random_access_iterator<_RAIter>::value>::type*) 112646035553Spatrick{ 1127*4bdff4beSrobert if (static_cast<size_type>(__l - __f) > size()) 112846035553Spatrick { 1129*4bdff4beSrobert _RAIter __m = __f + size(); 1130*4bdff4beSrobert _VSTD::copy(__f, __m, begin()); 113146035553Spatrick __append(__m, __l); 113246035553Spatrick } 113346035553Spatrick else 1134*4bdff4beSrobert __erase_to_end(_VSTD::copy(__f, __l, begin())); 113546035553Spatrick} 113646035553Spatrick 113746035553Spatricktemplate <class _Tp, class _Allocator> 113846035553Spatrickvoid 113946035553Spatrickdeque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v) 114046035553Spatrick{ 1141*4bdff4beSrobert if (__n > size()) 114246035553Spatrick { 1143*4bdff4beSrobert _VSTD::fill_n(begin(), size(), __v); 1144*4bdff4beSrobert __n -= size(); 114546035553Spatrick __append(__n, __v); 114646035553Spatrick } 114746035553Spatrick else 1148*4bdff4beSrobert __erase_to_end(_VSTD::fill_n(begin(), __n, __v)); 114946035553Spatrick} 115046035553Spatrick 115146035553Spatricktemplate <class _Tp, class _Allocator> 115246035553Spatrickinline 115346035553Spatrick_Allocator 115446035553Spatrickdeque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT 115546035553Spatrick{ 1156*4bdff4beSrobert return __alloc(); 115746035553Spatrick} 115846035553Spatrick 115946035553Spatricktemplate <class _Tp, class _Allocator> 116046035553Spatrickvoid 116146035553Spatrickdeque<_Tp, _Allocator>::resize(size_type __n) 116246035553Spatrick{ 1163*4bdff4beSrobert if (__n > size()) 1164*4bdff4beSrobert __append(__n - size()); 1165*4bdff4beSrobert else if (__n < size()) 1166*4bdff4beSrobert __erase_to_end(begin() + __n); 116746035553Spatrick} 116846035553Spatrick 116946035553Spatricktemplate <class _Tp, class _Allocator> 117046035553Spatrickvoid 117146035553Spatrickdeque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v) 117246035553Spatrick{ 1173*4bdff4beSrobert if (__n > size()) 1174*4bdff4beSrobert __append(__n - size(), __v); 1175*4bdff4beSrobert else if (__n < size()) 1176*4bdff4beSrobert __erase_to_end(begin() + __n); 117746035553Spatrick} 117846035553Spatrick 117946035553Spatricktemplate <class _Tp, class _Allocator> 118046035553Spatrickvoid 118146035553Spatrickdeque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT 118246035553Spatrick{ 1183*4bdff4beSrobert allocator_type& __a = __alloc(); 118446035553Spatrick if (empty()) 118546035553Spatrick { 1186*4bdff4beSrobert while (__map_.size() > 0) 118746035553Spatrick { 1188*4bdff4beSrobert __alloc_traits::deallocate(__a, __map_.back(), __block_size); 1189*4bdff4beSrobert __map_.pop_back(); 119046035553Spatrick } 1191*4bdff4beSrobert __start_ = 0; 119246035553Spatrick } 119346035553Spatrick else 119446035553Spatrick { 119546035553Spatrick __maybe_remove_front_spare(/*__keep_one=*/false); 119646035553Spatrick __maybe_remove_back_spare(/*__keep_one=*/false); 119746035553Spatrick } 1198*4bdff4beSrobert __map_.shrink_to_fit(); 119946035553Spatrick} 120046035553Spatrick 120146035553Spatricktemplate <class _Tp, class _Allocator> 120246035553Spatrickinline 120346035553Spatricktypename deque<_Tp, _Allocator>::reference 120446035553Spatrickdeque<_Tp, _Allocator>::operator[](size_type __i) _NOEXCEPT 120546035553Spatrick{ 1206*4bdff4beSrobert size_type __p = __start_ + __i; 1207*4bdff4beSrobert return *(*(__map_.begin() + __p / __block_size) + __p % __block_size); 120846035553Spatrick} 120946035553Spatrick 121046035553Spatricktemplate <class _Tp, class _Allocator> 121146035553Spatrickinline 121246035553Spatricktypename deque<_Tp, _Allocator>::const_reference 121346035553Spatrickdeque<_Tp, _Allocator>::operator[](size_type __i) const _NOEXCEPT 121446035553Spatrick{ 1215*4bdff4beSrobert size_type __p = __start_ + __i; 1216*4bdff4beSrobert return *(*(__map_.begin() + __p / __block_size) + __p % __block_size); 121746035553Spatrick} 121846035553Spatrick 121946035553Spatricktemplate <class _Tp, class _Allocator> 122046035553Spatrickinline 122146035553Spatricktypename deque<_Tp, _Allocator>::reference 122246035553Spatrickdeque<_Tp, _Allocator>::at(size_type __i) 122346035553Spatrick{ 1224*4bdff4beSrobert if (__i >= size()) 1225*4bdff4beSrobert _VSTD::__throw_out_of_range("deque"); 1226*4bdff4beSrobert size_type __p = __start_ + __i; 1227*4bdff4beSrobert return *(*(__map_.begin() + __p / __block_size) + __p % __block_size); 122846035553Spatrick} 122946035553Spatrick 123046035553Spatricktemplate <class _Tp, class _Allocator> 123146035553Spatrickinline 123246035553Spatricktypename deque<_Tp, _Allocator>::const_reference 123346035553Spatrickdeque<_Tp, _Allocator>::at(size_type __i) const 123446035553Spatrick{ 1235*4bdff4beSrobert if (__i >= size()) 1236*4bdff4beSrobert _VSTD::__throw_out_of_range("deque"); 1237*4bdff4beSrobert size_type __p = __start_ + __i; 1238*4bdff4beSrobert return *(*(__map_.begin() + __p / __block_size) + __p % __block_size); 123946035553Spatrick} 124046035553Spatrick 124146035553Spatricktemplate <class _Tp, class _Allocator> 124246035553Spatrickinline 124346035553Spatricktypename deque<_Tp, _Allocator>::reference 124446035553Spatrickdeque<_Tp, _Allocator>::front() _NOEXCEPT 124546035553Spatrick{ 1246*4bdff4beSrobert return *(*(__map_.begin() + __start_ / __block_size) 1247*4bdff4beSrobert + __start_ % __block_size); 124846035553Spatrick} 124946035553Spatrick 125046035553Spatricktemplate <class _Tp, class _Allocator> 125146035553Spatrickinline 125246035553Spatricktypename deque<_Tp, _Allocator>::const_reference 125346035553Spatrickdeque<_Tp, _Allocator>::front() const _NOEXCEPT 125446035553Spatrick{ 1255*4bdff4beSrobert return *(*(__map_.begin() + __start_ / __block_size) 1256*4bdff4beSrobert + __start_ % __block_size); 125746035553Spatrick} 125846035553Spatrick 125946035553Spatricktemplate <class _Tp, class _Allocator> 126046035553Spatrickinline 126146035553Spatricktypename deque<_Tp, _Allocator>::reference 126246035553Spatrickdeque<_Tp, _Allocator>::back() _NOEXCEPT 126346035553Spatrick{ 1264*4bdff4beSrobert size_type __p = size() + __start_ - 1; 1265*4bdff4beSrobert return *(*(__map_.begin() + __p / __block_size) + __p % __block_size); 126646035553Spatrick} 126746035553Spatrick 126846035553Spatricktemplate <class _Tp, class _Allocator> 126946035553Spatrickinline 127046035553Spatricktypename deque<_Tp, _Allocator>::const_reference 127146035553Spatrickdeque<_Tp, _Allocator>::back() const _NOEXCEPT 127246035553Spatrick{ 1273*4bdff4beSrobert size_type __p = size() + __start_ - 1; 1274*4bdff4beSrobert return *(*(__map_.begin() + __p / __block_size) + __p % __block_size); 127546035553Spatrick} 127646035553Spatrick 127746035553Spatricktemplate <class _Tp, class _Allocator> 127846035553Spatrickvoid 127946035553Spatrickdeque<_Tp, _Allocator>::push_back(const value_type& __v) 128046035553Spatrick{ 1281*4bdff4beSrobert allocator_type& __a = __alloc(); 128246035553Spatrick if (__back_spare() == 0) 128346035553Spatrick __add_back_capacity(); 128446035553Spatrick // __back_spare() >= 1 1285*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*end()), __v); 1286*4bdff4beSrobert ++__size(); 128746035553Spatrick} 128846035553Spatrick 128946035553Spatricktemplate <class _Tp, class _Allocator> 129046035553Spatrickvoid 129146035553Spatrickdeque<_Tp, _Allocator>::push_front(const value_type& __v) 129246035553Spatrick{ 1293*4bdff4beSrobert allocator_type& __a = __alloc(); 129446035553Spatrick if (__front_spare() == 0) 129546035553Spatrick __add_front_capacity(); 129646035553Spatrick // __front_spare() >= 1 1297*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*--begin()), __v); 1298*4bdff4beSrobert --__start_; 1299*4bdff4beSrobert ++__size(); 130046035553Spatrick} 130146035553Spatrick 130246035553Spatrick#ifndef _LIBCPP_CXX03_LANG 130346035553Spatricktemplate <class _Tp, class _Allocator> 130446035553Spatrickvoid 130546035553Spatrickdeque<_Tp, _Allocator>::push_back(value_type&& __v) 130646035553Spatrick{ 1307*4bdff4beSrobert allocator_type& __a = __alloc(); 130846035553Spatrick if (__back_spare() == 0) 130946035553Spatrick __add_back_capacity(); 131046035553Spatrick // __back_spare() >= 1 1311*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*end()), _VSTD::move(__v)); 1312*4bdff4beSrobert ++__size(); 131346035553Spatrick} 131446035553Spatrick 131546035553Spatricktemplate <class _Tp, class _Allocator> 131646035553Spatricktemplate <class... _Args> 131746035553Spatrick#if _LIBCPP_STD_VER > 14 131846035553Spatricktypename deque<_Tp, _Allocator>::reference 131946035553Spatrick#else 132046035553Spatrickvoid 132146035553Spatrick#endif 132246035553Spatrickdeque<_Tp, _Allocator>::emplace_back(_Args&&... __args) 132346035553Spatrick{ 1324*4bdff4beSrobert allocator_type& __a = __alloc(); 132546035553Spatrick if (__back_spare() == 0) 132646035553Spatrick __add_back_capacity(); 132746035553Spatrick // __back_spare() >= 1 1328*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*end()), 132946035553Spatrick _VSTD::forward<_Args>(__args)...); 1330*4bdff4beSrobert ++__size(); 133146035553Spatrick#if _LIBCPP_STD_VER > 14 1332*4bdff4beSrobert return *--end(); 133346035553Spatrick#endif 133446035553Spatrick} 133546035553Spatrick 133646035553Spatricktemplate <class _Tp, class _Allocator> 133746035553Spatrickvoid 133846035553Spatrickdeque<_Tp, _Allocator>::push_front(value_type&& __v) 133946035553Spatrick{ 1340*4bdff4beSrobert allocator_type& __a = __alloc(); 134146035553Spatrick if (__front_spare() == 0) 134246035553Spatrick __add_front_capacity(); 134346035553Spatrick // __front_spare() >= 1 1344*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*--begin()), _VSTD::move(__v)); 1345*4bdff4beSrobert --__start_; 1346*4bdff4beSrobert ++__size(); 134746035553Spatrick} 134846035553Spatrick 134946035553Spatrick 135046035553Spatricktemplate <class _Tp, class _Allocator> 135146035553Spatricktemplate <class... _Args> 135246035553Spatrick#if _LIBCPP_STD_VER > 14 135346035553Spatricktypename deque<_Tp, _Allocator>::reference 135446035553Spatrick#else 135546035553Spatrickvoid 135646035553Spatrick#endif 135746035553Spatrickdeque<_Tp, _Allocator>::emplace_front(_Args&&... __args) 135846035553Spatrick{ 1359*4bdff4beSrobert allocator_type& __a = __alloc(); 136046035553Spatrick if (__front_spare() == 0) 136146035553Spatrick __add_front_capacity(); 136246035553Spatrick // __front_spare() >= 1 1363*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*--begin()), _VSTD::forward<_Args>(__args)...); 1364*4bdff4beSrobert --__start_; 1365*4bdff4beSrobert ++__size(); 136646035553Spatrick#if _LIBCPP_STD_VER > 14 1367*4bdff4beSrobert return *begin(); 136846035553Spatrick#endif 136946035553Spatrick} 137046035553Spatrick 137146035553Spatricktemplate <class _Tp, class _Allocator> 137246035553Spatricktypename deque<_Tp, _Allocator>::iterator 137346035553Spatrickdeque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v) 137446035553Spatrick{ 1375*4bdff4beSrobert size_type __pos = __p - begin(); 1376*4bdff4beSrobert size_type __to_end = size() - __pos; 1377*4bdff4beSrobert allocator_type& __a = __alloc(); 137846035553Spatrick if (__pos < __to_end) 137946035553Spatrick { // insert by shifting things backward 138046035553Spatrick if (__front_spare() == 0) 138146035553Spatrick __add_front_capacity(); 138246035553Spatrick // __front_spare() >= 1 138346035553Spatrick if (__pos == 0) 138446035553Spatrick { 1385*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*--begin()), _VSTD::move(__v)); 1386*4bdff4beSrobert --__start_; 1387*4bdff4beSrobert ++__size(); 138846035553Spatrick } 138946035553Spatrick else 139046035553Spatrick { 1391*4bdff4beSrobert iterator __b = begin(); 139246035553Spatrick iterator __bm1 = _VSTD::prev(__b); 139346035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); 1394*4bdff4beSrobert --__start_; 1395*4bdff4beSrobert ++__size(); 139646035553Spatrick if (__pos > 1) 139746035553Spatrick __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b); 139846035553Spatrick *__b = _VSTD::move(__v); 139946035553Spatrick } 140046035553Spatrick } 140146035553Spatrick else 140246035553Spatrick { // insert by shifting things forward 140346035553Spatrick if (__back_spare() == 0) 140446035553Spatrick __add_back_capacity(); 140546035553Spatrick // __back_capacity >= 1 1406*4bdff4beSrobert size_type __de = size() - __pos; 140746035553Spatrick if (__de == 0) 140846035553Spatrick { 1409*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*end()), _VSTD::move(__v)); 1410*4bdff4beSrobert ++__size(); 141146035553Spatrick } 141246035553Spatrick else 141346035553Spatrick { 1414*4bdff4beSrobert iterator __e = end(); 141546035553Spatrick iterator __em1 = _VSTD::prev(__e); 141646035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); 1417*4bdff4beSrobert ++__size(); 141846035553Spatrick if (__de > 1) 141946035553Spatrick __e = _VSTD::move_backward(__e - __de, __em1, __e); 142046035553Spatrick *--__e = _VSTD::move(__v); 142146035553Spatrick } 142246035553Spatrick } 1423*4bdff4beSrobert return begin() + __pos; 142446035553Spatrick} 142546035553Spatrick 142646035553Spatricktemplate <class _Tp, class _Allocator> 142746035553Spatricktemplate <class... _Args> 142846035553Spatricktypename deque<_Tp, _Allocator>::iterator 142946035553Spatrickdeque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args) 143046035553Spatrick{ 1431*4bdff4beSrobert size_type __pos = __p - begin(); 1432*4bdff4beSrobert size_type __to_end = size() - __pos; 1433*4bdff4beSrobert allocator_type& __a = __alloc(); 143446035553Spatrick if (__pos < __to_end) 143546035553Spatrick { // insert by shifting things backward 143646035553Spatrick if (__front_spare() == 0) 143746035553Spatrick __add_front_capacity(); 143846035553Spatrick // __front_spare() >= 1 143946035553Spatrick if (__pos == 0) 144046035553Spatrick { 1441*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*--begin()), _VSTD::forward<_Args>(__args)...); 1442*4bdff4beSrobert --__start_; 1443*4bdff4beSrobert ++__size(); 144446035553Spatrick } 144546035553Spatrick else 144646035553Spatrick { 1447*4bdff4beSrobert __temp_value<value_type, _Allocator> __tmp(__alloc(), _VSTD::forward<_Args>(__args)...); 1448*4bdff4beSrobert iterator __b = begin(); 144946035553Spatrick iterator __bm1 = _VSTD::prev(__b); 145046035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); 1451*4bdff4beSrobert --__start_; 1452*4bdff4beSrobert ++__size(); 145346035553Spatrick if (__pos > 1) 145446035553Spatrick __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b); 145546035553Spatrick *__b = _VSTD::move(__tmp.get()); 145646035553Spatrick } 145746035553Spatrick } 145846035553Spatrick else 145946035553Spatrick { // insert by shifting things forward 146046035553Spatrick if (__back_spare() == 0) 146146035553Spatrick __add_back_capacity(); 146246035553Spatrick // __back_capacity >= 1 1463*4bdff4beSrobert size_type __de = size() - __pos; 146446035553Spatrick if (__de == 0) 146546035553Spatrick { 1466*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*end()), _VSTD::forward<_Args>(__args)...); 1467*4bdff4beSrobert ++__size(); 146846035553Spatrick } 146946035553Spatrick else 147046035553Spatrick { 1471*4bdff4beSrobert __temp_value<value_type, _Allocator> __tmp(__alloc(), _VSTD::forward<_Args>(__args)...); 1472*4bdff4beSrobert iterator __e = end(); 147346035553Spatrick iterator __em1 = _VSTD::prev(__e); 147446035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); 1475*4bdff4beSrobert ++__size(); 147646035553Spatrick if (__de > 1) 147746035553Spatrick __e = _VSTD::move_backward(__e - __de, __em1, __e); 147846035553Spatrick *--__e = _VSTD::move(__tmp.get()); 147946035553Spatrick } 148046035553Spatrick } 1481*4bdff4beSrobert return begin() + __pos; 148246035553Spatrick} 148346035553Spatrick 148446035553Spatrick#endif // _LIBCPP_CXX03_LANG 148546035553Spatrick 148646035553Spatrick 148746035553Spatricktemplate <class _Tp, class _Allocator> 148846035553Spatricktypename deque<_Tp, _Allocator>::iterator 148946035553Spatrickdeque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v) 149046035553Spatrick{ 1491*4bdff4beSrobert size_type __pos = __p - begin(); 1492*4bdff4beSrobert size_type __to_end = size() - __pos; 1493*4bdff4beSrobert allocator_type& __a = __alloc(); 149446035553Spatrick if (__pos < __to_end) 149546035553Spatrick { // insert by shifting things backward 149646035553Spatrick if (__front_spare() == 0) 149746035553Spatrick __add_front_capacity(); 149846035553Spatrick // __front_spare() >= 1 149946035553Spatrick if (__pos == 0) 150046035553Spatrick { 1501*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*--begin()), __v); 1502*4bdff4beSrobert --__start_; 1503*4bdff4beSrobert ++__size(); 150446035553Spatrick } 150546035553Spatrick else 150646035553Spatrick { 150746035553Spatrick const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 1508*4bdff4beSrobert iterator __b = begin(); 150946035553Spatrick iterator __bm1 = _VSTD::prev(__b); 151046035553Spatrick if (__vt == pointer_traits<const_pointer>::pointer_to(*__b)) 151146035553Spatrick __vt = pointer_traits<const_pointer>::pointer_to(*__bm1); 151246035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); 1513*4bdff4beSrobert --__start_; 1514*4bdff4beSrobert ++__size(); 151546035553Spatrick if (__pos > 1) 151646035553Spatrick __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt); 151746035553Spatrick *__b = *__vt; 151846035553Spatrick } 151946035553Spatrick } 152046035553Spatrick else 152146035553Spatrick { // insert by shifting things forward 152246035553Spatrick if (__back_spare() == 0) 152346035553Spatrick __add_back_capacity(); 152446035553Spatrick // __back_capacity >= 1 1525*4bdff4beSrobert size_type __de = size() - __pos; 152646035553Spatrick if (__de == 0) 152746035553Spatrick { 1528*4bdff4beSrobert __alloc_traits::construct(__a, _VSTD::addressof(*end()), __v); 1529*4bdff4beSrobert ++__size(); 153046035553Spatrick } 153146035553Spatrick else 153246035553Spatrick { 153346035553Spatrick const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 1534*4bdff4beSrobert iterator __e = end(); 153546035553Spatrick iterator __em1 = _VSTD::prev(__e); 153646035553Spatrick if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1)) 153746035553Spatrick __vt = pointer_traits<const_pointer>::pointer_to(*__e); 153846035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); 1539*4bdff4beSrobert ++__size(); 154046035553Spatrick if (__de > 1) 154146035553Spatrick __e = __move_backward_and_check(__e - __de, __em1, __e, __vt); 154246035553Spatrick *--__e = *__vt; 154346035553Spatrick } 154446035553Spatrick } 1545*4bdff4beSrobert return begin() + __pos; 154646035553Spatrick} 154746035553Spatrick 154846035553Spatricktemplate <class _Tp, class _Allocator> 154946035553Spatricktypename deque<_Tp, _Allocator>::iterator 155046035553Spatrickdeque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v) 155146035553Spatrick{ 1552*4bdff4beSrobert size_type __pos = __p - begin(); 1553*4bdff4beSrobert size_type __to_end = __size() - __pos; 1554*4bdff4beSrobert allocator_type& __a = __alloc(); 155546035553Spatrick if (__pos < __to_end) 155646035553Spatrick { // insert by shifting things backward 155746035553Spatrick if (__n > __front_spare()) 155846035553Spatrick __add_front_capacity(__n - __front_spare()); 155946035553Spatrick // __n <= __front_spare() 1560*4bdff4beSrobert iterator __old_begin = begin(); 156146035553Spatrick iterator __i = __old_begin; 156246035553Spatrick if (__n > __pos) 156346035553Spatrick { 1564*4bdff4beSrobert for (size_type __m = __n - __pos; __m; --__m, --__start_, ++__size()) 156546035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v); 156646035553Spatrick __n = __pos; 156746035553Spatrick } 156846035553Spatrick if (__n > 0) 156946035553Spatrick { 157046035553Spatrick const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 157146035553Spatrick iterator __obn = __old_begin + __n; 157246035553Spatrick __move_construct_backward_and_check(__old_begin, __obn, __i, __vt); 157346035553Spatrick if (__n < __pos) 157446035553Spatrick __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt); 157546035553Spatrick _VSTD::fill_n(__old_begin, __n, *__vt); 157646035553Spatrick } 157746035553Spatrick } 157846035553Spatrick else 157946035553Spatrick { // insert by shifting things forward 158046035553Spatrick size_type __back_capacity = __back_spare(); 158146035553Spatrick if (__n > __back_capacity) 158246035553Spatrick __add_back_capacity(__n - __back_capacity); 158346035553Spatrick // __n <= __back_capacity 1584*4bdff4beSrobert iterator __old_end = end(); 158546035553Spatrick iterator __i = __old_end; 1586*4bdff4beSrobert size_type __de = size() - __pos; 158746035553Spatrick if (__n > __de) 158846035553Spatrick { 1589*4bdff4beSrobert for (size_type __m = __n - __de; __m; --__m, (void) ++__i, ++__size()) 159046035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v); 159146035553Spatrick __n = __de; 159246035553Spatrick } 159346035553Spatrick if (__n > 0) 159446035553Spatrick { 159546035553Spatrick const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 159646035553Spatrick iterator __oen = __old_end - __n; 159746035553Spatrick __move_construct_and_check(__oen, __old_end, __i, __vt); 159846035553Spatrick if (__n < __de) 159946035553Spatrick __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt); 160046035553Spatrick _VSTD::fill_n(__old_end - __n, __n, *__vt); 160146035553Spatrick } 160246035553Spatrick } 1603*4bdff4beSrobert return begin() + __pos; 160446035553Spatrick} 160546035553Spatrick 160646035553Spatricktemplate <class _Tp, class _Allocator> 160746035553Spatricktemplate <class _InputIter> 160846035553Spatricktypename deque<_Tp, _Allocator>::iterator 160946035553Spatrickdeque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l, 1610*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InputIter>::value>::type*) 161146035553Spatrick{ 1612*4bdff4beSrobert __split_buffer<value_type, allocator_type&> __buf(__alloc()); 161346035553Spatrick __buf.__construct_at_end(__f, __l); 161446035553Spatrick typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi; 161546035553Spatrick return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end())); 161646035553Spatrick} 161746035553Spatrick 161846035553Spatricktemplate <class _Tp, class _Allocator> 161946035553Spatricktemplate <class _ForwardIterator> 162046035553Spatricktypename deque<_Tp, _Allocator>::iterator 162146035553Spatrickdeque<_Tp, _Allocator>::insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l, 1622*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_forward_iterator<_ForwardIterator>::value>::type*) 162346035553Spatrick{ 162446035553Spatrick size_type __n = _VSTD::distance(__f, __l); 1625*4bdff4beSrobert __split_buffer<value_type, allocator_type&> __buf(__n, 0, __alloc()); 162646035553Spatrick __buf.__construct_at_end(__f, __l); 162746035553Spatrick typedef typename __split_buffer<value_type, allocator_type&>::iterator __fwd; 162846035553Spatrick return insert(__p, move_iterator<__fwd>(__buf.begin()), move_iterator<__fwd>(__buf.end())); 162946035553Spatrick} 163046035553Spatrick 163146035553Spatricktemplate <class _Tp, class _Allocator> 163246035553Spatricktemplate <class _BiIter> 163346035553Spatricktypename deque<_Tp, _Allocator>::iterator 163446035553Spatrickdeque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l, 163546035553Spatrick typename enable_if<__is_cpp17_bidirectional_iterator<_BiIter>::value>::type*) 163646035553Spatrick{ 163746035553Spatrick size_type __n = _VSTD::distance(__f, __l); 1638*4bdff4beSrobert size_type __pos = __p - begin(); 1639*4bdff4beSrobert size_type __to_end = size() - __pos; 1640*4bdff4beSrobert allocator_type& __a = __alloc(); 164146035553Spatrick if (__pos < __to_end) 164246035553Spatrick { // insert by shifting things backward 164346035553Spatrick if (__n > __front_spare()) 164446035553Spatrick __add_front_capacity(__n - __front_spare()); 164546035553Spatrick // __n <= __front_spare() 1646*4bdff4beSrobert iterator __old_begin = begin(); 164746035553Spatrick iterator __i = __old_begin; 164846035553Spatrick _BiIter __m = __f; 164946035553Spatrick if (__n > __pos) 165046035553Spatrick { 165146035553Spatrick __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos); 1652*4bdff4beSrobert for (_BiIter __j = __m; __j != __f; --__start_, ++__size()) 165346035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j); 165446035553Spatrick __n = __pos; 165546035553Spatrick } 165646035553Spatrick if (__n > 0) 165746035553Spatrick { 165846035553Spatrick iterator __obn = __old_begin + __n; 165946035553Spatrick for (iterator __j = __obn; __j != __old_begin;) 166046035553Spatrick { 166146035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j)); 1662*4bdff4beSrobert --__start_; 1663*4bdff4beSrobert ++__size(); 166446035553Spatrick } 166546035553Spatrick if (__n < __pos) 166646035553Spatrick __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin); 166746035553Spatrick _VSTD::copy(__m, __l, __old_begin); 166846035553Spatrick } 166946035553Spatrick } 167046035553Spatrick else 167146035553Spatrick { // insert by shifting things forward 167246035553Spatrick size_type __back_capacity = __back_spare(); 167346035553Spatrick if (__n > __back_capacity) 167446035553Spatrick __add_back_capacity(__n - __back_capacity); 167546035553Spatrick // __n <= __back_capacity 1676*4bdff4beSrobert iterator __old_end = end(); 167746035553Spatrick iterator __i = __old_end; 167846035553Spatrick _BiIter __m = __l; 1679*4bdff4beSrobert size_type __de = size() - __pos; 168046035553Spatrick if (__n > __de) 168146035553Spatrick { 168246035553Spatrick __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de); 1683*4bdff4beSrobert for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__size()) 168446035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j); 168546035553Spatrick __n = __de; 168646035553Spatrick } 168746035553Spatrick if (__n > 0) 168846035553Spatrick { 168946035553Spatrick iterator __oen = __old_end - __n; 1690*4bdff4beSrobert for (iterator __j = __oen; __j != __old_end; ++__i, (void) ++__j, ++__size()) 169146035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j)); 169246035553Spatrick if (__n < __de) 169346035553Spatrick __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end); 169446035553Spatrick _VSTD::copy_backward(__f, __m, __old_end); 169546035553Spatrick } 169646035553Spatrick } 1697*4bdff4beSrobert return begin() + __pos; 169846035553Spatrick} 169946035553Spatrick 170046035553Spatricktemplate <class _Tp, class _Allocator> 170146035553Spatricktemplate <class _InpIter> 170246035553Spatrickvoid 170346035553Spatrickdeque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l, 1704*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InpIter>::value>::type*) 170546035553Spatrick{ 170646035553Spatrick for (; __f != __l; ++__f) 170746035553Spatrick#ifdef _LIBCPP_CXX03_LANG 170846035553Spatrick push_back(*__f); 170946035553Spatrick#else 171046035553Spatrick emplace_back(*__f); 171146035553Spatrick#endif 171246035553Spatrick} 171346035553Spatrick 171446035553Spatricktemplate <class _Tp, class _Allocator> 171546035553Spatricktemplate <class _ForIter> 171646035553Spatrickvoid 171746035553Spatrickdeque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l, 171846035553Spatrick typename enable_if<__is_cpp17_forward_iterator<_ForIter>::value>::type*) 171946035553Spatrick{ 172046035553Spatrick size_type __n = _VSTD::distance(__f, __l); 1721*4bdff4beSrobert allocator_type& __a = __alloc(); 172246035553Spatrick size_type __back_capacity = __back_spare(); 172346035553Spatrick if (__n > __back_capacity) 172446035553Spatrick __add_back_capacity(__n - __back_capacity); 172546035553Spatrick // __n <= __back_capacity 1726*4bdff4beSrobert for (__deque_block_range __br : __deque_range(end(), end() + __n)) { 172746035553Spatrick _ConstructTransaction __tx(this, __br); 172846035553Spatrick for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, (void)++__f) { 172976d0caaeSpatrick __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_), *__f); 173046035553Spatrick } 173146035553Spatrick } 173246035553Spatrick} 173346035553Spatrick 173446035553Spatricktemplate <class _Tp, class _Allocator> 173546035553Spatrickvoid 173646035553Spatrickdeque<_Tp, _Allocator>::__append(size_type __n) 173746035553Spatrick{ 1738*4bdff4beSrobert allocator_type& __a = __alloc(); 173946035553Spatrick size_type __back_capacity = __back_spare(); 174046035553Spatrick if (__n > __back_capacity) 174146035553Spatrick __add_back_capacity(__n - __back_capacity); 174246035553Spatrick // __n <= __back_capacity 1743*4bdff4beSrobert for (__deque_block_range __br : __deque_range(end(), end() + __n)) { 174446035553Spatrick _ConstructTransaction __tx(this, __br); 174546035553Spatrick for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) { 174676d0caaeSpatrick __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_)); 174746035553Spatrick } 174846035553Spatrick } 174946035553Spatrick} 175046035553Spatrick 175146035553Spatricktemplate <class _Tp, class _Allocator> 175246035553Spatrickvoid 175346035553Spatrickdeque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v) 175446035553Spatrick{ 1755*4bdff4beSrobert allocator_type& __a = __alloc(); 175646035553Spatrick size_type __back_capacity = __back_spare(); 175746035553Spatrick if (__n > __back_capacity) 175846035553Spatrick __add_back_capacity(__n - __back_capacity); 175946035553Spatrick // __n <= __back_capacity 1760*4bdff4beSrobert for (__deque_block_range __br : __deque_range(end(), end() + __n)) { 176146035553Spatrick _ConstructTransaction __tx(this, __br); 176246035553Spatrick for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) { 176376d0caaeSpatrick __alloc_traits::construct(__a, _VSTD::__to_address(__tx.__pos_), __v); 176446035553Spatrick } 176546035553Spatrick } 176646035553Spatrick 176746035553Spatrick} 176846035553Spatrick 176946035553Spatrick// Create front capacity for one block of elements. 177046035553Spatrick// Strong guarantee. Either do it or don't touch anything. 177146035553Spatricktemplate <class _Tp, class _Allocator> 177246035553Spatrickvoid 177346035553Spatrickdeque<_Tp, _Allocator>::__add_front_capacity() 177446035553Spatrick{ 1775*4bdff4beSrobert allocator_type& __a = __alloc(); 1776*4bdff4beSrobert if (__back_spare() >= __block_size) 177746035553Spatrick { 1778*4bdff4beSrobert __start_ += __block_size; 1779*4bdff4beSrobert pointer __pt = __map_.back(); 1780*4bdff4beSrobert __map_.pop_back(); 1781*4bdff4beSrobert __map_.push_front(__pt); 178246035553Spatrick } 1783*4bdff4beSrobert // Else if __map_.size() < __map_.capacity() then we need to allocate 1 buffer 1784*4bdff4beSrobert else if (__map_.size() < __map_.capacity()) 178546035553Spatrick { // we can put the new buffer into the map, but don't shift things around 178646035553Spatrick // until all buffers are allocated. If we throw, we don't need to fix 178746035553Spatrick // anything up (any added buffers are undetectible) 1788*4bdff4beSrobert if (__map_.__front_spare() > 0) 1789*4bdff4beSrobert __map_.push_front(__alloc_traits::allocate(__a, __block_size)); 179046035553Spatrick else 179146035553Spatrick { 1792*4bdff4beSrobert __map_.push_back(__alloc_traits::allocate(__a, __block_size)); 179346035553Spatrick // Done allocating, reorder capacity 1794*4bdff4beSrobert pointer __pt = __map_.back(); 1795*4bdff4beSrobert __map_.pop_back(); 1796*4bdff4beSrobert __map_.push_front(__pt); 179746035553Spatrick } 1798*4bdff4beSrobert __start_ = __map_.size() == 1 ? 1799*4bdff4beSrobert __block_size / 2 : 1800*4bdff4beSrobert __start_ + __block_size; 180146035553Spatrick } 180246035553Spatrick // Else need to allocate 1 buffer, *and* we need to reallocate __map_. 180346035553Spatrick else 180446035553Spatrick { 1805*4bdff4beSrobert __split_buffer<pointer, __pointer_allocator&> 1806*4bdff4beSrobert __buf(std::max<size_type>(2 * __map_.capacity(), 1), 1807*4bdff4beSrobert 0, __map_.__alloc()); 180846035553Spatrick 180946035553Spatrick typedef __allocator_destructor<_Allocator> _Dp; 181046035553Spatrick unique_ptr<pointer, _Dp> __hold( 1811*4bdff4beSrobert __alloc_traits::allocate(__a, __block_size), 1812*4bdff4beSrobert _Dp(__a, __block_size)); 181346035553Spatrick __buf.push_back(__hold.get()); 181446035553Spatrick __hold.release(); 181546035553Spatrick 1816*4bdff4beSrobert for (__map_pointer __i = __map_.begin(); 1817*4bdff4beSrobert __i != __map_.end(); ++__i) 181846035553Spatrick __buf.push_back(*__i); 1819*4bdff4beSrobert _VSTD::swap(__map_.__first_, __buf.__first_); 1820*4bdff4beSrobert _VSTD::swap(__map_.__begin_, __buf.__begin_); 1821*4bdff4beSrobert _VSTD::swap(__map_.__end_, __buf.__end_); 1822*4bdff4beSrobert _VSTD::swap(__map_.__end_cap(), __buf.__end_cap()); 1823*4bdff4beSrobert __start_ = __map_.size() == 1 ? 1824*4bdff4beSrobert __block_size / 2 : 1825*4bdff4beSrobert __start_ + __block_size; 182646035553Spatrick } 182746035553Spatrick} 182846035553Spatrick 182946035553Spatrick// Create front capacity for __n elements. 183046035553Spatrick// Strong guarantee. Either do it or don't touch anything. 183146035553Spatricktemplate <class _Tp, class _Allocator> 183246035553Spatrickvoid 183346035553Spatrickdeque<_Tp, _Allocator>::__add_front_capacity(size_type __n) 183446035553Spatrick{ 1835*4bdff4beSrobert allocator_type& __a = __alloc(); 1836*4bdff4beSrobert size_type __nb = __recommend_blocks(__n + __map_.empty()); 183746035553Spatrick // Number of unused blocks at back: 1838*4bdff4beSrobert size_type __back_capacity = __back_spare() / __block_size; 183946035553Spatrick __back_capacity = _VSTD::min(__back_capacity, __nb); // don't take more than you need 184046035553Spatrick __nb -= __back_capacity; // number of blocks need to allocate 184146035553Spatrick // If __nb == 0, then we have sufficient capacity. 184246035553Spatrick if (__nb == 0) 184346035553Spatrick { 1844*4bdff4beSrobert __start_ += __block_size * __back_capacity; 184546035553Spatrick for (; __back_capacity > 0; --__back_capacity) 184646035553Spatrick { 1847*4bdff4beSrobert pointer __pt = __map_.back(); 1848*4bdff4beSrobert __map_.pop_back(); 1849*4bdff4beSrobert __map_.push_front(__pt); 185046035553Spatrick } 185146035553Spatrick } 185246035553Spatrick // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers 1853*4bdff4beSrobert else if (__nb <= __map_.capacity() - __map_.size()) 185446035553Spatrick { // we can put the new buffers into the map, but don't shift things around 185546035553Spatrick // until all buffers are allocated. If we throw, we don't need to fix 185646035553Spatrick // anything up (any added buffers are undetectible) 1857*4bdff4beSrobert for (; __nb > 0; --__nb, __start_ += __block_size - (__map_.size() == 1)) 185846035553Spatrick { 1859*4bdff4beSrobert if (__map_.__front_spare() == 0) 186046035553Spatrick break; 1861*4bdff4beSrobert __map_.push_front(__alloc_traits::allocate(__a, __block_size)); 186246035553Spatrick } 186346035553Spatrick for (; __nb > 0; --__nb, ++__back_capacity) 1864*4bdff4beSrobert __map_.push_back(__alloc_traits::allocate(__a, __block_size)); 186546035553Spatrick // Done allocating, reorder capacity 1866*4bdff4beSrobert __start_ += __back_capacity * __block_size; 186746035553Spatrick for (; __back_capacity > 0; --__back_capacity) 186846035553Spatrick { 1869*4bdff4beSrobert pointer __pt = __map_.back(); 1870*4bdff4beSrobert __map_.pop_back(); 1871*4bdff4beSrobert __map_.push_front(__pt); 187246035553Spatrick } 187346035553Spatrick } 187446035553Spatrick // Else need to allocate __nb buffers, *and* we need to reallocate __map_. 187546035553Spatrick else 187646035553Spatrick { 1877*4bdff4beSrobert size_type __ds = (__nb + __back_capacity) * __block_size - __map_.empty(); 1878*4bdff4beSrobert __split_buffer<pointer, __pointer_allocator&> 1879*4bdff4beSrobert __buf(std::max<size_type>(2* __map_.capacity(), 1880*4bdff4beSrobert __nb + __map_.size()), 1881*4bdff4beSrobert 0, __map_.__alloc()); 188246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 188346035553Spatrick try 188446035553Spatrick { 188546035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 188646035553Spatrick for (; __nb > 0; --__nb) 1887*4bdff4beSrobert __buf.push_back(__alloc_traits::allocate(__a, __block_size)); 188846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 188946035553Spatrick } 189046035553Spatrick catch (...) 189146035553Spatrick { 1892*4bdff4beSrobert for (__map_pointer __i = __buf.begin(); 189346035553Spatrick __i != __buf.end(); ++__i) 1894*4bdff4beSrobert __alloc_traits::deallocate(__a, *__i, __block_size); 189546035553Spatrick throw; 189646035553Spatrick } 189746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 189846035553Spatrick for (; __back_capacity > 0; --__back_capacity) 189946035553Spatrick { 1900*4bdff4beSrobert __buf.push_back(__map_.back()); 1901*4bdff4beSrobert __map_.pop_back(); 190246035553Spatrick } 1903*4bdff4beSrobert for (__map_pointer __i = __map_.begin(); 1904*4bdff4beSrobert __i != __map_.end(); ++__i) 190546035553Spatrick __buf.push_back(*__i); 1906*4bdff4beSrobert _VSTD::swap(__map_.__first_, __buf.__first_); 1907*4bdff4beSrobert _VSTD::swap(__map_.__begin_, __buf.__begin_); 1908*4bdff4beSrobert _VSTD::swap(__map_.__end_, __buf.__end_); 1909*4bdff4beSrobert _VSTD::swap(__map_.__end_cap(), __buf.__end_cap()); 1910*4bdff4beSrobert __start_ += __ds; 191146035553Spatrick } 191246035553Spatrick} 191346035553Spatrick 191446035553Spatrick// Create back capacity for one block of elements. 191546035553Spatrick// Strong guarantee. Either do it or don't touch anything. 191646035553Spatricktemplate <class _Tp, class _Allocator> 191746035553Spatrickvoid 191846035553Spatrickdeque<_Tp, _Allocator>::__add_back_capacity() 191946035553Spatrick{ 1920*4bdff4beSrobert allocator_type& __a = __alloc(); 1921*4bdff4beSrobert if (__front_spare() >= __block_size) 192246035553Spatrick { 1923*4bdff4beSrobert __start_ -= __block_size; 1924*4bdff4beSrobert pointer __pt = __map_.front(); 1925*4bdff4beSrobert __map_.pop_front(); 1926*4bdff4beSrobert __map_.push_back(__pt); 192746035553Spatrick } 192846035553Spatrick // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers 1929*4bdff4beSrobert else if (__map_.size() < __map_.capacity()) 193046035553Spatrick { // we can put the new buffer into the map, but don't shift things around 193146035553Spatrick // until it is allocated. If we throw, we don't need to fix 193246035553Spatrick // anything up (any added buffers are undetectible) 1933*4bdff4beSrobert if (__map_.__back_spare() != 0) 1934*4bdff4beSrobert __map_.push_back(__alloc_traits::allocate(__a, __block_size)); 193546035553Spatrick else 193646035553Spatrick { 1937*4bdff4beSrobert __map_.push_front(__alloc_traits::allocate(__a, __block_size)); 193846035553Spatrick // Done allocating, reorder capacity 1939*4bdff4beSrobert pointer __pt = __map_.front(); 1940*4bdff4beSrobert __map_.pop_front(); 1941*4bdff4beSrobert __map_.push_back(__pt); 194246035553Spatrick } 194346035553Spatrick } 194446035553Spatrick // Else need to allocate 1 buffer, *and* we need to reallocate __map_. 194546035553Spatrick else 194646035553Spatrick { 1947*4bdff4beSrobert __split_buffer<pointer, __pointer_allocator&> 1948*4bdff4beSrobert __buf(std::max<size_type>(2* __map_.capacity(), 1), 1949*4bdff4beSrobert __map_.size(), 1950*4bdff4beSrobert __map_.__alloc()); 195146035553Spatrick 195246035553Spatrick typedef __allocator_destructor<_Allocator> _Dp; 195346035553Spatrick unique_ptr<pointer, _Dp> __hold( 1954*4bdff4beSrobert __alloc_traits::allocate(__a, __block_size), 1955*4bdff4beSrobert _Dp(__a, __block_size)); 195646035553Spatrick __buf.push_back(__hold.get()); 195746035553Spatrick __hold.release(); 195846035553Spatrick 1959*4bdff4beSrobert for (__map_pointer __i = __map_.end(); 1960*4bdff4beSrobert __i != __map_.begin();) 196146035553Spatrick __buf.push_front(*--__i); 1962*4bdff4beSrobert _VSTD::swap(__map_.__first_, __buf.__first_); 1963*4bdff4beSrobert _VSTD::swap(__map_.__begin_, __buf.__begin_); 1964*4bdff4beSrobert _VSTD::swap(__map_.__end_, __buf.__end_); 1965*4bdff4beSrobert _VSTD::swap(__map_.__end_cap(), __buf.__end_cap()); 196646035553Spatrick } 196746035553Spatrick} 196846035553Spatrick 196946035553Spatrick// Create back capacity for __n elements. 197046035553Spatrick// Strong guarantee. Either do it or don't touch anything. 197146035553Spatricktemplate <class _Tp, class _Allocator> 197246035553Spatrickvoid 197346035553Spatrickdeque<_Tp, _Allocator>::__add_back_capacity(size_type __n) 197446035553Spatrick{ 1975*4bdff4beSrobert allocator_type& __a = __alloc(); 1976*4bdff4beSrobert size_type __nb = __recommend_blocks(__n + __map_.empty()); 197746035553Spatrick // Number of unused blocks at front: 1978*4bdff4beSrobert size_type __front_capacity = __front_spare() / __block_size; 197946035553Spatrick __front_capacity = _VSTD::min(__front_capacity, __nb); // don't take more than you need 198046035553Spatrick __nb -= __front_capacity; // number of blocks need to allocate 198146035553Spatrick // If __nb == 0, then we have sufficient capacity. 198246035553Spatrick if (__nb == 0) 198346035553Spatrick { 1984*4bdff4beSrobert __start_ -= __block_size * __front_capacity; 198546035553Spatrick for (; __front_capacity > 0; --__front_capacity) 198646035553Spatrick { 1987*4bdff4beSrobert pointer __pt = __map_.front(); 1988*4bdff4beSrobert __map_.pop_front(); 1989*4bdff4beSrobert __map_.push_back(__pt); 199046035553Spatrick } 199146035553Spatrick } 199246035553Spatrick // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers 1993*4bdff4beSrobert else if (__nb <= __map_.capacity() - __map_.size()) 199446035553Spatrick { // we can put the new buffers into the map, but don't shift things around 199546035553Spatrick // until all buffers are allocated. If we throw, we don't need to fix 199646035553Spatrick // anything up (any added buffers are undetectible) 199746035553Spatrick for (; __nb > 0; --__nb) 199846035553Spatrick { 1999*4bdff4beSrobert if (__map_.__back_spare() == 0) 200046035553Spatrick break; 2001*4bdff4beSrobert __map_.push_back(__alloc_traits::allocate(__a, __block_size)); 200246035553Spatrick } 2003*4bdff4beSrobert for (; __nb > 0; --__nb, ++__front_capacity, __start_ += 2004*4bdff4beSrobert __block_size - (__map_.size() == 1)) 2005*4bdff4beSrobert __map_.push_front(__alloc_traits::allocate(__a, __block_size)); 200646035553Spatrick // Done allocating, reorder capacity 2007*4bdff4beSrobert __start_ -= __block_size * __front_capacity; 200846035553Spatrick for (; __front_capacity > 0; --__front_capacity) 200946035553Spatrick { 2010*4bdff4beSrobert pointer __pt = __map_.front(); 2011*4bdff4beSrobert __map_.pop_front(); 2012*4bdff4beSrobert __map_.push_back(__pt); 201346035553Spatrick } 201446035553Spatrick } 201546035553Spatrick // Else need to allocate __nb buffers, *and* we need to reallocate __map_. 201646035553Spatrick else 201746035553Spatrick { 2018*4bdff4beSrobert size_type __ds = __front_capacity * __block_size; 2019*4bdff4beSrobert __split_buffer<pointer, __pointer_allocator&> 2020*4bdff4beSrobert __buf(std::max<size_type>(2* __map_.capacity(), 2021*4bdff4beSrobert __nb + __map_.size()), 2022*4bdff4beSrobert __map_.size() - __front_capacity, 2023*4bdff4beSrobert __map_.__alloc()); 202446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 202546035553Spatrick try 202646035553Spatrick { 202746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 202846035553Spatrick for (; __nb > 0; --__nb) 2029*4bdff4beSrobert __buf.push_back(__alloc_traits::allocate(__a, __block_size)); 203046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 203146035553Spatrick } 203246035553Spatrick catch (...) 203346035553Spatrick { 2034*4bdff4beSrobert for (__map_pointer __i = __buf.begin(); 203546035553Spatrick __i != __buf.end(); ++__i) 2036*4bdff4beSrobert __alloc_traits::deallocate(__a, *__i, __block_size); 203746035553Spatrick throw; 203846035553Spatrick } 203946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 204046035553Spatrick for (; __front_capacity > 0; --__front_capacity) 204146035553Spatrick { 2042*4bdff4beSrobert __buf.push_back(__map_.front()); 2043*4bdff4beSrobert __map_.pop_front(); 204446035553Spatrick } 2045*4bdff4beSrobert for (__map_pointer __i = __map_.end(); 2046*4bdff4beSrobert __i != __map_.begin();) 204746035553Spatrick __buf.push_front(*--__i); 2048*4bdff4beSrobert _VSTD::swap(__map_.__first_, __buf.__first_); 2049*4bdff4beSrobert _VSTD::swap(__map_.__begin_, __buf.__begin_); 2050*4bdff4beSrobert _VSTD::swap(__map_.__end_, __buf.__end_); 2051*4bdff4beSrobert _VSTD::swap(__map_.__end_cap(), __buf.__end_cap()); 2052*4bdff4beSrobert __start_ -= __ds; 205346035553Spatrick } 205446035553Spatrick} 205546035553Spatrick 205646035553Spatricktemplate <class _Tp, class _Allocator> 205746035553Spatrickvoid 205846035553Spatrickdeque<_Tp, _Allocator>::pop_front() 205946035553Spatrick{ 2060*4bdff4beSrobert allocator_type& __a = __alloc(); 2061*4bdff4beSrobert __alloc_traits::destroy(__a, _VSTD::__to_address(*(__map_.begin() + 2062*4bdff4beSrobert __start_ / __block_size) + 2063*4bdff4beSrobert __start_ % __block_size)); 2064*4bdff4beSrobert --__size(); 2065*4bdff4beSrobert ++__start_; 206646035553Spatrick __maybe_remove_front_spare(); 206746035553Spatrick} 206846035553Spatrick 206946035553Spatricktemplate <class _Tp, class _Allocator> 207046035553Spatrickvoid 207146035553Spatrickdeque<_Tp, _Allocator>::pop_back() 207246035553Spatrick{ 207376d0caaeSpatrick _LIBCPP_ASSERT(!empty(), "deque::pop_back called on an empty deque"); 2074*4bdff4beSrobert allocator_type& __a = __alloc(); 2075*4bdff4beSrobert size_type __p = size() + __start_ - 1; 2076*4bdff4beSrobert __alloc_traits::destroy(__a, _VSTD::__to_address(*(__map_.begin() + 2077*4bdff4beSrobert __p / __block_size) + 2078*4bdff4beSrobert __p % __block_size)); 2079*4bdff4beSrobert --__size(); 208046035553Spatrick __maybe_remove_back_spare(); 208146035553Spatrick} 208246035553Spatrick 208346035553Spatrick// move assign [__f, __l) to [__r, __r + (__l-__f)). 208446035553Spatrick// If __vt points into [__f, __l), then subtract (__f - __r) from __vt. 208546035553Spatricktemplate <class _Tp, class _Allocator> 208646035553Spatricktypename deque<_Tp, _Allocator>::iterator 208746035553Spatrickdeque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r, 208846035553Spatrick const_pointer& __vt) 208946035553Spatrick{ 209046035553Spatrick // as if 209146035553Spatrick // for (; __f != __l; ++__f, ++__r) 209246035553Spatrick // *__r = _VSTD::move(*__f); 209346035553Spatrick difference_type __n = __l - __f; 209446035553Spatrick while (__n > 0) 209546035553Spatrick { 209646035553Spatrick pointer __fb = __f.__ptr_; 2097*4bdff4beSrobert pointer __fe = *__f.__m_iter_ + __block_size; 209846035553Spatrick difference_type __bs = __fe - __fb; 209946035553Spatrick if (__bs > __n) 210046035553Spatrick { 210146035553Spatrick __bs = __n; 210246035553Spatrick __fe = __fb + __bs; 210346035553Spatrick } 210446035553Spatrick if (__fb <= __vt && __vt < __fe) 210546035553Spatrick __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_; 210646035553Spatrick __r = _VSTD::move(__fb, __fe, __r); 210746035553Spatrick __n -= __bs; 210846035553Spatrick __f += __bs; 210946035553Spatrick } 211046035553Spatrick return __r; 211146035553Spatrick} 211246035553Spatrick 211346035553Spatrick// move assign [__f, __l) to [__r - (__l-__f), __r) backwards. 211446035553Spatrick// If __vt points into [__f, __l), then add (__r - __l) to __vt. 211546035553Spatricktemplate <class _Tp, class _Allocator> 211646035553Spatricktypename deque<_Tp, _Allocator>::iterator 211746035553Spatrickdeque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r, 211846035553Spatrick const_pointer& __vt) 211946035553Spatrick{ 212046035553Spatrick // as if 212146035553Spatrick // while (__f != __l) 212246035553Spatrick // *--__r = _VSTD::move(*--__l); 212346035553Spatrick difference_type __n = __l - __f; 212446035553Spatrick while (__n > 0) 212546035553Spatrick { 212646035553Spatrick --__l; 212746035553Spatrick pointer __lb = *__l.__m_iter_; 212846035553Spatrick pointer __le = __l.__ptr_ + 1; 212946035553Spatrick difference_type __bs = __le - __lb; 213046035553Spatrick if (__bs > __n) 213146035553Spatrick { 213246035553Spatrick __bs = __n; 213346035553Spatrick __lb = __le - __bs; 213446035553Spatrick } 213546035553Spatrick if (__lb <= __vt && __vt < __le) 213646035553Spatrick __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_; 213746035553Spatrick __r = _VSTD::move_backward(__lb, __le, __r); 213846035553Spatrick __n -= __bs; 213946035553Spatrick __l -= __bs - 1; 214046035553Spatrick } 214146035553Spatrick return __r; 214246035553Spatrick} 214346035553Spatrick 214446035553Spatrick// move construct [__f, __l) to [__r, __r + (__l-__f)). 214546035553Spatrick// If __vt points into [__f, __l), then add (__r - __f) to __vt. 214646035553Spatricktemplate <class _Tp, class _Allocator> 214746035553Spatrickvoid 214846035553Spatrickdeque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l, 214946035553Spatrick iterator __r, const_pointer& __vt) 215046035553Spatrick{ 2151*4bdff4beSrobert allocator_type& __a = __alloc(); 215246035553Spatrick // as if 2153*4bdff4beSrobert // for (; __f != __l; ++__r, ++__f, ++__size()) 215446035553Spatrick // __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f)); 215546035553Spatrick difference_type __n = __l - __f; 215646035553Spatrick while (__n > 0) 215746035553Spatrick { 215846035553Spatrick pointer __fb = __f.__ptr_; 2159*4bdff4beSrobert pointer __fe = *__f.__m_iter_ + __block_size; 216046035553Spatrick difference_type __bs = __fe - __fb; 216146035553Spatrick if (__bs > __n) 216246035553Spatrick { 216346035553Spatrick __bs = __n; 216446035553Spatrick __fe = __fb + __bs; 216546035553Spatrick } 216646035553Spatrick if (__fb <= __vt && __vt < __fe) 216746035553Spatrick __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_; 2168*4bdff4beSrobert for (; __fb != __fe; ++__fb, ++__r, ++__size()) 216946035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb)); 217046035553Spatrick __n -= __bs; 217146035553Spatrick __f += __bs; 217246035553Spatrick } 217346035553Spatrick} 217446035553Spatrick 217546035553Spatrick// move construct [__f, __l) to [__r - (__l-__f), __r) backwards. 217646035553Spatrick// If __vt points into [__f, __l), then subtract (__l - __r) from __vt. 217746035553Spatricktemplate <class _Tp, class _Allocator> 217846035553Spatrickvoid 217946035553Spatrickdeque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l, 218046035553Spatrick iterator __r, const_pointer& __vt) 218146035553Spatrick{ 2182*4bdff4beSrobert allocator_type& __a = __alloc(); 218346035553Spatrick // as if 218446035553Spatrick // for (iterator __j = __l; __j != __f;) 218546035553Spatrick // { 218646035553Spatrick // __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j)); 2187*4bdff4beSrobert // --__start_; 2188*4bdff4beSrobert // ++__size(); 218946035553Spatrick // } 219046035553Spatrick difference_type __n = __l - __f; 219146035553Spatrick while (__n > 0) 219246035553Spatrick { 219346035553Spatrick --__l; 219446035553Spatrick pointer __lb = *__l.__m_iter_; 219546035553Spatrick pointer __le = __l.__ptr_ + 1; 219646035553Spatrick difference_type __bs = __le - __lb; 219746035553Spatrick if (__bs > __n) 219846035553Spatrick { 219946035553Spatrick __bs = __n; 220046035553Spatrick __lb = __le - __bs; 220146035553Spatrick } 220246035553Spatrick if (__lb <= __vt && __vt < __le) 220346035553Spatrick __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_; 220446035553Spatrick while (__le != __lb) 220546035553Spatrick { 220646035553Spatrick __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le)); 2207*4bdff4beSrobert --__start_; 2208*4bdff4beSrobert ++__size(); 220946035553Spatrick } 221046035553Spatrick __n -= __bs; 221146035553Spatrick __l -= __bs - 1; 221246035553Spatrick } 221346035553Spatrick} 221446035553Spatrick 221546035553Spatricktemplate <class _Tp, class _Allocator> 221646035553Spatricktypename deque<_Tp, _Allocator>::iterator 221746035553Spatrickdeque<_Tp, _Allocator>::erase(const_iterator __f) 221846035553Spatrick{ 2219*4bdff4beSrobert iterator __b = begin(); 222046035553Spatrick difference_type __pos = __f - __b; 222146035553Spatrick iterator __p = __b + __pos; 2222*4bdff4beSrobert allocator_type& __a = __alloc(); 2223*4bdff4beSrobert if (static_cast<size_t>(__pos) <= (size() - 1) / 2) 222446035553Spatrick { // erase from front 222546035553Spatrick _VSTD::move_backward(__b, __p, _VSTD::next(__p)); 222646035553Spatrick __alloc_traits::destroy(__a, _VSTD::addressof(*__b)); 2227*4bdff4beSrobert --__size(); 2228*4bdff4beSrobert ++__start_; 222946035553Spatrick __maybe_remove_front_spare(); 223046035553Spatrick } 223146035553Spatrick else 223246035553Spatrick { // erase from back 2233*4bdff4beSrobert iterator __i = _VSTD::move(_VSTD::next(__p), end(), __p); 223446035553Spatrick __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); 2235*4bdff4beSrobert --__size(); 223646035553Spatrick __maybe_remove_back_spare(); 223746035553Spatrick } 2238*4bdff4beSrobert return begin() + __pos; 223946035553Spatrick} 224046035553Spatrick 224146035553Spatricktemplate <class _Tp, class _Allocator> 224246035553Spatricktypename deque<_Tp, _Allocator>::iterator 224346035553Spatrickdeque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l) 224446035553Spatrick{ 224546035553Spatrick difference_type __n = __l - __f; 2246*4bdff4beSrobert iterator __b = begin(); 224746035553Spatrick difference_type __pos = __f - __b; 224846035553Spatrick iterator __p = __b + __pos; 224946035553Spatrick if (__n > 0) 225046035553Spatrick { 2251*4bdff4beSrobert allocator_type& __a = __alloc(); 2252*4bdff4beSrobert if (static_cast<size_t>(__pos) <= (size() - __n) / 2) 225346035553Spatrick { // erase from front 225446035553Spatrick iterator __i = _VSTD::move_backward(__b, __p, __p + __n); 225546035553Spatrick for (; __b != __i; ++__b) 225646035553Spatrick __alloc_traits::destroy(__a, _VSTD::addressof(*__b)); 2257*4bdff4beSrobert __size() -= __n; 2258*4bdff4beSrobert __start_ += __n; 225946035553Spatrick while (__maybe_remove_front_spare()) { 226046035553Spatrick } 226146035553Spatrick } 226246035553Spatrick else 226346035553Spatrick { // erase from back 2264*4bdff4beSrobert iterator __i = _VSTD::move(__p + __n, end(), __p); 2265*4bdff4beSrobert for (iterator __e = end(); __i != __e; ++__i) 226646035553Spatrick __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); 2267*4bdff4beSrobert __size() -= __n; 226846035553Spatrick while (__maybe_remove_back_spare()) { 226946035553Spatrick } 227046035553Spatrick } 227146035553Spatrick } 2272*4bdff4beSrobert return begin() + __pos; 227346035553Spatrick} 227446035553Spatrick 227546035553Spatricktemplate <class _Tp, class _Allocator> 227646035553Spatrickvoid 227746035553Spatrickdeque<_Tp, _Allocator>::__erase_to_end(const_iterator __f) 227846035553Spatrick{ 2279*4bdff4beSrobert iterator __e = end(); 228046035553Spatrick difference_type __n = __e - __f; 228146035553Spatrick if (__n > 0) 228246035553Spatrick { 2283*4bdff4beSrobert allocator_type& __a = __alloc(); 2284*4bdff4beSrobert iterator __b = begin(); 228546035553Spatrick difference_type __pos = __f - __b; 228646035553Spatrick for (iterator __p = __b + __pos; __p != __e; ++__p) 228746035553Spatrick __alloc_traits::destroy(__a, _VSTD::addressof(*__p)); 2288*4bdff4beSrobert __size() -= __n; 228946035553Spatrick while (__maybe_remove_back_spare()) { 229046035553Spatrick } 229146035553Spatrick } 229246035553Spatrick} 229346035553Spatrick 229446035553Spatricktemplate <class _Tp, class _Allocator> 229546035553Spatrickinline 229646035553Spatrickvoid 229746035553Spatrickdeque<_Tp, _Allocator>::swap(deque& __c) 229846035553Spatrick#if _LIBCPP_STD_VER >= 14 229946035553Spatrick _NOEXCEPT 230046035553Spatrick#else 230146035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 230246035553Spatrick __is_nothrow_swappable<allocator_type>::value) 230346035553Spatrick#endif 230446035553Spatrick{ 2305*4bdff4beSrobert __map_.swap(__c.__map_); 2306*4bdff4beSrobert _VSTD::swap(__start_, __c.__start_); 2307*4bdff4beSrobert _VSTD::swap(__size(), __c.__size()); 2308*4bdff4beSrobert _VSTD::__swap_allocator(__alloc(), __c.__alloc()); 230946035553Spatrick} 231046035553Spatrick 231146035553Spatricktemplate <class _Tp, class _Allocator> 231246035553Spatrickinline 231346035553Spatrickvoid 231446035553Spatrickdeque<_Tp, _Allocator>::clear() _NOEXCEPT 231546035553Spatrick{ 2316*4bdff4beSrobert allocator_type& __a = __alloc(); 2317*4bdff4beSrobert for (iterator __i = begin(), __e = end(); __i != __e; ++__i) 2318*4bdff4beSrobert __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); 2319*4bdff4beSrobert __size() = 0; 2320*4bdff4beSrobert while (__map_.size() > 2) 2321*4bdff4beSrobert { 2322*4bdff4beSrobert __alloc_traits::deallocate(__a, __map_.front(), __block_size); 2323*4bdff4beSrobert __map_.pop_front(); 2324*4bdff4beSrobert } 2325*4bdff4beSrobert switch (__map_.size()) 2326*4bdff4beSrobert { 2327*4bdff4beSrobert case 1: 2328*4bdff4beSrobert __start_ = __block_size / 2; 2329*4bdff4beSrobert break; 2330*4bdff4beSrobert case 2: 2331*4bdff4beSrobert __start_ = __block_size; 2332*4bdff4beSrobert break; 2333*4bdff4beSrobert } 233446035553Spatrick} 233546035553Spatrick 233646035553Spatricktemplate <class _Tp, class _Allocator> 2337*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 233846035553Spatrickbool 233946035553Spatrickoperator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 234046035553Spatrick{ 234146035553Spatrick const typename deque<_Tp, _Allocator>::size_type __sz = __x.size(); 234246035553Spatrick return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 234346035553Spatrick} 234446035553Spatrick 234546035553Spatricktemplate <class _Tp, class _Allocator> 2346*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 234746035553Spatrickbool 234846035553Spatrickoperator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 234946035553Spatrick{ 235046035553Spatrick return !(__x == __y); 235146035553Spatrick} 235246035553Spatrick 235346035553Spatricktemplate <class _Tp, class _Allocator> 2354*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 235546035553Spatrickbool 235646035553Spatrickoperator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 235746035553Spatrick{ 235846035553Spatrick return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 235946035553Spatrick} 236046035553Spatrick 236146035553Spatricktemplate <class _Tp, class _Allocator> 2362*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 236346035553Spatrickbool 236446035553Spatrickoperator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 236546035553Spatrick{ 236646035553Spatrick return __y < __x; 236746035553Spatrick} 236846035553Spatrick 236946035553Spatricktemplate <class _Tp, class _Allocator> 2370*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 237146035553Spatrickbool 237246035553Spatrickoperator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 237346035553Spatrick{ 237446035553Spatrick return !(__x < __y); 237546035553Spatrick} 237646035553Spatrick 237746035553Spatricktemplate <class _Tp, class _Allocator> 2378*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 237946035553Spatrickbool 238046035553Spatrickoperator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 238146035553Spatrick{ 238246035553Spatrick return !(__y < __x); 238346035553Spatrick} 238446035553Spatrick 238546035553Spatricktemplate <class _Tp, class _Allocator> 2386*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 238746035553Spatrickvoid 238846035553Spatrickswap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y) 238946035553Spatrick _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 239046035553Spatrick{ 239146035553Spatrick __x.swap(__y); 239246035553Spatrick} 239346035553Spatrick 239446035553Spatrick#if _LIBCPP_STD_VER > 17 239546035553Spatricktemplate <class _Tp, class _Allocator, class _Up> 2396*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI typename deque<_Tp, _Allocator>::size_type 2397037e7968Spatrickerase(deque<_Tp, _Allocator>& __c, const _Up& __v) { 2398037e7968Spatrick auto __old_size = __c.size(); 2399037e7968Spatrick __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); 2400037e7968Spatrick return __old_size - __c.size(); 2401037e7968Spatrick} 240246035553Spatrick 240346035553Spatricktemplate <class _Tp, class _Allocator, class _Predicate> 2404*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI typename deque<_Tp, _Allocator>::size_type 2405037e7968Spatrickerase_if(deque<_Tp, _Allocator>& __c, _Predicate __pred) { 2406037e7968Spatrick auto __old_size = __c.size(); 2407037e7968Spatrick __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); 2408037e7968Spatrick return __old_size - __c.size(); 2409037e7968Spatrick} 2410*4bdff4beSrobert 2411*4bdff4beSroberttemplate <> 2412*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<std::deque<char>> = true; 2413*4bdff4beSrobert#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 2414*4bdff4beSroberttemplate <> 2415*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<std::deque<wchar_t>> = true; 241646035553Spatrick#endif 241746035553Spatrick 2418*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 17 241946035553Spatrick 242046035553Spatrick_LIBCPP_END_NAMESPACE_STD 242146035553Spatrick 2422*4bdff4beSrobert#if _LIBCPP_STD_VER > 14 2423*4bdff4beSrobert_LIBCPP_BEGIN_NAMESPACE_STD 2424*4bdff4beSrobertnamespace pmr { 2425*4bdff4beSroberttemplate <class _ValueT> 2426*4bdff4beSrobertusing deque = std::deque<_ValueT, polymorphic_allocator<_ValueT>>; 2427*4bdff4beSrobert} // namespace pmr 2428*4bdff4beSrobert_LIBCPP_END_NAMESPACE_STD 2429*4bdff4beSrobert#endif 2430*4bdff4beSrobert 243146035553Spatrick_LIBCPP_POP_MACROS 243246035553Spatrick 2433*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 2434*4bdff4beSrobert# include <algorithm> 2435*4bdff4beSrobert# include <atomic> 2436*4bdff4beSrobert# include <concepts> 2437*4bdff4beSrobert# include <functional> 2438*4bdff4beSrobert# include <iosfwd> 2439*4bdff4beSrobert# include <iterator> 2440*4bdff4beSrobert# include <typeinfo> 2441*4bdff4beSrobert#endif 2442*4bdff4beSrobert 244346035553Spatrick#endif // _LIBCPP_DEQUE 2444