2 //===---------------------------- deque -----------------------------------===//
4 // The LLVM Compiler Infrastructure
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
20 template <class T, class Allocator = allocator<T> >
26 typedef Allocator allocator_type;
28 typedef typename allocator_type::reference reference;
29 typedef typename allocator_type::const_reference const_reference;
30 typedef implementation-defined iterator;
31 typedef implementation-defined const_iterator;
32 typedef typename allocator_type::size_type size_type;
33 typedef typename allocator_type::difference_type difference_type;
35 typedef typename allocator_type::pointer pointer;
36 typedef typename allocator_type::const_pointer const_pointer;
37 typedef std::reverse_iterator<iterator> reverse_iterator;
38 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
40 // construct/copy/destroy:
41 deque() noexcept(is_nothrow_default_constructible<allocator_type>::value);
42 explicit deque(const allocator_type& a);
43 explicit deque(size_type n);
44 explicit deque(size_type n, const allocator_type& a); // C++14
45 deque(size_type n, const value_type& v);
46 deque(size_type n, const value_type& v, const allocator_type& a);
47 template <class InputIterator>
48 deque(InputIterator f, InputIterator l);
49 template <class InputIterator>
50 deque(InputIterator f, InputIterator l, const allocator_type& a);
51 deque(const deque& c);
53 noexcept(is_nothrow_move_constructible<allocator_type>::value);
54 deque(initializer_list<value_type> il, const Allocator& a = allocator_type());
55 deque(const deque& c, const allocator_type& a);
56 deque(deque&& c, const allocator_type& a);
59 deque& operator=(const deque& c);
60 deque& operator=(deque&& c)
62 allocator_type::propagate_on_container_move_assignment::value &&
63 is_nothrow_move_assignable<allocator_type>::value);
64 deque& operator=(initializer_list<value_type> il);
66 template <class InputIterator>
67 void assign(InputIterator f, InputIterator l);
68 void assign(size_type n, const value_type& v);
69 void assign(initializer_list<value_type> il);
71 allocator_type get_allocator() const noexcept;
75 iterator begin() noexcept;
76 const_iterator begin() const noexcept;
77 iterator end() noexcept;
78 const_iterator end() const noexcept;
80 reverse_iterator rbegin() noexcept;
81 const_reverse_iterator rbegin() const noexcept;
82 reverse_iterator rend() noexcept;
83 const_reverse_iterator rend() const noexcept;
85 const_iterator cbegin() const noexcept;
86 const_iterator cend() const noexcept;
87 const_reverse_iterator crbegin() const noexcept;
88 const_reverse_iterator crend() const noexcept;
91 size_type size() const noexcept;
92 size_type max_size() const noexcept;
93 void resize(size_type n);
94 void resize(size_type n, const value_type& v);
96 bool empty() const noexcept;
99 reference operator[](size_type i);
100 const_reference operator[](size_type i) const;
101 reference at(size_type i);
102 const_reference at(size_type i) const;
104 const_reference front() const;
106 const_reference back() const;
109 void push_front(const value_type& v);
110 void push_front(value_type&& v);
111 void push_back(const value_type& v);
112 void push_back(value_type&& v);
113 template <class... Args> reference emplace_front(Args&&... args); // reference in C++17
114 template <class... Args> reference emplace_back(Args&&... args); // reference in C++17
115 template <class... Args> iterator emplace(const_iterator p, Args&&... args);
116 iterator insert(const_iterator p, const value_type& v);
117 iterator insert(const_iterator p, value_type&& v);
118 iterator insert(const_iterator p, size_type n, const value_type& v);
119 template <class InputIterator>
120 iterator insert(const_iterator p, InputIterator f, InputIterator l);
121 iterator insert(const_iterator p, initializer_list<value_type> il);
124 iterator erase(const_iterator p);
125 iterator erase(const_iterator f, const_iterator l);
127 noexcept(allocator_traits<allocator_type>::is_always_equal::value); // C++17
128 void clear() noexcept;
131 template <class T, class Allocator>
132 bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
133 template <class T, class Allocator>
134 bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
135 template <class T, class Allocator>
136 bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
137 template <class T, class Allocator>
138 bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
139 template <class T, class Allocator>
140 bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
141 template <class T, class Allocator>
142 bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
144 // specialized algorithms:
145 template <class T, class Allocator>
146 void swap(deque<T,Allocator>& x, deque<T,Allocator>& y)
147 noexcept(noexcept(x.swap(y)));
153 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
154 #pragma GCC system_header
158 #include <__split_buffer>
159 #include <type_traits>
160 #include <initializer_list>
165 #include <__undef_min_max>
167 _LIBCPP_BEGIN_NAMESPACE_STD
169 template <class _Tp, class _Allocator> class __deque_base;
170 template <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS deque;
172 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
173 class _DiffType, _DiffType _BlockSize>
174 class _LIBCPP_TEMPLATE_VIS __deque_iterator;
176 template <class _RAIter,
177 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
178 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
181 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
182 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
184 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
185 class _OutputIterator>
187 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
188 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
189 _OutputIterator __r);
191 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
192 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
193 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
194 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
195 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
196 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
198 template <class _RAIter,
199 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
200 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
201 copy_backward(_RAIter __f,
203 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
204 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
206 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
207 class _OutputIterator>
209 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
210 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
211 _OutputIterator __r);
213 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
214 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
215 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
216 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
217 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
218 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
220 template <class _RAIter,
221 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
222 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
225 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
226 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
228 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
229 class _OutputIterator>
231 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
232 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
233 _OutputIterator __r);
235 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
236 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
237 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
238 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
239 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
240 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
242 template <class _RAIter,
243 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
244 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
245 move_backward(_RAIter __f,
247 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
248 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
250 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
251 class _OutputIterator>
253 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
254 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
255 _OutputIterator __r);
257 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
258 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
259 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
260 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
261 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
262 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
264 template <class _ValueType, class _DiffType>
265 struct __deque_block_size {
266 static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16;
269 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
270 class _DiffType, _DiffType _BS =
271 #ifdef _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
272 // Keep template parameter to avoid changing all template declarations thoughout
276 __deque_block_size<_ValueType, _DiffType>::value
279 class _LIBCPP_TEMPLATE_VIS __deque_iterator
281 typedef _MapPointer __map_iterator;
283 typedef _Pointer pointer;
284 typedef _DiffType difference_type;
286 __map_iterator __m_iter_;
289 static const difference_type __block_size;
291 typedef _ValueType value_type;
292 typedef random_access_iterator_tag iterator_category;
293 typedef _Reference reference;
295 _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT
296 #if _LIBCPP_STD_VER > 11
297 : __m_iter_(nullptr), __ptr_(nullptr)
301 template <class _Pp, class _Rp, class _MP>
302 _LIBCPP_INLINE_VISIBILITY
303 __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, _BS>& __it,
304 typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
305 : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
307 _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;}
308 _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;}
310 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++()
312 if (++__ptr_ - *__m_iter_ == __block_size)
320 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int)
322 __deque_iterator __tmp = *this;
327 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--()
329 if (__ptr_ == *__m_iter_)
332 __ptr_ = *__m_iter_ + __block_size;
338 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int)
340 __deque_iterator __tmp = *this;
345 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n)
349 __n += __ptr_ - *__m_iter_;
352 __m_iter_ += __n / __block_size;
353 __ptr_ = *__m_iter_ + __n % __block_size;
357 difference_type __z = __block_size - 1 - __n;
358 __m_iter_ -= __z / __block_size;
359 __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size);
365 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n)
367 return *this += -__n;
370 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const
372 __deque_iterator __t(*this);
377 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const
379 __deque_iterator __t(*this);
384 _LIBCPP_INLINE_VISIBILITY
385 friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it)
388 _LIBCPP_INLINE_VISIBILITY
389 friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y)
392 return (__x.__m_iter_ - __y.__m_iter_) * __block_size
393 + (__x.__ptr_ - *__x.__m_iter_)
394 - (__y.__ptr_ - *__y.__m_iter_);
398 _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
399 {return *(*this + __n);}
401 _LIBCPP_INLINE_VISIBILITY friend
402 bool operator==(const __deque_iterator& __x, const __deque_iterator& __y)
403 {return __x.__ptr_ == __y.__ptr_;}
405 _LIBCPP_INLINE_VISIBILITY friend
406 bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y)
407 {return !(__x == __y);}
409 _LIBCPP_INLINE_VISIBILITY friend
410 bool operator<(const __deque_iterator& __x, const __deque_iterator& __y)
411 {return __x.__m_iter_ < __y.__m_iter_ ||
412 (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);}
414 _LIBCPP_INLINE_VISIBILITY friend
415 bool operator>(const __deque_iterator& __x, const __deque_iterator& __y)
418 _LIBCPP_INLINE_VISIBILITY friend
419 bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y)
420 {return !(__y < __x);}
422 _LIBCPP_INLINE_VISIBILITY friend
423 bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y)
424 {return !(__x < __y);}
427 _LIBCPP_INLINE_VISIBILITY __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT
428 : __m_iter_(__m), __ptr_(__p) {}
430 template <class _Tp, class _Ap> friend class __deque_base;
431 template <class _Tp, class _Ap> friend class _LIBCPP_TEMPLATE_VIS deque;
432 template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp>
433 friend class _LIBCPP_TEMPLATE_VIS __deque_iterator;
435 template <class _RAIter,
436 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
438 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
441 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
442 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
444 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
445 class _OutputIterator>
448 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
449 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
450 _OutputIterator __r);
452 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
453 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
455 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
456 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
457 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
458 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
460 template <class _RAIter,
461 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
463 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
464 copy_backward(_RAIter __f,
466 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
467 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
469 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
470 class _OutputIterator>
473 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
474 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
475 _OutputIterator __r);
477 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
478 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
480 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
481 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
482 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
483 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
485 template <class _RAIter,
486 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
488 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
491 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
492 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
494 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
495 class _OutputIterator>
498 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
499 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
500 _OutputIterator __r);
502 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
503 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
505 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
506 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
507 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
508 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
510 template <class _RAIter,
511 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
513 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
514 move_backward(_RAIter __f,
516 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
517 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
519 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
520 class _OutputIterator>
523 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
524 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
525 _OutputIterator __r);
527 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
528 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
530 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
531 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
532 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
533 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
536 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
537 class _DiffType, _DiffType _BlockSize>
538 const _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer,
539 _DiffType, _BlockSize>::__block_size =
540 __deque_block_size<_ValueType, _DiffType>::value;
544 template <class _RAIter,
545 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
546 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
549 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
550 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
552 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
553 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
554 const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
557 pointer __rb = __r.__ptr_;
558 pointer __re = *__r.__m_iter_ + __block_size;
559 difference_type __bs = __re - __rb;
560 difference_type __n = __l - __f;
567 _VSTD::copy(__f, __m, __rb);
574 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
575 class _OutputIterator>
577 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
578 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
581 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
582 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
583 const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
584 difference_type __n = __l - __f;
587 pointer __fb = __f.__ptr_;
588 pointer __fe = *__f.__m_iter_ + __block_size;
589 difference_type __bs = __fe - __fb;
595 __r = _VSTD::copy(__fb, __fe, __r);
602 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
603 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
604 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
605 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
606 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
607 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
609 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
610 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
611 const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
612 difference_type __n = __l - __f;
615 pointer __fb = __f.__ptr_;
616 pointer __fe = *__f.__m_iter_ + __block_size;
617 difference_type __bs = __fe - __fb;
623 __r = _VSTD::copy(__fb, __fe, __r);
632 template <class _RAIter,
633 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
634 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
635 copy_backward(_RAIter __f,
637 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
638 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
640 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
641 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
644 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
645 pointer __rb = *__rp.__m_iter_;
646 pointer __re = __rp.__ptr_ + 1;
647 difference_type __bs = __re - __rb;
648 difference_type __n = __l - __f;
655 _VSTD::copy_backward(__m, __l, __re);
662 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
663 class _OutputIterator>
665 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
666 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
669 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
670 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
671 difference_type __n = __l - __f;
675 pointer __lb = *__l.__m_iter_;
676 pointer __le = __l.__ptr_ + 1;
677 difference_type __bs = __le - __lb;
683 __r = _VSTD::copy_backward(__lb, __le, __r);
690 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
691 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
692 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
693 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
694 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
695 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
697 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
698 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
699 difference_type __n = __l - __f;
703 pointer __lb = *__l.__m_iter_;
704 pointer __le = __l.__ptr_ + 1;
705 difference_type __bs = __le - __lb;
711 __r = _VSTD::copy_backward(__lb, __le, __r);
720 template <class _RAIter,
721 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
722 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
725 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
726 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
728 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
729 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
730 const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
733 pointer __rb = __r.__ptr_;
734 pointer __re = *__r.__m_iter_ + __block_size;
735 difference_type __bs = __re - __rb;
736 difference_type __n = __l - __f;
743 _VSTD::move(__f, __m, __rb);
750 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
751 class _OutputIterator>
753 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
754 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
757 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
758 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
759 const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
760 difference_type __n = __l - __f;
763 pointer __fb = __f.__ptr_;
764 pointer __fe = *__f.__m_iter_ + __block_size;
765 difference_type __bs = __fe - __fb;
771 __r = _VSTD::move(__fb, __fe, __r);
778 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
779 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
780 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
781 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
782 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
783 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
785 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
786 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
787 const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
788 difference_type __n = __l - __f;
791 pointer __fb = __f.__ptr_;
792 pointer __fe = *__f.__m_iter_ + __block_size;
793 difference_type __bs = __fe - __fb;
799 __r = _VSTD::move(__fb, __fe, __r);
808 template <class _RAIter,
809 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
810 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
811 move_backward(_RAIter __f,
813 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
814 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
816 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
817 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
820 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
821 pointer __rb = *__rp.__m_iter_;
822 pointer __re = __rp.__ptr_ + 1;
823 difference_type __bs = __re - __rb;
824 difference_type __n = __l - __f;
831 _VSTD::move_backward(__m, __l, __re);
838 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
839 class _OutputIterator>
841 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
842 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
845 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
846 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
847 difference_type __n = __l - __f;
851 pointer __lb = *__l.__m_iter_;
852 pointer __le = __l.__ptr_ + 1;
853 difference_type __bs = __le - __lb;
859 __r = _VSTD::move_backward(__lb, __le, __r);
866 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
867 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
868 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
869 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
870 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
871 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
873 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
874 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
875 difference_type __n = __l - __f;
879 pointer __lb = *__l.__m_iter_;
880 pointer __le = __l.__ptr_ + 1;
881 difference_type __bs = __le - __lb;
887 __r = _VSTD::move_backward(__lb, __le, __r);
895 class __deque_base_common
898 _LIBCPP_NORETURN void __throw_length_error() const;
899 _LIBCPP_NORETURN void __throw_out_of_range() const;
904 __deque_base_common<__b>::__throw_length_error() const
906 _VSTD::__throw_length_error("deque");
911 __deque_base_common<__b>::__throw_out_of_range() const
913 _VSTD::__throw_out_of_range("deque");
916 template <class _Tp, class _Allocator>
918 : protected __deque_base_common<true>
920 __deque_base(const __deque_base& __c);
921 __deque_base& operator=(const __deque_base& __c);
923 typedef _Tp value_type;
924 typedef _Allocator allocator_type;
925 typedef allocator_traits<allocator_type> __alloc_traits;
926 typedef value_type& reference;
927 typedef const value_type& const_reference;
928 typedef typename __alloc_traits::size_type size_type;
929 typedef typename __alloc_traits::difference_type difference_type;
930 typedef typename __alloc_traits::pointer pointer;
931 typedef typename __alloc_traits::const_pointer const_pointer;
933 static const difference_type __block_size;
935 typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
936 typedef allocator_traits<__pointer_allocator> __map_traits;
937 typedef typename __map_traits::pointer __map_pointer;
938 typedef typename __rebind_alloc_helper<__alloc_traits, const_pointer>::type __const_pointer_allocator;
939 typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer;
940 typedef __split_buffer<pointer, __pointer_allocator> __map;
942 typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
943 difference_type> iterator;
944 typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
945 difference_type> const_iterator;
949 __compressed_pair<size_type, allocator_type> __size_;
951 iterator begin() _NOEXCEPT;
952 const_iterator begin() const _NOEXCEPT;
953 iterator end() _NOEXCEPT;
954 const_iterator end() const _NOEXCEPT;
956 _LIBCPP_INLINE_VISIBILITY size_type& size() {return __size_.first();}
957 _LIBCPP_INLINE_VISIBILITY
958 const size_type& size() const _NOEXCEPT {return __size_.first();}
959 _LIBCPP_INLINE_VISIBILITY allocator_type& __alloc() {return __size_.second();}
960 _LIBCPP_INLINE_VISIBILITY
961 const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
963 _LIBCPP_INLINE_VISIBILITY
965 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
966 _LIBCPP_INLINE_VISIBILITY
967 explicit __deque_base(const allocator_type& __a);
971 #ifndef _LIBCPP_CXX03_LANG
972 __deque_base(__deque_base&& __c)
973 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
974 __deque_base(__deque_base&& __c, const allocator_type& __a);
975 #endif // _LIBCPP_CXX03_LANG
977 void swap(__deque_base& __c)
978 #if _LIBCPP_STD_VER >= 14
981 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
982 __is_nothrow_swappable<allocator_type>::value);
985 void clear() _NOEXCEPT;
987 bool __invariants() const;
989 _LIBCPP_INLINE_VISIBILITY
990 void __move_assign(__deque_base& __c)
991 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
992 is_nothrow_move_assignable<allocator_type>::value)
994 __map_ = _VSTD::move(__c.__map_);
995 __start_ = __c.__start_;
997 __move_assign_alloc(__c);
998 __c.__start_ = __c.size() = 0;
1001 _LIBCPP_INLINE_VISIBILITY
1002 void __move_assign_alloc(__deque_base& __c)
1003 _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value ||
1004 is_nothrow_move_assignable<allocator_type>::value)
1005 {__move_assign_alloc(__c, integral_constant<bool,
1006 __alloc_traits::propagate_on_container_move_assignment::value>());}
1009 _LIBCPP_INLINE_VISIBILITY
1010 void __move_assign_alloc(__deque_base& __c, true_type)
1011 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1013 __alloc() = _VSTD::move(__c.__alloc());
1016 _LIBCPP_INLINE_VISIBILITY
1017 void __move_assign_alloc(__deque_base&, false_type) _NOEXCEPT
1021 template <class _Tp, class _Allocator>
1022 const typename __deque_base<_Tp, _Allocator>::difference_type
1023 __deque_base<_Tp, _Allocator>::__block_size =
1024 __deque_block_size<value_type, difference_type>::value;
1026 template <class _Tp, class _Allocator>
1028 __deque_base<_Tp, _Allocator>::__invariants() const
1030 if (!__map_.__invariants())
1032 if (__map_.size() >= size_type(-1) / __block_size)
1034 for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end();
1036 if (*__i == nullptr)
1038 if (__map_.size() != 0)
1040 if (size() >= __map_.size() * __block_size)
1042 if (__start_ >= __map_.size() * __block_size - size())
1055 template <class _Tp, class _Allocator>
1056 typename __deque_base<_Tp, _Allocator>::iterator
1057 __deque_base<_Tp, _Allocator>::begin() _NOEXCEPT
1059 __map_pointer __mp = __map_.begin() + __start_ / __block_size;
1060 return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
1063 template <class _Tp, class _Allocator>
1064 typename __deque_base<_Tp, _Allocator>::const_iterator
1065 __deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
1067 __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
1068 return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
1071 template <class _Tp, class _Allocator>
1072 typename __deque_base<_Tp, _Allocator>::iterator
1073 __deque_base<_Tp, _Allocator>::end() _NOEXCEPT
1075 size_type __p = size() + __start_;
1076 __map_pointer __mp = __map_.begin() + __p / __block_size;
1077 return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
1080 template <class _Tp, class _Allocator>
1081 typename __deque_base<_Tp, _Allocator>::const_iterator
1082 __deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
1084 size_type __p = size() + __start_;
1085 __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
1086 return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
1089 template <class _Tp, class _Allocator>
1091 __deque_base<_Tp, _Allocator>::__deque_base()
1092 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1093 : __start_(0), __size_(0) {}
1095 template <class _Tp, class _Allocator>
1097 __deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
1098 : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
1100 template <class _Tp, class _Allocator>
1101 __deque_base<_Tp, _Allocator>::~__deque_base()
1104 typename __map::iterator __i = __map_.begin();
1105 typename __map::iterator __e = __map_.end();
1106 for (; __i != __e; ++__i)
1107 __alloc_traits::deallocate(__alloc(), *__i, __block_size);
1110 #ifndef _LIBCPP_CXX03_LANG
1112 template <class _Tp, class _Allocator>
1113 __deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c)
1114 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
1115 : __map_(_VSTD::move(__c.__map_)),
1116 __start_(_VSTD::move(__c.__start_)),
1117 __size_(_VSTD::move(__c.__size_))
1123 template <class _Tp, class _Allocator>
1124 __deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a)
1125 : __map_(_VSTD::move(__c.__map_), __pointer_allocator(__a)),
1126 __start_(_VSTD::move(__c.__start_)),
1127 __size_(_VSTD::move(__c.size()), __a)
1129 if (__a == __c.__alloc())
1142 #endif // _LIBCPP_CXX03_LANG
1144 template <class _Tp, class _Allocator>
1146 __deque_base<_Tp, _Allocator>::swap(__deque_base& __c)
1147 #if _LIBCPP_STD_VER >= 14
1150 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1151 __is_nothrow_swappable<allocator_type>::value)
1154 __map_.swap(__c.__map_);
1155 _VSTD::swap(__start_, __c.__start_);
1156 _VSTD::swap(size(), __c.size());
1157 __swap_allocator(__alloc(), __c.__alloc());
1160 template <class _Tp, class _Allocator>
1162 __deque_base<_Tp, _Allocator>::clear() _NOEXCEPT
1164 allocator_type& __a = __alloc();
1165 for (iterator __i = begin(), __e = end(); __i != __e; ++__i)
1166 __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
1168 while (__map_.size() > 2)
1170 __alloc_traits::deallocate(__a, __map_.front(), __block_size);
1173 switch (__map_.size())
1176 __start_ = __block_size / 2;
1179 __start_ = __block_size;
1184 template <class _Tp, class _Allocator /*= allocator<_Tp>*/>
1185 class _LIBCPP_TEMPLATE_VIS deque
1186 : private __deque_base<_Tp, _Allocator>
1191 typedef _Tp value_type;
1192 typedef _Allocator allocator_type;
1194 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1195 "Allocator::value_type must be same type as value_type");
1197 typedef __deque_base<value_type, allocator_type> __base;
1199 typedef typename __base::__alloc_traits __alloc_traits;
1200 typedef typename __base::reference reference;
1201 typedef typename __base::const_reference const_reference;
1202 typedef typename __base::iterator iterator;
1203 typedef typename __base::const_iterator const_iterator;
1204 typedef typename __base::size_type size_type;
1205 typedef typename __base::difference_type difference_type;
1207 typedef typename __base::pointer pointer;
1208 typedef typename __base::const_pointer const_pointer;
1209 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1210 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
1212 // construct/copy/destroy:
1213 _LIBCPP_INLINE_VISIBILITY
1215 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1217 _LIBCPP_INLINE_VISIBILITY explicit deque(const allocator_type& __a) : __base(__a) {}
1218 explicit deque(size_type __n);
1219 #if _LIBCPP_STD_VER > 11
1220 explicit deque(size_type __n, const _Allocator& __a);
1222 deque(size_type __n, const value_type& __v);
1223 deque(size_type __n, const value_type& __v, const allocator_type& __a);
1224 template <class _InputIter>
1225 deque(_InputIter __f, _InputIter __l,
1226 typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
1227 template <class _InputIter>
1228 deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
1229 typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0);
1230 deque(const deque& __c);
1231 deque(const deque& __c, const allocator_type& __a);
1233 deque& operator=(const deque& __c);
1235 #ifndef _LIBCPP_CXX03_LANG
1236 deque(initializer_list<value_type> __il);
1237 deque(initializer_list<value_type> __il, const allocator_type& __a);
1239 _LIBCPP_INLINE_VISIBILITY
1240 deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;}
1242 _LIBCPP_INLINE_VISIBILITY
1243 deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
1244 _LIBCPP_INLINE_VISIBILITY
1245 deque(deque&& __c, const allocator_type& __a);
1246 _LIBCPP_INLINE_VISIBILITY
1247 deque& operator=(deque&& __c)
1248 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1249 is_nothrow_move_assignable<allocator_type>::value);
1251 _LIBCPP_INLINE_VISIBILITY
1252 void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
1253 #endif // _LIBCPP_CXX03_LANG
1255 template <class _InputIter>
1256 void assign(_InputIter __f, _InputIter __l,
1257 typename enable_if<__is_input_iterator<_InputIter>::value &&
1258 !__is_random_access_iterator<_InputIter>::value>::type* = 0);
1259 template <class _RAIter>
1260 void assign(_RAIter __f, _RAIter __l,
1261 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
1262 void assign(size_type __n, const value_type& __v);
1264 _LIBCPP_INLINE_VISIBILITY
1265 allocator_type get_allocator() const _NOEXCEPT;
1269 _LIBCPP_INLINE_VISIBILITY
1270 iterator begin() _NOEXCEPT {return __base::begin();}
1271 _LIBCPP_INLINE_VISIBILITY
1272 const_iterator begin() const _NOEXCEPT {return __base::begin();}
1273 _LIBCPP_INLINE_VISIBILITY
1274 iterator end() _NOEXCEPT {return __base::end();}
1275 _LIBCPP_INLINE_VISIBILITY
1276 const_iterator end() const _NOEXCEPT {return __base::end();}
1278 _LIBCPP_INLINE_VISIBILITY
1279 reverse_iterator rbegin() _NOEXCEPT
1280 {return reverse_iterator(__base::end());}
1281 _LIBCPP_INLINE_VISIBILITY
1282 const_reverse_iterator rbegin() const _NOEXCEPT
1283 {return const_reverse_iterator(__base::end());}
1284 _LIBCPP_INLINE_VISIBILITY
1285 reverse_iterator rend() _NOEXCEPT
1286 {return reverse_iterator(__base::begin());}
1287 _LIBCPP_INLINE_VISIBILITY
1288 const_reverse_iterator rend() const _NOEXCEPT
1289 {return const_reverse_iterator(__base::begin());}
1291 _LIBCPP_INLINE_VISIBILITY
1292 const_iterator cbegin() const _NOEXCEPT
1293 {return __base::begin();}
1294 _LIBCPP_INLINE_VISIBILITY
1295 const_iterator cend() const _NOEXCEPT
1296 {return __base::end();}
1297 _LIBCPP_INLINE_VISIBILITY
1298 const_reverse_iterator crbegin() const _NOEXCEPT
1299 {return const_reverse_iterator(__base::end());}
1300 _LIBCPP_INLINE_VISIBILITY
1301 const_reverse_iterator crend() const _NOEXCEPT
1302 {return const_reverse_iterator(__base::begin());}
1305 _LIBCPP_INLINE_VISIBILITY
1306 size_type size() const _NOEXCEPT {return __base::size();}
1307 _LIBCPP_INLINE_VISIBILITY
1308 size_type max_size() const _NOEXCEPT
1309 {return std::min<size_type>(
1310 __alloc_traits::max_size(__base::__alloc()),
1311 numeric_limits<difference_type>::max());}
1312 void resize(size_type __n);
1313 void resize(size_type __n, const value_type& __v);
1314 void shrink_to_fit() _NOEXCEPT;
1315 _LIBCPP_INLINE_VISIBILITY
1316 bool empty() const _NOEXCEPT {return __base::size() == 0;}
1319 _LIBCPP_INLINE_VISIBILITY
1320 reference operator[](size_type __i);
1321 _LIBCPP_INLINE_VISIBILITY
1322 const_reference operator[](size_type __i) const;
1323 _LIBCPP_INLINE_VISIBILITY
1324 reference at(size_type __i);
1325 _LIBCPP_INLINE_VISIBILITY
1326 const_reference at(size_type __i) const;
1327 _LIBCPP_INLINE_VISIBILITY
1329 _LIBCPP_INLINE_VISIBILITY
1330 const_reference front() const;
1331 _LIBCPP_INLINE_VISIBILITY
1333 _LIBCPP_INLINE_VISIBILITY
1334 const_reference back() const;
1336 // 23.2.2.3 modifiers:
1337 void push_front(const value_type& __v);
1338 void push_back(const value_type& __v);
1339 #ifndef _LIBCPP_CXX03_LANG
1340 #if _LIBCPP_STD_VER > 14
1341 template <class... _Args> reference emplace_front(_Args&&... __args);
1342 template <class... _Args> reference emplace_back (_Args&&... __args);
1344 template <class... _Args> void emplace_front(_Args&&... __args);
1345 template <class... _Args> void emplace_back (_Args&&... __args);
1347 template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
1349 void push_front(value_type&& __v);
1350 void push_back(value_type&& __v);
1351 iterator insert(const_iterator __p, value_type&& __v);
1353 _LIBCPP_INLINE_VISIBILITY
1354 iterator insert(const_iterator __p, initializer_list<value_type> __il)
1355 {return insert(__p, __il.begin(), __il.end());}
1356 #endif // _LIBCPP_CXX03_LANG
1358 iterator insert(const_iterator __p, const value_type& __v);
1359 iterator insert(const_iterator __p, size_type __n, const value_type& __v);
1360 template <class _InputIter>
1361 iterator insert(const_iterator __p, _InputIter __f, _InputIter __l,
1362 typename enable_if<__is_input_iterator<_InputIter>::value
1363 &&!__is_forward_iterator<_InputIter>::value>::type* = 0);
1364 template <class _ForwardIterator>
1365 iterator insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
1366 typename enable_if<__is_forward_iterator<_ForwardIterator>::value
1367 &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type* = 0);
1368 template <class _BiIter>
1369 iterator insert(const_iterator __p, _BiIter __f, _BiIter __l,
1370 typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type* = 0);
1374 iterator erase(const_iterator __p);
1375 iterator erase(const_iterator __f, const_iterator __l);
1377 _LIBCPP_INLINE_VISIBILITY
1378 void swap(deque& __c)
1379 #if _LIBCPP_STD_VER >= 14
1382 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1383 __is_nothrow_swappable<allocator_type>::value);
1385 _LIBCPP_INLINE_VISIBILITY
1386 void clear() _NOEXCEPT;
1388 _LIBCPP_INLINE_VISIBILITY
1389 bool __invariants() const {return __base::__invariants();}
1391 typedef typename __base::__map_const_pointer __map_const_pointer;
1393 _LIBCPP_INLINE_VISIBILITY
1394 static size_type __recommend_blocks(size_type __n)
1396 return __n / __base::__block_size + (__n % __base::__block_size != 0);
1398 _LIBCPP_INLINE_VISIBILITY
1399 size_type __capacity() const
1401 return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1;
1403 _LIBCPP_INLINE_VISIBILITY
1404 size_type __front_spare() const
1406 return __base::__start_;
1408 _LIBCPP_INLINE_VISIBILITY
1409 size_type __back_spare() const
1411 return __capacity() - (__base::__start_ + __base::size());
1414 template <class _InpIter>
1415 void __append(_InpIter __f, _InpIter __l,
1416 typename enable_if<__is_input_iterator<_InpIter>::value &&
1417 !__is_forward_iterator<_InpIter>::value>::type* = 0);
1418 template <class _ForIter>
1419 void __append(_ForIter __f, _ForIter __l,
1420 typename enable_if<__is_forward_iterator<_ForIter>::value>::type* = 0);
1421 void __append(size_type __n);
1422 void __append(size_type __n, const value_type& __v);
1423 void __erase_to_end(const_iterator __f);
1424 void __add_front_capacity();
1425 void __add_front_capacity(size_type __n);
1426 void __add_back_capacity();
1427 void __add_back_capacity(size_type __n);
1428 iterator __move_and_check(iterator __f, iterator __l, iterator __r,
1429 const_pointer& __vt);
1430 iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r,
1431 const_pointer& __vt);
1432 void __move_construct_and_check(iterator __f, iterator __l,
1433 iterator __r, const_pointer& __vt);
1434 void __move_construct_backward_and_check(iterator __f, iterator __l,
1435 iterator __r, const_pointer& __vt);
1437 _LIBCPP_INLINE_VISIBILITY
1438 void __copy_assign_alloc(const deque& __c)
1439 {__copy_assign_alloc(__c, integral_constant<bool,
1440 __alloc_traits::propagate_on_container_copy_assignment::value>());}
1442 _LIBCPP_INLINE_VISIBILITY
1443 void __copy_assign_alloc(const deque& __c, true_type)
1445 if (__base::__alloc() != __c.__alloc())
1450 __base::__alloc() = __c.__alloc();
1451 __base::__map_.__alloc() = __c.__map_.__alloc();
1454 _LIBCPP_INLINE_VISIBILITY
1455 void __copy_assign_alloc(const deque&, false_type)
1458 void __move_assign(deque& __c, true_type)
1459 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
1460 void __move_assign(deque& __c, false_type);
1463 template <class _Tp, class _Allocator>
1464 deque<_Tp, _Allocator>::deque(size_type __n)
1470 #if _LIBCPP_STD_VER > 11
1471 template <class _Tp, class _Allocator>
1472 deque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a)
1480 template <class _Tp, class _Allocator>
1481 deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)
1487 template <class _Tp, class _Allocator>
1488 deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a)
1495 template <class _Tp, class _Allocator>
1496 template <class _InputIter>
1497 deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l,
1498 typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
1503 template <class _Tp, class _Allocator>
1504 template <class _InputIter>
1505 deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a,
1506 typename enable_if<__is_input_iterator<_InputIter>::value>::type*)
1512 template <class _Tp, class _Allocator>
1513 deque<_Tp, _Allocator>::deque(const deque& __c)
1514 : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc()))
1516 __append(__c.begin(), __c.end());
1519 template <class _Tp, class _Allocator>
1520 deque<_Tp, _Allocator>::deque(const deque& __c, const allocator_type& __a)
1523 __append(__c.begin(), __c.end());
1526 template <class _Tp, class _Allocator>
1527 deque<_Tp, _Allocator>&
1528 deque<_Tp, _Allocator>::operator=(const deque& __c)
1532 __copy_assign_alloc(__c);
1533 assign(__c.begin(), __c.end());
1538 #ifndef _LIBCPP_CXX03_LANG
1540 template <class _Tp, class _Allocator>
1541 deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il)
1543 __append(__il.begin(), __il.end());
1546 template <class _Tp, class _Allocator>
1547 deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a)
1550 __append(__il.begin(), __il.end());
1553 template <class _Tp, class _Allocator>
1555 deque<_Tp, _Allocator>::deque(deque&& __c)
1556 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1557 : __base(_VSTD::move(__c))
1561 template <class _Tp, class _Allocator>
1563 deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a)
1564 : __base(_VSTD::move(__c), __a)
1566 if (__a != __c.__alloc())
1568 typedef move_iterator<iterator> _Ip;
1569 assign(_Ip(__c.begin()), _Ip(__c.end()));
1573 template <class _Tp, class _Allocator>
1575 deque<_Tp, _Allocator>&
1576 deque<_Tp, _Allocator>::operator=(deque&& __c)
1577 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1578 is_nothrow_move_assignable<allocator_type>::value)
1580 __move_assign(__c, integral_constant<bool,
1581 __alloc_traits::propagate_on_container_move_assignment::value>());
1585 template <class _Tp, class _Allocator>
1587 deque<_Tp, _Allocator>::__move_assign(deque& __c, false_type)
1589 if (__base::__alloc() != __c.__alloc())
1591 typedef move_iterator<iterator> _Ip;
1592 assign(_Ip(__c.begin()), _Ip(__c.end()));
1595 __move_assign(__c, true_type());
1598 template <class _Tp, class _Allocator>
1600 deque<_Tp, _Allocator>::__move_assign(deque& __c, true_type)
1601 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1605 __base::__move_assign(__c);
1608 #endif // _LIBCPP_CXX03_LANG
1610 template <class _Tp, class _Allocator>
1611 template <class _InputIter>
1613 deque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
1614 typename enable_if<__is_input_iterator<_InputIter>::value &&
1615 !__is_random_access_iterator<_InputIter>::value>::type*)
1617 iterator __i = __base::begin();
1618 iterator __e = __base::end();
1619 for (; __f != __l && __i != __e; ++__f, (void) ++__i)
1624 __erase_to_end(__i);
1627 template <class _Tp, class _Allocator>
1628 template <class _RAIter>
1630 deque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l,
1631 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
1633 if (static_cast<size_type>(__l - __f) > __base::size())
1635 _RAIter __m = __f + __base::size();
1636 _VSTD::copy(__f, __m, __base::begin());
1640 __erase_to_end(_VSTD::copy(__f, __l, __base::begin()));
1643 template <class _Tp, class _Allocator>
1645 deque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v)
1647 if (__n > __base::size())
1649 _VSTD::fill_n(__base::begin(), __base::size(), __v);
1650 __n -= __base::size();
1654 __erase_to_end(_VSTD::fill_n(__base::begin(), __n, __v));
1657 template <class _Tp, class _Allocator>
1660 deque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
1662 return __base::__alloc();
1665 template <class _Tp, class _Allocator>
1667 deque<_Tp, _Allocator>::resize(size_type __n)
1669 if (__n > __base::size())
1670 __append(__n - __base::size());
1671 else if (__n < __base::size())
1672 __erase_to_end(__base::begin() + __n);
1675 template <class _Tp, class _Allocator>
1677 deque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v)
1679 if (__n > __base::size())
1680 __append(__n - __base::size(), __v);
1681 else if (__n < __base::size())
1682 __erase_to_end(__base::begin() + __n);
1685 template <class _Tp, class _Allocator>
1687 deque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
1689 allocator_type& __a = __base::__alloc();
1692 while (__base::__map_.size() > 0)
1694 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
1695 __base::__map_.pop_back();
1697 __base::__start_ = 0;
1701 if (__front_spare() >= __base::__block_size)
1703 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
1704 __base::__map_.pop_front();
1705 __base::__start_ -= __base::__block_size;
1707 if (__back_spare() >= __base::__block_size)
1709 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
1710 __base::__map_.pop_back();
1713 __base::__map_.shrink_to_fit();
1716 template <class _Tp, class _Allocator>
1718 typename deque<_Tp, _Allocator>::reference
1719 deque<_Tp, _Allocator>::operator[](size_type __i)
1721 size_type __p = __base::__start_ + __i;
1722 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
1725 template <class _Tp, class _Allocator>
1727 typename deque<_Tp, _Allocator>::const_reference
1728 deque<_Tp, _Allocator>::operator[](size_type __i) const
1730 size_type __p = __base::__start_ + __i;
1731 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
1734 template <class _Tp, class _Allocator>
1736 typename deque<_Tp, _Allocator>::reference
1737 deque<_Tp, _Allocator>::at(size_type __i)
1739 if (__i >= __base::size())
1740 __base::__throw_out_of_range();
1741 size_type __p = __base::__start_ + __i;
1742 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
1745 template <class _Tp, class _Allocator>
1747 typename deque<_Tp, _Allocator>::const_reference
1748 deque<_Tp, _Allocator>::at(size_type __i) const
1750 if (__i >= __base::size())
1751 __base::__throw_out_of_range();
1752 size_type __p = __base::__start_ + __i;
1753 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
1756 template <class _Tp, class _Allocator>
1758 typename deque<_Tp, _Allocator>::reference
1759 deque<_Tp, _Allocator>::front()
1761 return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
1762 + __base::__start_ % __base::__block_size);
1765 template <class _Tp, class _Allocator>
1767 typename deque<_Tp, _Allocator>::const_reference
1768 deque<_Tp, _Allocator>::front() const
1770 return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
1771 + __base::__start_ % __base::__block_size);
1774 template <class _Tp, class _Allocator>
1776 typename deque<_Tp, _Allocator>::reference
1777 deque<_Tp, _Allocator>::back()
1779 size_type __p = __base::size() + __base::__start_ - 1;
1780 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
1783 template <class _Tp, class _Allocator>
1785 typename deque<_Tp, _Allocator>::const_reference
1786 deque<_Tp, _Allocator>::back() const
1788 size_type __p = __base::size() + __base::__start_ - 1;
1789 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
1792 template <class _Tp, class _Allocator>
1794 deque<_Tp, _Allocator>::push_back(const value_type& __v)
1796 allocator_type& __a = __base::__alloc();
1797 if (__back_spare() == 0)
1798 __add_back_capacity();
1799 // __back_spare() >= 1
1800 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
1804 template <class _Tp, class _Allocator>
1806 deque<_Tp, _Allocator>::push_front(const value_type& __v)
1808 allocator_type& __a = __base::__alloc();
1809 if (__front_spare() == 0)
1810 __add_front_capacity();
1811 // __front_spare() >= 1
1812 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
1817 #ifndef _LIBCPP_CXX03_LANG
1818 template <class _Tp, class _Allocator>
1820 deque<_Tp, _Allocator>::push_back(value_type&& __v)
1822 allocator_type& __a = __base::__alloc();
1823 if (__back_spare() == 0)
1824 __add_back_capacity();
1825 // __back_spare() >= 1
1826 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
1830 template <class _Tp, class _Allocator>
1831 template <class... _Args>
1832 #if _LIBCPP_STD_VER > 14
1833 typename deque<_Tp, _Allocator>::reference
1837 deque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1839 allocator_type& __a = __base::__alloc();
1840 if (__back_spare() == 0)
1841 __add_back_capacity();
1842 // __back_spare() >= 1
1843 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()),
1844 _VSTD::forward<_Args>(__args)...);
1846 #if _LIBCPP_STD_VER > 14
1847 return *--__base::end();
1851 template <class _Tp, class _Allocator>
1853 deque<_Tp, _Allocator>::push_front(value_type&& __v)
1855 allocator_type& __a = __base::__alloc();
1856 if (__front_spare() == 0)
1857 __add_front_capacity();
1858 // __front_spare() >= 1
1859 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
1865 template <class _Tp, class _Allocator>
1866 template <class... _Args>
1867 #if _LIBCPP_STD_VER > 14
1868 typename deque<_Tp, _Allocator>::reference
1872 deque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
1874 allocator_type& __a = __base::__alloc();
1875 if (__front_spare() == 0)
1876 __add_front_capacity();
1877 // __front_spare() >= 1
1878 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
1881 #if _LIBCPP_STD_VER > 14
1882 return *__base::begin();
1886 template <class _Tp, class _Allocator>
1887 typename deque<_Tp, _Allocator>::iterator
1888 deque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v)
1890 size_type __pos = __p - __base::begin();
1891 size_type __to_end = __base::size() - __pos;
1892 allocator_type& __a = __base::__alloc();
1893 if (__pos < __to_end)
1894 { // insert by shifting things backward
1895 if (__front_spare() == 0)
1896 __add_front_capacity();
1897 // __front_spare() >= 1
1900 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v));
1906 iterator __b = __base::begin();
1907 iterator __bm1 = _VSTD::prev(__b);
1908 __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
1912 __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
1913 *__b = _VSTD::move(__v);
1917 { // insert by shifting things forward
1918 if (__back_spare() == 0)
1919 __add_back_capacity();
1920 // __back_capacity >= 1
1921 size_type __de = __base::size() - __pos;
1924 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v));
1929 iterator __e = __base::end();
1930 iterator __em1 = _VSTD::prev(__e);
1931 __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
1934 __e = _VSTD::move_backward(__e - __de, __em1, __e);
1935 *--__e = _VSTD::move(__v);
1938 return __base::begin() + __pos;
1941 template <class _Tp, class _Allocator>
1942 template <class... _Args>
1943 typename deque<_Tp, _Allocator>::iterator
1944 deque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args)
1946 size_type __pos = __p - __base::begin();
1947 size_type __to_end = __base::size() - __pos;
1948 allocator_type& __a = __base::__alloc();
1949 if (__pos < __to_end)
1950 { // insert by shifting things backward
1951 if (__front_spare() == 0)
1952 __add_front_capacity();
1953 // __front_spare() >= 1
1956 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
1962 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
1963 iterator __b = __base::begin();
1964 iterator __bm1 = _VSTD::prev(__b);
1965 __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
1969 __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b);
1970 *__b = _VSTD::move(__tmp.get());
1974 { // insert by shifting things forward
1975 if (__back_spare() == 0)
1976 __add_back_capacity();
1977 // __back_capacity >= 1
1978 size_type __de = __base::size() - __pos;
1981 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...);
1986 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
1987 iterator __e = __base::end();
1988 iterator __em1 = _VSTD::prev(__e);
1989 __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
1992 __e = _VSTD::move_backward(__e - __de, __em1, __e);
1993 *--__e = _VSTD::move(__tmp.get());
1996 return __base::begin() + __pos;
1999 #endif // _LIBCPP_CXX03_LANG
2002 template <class _Tp, class _Allocator>
2003 typename deque<_Tp, _Allocator>::iterator
2004 deque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v)
2006 size_type __pos = __p - __base::begin();
2007 size_type __to_end = __base::size() - __pos;
2008 allocator_type& __a = __base::__alloc();
2009 if (__pos < __to_end)
2010 { // insert by shifting things backward
2011 if (__front_spare() == 0)
2012 __add_front_capacity();
2013 // __front_spare() >= 1
2016 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v);
2022 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
2023 iterator __b = __base::begin();
2024 iterator __bm1 = _VSTD::prev(__b);
2025 if (__vt == pointer_traits<const_pointer>::pointer_to(*__b))
2026 __vt = pointer_traits<const_pointer>::pointer_to(*__bm1);
2027 __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b));
2031 __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt);
2036 { // insert by shifting things forward
2037 if (__back_spare() == 0)
2038 __add_back_capacity();
2039 // __back_capacity >= 1
2040 size_type __de = __base::size() - __pos;
2043 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v);
2048 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
2049 iterator __e = __base::end();
2050 iterator __em1 = _VSTD::prev(__e);
2051 if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1))
2052 __vt = pointer_traits<const_pointer>::pointer_to(*__e);
2053 __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1));
2056 __e = __move_backward_and_check(__e - __de, __em1, __e, __vt);
2060 return __base::begin() + __pos;
2063 template <class _Tp, class _Allocator>
2064 typename deque<_Tp, _Allocator>::iterator
2065 deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v)
2067 size_type __pos = __p - __base::begin();
2068 size_type __to_end = __base::size() - __pos;
2069 allocator_type& __a = __base::__alloc();
2070 if (__pos < __to_end)
2071 { // insert by shifting things backward
2072 if (__n > __front_spare())
2073 __add_front_capacity(__n - __front_spare());
2074 // __n <= __front_spare()
2075 iterator __old_begin = __base::begin();
2076 iterator __i = __old_begin;
2079 for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size())
2080 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v);
2085 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
2086 iterator __obn = __old_begin + __n;
2087 __move_construct_backward_and_check(__old_begin, __obn, __i, __vt);
2089 __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt);
2090 _VSTD::fill_n(__old_begin, __n, *__vt);
2094 { // insert by shifting things forward
2095 size_type __back_capacity = __back_spare();
2096 if (__n > __back_capacity)
2097 __add_back_capacity(__n - __back_capacity);
2098 // __n <= __back_capacity
2099 iterator __old_end = __base::end();
2100 iterator __i = __old_end;
2101 size_type __de = __base::size() - __pos;
2104 for (size_type __m = __n - __de; __m; --__m, ++__i, ++__base::size())
2105 __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
2110 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v);
2111 iterator __oen = __old_end - __n;
2112 __move_construct_and_check(__oen, __old_end, __i, __vt);
2114 __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt);
2115 _VSTD::fill_n(__old_end - __n, __n, *__vt);
2118 return __base::begin() + __pos;
2121 template <class _Tp, class _Allocator>
2122 template <class _InputIter>
2123 typename deque<_Tp, _Allocator>::iterator
2124 deque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l,
2125 typename enable_if<__is_input_iterator<_InputIter>::value
2126 &&!__is_forward_iterator<_InputIter>::value>::type*)
2128 __split_buffer<value_type, allocator_type&> __buf(__base::__alloc());
2129 __buf.__construct_at_end(__f, __l);
2130 typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi;
2131 return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end()));
2134 template <class _Tp, class _Allocator>
2135 template <class _ForwardIterator>
2136 typename deque<_Tp, _Allocator>::iterator
2137 deque<_Tp, _Allocator>::insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l,
2138 typename enable_if<__is_forward_iterator<_ForwardIterator>::value
2139 &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type*)
2141 size_type __n = _VSTD::distance(__f, __l);
2142 __split_buffer<value_type, allocator_type&> __buf(__n, 0, __base::__alloc());
2143 __buf.__construct_at_end(__f, __l);
2144 typedef typename __split_buffer<value_type, allocator_type&>::iterator __fwd;
2145 return insert(__p, move_iterator<__fwd>(__buf.begin()), move_iterator<__fwd>(__buf.end()));
2148 template <class _Tp, class _Allocator>
2149 template <class _BiIter>
2150 typename deque<_Tp, _Allocator>::iterator
2151 deque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
2152 typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type*)
2154 size_type __n = _VSTD::distance(__f, __l);
2155 size_type __pos = __p - __base::begin();
2156 size_type __to_end = __base::size() - __pos;
2157 allocator_type& __a = __base::__alloc();
2158 if (__pos < __to_end)
2159 { // insert by shifting things backward
2160 if (__n > __front_spare())
2161 __add_front_capacity(__n - __front_spare());
2162 // __n <= __front_spare()
2163 iterator __old_begin = __base::begin();
2164 iterator __i = __old_begin;
2168 __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos);
2169 for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size())
2170 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j);
2175 iterator __obn = __old_begin + __n;
2176 for (iterator __j = __obn; __j != __old_begin;)
2178 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j));
2183 __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin);
2184 _VSTD::copy(__m, __l, __old_begin);
2188 { // insert by shifting things forward
2189 size_type __back_capacity = __back_spare();
2190 if (__n > __back_capacity)
2191 __add_back_capacity(__n - __back_capacity);
2192 // __n <= __back_capacity
2193 iterator __old_end = __base::end();
2194 iterator __i = __old_end;
2196 size_type __de = __base::size() - __pos;
2199 __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
2200 for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
2201 __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
2206 iterator __oen = __old_end - __n;
2207 for (iterator __j = __oen; __j != __old_end; ++__i, ++__j, ++__base::size())
2208 __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j));
2210 __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end);
2211 _VSTD::copy_backward(__f, __m, __old_end);
2214 return __base::begin() + __pos;
2217 template <class _Tp, class _Allocator>
2218 template <class _InpIter>
2220 deque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l,
2221 typename enable_if<__is_input_iterator<_InpIter>::value &&
2222 !__is_forward_iterator<_InpIter>::value>::type*)
2224 for (; __f != __l; ++__f)
2228 template <class _Tp, class _Allocator>
2229 template <class _ForIter>
2231 deque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
2232 typename enable_if<__is_forward_iterator<_ForIter>::value>::type*)
2234 size_type __n = _VSTD::distance(__f, __l);
2235 allocator_type& __a = __base::__alloc();
2236 size_type __back_capacity = __back_spare();
2237 if (__n > __back_capacity)
2238 __add_back_capacity(__n - __back_capacity);
2239 // __n <= __back_capacity
2240 for (iterator __i = __base::end(); __f != __l; ++__i, (void) ++__f, ++__base::size())
2241 __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f);
2244 template <class _Tp, class _Allocator>
2246 deque<_Tp, _Allocator>::__append(size_type __n)
2248 allocator_type& __a = __base::__alloc();
2249 size_type __back_capacity = __back_spare();
2250 if (__n > __back_capacity)
2251 __add_back_capacity(__n - __back_capacity);
2252 // __n <= __back_capacity
2253 for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
2254 __alloc_traits::construct(__a, _VSTD::addressof(*__i));
2257 template <class _Tp, class _Allocator>
2259 deque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v)
2261 allocator_type& __a = __base::__alloc();
2262 size_type __back_capacity = __back_spare();
2263 if (__n > __back_capacity)
2264 __add_back_capacity(__n - __back_capacity);
2265 // __n <= __back_capacity
2266 for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size())
2267 __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v);
2270 // Create front capacity for one block of elements.
2271 // Strong guarantee. Either do it or don't touch anything.
2272 template <class _Tp, class _Allocator>
2274 deque<_Tp, _Allocator>::__add_front_capacity()
2276 allocator_type& __a = __base::__alloc();
2277 if (__back_spare() >= __base::__block_size)
2279 __base::__start_ += __base::__block_size;
2280 pointer __pt = __base::__map_.back();
2281 __base::__map_.pop_back();
2282 __base::__map_.push_front(__pt);
2284 // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer
2285 else if (__base::__map_.size() < __base::__map_.capacity())
2286 { // we can put the new buffer into the map, but don't shift things around
2287 // until all buffers are allocated. If we throw, we don't need to fix
2288 // anything up (any added buffers are undetectible)
2289 if (__base::__map_.__front_spare() > 0)
2290 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
2293 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
2294 // Done allocating, reorder capacity
2295 pointer __pt = __base::__map_.back();
2296 __base::__map_.pop_back();
2297 __base::__map_.push_front(__pt);
2299 __base::__start_ = __base::__map_.size() == 1 ?
2300 __base::__block_size / 2 :
2301 __base::__start_ + __base::__block_size;
2303 // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
2306 __split_buffer<pointer, typename __base::__pointer_allocator&>
2307 __buf(max<size_type>(2 * __base::__map_.capacity(), 1),
2308 0, __base::__map_.__alloc());
2310 typedef __allocator_destructor<_Allocator> _Dp;
2311 unique_ptr<pointer, _Dp> __hold(
2312 __alloc_traits::allocate(__a, __base::__block_size),
2313 _Dp(__a, __base::__block_size));
2314 __buf.push_back(__hold.get());
2317 for (typename __base::__map_pointer __i = __base::__map_.begin();
2318 __i != __base::__map_.end(); ++__i)
2319 __buf.push_back(*__i);
2320 _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2321 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2322 _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2323 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
2324 __base::__start_ = __base::__map_.size() == 1 ?
2325 __base::__block_size / 2 :
2326 __base::__start_ + __base::__block_size;
2330 // Create front capacity for __n elements.
2331 // Strong guarantee. Either do it or don't touch anything.
2332 template <class _Tp, class _Allocator>
2334 deque<_Tp, _Allocator>::__add_front_capacity(size_type __n)
2336 allocator_type& __a = __base::__alloc();
2337 size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
2338 // Number of unused blocks at back:
2339 size_type __back_capacity = __back_spare() / __base::__block_size;
2340 __back_capacity = _VSTD::min(__back_capacity, __nb); // don't take more than you need
2341 __nb -= __back_capacity; // number of blocks need to allocate
2342 // If __nb == 0, then we have sufficient capacity.
2345 __base::__start_ += __base::__block_size * __back_capacity;
2346 for (; __back_capacity > 0; --__back_capacity)
2348 pointer __pt = __base::__map_.back();
2349 __base::__map_.pop_back();
2350 __base::__map_.push_front(__pt);
2353 // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
2354 else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
2355 { // we can put the new buffers into the map, but don't shift things around
2356 // until all buffers are allocated. If we throw, we don't need to fix
2357 // anything up (any added buffers are undetectible)
2358 for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1))
2360 if (__base::__map_.__front_spare() == 0)
2362 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
2364 for (; __nb > 0; --__nb, ++__back_capacity)
2365 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
2366 // Done allocating, reorder capacity
2367 __base::__start_ += __back_capacity * __base::__block_size;
2368 for (; __back_capacity > 0; --__back_capacity)
2370 pointer __pt = __base::__map_.back();
2371 __base::__map_.pop_back();
2372 __base::__map_.push_front(__pt);
2375 // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
2378 size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty();
2379 __split_buffer<pointer, typename __base::__pointer_allocator&>
2380 __buf(max<size_type>(2* __base::__map_.capacity(),
2381 __nb + __base::__map_.size()),
2382 0, __base::__map_.__alloc());
2383 #ifndef _LIBCPP_NO_EXCEPTIONS
2386 #endif // _LIBCPP_NO_EXCEPTIONS
2387 for (; __nb > 0; --__nb)
2388 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
2389 #ifndef _LIBCPP_NO_EXCEPTIONS
2393 for (typename __base::__map_pointer __i = __buf.begin();
2394 __i != __buf.end(); ++__i)
2395 __alloc_traits::deallocate(__a, *__i, __base::__block_size);
2398 #endif // _LIBCPP_NO_EXCEPTIONS
2399 for (; __back_capacity > 0; --__back_capacity)
2401 __buf.push_back(__base::__map_.back());
2402 __base::__map_.pop_back();
2404 for (typename __base::__map_pointer __i = __base::__map_.begin();
2405 __i != __base::__map_.end(); ++__i)
2406 __buf.push_back(*__i);
2407 _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2408 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2409 _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2410 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
2411 __base::__start_ += __ds;
2415 // Create back capacity for one block of elements.
2416 // Strong guarantee. Either do it or don't touch anything.
2417 template <class _Tp, class _Allocator>
2419 deque<_Tp, _Allocator>::__add_back_capacity()
2421 allocator_type& __a = __base::__alloc();
2422 if (__front_spare() >= __base::__block_size)
2424 __base::__start_ -= __base::__block_size;
2425 pointer __pt = __base::__map_.front();
2426 __base::__map_.pop_front();
2427 __base::__map_.push_back(__pt);
2429 // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
2430 else if (__base::__map_.size() < __base::__map_.capacity())
2431 { // we can put the new buffer into the map, but don't shift things around
2432 // until it is allocated. If we throw, we don't need to fix
2433 // anything up (any added buffers are undetectible)
2434 if (__base::__map_.__back_spare() != 0)
2435 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
2438 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
2439 // Done allocating, reorder capacity
2440 pointer __pt = __base::__map_.front();
2441 __base::__map_.pop_front();
2442 __base::__map_.push_back(__pt);
2445 // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
2448 __split_buffer<pointer, typename __base::__pointer_allocator&>
2449 __buf(max<size_type>(2* __base::__map_.capacity(), 1),
2450 __base::__map_.size(),
2451 __base::__map_.__alloc());
2453 typedef __allocator_destructor<_Allocator> _Dp;
2454 unique_ptr<pointer, _Dp> __hold(
2455 __alloc_traits::allocate(__a, __base::__block_size),
2456 _Dp(__a, __base::__block_size));
2457 __buf.push_back(__hold.get());
2460 for (typename __base::__map_pointer __i = __base::__map_.end();
2461 __i != __base::__map_.begin();)
2462 __buf.push_front(*--__i);
2463 _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2464 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2465 _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2466 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
2470 // Create back capacity for __n elements.
2471 // Strong guarantee. Either do it or don't touch anything.
2472 template <class _Tp, class _Allocator>
2474 deque<_Tp, _Allocator>::__add_back_capacity(size_type __n)
2476 allocator_type& __a = __base::__alloc();
2477 size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
2478 // Number of unused blocks at front:
2479 size_type __front_capacity = __front_spare() / __base::__block_size;
2480 __front_capacity = _VSTD::min(__front_capacity, __nb); // don't take more than you need
2481 __nb -= __front_capacity; // number of blocks need to allocate
2482 // If __nb == 0, then we have sufficient capacity.
2485 __base::__start_ -= __base::__block_size * __front_capacity;
2486 for (; __front_capacity > 0; --__front_capacity)
2488 pointer __pt = __base::__map_.front();
2489 __base::__map_.pop_front();
2490 __base::__map_.push_back(__pt);
2493 // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers
2494 else if (__nb <= __base::__map_.capacity() - __base::__map_.size())
2495 { // we can put the new buffers into the map, but don't shift things around
2496 // until all buffers are allocated. If we throw, we don't need to fix
2497 // anything up (any added buffers are undetectible)
2498 for (; __nb > 0; --__nb)
2500 if (__base::__map_.__back_spare() == 0)
2502 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
2504 for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ +=
2505 __base::__block_size - (__base::__map_.size() == 1))
2506 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
2507 // Done allocating, reorder capacity
2508 __base::__start_ -= __base::__block_size * __front_capacity;
2509 for (; __front_capacity > 0; --__front_capacity)
2511 pointer __pt = __base::__map_.front();
2512 __base::__map_.pop_front();
2513 __base::__map_.push_back(__pt);
2516 // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
2519 size_type __ds = __front_capacity * __base::__block_size;
2520 __split_buffer<pointer, typename __base::__pointer_allocator&>
2521 __buf(max<size_type>(2* __base::__map_.capacity(),
2522 __nb + __base::__map_.size()),
2523 __base::__map_.size() - __front_capacity,
2524 __base::__map_.__alloc());
2525 #ifndef _LIBCPP_NO_EXCEPTIONS
2528 #endif // _LIBCPP_NO_EXCEPTIONS
2529 for (; __nb > 0; --__nb)
2530 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
2531 #ifndef _LIBCPP_NO_EXCEPTIONS
2535 for (typename __base::__map_pointer __i = __buf.begin();
2536 __i != __buf.end(); ++__i)
2537 __alloc_traits::deallocate(__a, *__i, __base::__block_size);
2540 #endif // _LIBCPP_NO_EXCEPTIONS
2541 for (; __front_capacity > 0; --__front_capacity)
2543 __buf.push_back(__base::__map_.front());
2544 __base::__map_.pop_front();
2546 for (typename __base::__map_pointer __i = __base::__map_.end();
2547 __i != __base::__map_.begin();)
2548 __buf.push_front(*--__i);
2549 _VSTD::swap(__base::__map_.__first_, __buf.__first_);
2550 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_);
2551 _VSTD::swap(__base::__map_.__end_, __buf.__end_);
2552 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
2553 __base::__start_ -= __ds;
2557 template <class _Tp, class _Allocator>
2559 deque<_Tp, _Allocator>::pop_front()
2561 allocator_type& __a = __base::__alloc();
2562 __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
2563 __base::__start_ / __base::__block_size) +
2564 __base::__start_ % __base::__block_size));
2566 if (++__base::__start_ >= 2 * __base::__block_size)
2568 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
2569 __base::__map_.pop_front();
2570 __base::__start_ -= __base::__block_size;
2574 template <class _Tp, class _Allocator>
2576 deque<_Tp, _Allocator>::pop_back()
2578 allocator_type& __a = __base::__alloc();
2579 size_type __p = __base::size() + __base::__start_ - 1;
2580 __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
2581 __p / __base::__block_size) +
2582 __p % __base::__block_size));
2584 if (__back_spare() >= 2 * __base::__block_size)
2586 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
2587 __base::__map_.pop_back();
2591 // move assign [__f, __l) to [__r, __r + (__l-__f)).
2592 // If __vt points into [__f, __l), then subtract (__f - __r) from __vt.
2593 template <class _Tp, class _Allocator>
2594 typename deque<_Tp, _Allocator>::iterator
2595 deque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r,
2596 const_pointer& __vt)
2599 // for (; __f != __l; ++__f, ++__r)
2600 // *__r = _VSTD::move(*__f);
2601 difference_type __n = __l - __f;
2604 pointer __fb = __f.__ptr_;
2605 pointer __fe = *__f.__m_iter_ + __base::__block_size;
2606 difference_type __bs = __fe - __fb;
2612 if (__fb <= __vt && __vt < __fe)
2613 __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_;
2614 __r = _VSTD::move(__fb, __fe, __r);
2621 // move assign [__f, __l) to [__r - (__l-__f), __r) backwards.
2622 // If __vt points into [__f, __l), then add (__r - __l) to __vt.
2623 template <class _Tp, class _Allocator>
2624 typename deque<_Tp, _Allocator>::iterator
2625 deque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r,
2626 const_pointer& __vt)
2629 // while (__f != __l)
2630 // *--__r = _VSTD::move(*--__l);
2631 difference_type __n = __l - __f;
2635 pointer __lb = *__l.__m_iter_;
2636 pointer __le = __l.__ptr_ + 1;
2637 difference_type __bs = __le - __lb;
2643 if (__lb <= __vt && __vt < __le)
2644 __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_;
2645 __r = _VSTD::move_backward(__lb, __le, __r);
2652 // move construct [__f, __l) to [__r, __r + (__l-__f)).
2653 // If __vt points into [__f, __l), then add (__r - __f) to __vt.
2654 template <class _Tp, class _Allocator>
2656 deque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
2657 iterator __r, const_pointer& __vt)
2659 allocator_type& __a = __base::__alloc();
2661 // for (; __f != __l; ++__r, ++__f, ++__base::size())
2662 // __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f));
2663 difference_type __n = __l - __f;
2666 pointer __fb = __f.__ptr_;
2667 pointer __fe = *__f.__m_iter_ + __base::__block_size;
2668 difference_type __bs = __fe - __fb;
2674 if (__fb <= __vt && __vt < __fe)
2675 __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_;
2676 for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
2677 __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb));
2683 // move construct [__f, __l) to [__r - (__l-__f), __r) backwards.
2684 // If __vt points into [__f, __l), then subtract (__l - __r) from __vt.
2685 template <class _Tp, class _Allocator>
2687 deque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l,
2688 iterator __r, const_pointer& __vt)
2690 allocator_type& __a = __base::__alloc();
2692 // for (iterator __j = __l; __j != __f;)
2694 // __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j));
2695 // --__base::__start_;
2696 // ++__base::size();
2698 difference_type __n = __l - __f;
2702 pointer __lb = *__l.__m_iter_;
2703 pointer __le = __l.__ptr_ + 1;
2704 difference_type __bs = __le - __lb;
2710 if (__lb <= __vt && __vt < __le)
2711 __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_;
2712 while (__le != __lb)
2714 __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le));
2723 template <class _Tp, class _Allocator>
2724 typename deque<_Tp, _Allocator>::iterator
2725 deque<_Tp, _Allocator>::erase(const_iterator __f)
2727 iterator __b = __base::begin();
2728 difference_type __pos = __f - __b;
2729 iterator __p = __b + __pos;
2730 allocator_type& __a = __base::__alloc();
2731 if (static_cast<size_t>(__pos) <= (__base::size() - 1) / 2)
2732 { // erase from front
2733 _VSTD::move_backward(__b, __p, _VSTD::next(__p));
2734 __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
2737 if (__front_spare() >= 2 * __base::__block_size)
2739 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
2740 __base::__map_.pop_front();
2741 __base::__start_ -= __base::__block_size;
2745 { // erase from back
2746 iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p);
2747 __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
2749 if (__back_spare() >= 2 * __base::__block_size)
2751 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
2752 __base::__map_.pop_back();
2755 return __base::begin() + __pos;
2758 template <class _Tp, class _Allocator>
2759 typename deque<_Tp, _Allocator>::iterator
2760 deque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l)
2762 difference_type __n = __l - __f;
2763 iterator __b = __base::begin();
2764 difference_type __pos = __f - __b;
2765 iterator __p = __b + __pos;
2768 allocator_type& __a = __base::__alloc();
2769 if (static_cast<size_t>(__pos) <= (__base::size() - __n) / 2)
2770 { // erase from front
2771 iterator __i = _VSTD::move_backward(__b, __p, __p + __n);
2772 for (; __b != __i; ++__b)
2773 __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
2774 __base::size() -= __n;
2775 __base::__start_ += __n;
2776 while (__front_spare() >= 2 * __base::__block_size)
2778 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
2779 __base::__map_.pop_front();
2780 __base::__start_ -= __base::__block_size;
2784 { // erase from back
2785 iterator __i = _VSTD::move(__p + __n, __base::end(), __p);
2786 for (iterator __e = __base::end(); __i != __e; ++__i)
2787 __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
2788 __base::size() -= __n;
2789 while (__back_spare() >= 2 * __base::__block_size)
2791 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
2792 __base::__map_.pop_back();
2796 return __base::begin() + __pos;
2799 template <class _Tp, class _Allocator>
2801 deque<_Tp, _Allocator>::__erase_to_end(const_iterator __f)
2803 iterator __e = __base::end();
2804 difference_type __n = __e - __f;
2807 allocator_type& __a = __base::__alloc();
2808 iterator __b = __base::begin();
2809 difference_type __pos = __f - __b;
2810 for (iterator __p = __b + __pos; __p != __e; ++__p)
2811 __alloc_traits::destroy(__a, _VSTD::addressof(*__p));
2812 __base::size() -= __n;
2813 while (__back_spare() >= 2 * __base::__block_size)
2815 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
2816 __base::__map_.pop_back();
2821 template <class _Tp, class _Allocator>
2824 deque<_Tp, _Allocator>::swap(deque& __c)
2825 #if _LIBCPP_STD_VER >= 14
2828 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
2829 __is_nothrow_swappable<allocator_type>::value)
2835 template <class _Tp, class _Allocator>
2838 deque<_Tp, _Allocator>::clear() _NOEXCEPT
2843 template <class _Tp, class _Allocator>
2844 inline _LIBCPP_INLINE_VISIBILITY
2846 operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
2848 const typename deque<_Tp, _Allocator>::size_type __sz = __x.size();
2849 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
2852 template <class _Tp, class _Allocator>
2853 inline _LIBCPP_INLINE_VISIBILITY
2855 operator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
2857 return !(__x == __y);
2860 template <class _Tp, class _Allocator>
2861 inline _LIBCPP_INLINE_VISIBILITY
2863 operator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
2865 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
2868 template <class _Tp, class _Allocator>
2869 inline _LIBCPP_INLINE_VISIBILITY
2871 operator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
2876 template <class _Tp, class _Allocator>
2877 inline _LIBCPP_INLINE_VISIBILITY
2879 operator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
2881 return !(__x < __y);
2884 template <class _Tp, class _Allocator>
2885 inline _LIBCPP_INLINE_VISIBILITY
2887 operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
2889 return !(__y < __x);
2892 template <class _Tp, class _Allocator>
2893 inline _LIBCPP_INLINE_VISIBILITY
2895 swap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y)
2896 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
2901 _LIBCPP_END_NAMESPACE_STD
2903 #endif // _LIBCPP_DEQUE