59 namespace std _GLIBCXX_VISIBILITY(default)
61 _GLIBCXX_BEGIN_NAMESPACE_VERSION
62 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
64 #if __cplusplus >= 201103L 65 template <
typename _Tp,
typename _Alloc>
68 _M_default_initialize()
73 for (__cur = this->_M_impl._M_start._M_node;
74 __cur < this->_M_impl._M_finish._M_node;
76 std::__uninitialized_default_a(*__cur, *__cur + _S_buffer_size(),
77 _M_get_Tp_allocator());
78 std::__uninitialized_default_a(this->_M_impl._M_finish._M_first,
79 this->_M_impl._M_finish._M_cur,
80 _M_get_Tp_allocator());
84 std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur),
85 _M_get_Tp_allocator());
86 __throw_exception_again;
91 template <
typename _Tp,
typename _Alloc>
98 #if __cplusplus >= 201103L 99 if (_Alloc_traits::_S_propagate_on_copy_assign())
101 if (!_Alloc_traits::_S_always_equal()
102 && _M_get_Tp_allocator() != __x._M_get_Tp_allocator())
107 std::__alloc_on_copy(_M_get_Tp_allocator(),
108 __x._M_get_Tp_allocator());
111 std::__alloc_on_copy(_M_get_Tp_allocator(),
112 __x._M_get_Tp_allocator());
115 const size_type __len = size();
116 if (__len >= __x.
size())
117 _M_erase_at_end(std::copy(__x.
begin(), __x.
end(),
118 this->_M_impl._M_start));
122 std::copy(__x.
begin(), __mid, this->_M_impl._M_start);
123 _M_range_insert_aux(this->_M_impl._M_finish, __mid, __x.
end(),
130 #if __cplusplus >= 201103L 131 template<
typename _Tp,
typename _Alloc>
132 template<
typename... _Args>
133 #if __cplusplus > 201402L 134 typename deque<_Tp, _Alloc>::reference
141 if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_first)
143 _Alloc_traits::construct(this->_M_impl,
144 this->_M_impl._M_start._M_cur - 1,
145 std::forward<_Args>(__args)...);
146 --this->_M_impl._M_start._M_cur;
149 _M_push_front_aux(std::forward<_Args>(__args)...);
150 #if __cplusplus > 201402L 155 template<
typename _Tp,
typename _Alloc>
156 template<
typename... _Args>
157 #if __cplusplus > 201402L 158 typename deque<_Tp, _Alloc>::reference
163 emplace_back(_Args&&... __args)
165 if (this->_M_impl._M_finish._M_cur
166 != this->_M_impl._M_finish._M_last - 1)
168 _Alloc_traits::construct(this->_M_impl,
169 this->_M_impl._M_finish._M_cur,
170 std::forward<_Args>(__args)...);
171 ++this->_M_impl._M_finish._M_cur;
174 _M_push_back_aux(std::forward<_Args>(__args)...);
175 #if __cplusplus > 201402L 181 #if __cplusplus >= 201103L 182 template<
typename _Tp,
typename _Alloc>
183 template<
typename... _Args>
184 typename deque<_Tp, _Alloc>::iterator
188 if (__position._M_cur == this->_M_impl._M_start._M_cur)
190 emplace_front(std::forward<_Args>(__args)...);
191 return this->_M_impl._M_start;
193 else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
195 emplace_back(std::forward<_Args>(__args)...);
196 iterator __tmp = this->_M_impl._M_finish;
201 return _M_insert_aux(__position._M_const_cast(),
202 std::forward<_Args>(__args)...);
206 template <
typename _Tp,
typename _Alloc>
209 #if __cplusplus >= 201103L 212 insert(
iterator __position,
const value_type& __x)
215 if (__position._M_cur == this->_M_impl._M_start._M_cur)
218 return this->_M_impl._M_start;
220 else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
223 iterator __tmp = this->_M_impl._M_finish;
228 return _M_insert_aux(__position._M_const_cast(), __x);
231 template <
typename _Tp,
typename _Alloc>
238 const difference_type __index = __position -
begin();
239 if (static_cast<size_type>(__index) < (size() >> 1))
241 if (__position !=
begin())
242 _GLIBCXX_MOVE_BACKWARD3(
begin(), __position, __next);
248 _GLIBCXX_MOVE3(__next,
end(), __position);
251 return begin() + __index;
254 template <
typename _Tp,
typename _Alloc>
255 typename deque<_Tp, _Alloc>::iterator
257 _M_erase(iterator __first, iterator __last)
259 if (__first == __last)
261 else if (__first ==
begin() && __last ==
end())
268 const difference_type __n = __last - __first;
269 const difference_type __elems_before = __first -
begin();
270 if (static_cast<size_type>(__elems_before) <= (size() - __n) / 2)
272 if (__first !=
begin())
273 _GLIBCXX_MOVE_BACKWARD3(
begin(), __first, __last);
274 _M_erase_at_begin(
begin() + __n);
279 _GLIBCXX_MOVE3(__last,
end(), __first);
280 _M_erase_at_end(
end() - __n);
282 return begin() + __elems_before;
286 template <
typename _Tp,
class _Alloc>
287 template <
typename _InputIterator>
290 _M_assign_aux(_InputIterator __first, _InputIterator __last,
293 iterator __cur =
begin();
294 for (; __first != __last && __cur !=
end(); ++__cur, ++__first)
296 if (__first == __last)
297 _M_erase_at_end(__cur);
299 _M_range_insert_aux(
end(), __first, __last,
303 template <
typename _Tp,
typename _Alloc>
306 _M_fill_insert(iterator __pos, size_type __n,
const value_type& __x)
308 if (__pos._M_cur == this->_M_impl._M_start._M_cur)
310 iterator __new_start = _M_reserve_elements_at_front(__n);
313 std::__uninitialized_fill_a(__new_start, this->_M_impl._M_start,
314 __x, _M_get_Tp_allocator());
315 this->_M_impl._M_start = __new_start;
319 _M_destroy_nodes(__new_start._M_node,
320 this->_M_impl._M_start._M_node);
321 __throw_exception_again;
324 else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
326 iterator __new_finish = _M_reserve_elements_at_back(__n);
329 std::__uninitialized_fill_a(this->_M_impl._M_finish,
331 _M_get_Tp_allocator());
332 this->_M_impl._M_finish = __new_finish;
336 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
337 __new_finish._M_node + 1);
338 __throw_exception_again;
342 _M_insert_aux(__pos, __n, __x);
345 #if __cplusplus >= 201103L 346 template <
typename _Tp,
typename _Alloc>
349 _M_default_append(size_type __n)
353 iterator __new_finish = _M_reserve_elements_at_back(__n);
356 std::__uninitialized_default_a(this->_M_impl._M_finish,
358 _M_get_Tp_allocator());
359 this->_M_impl._M_finish = __new_finish;
363 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
364 __new_finish._M_node + 1);
365 __throw_exception_again;
370 template <
typename _Tp,
typename _Alloc>
375 const difference_type __front_capacity
376 = (this->_M_impl._M_start._M_cur - this->_M_impl._M_start._M_first);
377 if (__front_capacity == 0)
380 const difference_type __back_capacity
381 = (this->_M_impl._M_finish._M_last - this->_M_impl._M_finish._M_cur);
382 if (__front_capacity + __back_capacity < _S_buffer_size())
385 return std::__shrink_to_fit_aux<deque>::_S_do_it(*
this);
389 template <
typename _Tp,
typename _Alloc>
397 for (__cur = this->_M_impl._M_start._M_node;
398 __cur < this->_M_impl._M_finish._M_node;
400 std::__uninitialized_fill_a(*__cur, *__cur + _S_buffer_size(),
401 __value, _M_get_Tp_allocator());
402 std::__uninitialized_fill_a(this->_M_impl._M_finish._M_first,
403 this->_M_impl._M_finish._M_cur,
404 __value, _M_get_Tp_allocator());
409 _M_get_Tp_allocator());
410 __throw_exception_again;
414 template <
typename _Tp,
typename _Alloc>
415 template <
typename _InputIterator>
421 this->_M_initialize_map(0);
424 for (; __first != __last; ++__first)
425 #
if __cplusplus >= 201103L
426 emplace_back(*__first);
434 __throw_exception_again;
438 template <
typename _Tp,
typename _Alloc>
439 template <
typename _ForwardIterator>
446 this->_M_initialize_map(__n);
448 _Map_pointer __cur_node;
451 for (__cur_node = this->_M_impl._M_start._M_node;
452 __cur_node < this->_M_impl._M_finish._M_node;
455 _ForwardIterator __mid = __first;
457 std::__uninitialized_copy_a(__first, __mid, *__cur_node,
458 _M_get_Tp_allocator());
461 std::__uninitialized_copy_a(__first, __last,
462 this->_M_impl._M_finish._M_first,
463 _M_get_Tp_allocator());
469 _M_get_Tp_allocator());
470 __throw_exception_again;
475 template<
typename _Tp,
typename _Alloc>
476 #if __cplusplus >= 201103L 477 template<
typename... _Args>
487 _M_reserve_map_at_back();
488 *(this->_M_impl._M_finish._M_node + 1) = this->_M_allocate_node();
491 #if __cplusplus >= 201103L 492 _Alloc_traits::construct(this->_M_impl,
493 this->_M_impl._M_finish._M_cur,
494 std::forward<_Args>(__args)...);
496 this->_M_impl.construct(this->_M_impl._M_finish._M_cur, __t);
498 this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node
500 this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first;
504 _M_deallocate_node(*(this->_M_impl._M_finish._M_node + 1));
505 __throw_exception_again;
510 template<
typename _Tp,
typename _Alloc>
511 #if __cplusplus >= 201103L 512 template<
typename... _Args>
522 _M_reserve_map_at_front();
523 *(this->_M_impl._M_start._M_node - 1) = this->_M_allocate_node();
526 this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node
528 this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_last - 1;
529 #if __cplusplus >= 201103L 530 _Alloc_traits::construct(this->_M_impl,
531 this->_M_impl._M_start._M_cur,
532 std::forward<_Args>(__args)...);
534 this->_M_impl.construct(this->_M_impl._M_start._M_cur, __t);
539 ++this->_M_impl._M_start;
540 _M_deallocate_node(*(this->_M_impl._M_start._M_node - 1));
541 __throw_exception_again;
546 template <
typename _Tp,
typename _Alloc>
550 _M_deallocate_node(this->_M_impl._M_finish._M_first);
551 this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1);
552 this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1;
553 _Alloc_traits::destroy(_M_get_Tp_allocator(),
554 this->_M_impl._M_finish._M_cur);
562 template <
typename _Tp,
typename _Alloc>
566 _Alloc_traits::destroy(_M_get_Tp_allocator(),
567 this->_M_impl._M_start._M_cur);
568 _M_deallocate_node(this->_M_impl._M_start._M_first);
569 this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1);
570 this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first;
573 template <
typename _Tp,
typename _Alloc>
574 template <
typename _InputIterator>
578 _InputIterator __first, _InputIterator __last,
582 template <
typename _Tp,
typename _Alloc>
583 template <
typename _ForwardIterator>
586 _M_range_insert_aux(iterator __pos,
587 _ForwardIterator __first, _ForwardIterator __last,
591 if (__pos._M_cur == this->_M_impl._M_start._M_cur)
593 iterator __new_start = _M_reserve_elements_at_front(__n);
596 std::__uninitialized_copy_a(__first, __last, __new_start,
597 _M_get_Tp_allocator());
598 this->_M_impl._M_start = __new_start;
602 _M_destroy_nodes(__new_start._M_node,
603 this->_M_impl._M_start._M_node);
604 __throw_exception_again;
607 else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
609 iterator __new_finish = _M_reserve_elements_at_back(__n);
612 std::__uninitialized_copy_a(__first, __last,
613 this->_M_impl._M_finish,
614 _M_get_Tp_allocator());
615 this->_M_impl._M_finish = __new_finish;
619 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
620 __new_finish._M_node + 1);
621 __throw_exception_again;
625 _M_insert_aux(__pos, __first, __last, __n);
628 template<
typename _Tp,
typename _Alloc>
629 #if __cplusplus >= 201103L 630 template<
typename... _Args>
631 typename deque<_Tp, _Alloc>::iterator
633 _M_insert_aux(iterator __pos, _Args&&... __args)
635 value_type __x_copy(std::forward<_Args>(__args)...);
637 typename deque<_Tp, _Alloc>::iterator
639 _M_insert_aux(iterator __pos,
const value_type& __x)
641 value_type __x_copy = __x;
643 difference_type __index = __pos - this->_M_impl._M_start;
644 if (static_cast<size_type>(__index) < size() / 2)
646 push_front(_GLIBCXX_MOVE(front()));
647 iterator __front1 = this->_M_impl._M_start;
649 iterator __front2 = __front1;
651 __pos = this->_M_impl._M_start + __index;
652 iterator __pos1 = __pos;
654 _GLIBCXX_MOVE3(__front2, __pos1, __front1);
658 push_back(_GLIBCXX_MOVE(back()));
659 iterator __back1 = this->_M_impl._M_finish;
661 iterator __back2 = __back1;
663 __pos = this->_M_impl._M_start + __index;
664 _GLIBCXX_MOVE_BACKWARD3(__pos, __back2, __back1);
666 *__pos = _GLIBCXX_MOVE(__x_copy);
670 template <
typename _Tp,
typename _Alloc>
673 _M_insert_aux(iterator __pos, size_type __n,
const value_type& __x)
675 const difference_type __elems_before = __pos - this->_M_impl._M_start;
676 const size_type __length = this->size();
677 value_type __x_copy = __x;
678 if (__elems_before < difference_type(__length / 2))
680 iterator __new_start = _M_reserve_elements_at_front(__n);
681 iterator __old_start = this->_M_impl._M_start;
682 __pos = this->_M_impl._M_start + __elems_before;
685 if (__elems_before >= difference_type(__n))
687 iterator __start_n = (this->_M_impl._M_start
688 + difference_type(__n));
689 std::__uninitialized_move_a(this->_M_impl._M_start,
690 __start_n, __new_start,
691 _M_get_Tp_allocator());
692 this->_M_impl._M_start = __new_start;
693 _GLIBCXX_MOVE3(__start_n, __pos, __old_start);
694 std::fill(__pos - difference_type(__n), __pos, __x_copy);
698 std::__uninitialized_move_fill(this->_M_impl._M_start,
700 this->_M_impl._M_start,
702 _M_get_Tp_allocator());
703 this->_M_impl._M_start = __new_start;
704 std::fill(__old_start, __pos, __x_copy);
709 _M_destroy_nodes(__new_start._M_node,
710 this->_M_impl._M_start._M_node);
711 __throw_exception_again;
716 iterator __new_finish = _M_reserve_elements_at_back(__n);
717 iterator __old_finish = this->_M_impl._M_finish;
718 const difference_type __elems_after =
719 difference_type(__length) - __elems_before;
720 __pos = this->_M_impl._M_finish - __elems_after;
723 if (__elems_after > difference_type(__n))
725 iterator __finish_n = (this->_M_impl._M_finish
726 - difference_type(__n));
727 std::__uninitialized_move_a(__finish_n,
728 this->_M_impl._M_finish,
729 this->_M_impl._M_finish,
730 _M_get_Tp_allocator());
731 this->_M_impl._M_finish = __new_finish;
732 _GLIBCXX_MOVE_BACKWARD3(__pos, __finish_n, __old_finish);
733 std::fill(__pos, __pos + difference_type(__n), __x_copy);
737 std::__uninitialized_fill_move(this->_M_impl._M_finish,
738 __pos + difference_type(__n),
740 this->_M_impl._M_finish,
741 _M_get_Tp_allocator());
742 this->_M_impl._M_finish = __new_finish;
743 std::fill(__pos, __old_finish, __x_copy);
748 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
749 __new_finish._M_node + 1);
750 __throw_exception_again;
755 template <
typename _Tp,
typename _Alloc>
756 template <
typename _ForwardIterator>
759 _M_insert_aux(iterator __pos,
760 _ForwardIterator __first, _ForwardIterator __last,
763 const difference_type __elemsbefore = __pos - this->_M_impl._M_start;
764 const size_type __length = size();
765 if (static_cast<size_type>(__elemsbefore) < __length / 2)
767 iterator __new_start = _M_reserve_elements_at_front(__n);
768 iterator __old_start = this->_M_impl._M_start;
769 __pos = this->_M_impl._M_start + __elemsbefore;
772 if (__elemsbefore >= difference_type(__n))
774 iterator __start_n = (this->_M_impl._M_start
775 + difference_type(__n));
776 std::__uninitialized_move_a(this->_M_impl._M_start,
777 __start_n, __new_start,
778 _M_get_Tp_allocator());
779 this->_M_impl._M_start = __new_start;
780 _GLIBCXX_MOVE3(__start_n, __pos, __old_start);
781 std::copy(__first, __last, __pos - difference_type(__n));
785 _ForwardIterator __mid = __first;
786 std::advance(__mid, difference_type(__n) - __elemsbefore);
787 std::__uninitialized_move_copy(this->_M_impl._M_start,
788 __pos, __first, __mid,
790 _M_get_Tp_allocator());
791 this->_M_impl._M_start = __new_start;
792 std::copy(__mid, __last, __old_start);
797 _M_destroy_nodes(__new_start._M_node,
798 this->_M_impl._M_start._M_node);
799 __throw_exception_again;
804 iterator __new_finish = _M_reserve_elements_at_back(__n);
805 iterator __old_finish = this->_M_impl._M_finish;
806 const difference_type __elemsafter =
807 difference_type(__length) - __elemsbefore;
808 __pos = this->_M_impl._M_finish - __elemsafter;
811 if (__elemsafter > difference_type(__n))
813 iterator __finish_n = (this->_M_impl._M_finish
814 - difference_type(__n));
815 std::__uninitialized_move_a(__finish_n,
816 this->_M_impl._M_finish,
817 this->_M_impl._M_finish,
818 _M_get_Tp_allocator());
819 this->_M_impl._M_finish = __new_finish;
820 _GLIBCXX_MOVE_BACKWARD3(__pos, __finish_n, __old_finish);
821 std::copy(__first, __last, __pos);
825 _ForwardIterator __mid = __first;
827 std::__uninitialized_copy_move(__mid, __last, __pos,
828 this->_M_impl._M_finish,
829 this->_M_impl._M_finish,
830 _M_get_Tp_allocator());
831 this->_M_impl._M_finish = __new_finish;
832 std::copy(__first, __mid, __pos);
837 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
838 __new_finish._M_node + 1);
839 __throw_exception_again;
844 template<
typename _Tp,
typename _Alloc>
847 _M_destroy_data_aux(iterator __first, iterator __last)
849 for (_Map_pointer __node = __first._M_node + 1;
850 __node < __last._M_node; ++__node)
852 _M_get_Tp_allocator());
854 if (__first._M_node != __last._M_node)
857 _M_get_Tp_allocator());
859 _M_get_Tp_allocator());
863 _M_get_Tp_allocator());
866 template <
typename _Tp,
typename _Alloc>
871 if (this->max_size() - this->size() < __new_elems)
872 __throw_length_error(__N(
"deque::_M_new_elements_at_front"));
874 const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
876 _M_reserve_map_at_front(__new_nodes);
880 for (__i = 1; __i <= __new_nodes; ++__i)
881 *(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node();
885 for (size_type __j = 1; __j < __i; ++__j)
886 _M_deallocate_node(*(this->_M_impl._M_start._M_node - __j));
887 __throw_exception_again;
891 template <
typename _Tp,
typename _Alloc>
896 if (this->max_size() - this->size() < __new_elems)
897 __throw_length_error(__N(
"deque::_M_new_elements_at_back"));
899 const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
901 _M_reserve_map_at_back(__new_nodes);
905 for (__i = 1; __i <= __new_nodes; ++__i)
906 *(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node();
910 for (size_type __j = 1; __j < __i; ++__j)
911 _M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j));
912 __throw_exception_again;
916 template <
typename _Tp,
typename _Alloc>
921 const size_type __old_num_nodes
922 = this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1;
923 const size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
925 _Map_pointer __new_nstart;
926 if (this->_M_impl._M_map_size > 2 * __new_num_nodes)
928 __new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size
929 - __new_num_nodes) / 2
930 + (__add_at_front ? __nodes_to_add : 0);
931 if (__new_nstart < this->_M_impl._M_start._M_node)
932 std::copy(this->_M_impl._M_start._M_node,
933 this->_M_impl._M_finish._M_node + 1,
936 std::copy_backward(this->_M_impl._M_start._M_node,
937 this->_M_impl._M_finish._M_node + 1,
938 __new_nstart + __old_num_nodes);
942 size_type __new_map_size = this->_M_impl._M_map_size
943 +
std::max(this->_M_impl._M_map_size,
946 _Map_pointer __new_map = this->_M_allocate_map(__new_map_size);
947 __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
948 + (__add_at_front ? __nodes_to_add : 0);
949 std::copy(this->_M_impl._M_start._M_node,
950 this->_M_impl._M_finish._M_node + 1,
952 _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
954 this->_M_impl._M_map = __new_map;
955 this->_M_impl._M_map_size = __new_map_size;
958 this->_M_impl._M_start._M_set_node(__new_nstart);
959 this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
964 template<
typename _Tp>
971 for (
typename _Self::_Map_pointer __node = __first._M_node + 1;
972 __node < __last._M_node; ++__node)
973 std::fill(*__node, *__node + _Self::_S_buffer_size(), __value);
975 if (__first._M_node != __last._M_node)
977 std::fill(__first._M_cur, __first._M_last, __value);
978 std::fill(__last._M_first, __last._M_cur, __value);
981 std::fill(__first._M_cur, __last._M_cur, __value);
984 template<
typename _Tp>
985 _Deque_iterator<_Tp, _Tp&, _Tp*>
986 copy(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
987 _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
988 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
990 typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
991 typedef typename _Self::difference_type difference_type;
993 difference_type __len = __last - __first;
996 const difference_type __clen
998 __result._M_last - __result._M_cur));
999 std::copy(__first._M_cur, __first._M_cur + __clen, __result._M_cur);
1007 template<
typename _Tp>
1008 _Deque_iterator<_Tp, _Tp&, _Tp*>
1009 copy_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
1010 _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
1011 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
1013 typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
1014 typedef typename _Self::difference_type difference_type;
1016 difference_type __len = __last - __first;
1019 difference_type __llen = __last._M_cur - __last._M_first;
1020 _Tp* __lend = __last._M_cur;
1022 difference_type __rlen = __result._M_cur - __result._M_first;
1023 _Tp* __rend = __result._M_cur;
1027 __llen = _Self::_S_buffer_size();
1028 __lend = *(__last._M_node - 1) + __llen;
1032 __rlen = _Self::_S_buffer_size();
1033 __rend = *(__result._M_node - 1) + __rlen;
1036 const difference_type __clen =
std::min(__len,
1038 std::copy_backward(__lend - __clen, __lend, __rend);
1046 #if __cplusplus >= 201103L 1047 template<
typename _Tp>
1048 _Deque_iterator<_Tp, _Tp&, _Tp*>
1049 move(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
1050 _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
1051 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
1053 typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
1054 typedef typename _Self::difference_type difference_type;
1056 difference_type __len = __last - __first;
1059 const difference_type __clen
1061 __result._M_last - __result._M_cur));
1062 std::move(__first._M_cur, __first._M_cur + __clen, __result._M_cur);
1070 template<
typename _Tp>
1071 _Deque_iterator<_Tp, _Tp&, _Tp*>
1072 move_backward(_Deque_iterator<_Tp, const _Tp&, const _Tp*> __first,
1073 _Deque_iterator<_Tp, const _Tp&, const _Tp*> __last,
1074 _Deque_iterator<_Tp, _Tp&, _Tp*> __result)
1076 typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
1077 typedef typename _Self::difference_type difference_type;
1079 difference_type __len = __last - __first;
1082 difference_type __llen = __last._M_cur - __last._M_first;
1083 _Tp* __lend = __last._M_cur;
1085 difference_type __rlen = __result._M_cur - __result._M_first;
1086 _Tp* __rend = __result._M_cur;
1090 __llen = _Self::_S_buffer_size();
1091 __lend = *(__last._M_node - 1) + __llen;
1095 __rlen = _Self::_S_buffer_size();
1096 __rend = *(__result._M_node - 1) + __rlen;
1099 const difference_type __clen =
std::min(__len,
1101 std::move_backward(__lend - __clen, __lend, __rend);
1110 _GLIBCXX_END_NAMESPACE_CONTAINER
1111 _GLIBCXX_END_NAMESPACE_VERSION
void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)
Memory-handling helpers for the major map.
void _M_pop_front_aux()
Helper functions for push_* and pop_*.
_GLIBCXX17_CONSTEXPR iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
void _Destroy(_Tp *__pointer)
Forward iterators support a superset of input iterator operations.
allocator_type get_allocator() const noexcept
Get a copy of the memory allocation object.
void _M_pop_back_aux()
Helper functions for push_* and pop_*.
void _M_fill_initialize(const value_type &__value)
Fills the deque with copies of value.
_GLIBCXX17_CONSTEXPR void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
void _M_push_back_aux(_Args &&... __args)
Helper functions for push_* and pop_*.
void _M_push_front_aux(_Args &&... __args)
Helper functions for push_* and pop_*.
insert_iterator< _Container > inserter(_Container &__x, _Iterator __i)
ISO C++ entities toplevel namespace is std.
_GLIBCXX14_CONSTEXPR const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
deque & operator=(const deque &__x)
Deque assignment operator.
size_type size() const noexcept
void _M_range_initialize(_InputIterator __first, _InputIterator __last, std::input_iterator_tag)
Fills the deque with whatever is in [first,last).
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
void _M_new_elements_at_back(size_type __new_elements)
Memory-handling helpers for the previous internal insert functions.
void _M_new_elements_at_front(size_type __new_elements)
Memory-handling helpers for the previous internal insert functions.
constexpr const _Tp * end(initializer_list< _Tp > __ils) noexcept
Return an iterator pointing to one past the last element of the initializer_list.
iterator emplace(const_iterator __position, _Args &&... __args)
Inserts an object in deque before specified iterator.
A standard container using fixed-size memory allocation and constant-time manipulation of elements at...
Random-access iterators support a superset of bidirectional iterator operations.
iterator begin() noexcept
constexpr const _Tp * begin(initializer_list< _Tp > __ils) noexcept
Return an iterator pointing to the first element of the initializer_list.
_GLIBCXX14_CONSTEXPR const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.