62#if __cplusplus >= 201103L
66namespace std _GLIBCXX_VISIBILITY(default)
68_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
84#ifndef _GLIBCXX_DEQUE_BUF_SIZE
85#define _GLIBCXX_DEQUE_BUF_SIZE 512
88 _GLIBCXX_CONSTEXPR
inline size_t
89 __deque_buf_size(
size_t __size)
105 template<
typename _Tp,
typename _Ref,
typename _Ptr>
108#if __cplusplus < 201103L
111 typedef _Tp* _Elt_pointer;
112 typedef _Tp** _Map_pointer;
115 template<
typename _Up>
117 template<
typename _CvTp>
127 {
return __deque_buf_size(
sizeof(_Tp)); }
130 typedef _Tp value_type;
131 typedef _Ptr pointer;
133 typedef size_t size_type;
138 _Elt_pointer _M_first;
139 _Elt_pointer _M_last;
140 _Map_pointer _M_node;
143 : _M_cur(__x), _M_first(*
__y),
144 _M_last(*
__y + _S_buffer_size()), _M_node(
__y) { }
147 : _M_cur(), _M_first(), _M_last(), _M_node() { }
150 : _M_cur(__x._M_cur), _M_first(__x._M_first),
151 _M_last(__x._M_last), _M_node(__x._M_node) { }
155 {
return iterator(_M_cur, _M_node); }
169 if (_M_cur == _M_last)
188 if (_M_cur == _M_first)
216 / _S_buffer_size()) - 1;
233 {
return *
this += -__n; }
244 {
return *(*
this + __n); }
263 template<
typename _Tp,
typename _Ref,
typename _Ptr>
265 operator==(
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
266 const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) _GLIBCXX_NOEXCEPT
267 {
return __x._M_cur == __y._M_cur; }
269 template<
typename _Tp,
typename _RefL,
typename _PtrL,
270 typename _RefR,
typename _PtrR>
272 operator==(
const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
273 const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) _GLIBCXX_NOEXCEPT
274 {
return __x._M_cur == __y._M_cur; }
276 template<
typename _Tp,
typename _Ref,
typename _Ptr>
278 operator!=(
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
279 const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) _GLIBCXX_NOEXCEPT
280 {
return !(__x == __y); }
282 template<
typename _Tp,
typename _RefL,
typename _PtrL,
283 typename _RefR,
typename _PtrR>
285 operator!=(
const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
286 const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) _GLIBCXX_NOEXCEPT
287 {
return !(__x == __y); }
289 template<
typename _Tp,
typename _Ref,
typename _Ptr>
291 operator<(
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
292 const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) _GLIBCXX_NOEXCEPT
293 {
return (__x._M_node == __y._M_node) ? (__x._M_cur < __y._M_cur)
294 : (__x._M_node < __y._M_node); }
296 template<
typename _Tp,
typename _RefL,
typename _PtrL,
297 typename _RefR,
typename _PtrR>
299 operator<(
const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
300 const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) _GLIBCXX_NOEXCEPT
301 {
return (__x._M_node == __y._M_node) ? (__x._M_cur < __y._M_cur)
302 : (__x._M_node < __y._M_node); }
304 template<
typename _Tp,
typename _Ref,
typename _Ptr>
306 operator>(
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
307 const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) _GLIBCXX_NOEXCEPT
308 {
return __y < __x; }
310 template<
typename _Tp,
typename _RefL,
typename _PtrL,
311 typename _RefR,
typename _PtrR>
313 operator>(
const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
314 const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) _GLIBCXX_NOEXCEPT
315 {
return __y < __x; }
317 template<
typename _Tp,
typename _Ref,
typename _Ptr>
319 operator<=(
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
320 const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) _GLIBCXX_NOEXCEPT
321 {
return !(__y < __x); }
323 template<
typename _Tp,
typename _RefL,
typename _PtrL,
324 typename _RefR,
typename _PtrR>
326 operator<=(
const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
327 const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) _GLIBCXX_NOEXCEPT
328 {
return !(__y < __x); }
330 template<
typename _Tp,
typename _Ref,
typename _Ptr>
332 operator>=(
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
333 const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) _GLIBCXX_NOEXCEPT
334 {
return !(__x < __y); }
336 template<
typename _Tp,
typename _RefL,
typename _PtrL,
337 typename _RefR,
typename _PtrR>
339 operator>=(
const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
340 const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) _GLIBCXX_NOEXCEPT
341 {
return !(__x < __y); }
347 template<
typename _Tp,
typename _Ref,
typename _Ptr>
348 inline typename _Deque_iterator<_Tp, _Ref, _Ptr>::difference_type
349 operator-(
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x,
350 const _Deque_iterator<_Tp, _Ref, _Ptr>& __y) _GLIBCXX_NOEXCEPT
352 return typename _Deque_iterator<_Tp, _Ref, _Ptr>::difference_type
353 (_Deque_iterator<_Tp, _Ref, _Ptr>::_S_buffer_size())
354 * (__x._M_node - __y._M_node - 1) + (__x._M_cur - __x._M_first)
355 + (__y._M_last - __y._M_cur);
358 template<
typename _Tp,
typename _RefL,
typename _PtrL,
359 typename _RefR,
typename _PtrR>
360 inline typename _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type
361 operator-(
const _Deque_iterator<_Tp, _RefL, _PtrL>& __x,
362 const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) _GLIBCXX_NOEXCEPT
364 return typename _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type
365 (_Deque_iterator<_Tp, _RefL, _PtrL>::_S_buffer_size())
366 * (__x._M_node - __y._M_node - 1) + (__x._M_cur - __x._M_first)
367 + (__y._M_last - __y._M_cur);
370 template<
typename _Tp,
typename _Ref,
typename _Ptr>
371 inline _Deque_iterator<_Tp, _Ref, _Ptr>
372 operator+(ptrdiff_t __n,
const _Deque_iterator<_Tp, _Ref, _Ptr>& __x)
374 {
return __x + __n; }
376 template<
typename _Tp>
378 fill(
const _Deque_iterator<_Tp, _Tp&, _Tp*>&,
379 const _Deque_iterator<_Tp, _Tp&, _Tp*>&,
const _Tp&);
381 template<
typename _Tp>
382 _Deque_iterator<_Tp, _Tp&, _Tp*>
383 copy(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
384 _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
385 _Deque_iterator<_Tp, _Tp&, _Tp*>);
387 template<
typename _Tp>
388 inline _Deque_iterator<_Tp, _Tp&, _Tp*>
389 copy(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
390 _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
391 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
392 {
return std::copy(_Deque_iterator<_Tp, const _Tp&, const _Tp*>(__first),
393 _Deque_iterator<_Tp, const _Tp&, const _Tp*>(__last),
396 template<
typename _Tp>
397 _Deque_iterator<_Tp, _Tp&, _Tp*>
398 copy_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
399 _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
400 _Deque_iterator<_Tp, _Tp&, _Tp*>);
402 template<
typename _Tp>
403 inline _Deque_iterator<_Tp, _Tp&, _Tp*>
404 copy_backward(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
405 _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
406 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
407 {
return std::copy_backward(_Deque_iterator<_Tp,
408 const _Tp&,
const _Tp*>(__first),
410 const _Tp&,
const _Tp*>(__last),
413#if __cplusplus >= 201103L
414 template<
typename _Tp>
415 _Deque_iterator<_Tp, _Tp&, _Tp*>
416 move(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
417 _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
418 _Deque_iterator<_Tp, _Tp&, _Tp*>);
420 template<
typename _Tp>
421 inline _Deque_iterator<_Tp, _Tp&, _Tp*>
422 move(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
423 _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
424 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
425 {
return std::move(_Deque_iterator<_Tp, const _Tp&, const _Tp*>(__first),
426 _Deque_iterator<_Tp, const _Tp&, const _Tp*>(__last),
429 template<
typename _Tp>
430 _Deque_iterator<_Tp, _Tp&, _Tp*>
431 move_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*>,
432 _Deque_iterator<_Tp, const _Tp&, const _Tp*>,
433 _Deque_iterator<_Tp, _Tp&, _Tp*>);
435 template<
typename _Tp>
436 inline _Deque_iterator<_Tp, _Tp&, _Tp*>
437 move_backward(_Deque_iterator<_Tp, _Tp&, _Tp*> __first,
438 _Deque_iterator<_Tp, _Tp&, _Tp*> __last,
439 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
440 {
return std::move_backward(_Deque_iterator<_Tp,
441 const _Tp&,
const _Tp*>(__first),
443 const _Tp&,
const _Tp*>(__last),
457 template<
typename _Tp,
typename _Alloc>
462 rebind<_Tp>::other _Tp_alloc_type;
465#if __cplusplus < 201103L
467 typedef const _Tp* _Ptr_const;
469 typedef typename _Alloc_traits::pointer _Ptr;
470 typedef typename _Alloc_traits::const_pointer _Ptr_const;
473 typedef typename _Alloc_traits::template rebind<_Ptr>::other
478 typedef _Alloc allocator_type;
483 {
return allocator_type(_M_get_Tp_allocator()); }
504#if __cplusplus >= 201103L
506 : _M_impl(__x._M_move_impl())
510 : _M_impl(std::move(__x._M_get_Tp_allocator()))
513 if (__x._M_impl._M_map)
514 this->_M_impl._M_swap_data(__x._M_impl);
524 if (__x.get_allocator() == __a)
526 if (__x._M_impl._M_map)
529 this->_M_impl._M_swap_data(__x._M_impl);
542 typedef typename iterator::_Map_pointer _Map_pointer;
548 :
public _Tp_alloc_type
556 : _Tp_alloc_type(), _M_map(), _M_map_size(0),
557 _M_start(), _M_finish()
561 : _Tp_alloc_type(__a), _M_map(), _M_map_size(0),
562 _M_start(), _M_finish()
565#if __cplusplus >= 201103L
566 _Deque_impl(_Deque_impl&&) =
default;
568 _Deque_impl(_Tp_alloc_type&& __a)
noexcept
569 : _Tp_alloc_type(std::move(__a)), _M_map(), _M_map_size(0),
570 _M_start(), _M_finish()
577 swap(this->_M_start, __x._M_start);
578 swap(this->_M_finish, __x._M_finish);
579 swap(this->_M_map, __x._M_map);
580 swap(this->_M_map_size, __x._M_map_size);
586 {
return *
static_cast<_Tp_alloc_type*
>(&this->_M_impl); }
588 const _Tp_alloc_type&
590 {
return *
static_cast<const _Tp_alloc_type*
>(&this->_M_impl); }
594 {
return _Map_alloc_type(_M_get_Tp_allocator()); }
600 return _Traits::allocate(_M_impl, __deque_buf_size(
sizeof(_Tp)));
607 _Traits::deallocate(_M_impl, __p, __deque_buf_size(
sizeof(_Tp)));
611 _M_allocate_map(
size_t __n)
613 _Map_alloc_type
__map_alloc = _M_get_map_allocator();
620 _Map_alloc_type
__map_alloc = _M_get_map_allocator();
627 void _M_destroy_nodes(_Map_pointer
__nstart,
629 enum { _S_initial_map_size = 8 };
633#if __cplusplus >= 201103L
639 return std::move(_M_impl);
642 _Tp_alloc_type
__alloc{_M_get_Tp_allocator()};
649 _Deque_impl
__ret{std::move(_M_get_Tp_allocator())};
650 _M_impl._M_swap_data(
__ret);
651 _M_impl._M_swap_data(
__empty._M_impl);
657 template<
typename _Tp,
typename _Alloc>
658 _Deque_base<_Tp, _Alloc>::
659 ~_Deque_base() _GLIBCXX_NOEXCEPT
661 if (this->_M_impl._M_map)
663 _M_destroy_nodes(this->_M_impl._M_start._M_node,
664 this->_M_impl._M_finish._M_node + 1);
665 _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
677 template<
typename _Tp,
typename _Alloc>
685 this->_M_impl._M_map_size =
std::max((
size_t) _S_initial_map_size,
687 this->_M_impl._M_map = _M_allocate_map(this->_M_impl._M_map_size);
694 _Map_pointer
__nstart = (this->_M_impl._M_map
702 _M_deallocate_map(this->_M_impl._M_map,
this->_M_impl._M_map_size);
703 this->_M_impl._M_map = _Map_pointer();
704 this->_M_impl._M_map_size = 0;
705 __throw_exception_again;
708 this->_M_impl._M_start._M_set_node(
__nstart);
709 this->_M_impl._M_finish._M_set_node(
__nfinish - 1);
710 this->_M_impl._M_start._M_cur = _M_impl._M_start._M_first;
711 this->_M_impl._M_finish._M_cur = (this->_M_impl._M_finish._M_first
713 % __deque_buf_size(
sizeof(_Tp)));
716 template<
typename _Tp,
typename _Alloc>
725 *
__cur = this->_M_allocate_node();
729 _M_destroy_nodes(__nstart, __cur);
730 __throw_exception_again;
734 template<
typename _Tp,
typename _Alloc>
736 _Deque_base<_Tp, _Alloc>::
737 _M_destroy_nodes(_Map_pointer __nstart,
738 _Map_pointer __nfinish) _GLIBCXX_NOEXCEPT
740 for (_Map_pointer __n = __nstart; __n < __nfinish; ++__n)
741 _M_deallocate_node(*__n);
828 template<
typename _Tp,
typename _Alloc = std::allocator<_Tp> >
832 typedef typename _Alloc::value_type _Alloc_value_type;
833#if __cplusplus < 201103L
834 __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
836 __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
839 typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
841 typedef typename _Base::_Map_pointer _Map_pointer;
844 typedef _Tp value_type;
845 typedef typename _Alloc_traits::pointer
pointer;
846 typedef typename _Alloc_traits::const_pointer const_pointer;
847 typedef typename _Alloc_traits::reference reference;
848 typedef typename _Alloc_traits::const_reference const_reference;
853 typedef size_t size_type;
855 typedef _Alloc allocator_type;
859 {
return __deque_buf_size(
sizeof(_Tp)); }
863 using _Base::_M_create_nodes;
864 using _Base::_M_destroy_nodes;
865 using _Base::_M_allocate_node;
866 using _Base::_M_deallocate_node;
867 using _Base::_M_allocate_map;
868 using _Base::_M_deallocate_map;
869 using _Base::_M_get_Tp_allocator;
875 using _Base::_M_impl;
894#if __cplusplus >= 201103L
904 deque(size_type __n,
const allocator_type& __a = allocator_type())
906 { _M_default_initialize(); }
916 deque(size_type __n,
const value_type& __value,
917 const allocator_type& __a = allocator_type())
930 deque(size_type __n,
const value_type& __value = value_type(),
931 const allocator_type& __a = allocator_type())
946 { std::__uninitialized_copy_a(__x.
begin(), __x.
end(),
947 this->_M_impl._M_start,
948 _M_get_Tp_allocator()); }
950#if __cplusplus >= 201103L
964 { std::__uninitialized_copy_a(__x.
begin(), __x.
end(),
965 this->_M_impl._M_start,
966 _M_get_Tp_allocator()); }
972 if (__x.get_allocator() != __a)
974 std::__uninitialized_move_a(__x.begin(), __x.end(),
975 this->_M_impl._M_start,
976 _M_get_Tp_allocator());
993 const allocator_type& __a = allocator_type())
1016#if __cplusplus >= 201103L
1020 const allocator_type& __a = allocator_type())
1022 { _M_initialize_dispatch(__first, __last, __false_type()); }
1024 template<
typename _InputIterator>
1026 const allocator_type& __a = allocator_type())
1030 typedef typename std::__is_integer<_InputIterator>::__type
_Integral;
1031 _M_initialize_dispatch(__first, __last,
_Integral());
1041 { _M_destroy_data(
begin(),
end(), _M_get_Tp_allocator()); }
1053#if __cplusplus >= 201103L
1100 assign(size_type __n,
const value_type& __val)
1101 { _M_fill_assign(__n, __val); }
1115#if __cplusplus >= 201103L
1120 { _M_assign_dispatch(__first, __last, __false_type()); }
1122 template<
typename _InputIterator>
1126 typedef typename std::__is_integer<_InputIterator>::__type
_Integral;
1127 _M_assign_dispatch(__first, __last,
_Integral());
1131#if __cplusplus >= 201103L
1145 { this->
assign(__l.begin(),
__l.end()); }
1151 {
return _Base::get_allocator(); }
1160 {
return this->
_M_impl._M_start; }
1168 {
return this->
_M_impl._M_start; }
1177 {
return this->
_M_impl._M_finish; }
1186 {
return this->
_M_impl._M_finish; }
1202 const_reverse_iterator
1220 const_reverse_iterator
1224#if __cplusplus >= 201103L
1231 {
return this->
_M_impl._M_start; }
1240 {
return this->
_M_impl._M_finish; }
1247 const_reverse_iterator
1256 const_reverse_iterator
1272#if __cplusplus >= 201103L
1289 _M_erase_at_end(this->
_M_impl._M_start
1311 _M_erase_at_end(this->
_M_impl._M_start
1333 _M_erase_at_end(this->
_M_impl._M_start
1338#if __cplusplus >= 201103L
1342 { _M_shrink_to_fit(); }
1367 {
return this->
_M_impl._M_start[difference_type(__n)]; }
1382 {
return this->
_M_impl._M_start[difference_type(__n)]; }
1389 if (__n >= this->
size())
1390 __throw_out_of_range_fmt(__N(
"deque::_M_range_check: __n "
1391 "(which is %zu)>= this->size() "
1412 return (*
this)[__n];
1430 return (*
this)[__n];
1439 {
return *
begin(); }
1447 {
return *
begin(); }
1486 if (this->
_M_impl._M_start._M_cur !=
this->_M_impl._M_start._M_first)
1488 _Alloc_traits::construct(this->
_M_impl,
1489 this->
_M_impl._M_start._M_cur - 1,
1491 --this->
_M_impl._M_start._M_cur;
1494 _M_push_front_aux(__x);
1497#if __cplusplus >= 201103L
1500 { emplace_front(std::move(__x)); }
1502 template<
typename... _Args>
1504 emplace_front(_Args&&... __args);
1519 if (this->
_M_impl._M_finish._M_cur
1520 !=
this->_M_impl._M_finish._M_last - 1)
1522 _Alloc_traits::construct(this->
_M_impl,
1523 this->
_M_impl._M_finish._M_cur, __x);
1524 ++this->
_M_impl._M_finish._M_cur;
1530#if __cplusplus >= 201103L
1533 { emplace_back(std::move(__x)); }
1535 template<
typename... _Args>
1537 emplace_back(_Args&&... __args);
1551 if (this->
_M_impl._M_start._M_cur
1552 !=
this->_M_impl._M_start._M_last - 1)
1554 _Alloc_traits::destroy(this->
_M_impl,
1555 this->
_M_impl._M_start._M_cur);
1556 ++this->
_M_impl._M_start._M_cur;
1573 if (this->
_M_impl._M_finish._M_cur
1574 !=
this->_M_impl._M_finish._M_first)
1576 --this->
_M_impl._M_finish._M_cur;
1577 _Alloc_traits::destroy(this->
_M_impl,
1578 this->
_M_impl._M_finish._M_cur);
1584#if __cplusplus >= 201103L
1594 template<
typename...
_Args>
1623#if __cplusplus >= 201103L
1651#if __cplusplus >= 201103L
1666 _M_fill_insert(
__position._M_const_cast(), __n, __x);
1667 return begin() + __offset;
1684#if __cplusplus >= 201103L
1696 template<
typename _InputIterator,
1703 _M_insert_dispatch(
__position._M_const_cast(),
1704 __first, __last, __false_type());
1705 return begin() + __offset;
1718 template<
typename _InputIterator>
1724 typedef typename std::__is_integer<_InputIterator>::__type
_Integral;
1743#if __cplusplus >= 201103L
1748 {
return _M_erase(
__position._M_const_cast()); }
1767#if __cplusplus >= 201103L
1772 {
return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
1786 _M_impl._M_swap_data(__x._M_impl);
1787 _Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
1788 __x._M_get_Tp_allocator());
1799 { _M_erase_at_end(
begin()); }
1808 template<
typename _Integer>
1817 template<
typename _InputIterator>
1819 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1823 iterator_category _IterCategory;
1839 template<
typename _InputIterator>
1845 template<
typename _ForwardIterator>
1864#if __cplusplus >= 201103L
1867 _M_default_initialize();
1877 template<
typename _Integer>
1879 _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1880 { _M_fill_assign(__n, __val); }
1883 template<
typename _InputIterator>
1885 _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1889 iterator_category _IterCategory;
1890 _M_assign_aux(__first, __last, _IterCategory());
1894 template<
typename _InputIterator>
1896 _M_assign_aux(_InputIterator __first, _InputIterator __last,
1900 template<
typename _ForwardIterator>
1902 _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1908 _ForwardIterator __mid = __first;
1910 std::copy(__first, __mid,
begin());
1914 _M_erase_at_end(std::copy(__first, __last,
begin()));
1920 _M_fill_assign(size_type __n,
const value_type& __val)
1929 _M_erase_at_end(
begin() + difference_type(__n));
1936#if __cplusplus < 201103L
1939 void _M_push_front_aux(
const value_type&);
1941 template<
typename... _Args>
1944 template<
typename... _Args>
1945 void _M_push_front_aux(_Args&&... __args);
1948 void _M_pop_back_aux();
1950 void _M_pop_front_aux();
1960 template<
typename _Integer>
1962 _M_insert_dispatch(iterator __pos,
1963 _Integer __n, _Integer __x, __true_type)
1964 { _M_fill_insert(__pos, __n, __x); }
1967 template<
typename _InputIterator>
1969 _M_insert_dispatch(iterator __pos,
1970 _InputIterator __first, _InputIterator __last,
1974 iterator_category _IterCategory;
1975 _M_range_insert_aux(__pos, __first, __last, _IterCategory());
1979 template<
typename _InputIterator>
1981 _M_range_insert_aux(iterator __pos, _InputIterator __first,
1985 template<
typename _ForwardIterator>
1987 _M_range_insert_aux(iterator __pos, _ForwardIterator __first,
1994 _M_fill_insert(iterator __pos, size_type __n,
const value_type& __x);
1997#if __cplusplus < 201103L
1999 _M_insert_aux(iterator __pos,
const value_type& __x);
2001 template<
typename... _Args>
2003 _M_insert_aux(iterator __pos, _Args&&... __args);
2008 _M_insert_aux(iterator __pos, size_type __n,
const value_type& __x);
2011 template<
typename _ForwardIterator>
2013 _M_insert_aux(iterator __pos,
2014 _ForwardIterator __first, _ForwardIterator __last,
2021 _M_destroy_data_aux(iterator __first, iterator __last);
2025 template<
typename _Alloc1>
2027 _M_destroy_data(iterator __first, iterator __last,
const _Alloc1&)
2028 { _M_destroy_data_aux(__first, __last); }
2031 _M_destroy_data(iterator __first, iterator __last,
2034 if (!__has_trivial_destructor(value_type))
2035 _M_destroy_data_aux(__first, __last);
2040 _M_erase_at_begin(iterator __pos)
2042 _M_destroy_data(
begin(), __pos, _M_get_Tp_allocator());
2043 _M_destroy_nodes(this->
_M_impl._M_start._M_node, __pos._M_node);
2044 this->
_M_impl._M_start = __pos;
2050 _M_erase_at_end(iterator __pos)
2052 _M_destroy_data(__pos,
end(), _M_get_Tp_allocator());
2053 _M_destroy_nodes(__pos._M_node + 1,
2054 this->_M_impl._M_finish._M_node + 1);
2055 this->
_M_impl._M_finish = __pos;
2059 _M_erase(iterator __pos);
2062 _M_erase(iterator __first, iterator __last);
2064#if __cplusplus >= 201103L
2067 _M_default_append(size_type __n);
2079 - this->
_M_impl._M_start._M_first;
2082 return this->
_M_impl._M_start - difference_type(__n);
2086 _M_reserve_elements_at_back(size_type __n)
2089 - this->
_M_impl._M_finish._M_cur) - 1;
2092 return this->
_M_impl._M_finish + difference_type(__n);
2096 _M_new_elements_at_front(size_type __new_elements);
2099 _M_new_elements_at_back(size_type __new_elements);
2115 - (
this->_M_impl._M_finish._M_node -
this->_M_impl._M_map))
2123 -
this->_M_impl._M_map))
2128 _M_reallocate_map(size_type __nodes_to_add,
bool __add_at_front);
2131#if __cplusplus >= 201103L
2137 this->
_M_impl._M_swap_data(__x._M_impl);
2139 std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
2148 constexpr bool __move_storage =
2149 _Alloc_traits::_S_propagate_on_move_assign();
2150 _M_move_assign2(std::move(__x), __bool_constant<__move_storage>());
2155 template<
typename... _Args>
2157 _M_replace_map(_Args&&... __args)
2163 _M_deallocate_node(*
begin()._M_node);
2164 _M_deallocate_map(this->
_M_impl._M_map, this->_M_impl._M_map_size);
2165 this->
_M_impl._M_map =
nullptr;
2166 this->
_M_impl._M_map_size = 0;
2168 this->
_M_impl._M_swap_data(__newobj._M_impl);
2176 auto __alloc = __x._M_get_Tp_allocator();
2179 _M_replace_map(std::move(__x));
2181 _M_get_Tp_allocator() = std::move(__alloc);
2189 if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
2193 _M_replace_map(std::move(__x), __x.get_allocator());
2199 this->
assign(std::__make_move_if_noexcept_iterator(__x.begin()),
2200 std::__make_move_if_noexcept_iterator(__x.end()));
2218 template<
typename _Tp,
typename _Alloc>
2222 {
return __x.size() ==
__y.size()
2223 && std::equal(__x.begin(), __x.end(),
__y.begin()); }
2236 template<
typename _Tp,
typename _Alloc>
2240 {
return std::lexicographical_compare(__x.begin(), __x.end(),
2241 __y.begin(),
__y.end()); }
2244 template<
typename _Tp,
typename _Alloc>
2248 {
return !(__x ==
__y); }
2251 template<
typename _Tp,
typename _Alloc>
2255 {
return __y < __x; }
2258 template<
typename _Tp,
typename _Alloc>
2262 {
return !(
__y < __x); }
2265 template<
typename _Tp,
typename _Alloc>
2269 {
return !(__x <
__y); }
2272 template<
typename _Tp,
typename _Alloc>
2278#undef _GLIBCXX_DEQUE_BUF_SIZE
2280_GLIBCXX_END_NAMESPACE_CONTAINER
#define _GLIBCXX_DEQUE_BUF_SIZE
This function controls the size of memory nodes.
complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
integral_constant< bool, true > true_type
The type used as a compile-time boolean with true value.
integral_constant< bool, false > false_type
The type used as a compile-time boolean with false value.
_GLIBCXX14_CONSTEXPR const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
ISO C++ entities toplevel namespace is std.
void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
typename _Size< _Alloc, difference_type >::type size_type
The allocator's size type.
__detected_or_t< typename is_empty< _Alloc >::type, __equal, _Alloc > is_always_equal
Whether all instances of the allocator type compare equal.
Uniform interface to all pointer-like types.
void _M_set_node(_Map_pointer __new_node) noexcept
void _M_initialize_map(size_t)
Layout storage.
A standard container using fixed-size memory allocation and constant-time manipulation of elements at...
reverse_iterator rbegin() noexcept
deque(const deque &__x)
Deque copy constructor.
const_reference at(size_type __n) const
Provides access to the data contained in the deque.
deque(const deque &__x, const allocator_type &__a)
Copy constructor with alternative allocator.
void _M_initialize_map(size_t)
Layout storage.
deque(deque &&__x, const allocator_type &__a)
Move constructor with alternative allocator.
reverse_iterator rend() noexcept
iterator erase(const_iterator __position)
Remove element at given position.
const_reference back() const noexcept
const_reverse_iterator crend() const noexcept
void pop_back() noexcept
Removes last element.
size_type size() const noexcept
const_iterator cbegin() const noexcept
void resize(size_type __new_size)
Resizes the deque to the specified number of elements.
const_reverse_iterator rend() const noexcept
iterator _M_reserve_elements_at_front(size_type __n)
Memory-handling helpers for the previous internal insert functions.
iterator emplace(const_iterator __position, _Args &&... __args)
Inserts an object in deque before specified iterator.
void pop_front() noexcept
Removes first element.
allocator_type get_allocator() const noexcept
Get a copy of the memory allocation object.
void swap(deque &__x) noexcept
Swaps data with another deque.
reference operator[](size_type __n) noexcept
Subscript access to the data contained in the deque.
reference at(size_type __n)
Provides access to the data contained in the deque.
deque(size_type __n, const allocator_type &__a=allocator_type())
Creates a deque with default constructed elements.
bool empty() const noexcept
const_reference operator[](size_type __n) const noexcept
Subscript access to the data contained in the deque.
size_type max_size() const noexcept
void push_front(const value_type &__x)
Add data to the front of the deque.
void resize(size_type __new_size, const value_type &__x)
Resizes the deque to the specified number of elements.
const_reference front() const noexcept
void assign(size_type __n, const value_type &__val)
Assigns a given value to a deque.
deque & operator=(initializer_list< value_type > __l)
Assigns an initializer list to a deque.
void _M_fill_initialize(const value_type &__value)
Fills the deque with copies of value.
iterator insert(const_iterator __position, const value_type &__x)
Inserts given value into deque before specified iterator.
iterator insert(const_iterator __p, initializer_list< value_type > __l)
Inserts an initializer list into the deque.
deque(deque &&__x)
Deque move constructor.
deque(size_type __n, const value_type &__value, const allocator_type &__a=allocator_type())
Creates a deque with copies of an exemplar element.
const_reverse_iterator crbegin() const noexcept
void _M_reserve_map_at_back(size_type __nodes_to_add=1)
Memory-handling helpers for the major map.
reference back() noexcept
void _M_push_back_aux(_Args &&... __args)
Helper functions for push_* and pop_*.
deque & operator=(deque &&__x) noexcept(_Alloc_traits::_S_always_equal())
Deque move assignment operator.
void push_back(const value_type &__x)
Add data to the end of the deque.
deque(const allocator_type &__a)
Creates a deque with no elements.
void _M_range_check(size_type __n) const
Safety check used only from at().
void assign(initializer_list< value_type > __l)
Assigns an initializer list to a deque.
deque(initializer_list< value_type > __l, const allocator_type &__a=allocator_type())
Builds a deque from an initializer list.
void shrink_to_fit() noexcept
void assign(_InputIterator __first, _InputIterator __last)
Assigns a range to a deque.
deque(_InputIterator __first, _InputIterator __last, const allocator_type &__a=allocator_type())
Builds a deque from a range.
const_iterator begin() const noexcept
deque & operator=(const deque &__x)
Deque assignment operator.
const_iterator end() const noexcept
iterator insert(const_iterator __position, size_type __n, const value_type &__x)
Inserts a number of copies of given data into the deque.
iterator insert(const_iterator __position, value_type &&__x)
Inserts given rvalue into deque before specified iterator.
void _M_range_initialize(_InputIterator __first, _InputIterator __last, std::input_iterator_tag)
Fills the deque with whatever is in [first,last).
reference front() noexcept
const_iterator cend() const noexcept
deque()
Creates a deque with no elements.
iterator insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
Inserts a range into the deque.
const_reverse_iterator rbegin() const noexcept
iterator begin() noexcept
iterator erase(const_iterator __first, const_iterator __last)
Remove a range of elements.
Forward iterators support a superset of input iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Uniform interface to C++98 and C++11 allocators.
static pointer allocate(_Alloc &__a, size_type __n)
Allocate memory.
static size_type max_size(const _Tp_alloc_type &__a) noexcept
The maximum supported allocation size.
static void deallocate(_Alloc &__a, pointer __p, size_type __n)
Deallocate memory.