94 rebind<_Tp>::other _Tp_alloc_type;
95 typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer
98 struct _Vector_impl_data
102 pointer _M_end_of_storage;
105 _Vector_impl_data() _GLIBCXX_NOEXCEPT
106 : _M_start(), _M_finish(), _M_end_of_storage()
109#if __cplusplus >= 201103L
111 _Vector_impl_data(_Vector_impl_data&& __x) noexcept
112 : _M_start(__x._M_start), _M_finish(__x._M_finish),
113 _M_end_of_storage(__x._M_end_of_storage)
114 { __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
119 _M_copy_data(_Vector_impl_data
const& __x) _GLIBCXX_NOEXCEPT
121 _M_start = __x._M_start;
122 _M_finish = __x._M_finish;
123 _M_end_of_storage = __x._M_end_of_storage;
128 _M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
132 _Vector_impl_data __tmp;
133 __tmp._M_copy_data(*
this);
135 __x._M_copy_data(__tmp);
140 :
public _Tp_alloc_type,
public _Vector_impl_data
143 _Vector_impl() _GLIBCXX_NOEXCEPT_IF(
145#if __cpp_lib_concepts
146 requires is_default_constructible_v<_Tp_alloc_type>
152 _Vector_impl(_Tp_alloc_type
const& __a) _GLIBCXX_NOEXCEPT
153 : _Tp_alloc_type(__a)
156#if __cplusplus >= 201103L
160 _Vector_impl(_Vector_impl&& __x) noexcept
165 _Vector_impl(_Tp_alloc_type&& __a) noexcept
170 _Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
175#if _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
176 template<
typename = _Tp_alloc_type>
182 static _GLIBCXX20_CONSTEXPR
void
184 static _GLIBCXX20_CONSTEXPR
void
185 _S_on_dealloc(_Vector_impl&) { }
187 typedef _Vector_impl& _Reinit;
191 _GLIBCXX20_CONSTEXPR _Grow(_Vector_impl&,
size_type) { }
192 _GLIBCXX20_CONSTEXPR
void _M_grew(
size_type) { }
197 template<
typename _Up>
205 static _GLIBCXX20_CONSTEXPR
void
206 _S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
208#if __cpp_lib_is_constant_evaluated
209 if (std::is_constant_evaluated())
212 __sanitizer_annotate_contiguous_container(__impl._M_start,
213 __impl._M_end_of_storage, __prev, __curr);
216 static _GLIBCXX20_CONSTEXPR
void
217 _S_grow(_Vector_impl& __impl,
size_type __n)
218 { _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
220 static _GLIBCXX20_CONSTEXPR
void
221 _S_shrink(_Vector_impl& __impl,
size_type __n)
222 { _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
224 static _GLIBCXX20_CONSTEXPR
void
225 _S_on_dealloc(_Vector_impl& __impl)
228 _S_adjust(__impl, __impl._M_finish, __impl._M_end_of_storage);
234 explicit _GLIBCXX20_CONSTEXPR
235 _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
238 _S_on_dealloc(_M_impl);
245 if (_M_impl._M_start)
246 _S_adjust(_M_impl, _M_impl._M_end_of_storage,
250 _Vector_impl& _M_impl;
252#if __cplusplus >= 201103L
253 _Reinit(
const _Reinit&) =
delete;
254 _Reinit& operator=(
const _Reinit&) =
delete;
262 _Grow(_Vector_impl& __impl,
size_type __n)
263 : _M_impl(__impl), _M_n(__n)
264 { _S_grow(_M_impl, __n); }
267 ~_Grow() {
if (_M_n) _S_shrink(_M_impl, _M_n); }
270 void _M_grew(
size_type __n) { _M_n -= __n; }
272#if __cplusplus >= 201103L
273 _Grow(
const _Grow&) =
delete;
274 _Grow& operator=(
const _Grow&) =
delete;
277 _Vector_impl& _M_impl;
282#define _GLIBCXX_ASAN_ANNOTATE_REINIT \
283 typename _Base::_Vector_impl::template _Asan<>::_Reinit const \
284 __attribute__((__unused__)) __reinit_guard(this->_M_impl)
285#define _GLIBCXX_ASAN_ANNOTATE_GROW(n) \
286 typename _Base::_Vector_impl::template _Asan<>::_Grow \
287 __attribute__((__unused__)) __grow_guard(this->_M_impl, (n))
288#define _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n)
289#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \
290 _Base::_Vector_impl::template _Asan<>::_S_shrink(this->_M_impl, n)
291#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \
292 _Base::_Vector_impl::template _Asan<>::_S_on_dealloc(this->_M_impl)
294#define _GLIBCXX_ASAN_ANNOTATE_REINIT
295#define _GLIBCXX_ASAN_ANNOTATE_GROW(n)
296#define _GLIBCXX_ASAN_ANNOTATE_GREW(n)
297#define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n)
298#define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC
303 typedef _Alloc allocator_type;
307 _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
308 {
return this->_M_impl; }
311 const _Tp_alloc_type&
312 _M_get_Tp_allocator()
const _GLIBCXX_NOEXCEPT
313 {
return this->_M_impl; }
318 {
return allocator_type(_M_get_Tp_allocator()); }
320#if __cplusplus >= 201103L
327 _Vector_base(
const allocator_type& __a) _GLIBCXX_NOEXCEPT
331#if !_GLIBCXX_INLINE_VERSION
333 _Vector_base(
size_t __n)
335 { _M_create_storage(__n); }
339 _Vector_base(
size_t __n,
const allocator_type& __a)
341 { _M_create_storage(__n); }
343#if __cplusplus >= 201103L
344 _Vector_base(_Vector_base&&) =
default;
347# if !_GLIBCXX_INLINE_VERSION
349 _Vector_base(_Tp_alloc_type&& __a) noexcept
353 _Vector_base(_Vector_base&& __x,
const allocator_type& __a)
356 if (__x.get_allocator() == __a)
357 this->_M_impl._M_swap_data(__x._M_impl);
360 size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
361 _M_create_storage(__n);
367 _Vector_base(
const allocator_type& __a, _Vector_base&& __x)
368 : _M_impl(_Tp_alloc_type(__a), std::
move(__x._M_impl))
373 ~_Vector_base() _GLIBCXX_NOEXCEPT
375 ptrdiff_t __n = _M_impl._M_end_of_storage - _M_impl._M_start;
377 __builtin_unreachable();
378 _M_deallocate(_M_impl._M_start,
size_t(__n));
382 _Vector_impl _M_impl;
386 _M_allocate(
size_t __n)
388 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
389 return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
394 _M_deallocate(pointer __p,
size_t __n)
396 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
398 _Tr::deallocate(_M_impl, __p, __n);
405 _M_create_storage(
size_t __n)
407 this->_M_impl._M_start = this->_M_allocate(__n);
408 this->_M_impl._M_finish = this->_M_impl._M_start;
409 this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
412#if __glibcxx_containers_ranges
418 template<ranges::input_range _Rg>
420 _M_append_range_to(_Rg&& __rg, pointer& __ptr)
422 __ptr = std::__uninitialized_copy_a(ranges::begin(__rg),
424 __ptr, _M_get_Tp_allocator());
429 template<ranges::input_range _Rg>
431 _M_append_range(_Rg&& __rg)
460 class vector :
protected _Vector_base<_Tp, _Alloc>
462#ifdef _GLIBCXX_CONCEPT_CHECKS
464 typedef typename _Alloc::value_type _Alloc_value_type;
465# if __cplusplus < 201103L
466 __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
468 __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
471#if __cplusplus >= 201103L
473 "std::vector must have a non-const, non-volatile value_type");
474# if __cplusplus > 201703L || defined __STRICT_ANSI__
476 "std::vector must have the same value_type as its allocator");
480 typedef _Vector_base<_Tp, _Alloc> _Base;
481 typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
485 typedef _Tp value_type;
486 typedef typename _Base::pointer pointer;
487 typedef typename _Alloc_traits::const_pointer const_pointer;
488 typedef typename _Alloc_traits::reference reference;
489 typedef typename _Alloc_traits::const_reference const_reference;
490 typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
491 typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
495 typedef size_t size_type;
496 typedef ptrdiff_t difference_type;
497 typedef _Alloc allocator_type;
500#if __cplusplus >= 201103L
501 static constexpr bool
510 static constexpr bool
514 static constexpr bool
520 return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
523 static _GLIBCXX20_CONSTEXPR pointer
524 _S_relocate(pointer __first, pointer __last, pointer __result,
525 _Tp_alloc_type& __alloc)
noexcept
527#pragma GCC diagnostic push
528#pragma GCC diagnostic ignored "-Wc++17-extensions"
529 if constexpr (_S_use_relocate())
530 return std::__relocate_a(__first, __last, __result, __alloc);
533#pragma GCC diagnostic pop
538 using _Base::_M_allocate;
539 using _Base::_M_deallocate;
540 using _Base::_M_impl;
541 using _Base::_M_get_Tp_allocator;
550#if __cplusplus >= 201103L
562 vector(
const allocator_type& __a) _GLIBCXX_NOEXCEPT
565#if __cplusplus >= 201103L
576 vector(size_type __n,
const allocator_type& __a = allocator_type())
577 : _Base(_S_check_init_len(__n, __a), __a)
578 { _M_default_initialize(__n); }
589 vector(size_type __n,
const value_type& __value,
590 const allocator_type& __a = allocator_type())
591 : _Base(_S_check_init_len(__n, __a), __a)
592 { _M_fill_initialize(__n, __value); }
604 const allocator_type& __a = allocator_type())
605 : _Base(_S_check_init_len(__n, __a), __a)
606 { _M_fill_initialize(__n, __value); }
623 _Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
625 this->_M_impl._M_finish =
626 std::__uninitialized_copy_a(__x.
begin(), __x.
end(),
627 this->_M_impl._M_start,
628 _M_get_Tp_allocator());
631#if __cplusplus >= 201103L
644 vector(const
vector& __x, const __type_identity_t<allocator_type>& __a)
645 : _Base(__x.
size(), __a)
647 this->_M_impl._M_finish =
648 std::__uninitialized_copy_a(__x.begin(), __x.end(),
649 this->_M_impl._M_start,
650 _M_get_Tp_allocator());
660 vector(vector&& __rv,
const allocator_type& __m, false_type)
663 if (__rv.get_allocator() == __m)
664 this->_M_impl._M_swap_data(__rv._M_impl);
665 else if (!__rv.empty())
667 this->_M_create_storage(__rv.size());
668 this->_M_impl._M_finish =
669 std::__uninitialized_move_a(__rv.begin(), __rv.end(),
670 this->_M_impl._M_start,
671 _M_get_Tp_allocator());
683 :
vector(
std::
move(__rv), __m, typename _Alloc_traits::is_always_equal{})
699 const allocator_type& __a = allocator_type())
702 _M_range_initialize_n(__l.begin(), __l.end(), __l.size());
722#if __cplusplus >= 201103L
723 template<
typename _InputIterator,
724 typename = std::_RequireInputIter<_InputIterator>>
726 vector(_InputIterator __first, _InputIterator __last,
727 const allocator_type& __a = allocator_type())
730#if __glibcxx_concepts
731 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
732 || forward_iterator<_InputIterator>)
735 =
static_cast<size_type
>(ranges::distance(__first, __last));
736 _M_range_initialize_n(__first, __last, __n);
741 _M_range_initialize(__first, __last,
745 template<
typename _InputIterator>
746 vector(_InputIterator __first, _InputIterator __last,
747 const allocator_type& __a = allocator_type())
751 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
752 _M_initialize_dispatch(__first, __last, _Integral());
756#if __glibcxx_containers_ranges
762 template<__detail::__container_compatible_range<_Tp> _Rg>
764 vector(from_range_t, _Rg&& __rg,
const _Alloc& __a = _Alloc())
767 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
769 const auto __n =
static_cast<size_type
>(ranges::distance(__rg));
770 _M_range_initialize_n(ranges::begin(__rg), ranges::end(__rg),
775 auto __first = ranges::begin(__rg);
776 const auto __last = ranges::end(__rg);
777 for (; __first != __last; ++__first)
778 emplace_back(*__first);
792 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
793 _M_get_Tp_allocator());
794 _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC;
810#if __cplusplus >= 201103L
825 constexpr bool __move_storage =
826 _Alloc_traits::_S_propagate_on_move_assign()
827 || _Alloc_traits::_S_always_equal();
828 _M_move_assign(
std::move(__x), __bool_constant<__move_storage>());
847 this->_M_assign_aux(__l.begin(), __l.end(),
865 assign(size_type __n,
const value_type& __val)
866 { _M_fill_assign(__n, __val); }
880#if __cplusplus >= 201103L
881 template<
typename _InputIterator,
882 typename = std::_RequireInputIter<_InputIterator>>
885 assign(_InputIterator __first, _InputIterator __last)
888 template<
typename _InputIterator>
890 assign(_InputIterator __first, _InputIterator __last)
893 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
894 _M_assign_dispatch(__first, __last, _Integral());
898#if __cplusplus >= 201103L
914 this->_M_assign_aux(__l.begin(), __l.end(),
919#if __glibcxx_containers_ranges
926 template<__detail::__container_compatible_range<_Tp> _Rg>
928 assign_range(_Rg&& __rg)
930 static_assert(assignable_from<_Tp&, ranges::range_reference_t<_Rg>>);
932 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
934 const auto __n =
size_type(ranges::distance(__rg));
937 auto __res = ranges::copy(__rg, this->_M_impl._M_start);
938 _M_erase_at_end(__res.out);
943 auto __first = ranges::copy_n(ranges::begin(__rg),
size(),
944 this->_M_impl._M_start).in;
945 [[maybe_unused]]
const auto __diff = __n -
size();
946 _GLIBCXX_ASAN_ANNOTATE_GROW(__diff);
947 _Base::_M_append_range(ranges::subrange(
std::move(__first),
949 _GLIBCXX_ASAN_ANNOTATE_GREW(__diff);
953 auto __first = ranges::begin(__rg);
954 const auto __last = ranges::end(__rg);
955 pointer __ptr = this->_M_impl._M_start;
956 pointer
const __end = this->_M_impl._M_finish;
958 while (__ptr < __end && __first != __last)
965 if (__first == __last)
966 _M_erase_at_end(__ptr);
970 emplace_back(*__first);
971 while (++__first != __last);
978 using _Base::get_allocator;
986 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
989 {
return iterator(this->_M_impl._M_start); }
996 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
999 {
return const_iterator(this->_M_impl._M_start); }
1006 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1009 {
return iterator(this->_M_impl._M_finish); }
1016 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1019 {
return const_iterator(this->_M_impl._M_finish); }
1026 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1029 {
return reverse_iterator(
end()); }
1036 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1037 const_reverse_iterator
1039 {
return const_reverse_iterator(
end()); }
1046 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1049 {
return reverse_iterator(
begin()); }
1056 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1057 const_reverse_iterator
1059 {
return const_reverse_iterator(
begin()); }
1061#if __cplusplus >= 201103L
1067 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1070 {
return const_iterator(this->_M_impl._M_start); }
1077 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1080 {
return const_iterator(this->_M_impl._M_finish); }
1087 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1088 const_reverse_iterator
1090 {
return const_reverse_iterator(
end()); }
1097 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1098 const_reverse_iterator
1100 {
return const_reverse_iterator(
begin()); }
1105 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1109 ptrdiff_t __dif = this->_M_impl._M_finish - this->_M_impl._M_start;
1111 __builtin_unreachable();
1112 return size_type(__dif);
1116 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1119 {
return _S_max_size(_M_get_Tp_allocator()); }
1121#if __cplusplus >= 201103L
1131 _GLIBCXX20_CONSTEXPR
1135 if (__new_size >
size())
1136 _M_default_append(__new_size -
size());
1137 else if (__new_size <
size())
1138 _M_erase_at_end(this->_M_impl._M_start + __new_size);
1152 _GLIBCXX20_CONSTEXPR
1154 resize(size_type __new_size,
const value_type& __x)
1156 if (__new_size >
size())
1157 _M_fill_append(__new_size -
size(), __x);
1158 else if (__new_size <
size())
1159 _M_erase_at_end(this->_M_impl._M_start + __new_size);
1173 _GLIBCXX20_CONSTEXPR
1177 if (__new_size >
size())
1178 _M_fill_append(__new_size -
size(), __x);
1179 else if (__new_size <
size())
1180 _M_erase_at_end(this->_M_impl._M_start + __new_size);
1184#if __cplusplus >= 201103L
1186 _GLIBCXX20_CONSTEXPR
1189 { _M_shrink_to_fit(); }
1196 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1200 ptrdiff_t __dif = this->_M_impl._M_end_of_storage
1201 - this->_M_impl._M_start;
1203 __builtin_unreachable();
1204 return size_type(__dif);
1211 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1233 _GLIBCXX20_CONSTEXPR
1249 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1253 __glibcxx_requires_subscript(__n);
1254 return *(this->_M_impl._M_start + __n);
1268 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1272 __glibcxx_requires_subscript(__n);
1273 return *(this->_M_impl._M_start + __n);
1278 _GLIBCXX20_CONSTEXPR
1282 if (__n >= this->
size())
1283 __throw_out_of_range_fmt(__N(
"vector::_M_range_check: __n "
1284 "(which is %zu) >= this->size() "
1301 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1306 return (*
this)[__n];
1320 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1325 return (*
this)[__n];
1332 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1336 __glibcxx_requires_nonempty();
1344 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1348 __glibcxx_requires_nonempty();
1356 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1360 __glibcxx_requires_nonempty();
1361 return *(
end() - 1);
1368 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1372 __glibcxx_requires_nonempty();
1373 return *(
end() - 1);
1383 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1386 {
return _M_data_ptr(this->_M_impl._M_start); }
1388 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1390 data() const _GLIBCXX_NOEXCEPT
1391 {
return _M_data_ptr(this->_M_impl._M_start); }
1404 _GLIBCXX20_CONSTEXPR
1408 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
1410 _GLIBCXX_ASAN_ANNOTATE_GROW(1);
1411 _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
1413 ++this->_M_impl._M_finish;
1414 _GLIBCXX_ASAN_ANNOTATE_GREW(1);
1417 _M_realloc_append(__x);
1420#if __cplusplus >= 201103L
1421 _GLIBCXX20_CONSTEXPR
1426 template<
typename... _Args>
1427#if __cplusplus > 201402L
1428 _GLIBCXX20_CONSTEXPR
1433 emplace_back(_Args&&... __args);
1445 _GLIBCXX20_CONSTEXPR
1449 __glibcxx_requires_nonempty();
1450 --this->_M_impl._M_finish;
1451 _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
1452 _GLIBCXX_ASAN_ANNOTATE_SHRINK(1);
1455#if __cplusplus >= 201103L
1468 template<
typename... _Args>
1469 _GLIBCXX20_CONSTEXPR
1471 emplace(const_iterator __position, _Args&&... __args)
1485 _GLIBCXX20_CONSTEXPR
1487 insert(const_iterator __position,
const value_type& __x);
1501 insert(iterator __position,
const value_type& __x);
1504#if __cplusplus >= 201103L
1516 _GLIBCXX20_CONSTEXPR
1518 insert(const_iterator __position, value_type&& __x)
1519 {
return _M_insert_rval(__position,
std::move(__x)); }
1534 _GLIBCXX20_CONSTEXPR
1538 auto __offset = __position -
cbegin();
1539 _M_range_insert(
begin() + __offset, __l.begin(), __l.end(),
1541 return begin() + __offset;
1545#if __cplusplus >= 201103L
1560 _GLIBCXX20_CONSTEXPR
1562 insert(const_iterator __position, size_type __n,
const value_type& __x)
1564 difference_type __offset = __position -
cbegin();
1565 _M_fill_insert(
begin() + __offset, __n, __x);
1566 return begin() + __offset;
1584 { _M_fill_insert(__position, __n, __x); }
1587#if __cplusplus >= 201103L
1603 template<
typename _InputIterator,
1604 typename = std::_RequireInputIter<_InputIterator>>
1605 _GLIBCXX20_CONSTEXPR
1607 insert(const_iterator __position, _InputIterator __first,
1608 _InputIterator __last)
1610 difference_type __offset = __position -
cbegin();
1611 _M_range_insert(
begin() + __offset, __first, __last,
1613 return begin() + __offset;
1630 template<
typename _InputIterator>
1633 _InputIterator __last)
1636 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1637 _M_insert_dispatch(__position, __first, __last, _Integral());
1641#if __glibcxx_containers_ranges
1650 template<__detail::__container_compatible_range<_Tp> _Rg>
1652 insert_range(const_iterator __pos, _Rg&& __rg);
1659 template<__detail::__container_compatible_range<_Tp> _Rg>
1661 append_range(_Rg&& __rg)
1666 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
1668 const auto __n = size_type(ranges::distance(__rg));
1675 const auto __sz =
size();
1676 const auto __capacity =
capacity();
1677 if ((__capacity - __sz) >= __n)
1679 _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
1680 _Base::_M_append_range(__rg);
1681 _GLIBCXX_ASAN_ANNOTATE_GREW(__n);
1685 const size_type __len = _M_check_len(__n,
"vector::append_range");
1687 pointer __old_start = this->_M_impl._M_start;
1688 pointer __old_finish = this->_M_impl._M_finish;
1690 allocator_type& __a = _M_get_Tp_allocator();
1691 const pointer __start = this->_M_allocate(__len);
1692 const pointer __mid = __start + __sz;
1693 const pointer __back = __mid + __n;
1694 _Guard_alloc __guard(__start, __len, *
this);
1695 std::__uninitialized_copy_a(ranges::begin(__rg),
1699 if constexpr (_S_use_relocate())
1700 _S_relocate(__old_start, __old_finish, __start, __a);
1706 pointer _M_first, _M_last;
1707 _Tp_alloc_type& _M_alloc;
1710 _Guard_elts(pointer __f, pointer __l, _Tp_alloc_type& __a)
1711 : _M_first(__f), _M_last(__l), _M_alloc(__a)
1718 _Guard_elts(_Guard_elts&&) =
delete;
1720 _Guard_elts __guard_elts{__mid, __back, __a};
1722 std::__uninitialized_move_a(__old_start, __old_finish,
1726 __guard_elts._M_first = __old_start;
1727 __guard_elts._M_last = __old_finish;
1731 __guard._M_storage = __old_start;
1732 __guard._M_len = __capacity;
1734 this->_M_impl._M_start = __start;
1735 this->_M_impl._M_finish = __back;
1736 this->_M_impl._M_end_of_storage = __start + __len;
1740 auto __first = ranges::begin(__rg);
1741 const auto __last = ranges::end(__rg);
1745 __first != __last && __free > 0;
1746 ++__first, (void) --__free)
1747 emplace_back(*__first);
1749 if (__first == __last)
1753 vector __tmp(_M_get_Tp_allocator());
1754 for (; __first != __last; ++__first)
1755 __tmp.emplace_back(*__first);
1756 reserve(_M_check_len(__tmp.size(),
"vector::append_range"));
1757 ranges::subrange __r(std::make_move_iterator(__tmp.begin()),
1758 std::make_move_iterator(__tmp.end()));
1779 _GLIBCXX20_CONSTEXPR
1781#if __cplusplus >= 201103L
1783 {
return _M_erase(
begin() + (__position -
cbegin())); }
1786 {
return _M_erase(__position); }
1807 _GLIBCXX20_CONSTEXPR
1809#if __cplusplus >= 201103L
1810 erase(const_iterator __first, const_iterator __last)
1812 const auto __beg =
begin();
1813 const auto __cbeg =
cbegin();
1814 return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
1818 {
return _M_erase(__first, __last); }
1832 _GLIBCXX20_CONSTEXPR
1836#if __cplusplus >= 201103L
1837 __glibcxx_assert(_Alloc_traits::propagate_on_container_swap::value
1838 || _M_get_Tp_allocator() == __x._M_get_Tp_allocator());
1840 this->_M_impl._M_swap_data(__x._M_impl);
1841 _Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
1842 __x._M_get_Tp_allocator());
1851 _GLIBCXX20_CONSTEXPR
1854 { _M_erase_at_end(this->_M_impl._M_start); }
1864 _GLIBCXX20_CONSTEXPR
1865 _Guard_alloc(pointer __s,
size_type __l, _Base& __vect)
1866 : _M_storage(__s), _M_len(__l), _M_vect(__vect)
1869 _GLIBCXX20_CONSTEXPR
1873 _M_vect._M_deallocate(_M_storage, _M_len);
1876 _GLIBCXX20_CONSTEXPR
1880 pointer __res = _M_storage;
1881 _M_storage = pointer();
1886 _Guard_alloc(
const _Guard_alloc&);
1894 template<
typename _ForwardIterator>
1895 _GLIBCXX20_CONSTEXPR
1898 _ForwardIterator __first, _ForwardIterator __last)
1900 _Guard_alloc __guard(this->_M_allocate(__n), __n, *
this);
1901 std::__uninitialized_copy_a
1902 (__first, __last, __guard._M_storage, _M_get_Tp_allocator());
1903 return __guard._M_release();
1911#if __cplusplus < 201103L
1914 template<
typename _Integer>
1916 _M_initialize_dispatch(_Integer __int_n, _Integer __value, __true_type)
1920 _M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
1921 this->_M_impl._M_start = __start;
1922 this->_M_impl._M_end_of_storage = __start + __n;
1923 _M_fill_initialize(__n, __value);
1927 template<
typename _InputIterator>
1929 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1932 _M_range_initialize(__first, __last,
1938 template<
typename _InputIterator>
1939 _GLIBCXX20_CONSTEXPR
1941 _M_range_initialize(_InputIterator __first, _InputIterator __last,
1942 std::input_iterator_tag)
1945 for (; __first != __last; ++__first)
1946#
if __cplusplus >= 201103L
1947 emplace_back(*__first);
1953 __throw_exception_again;
1958 template<
typename _ForwardIterator>
1959 _GLIBCXX20_CONSTEXPR
1961 _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
1962 std::forward_iterator_tag)
1964 _M_range_initialize_n(__first, __last,
1968 template<
typename _Iterator,
typename _Sentinel>
1969 _GLIBCXX20_CONSTEXPR
1971 _M_range_initialize_n(_Iterator __first, _Sentinel __last,
1975 this->_M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
1976 this->_M_impl._M_start = this->_M_impl._M_finish = __start;
1977 this->_M_impl._M_end_of_storage = __start + __n;
1978 this->_M_impl._M_finish
1979 = std::__uninitialized_copy_a(_GLIBCXX_MOVE(__first), __last,
1980 __start, _M_get_Tp_allocator());
1985 _GLIBCXX20_CONSTEXPR
1987 _M_fill_initialize(size_type __n,
const value_type& __value)
1989 this->_M_impl._M_finish =
1990 std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
1991 _M_get_Tp_allocator());
1994#if __cplusplus >= 201103L
1996 _GLIBCXX20_CONSTEXPR
1998 _M_default_initialize(size_type __n)
2000 this->_M_impl._M_finish =
2001 std::__uninitialized_default_n_a(this->_M_impl._M_start, __n,
2002 _M_get_Tp_allocator());
2013 template<
typename _Integer>
2014 _GLIBCXX20_CONSTEXPR
2016 _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
2017 { _M_fill_assign(__n, __val); }
2020 template<
typename _InputIterator>
2021 _GLIBCXX20_CONSTEXPR
2023 _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
2028 template<
typename _InputIterator>
2029 _GLIBCXX20_CONSTEXPR
2031 _M_assign_aux(_InputIterator __first, _InputIterator __last,
2032 std::input_iterator_tag);
2035 template<
typename _ForwardIterator>
2036 _GLIBCXX20_CONSTEXPR
2038 _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
2039 std::forward_iterator_tag);
2043 _GLIBCXX20_CONSTEXPR
2045 _M_fill_assign(size_type __n,
const value_type& __val);
2053 template<
typename _Integer>
2054 _GLIBCXX20_CONSTEXPR
2056 _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
2058 { _M_fill_insert(__pos, __n, __val); }
2061 template<
typename _InputIterator>
2062 _GLIBCXX20_CONSTEXPR
2064 _M_insert_dispatch(iterator __pos, _InputIterator __first,
2065 _InputIterator __last, __false_type)
2067 _M_range_insert(__pos, __first, __last,
2072 template<
typename _InputIterator>
2073 _GLIBCXX20_CONSTEXPR
2075 _M_range_insert(iterator __pos, _InputIterator __first,
2076 _InputIterator __last, std::input_iterator_tag);
2079 template<
typename _ForwardIterator>
2080 _GLIBCXX20_CONSTEXPR
2082 _M_range_insert(iterator __pos, _ForwardIterator __first,
2083 _ForwardIterator __last, std::forward_iterator_tag);
2087 _GLIBCXX20_CONSTEXPR
2089 _M_fill_insert(iterator __pos, size_type __n,
const value_type& __x);
2092 _GLIBCXX20_CONSTEXPR
2094 _M_fill_append(size_type __n,
const value_type& __x);
2096#if __cplusplus >= 201103L
2098 _GLIBCXX20_CONSTEXPR
2100 _M_default_append(size_type __n);
2102 _GLIBCXX20_CONSTEXPR
2107#if __cplusplus < 201103L
2110 _M_insert_aux(iterator __position,
const value_type& __x);
2113 _M_realloc_insert(iterator __position,
const value_type& __x);
2116 _M_realloc_append(
const value_type& __x);
2120 struct _Temporary_value
2122 template<
typename... _Args>
2123 _GLIBCXX20_CONSTEXPR
explicit
2124 _Temporary_value(
vector* __vec, _Args&&... __args) : _M_this(__vec)
2126 _Alloc_traits::construct(_M_this->_M_impl, _M_ptr(),
2130 _GLIBCXX20_CONSTEXPR
2132 { _Alloc_traits::destroy(_M_this->_M_impl, _M_ptr()); }
2134 _GLIBCXX20_CONSTEXPR value_type&
2135 _M_val() noexcept {
return _M_storage._M_val; }
2138 _GLIBCXX20_CONSTEXPR _Tp*
2143 constexpr _Storage() : _M_byte() { }
2144 _GLIBCXX20_CONSTEXPR ~_Storage() { }
2145 _Storage& operator=(
const _Storage&) =
delete;
2146 unsigned char _M_byte;
2151 _Storage _M_storage;
2156 template<
typename _Arg>
2157 _GLIBCXX20_CONSTEXPR
2159 _M_insert_aux(iterator __position, _Arg&& __arg);
2161 template<
typename... _Args>
2162 _GLIBCXX20_CONSTEXPR
2164 _M_realloc_insert(iterator __position, _Args&&... __args);
2166 template<
typename... _Args>
2167 _GLIBCXX20_CONSTEXPR
2169 _M_realloc_append(_Args&&... __args);
2172 _GLIBCXX20_CONSTEXPR
2174 _M_insert_rval(const_iterator __position, value_type&& __v);
2177 template<
typename... _Args>
2178 _GLIBCXX20_CONSTEXPR
2180 _M_emplace_aux(const_iterator __position, _Args&&... __args);
2183 _GLIBCXX20_CONSTEXPR
2185 _M_emplace_aux(const_iterator __position, value_type&& __v)
2186 {
return _M_insert_rval(__position,
std::move(__v)); }
2190 _GLIBCXX20_CONSTEXPR
2192 _M_check_len(size_type __n,
const char* __s)
const
2195 __throw_length_error(__N(__s));
2202 static _GLIBCXX20_CONSTEXPR size_type
2203 _S_check_init_len(size_type __n,
const allocator_type& __a)
2205 if (__n > _S_max_size(_Tp_alloc_type(__a)))
2206 __throw_length_error(
2207 __N(
"cannot create std::vector larger than max_size()"));
2211 static _GLIBCXX20_CONSTEXPR size_type
2212 _S_max_size(
const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
2217 const size_t __diffmax
2218 = __gnu_cxx::__numeric_traits<ptrdiff_t>::__max /
sizeof(_Tp);
2220 return (
std::min)(__diffmax, __allocmax);
2227 _GLIBCXX20_CONSTEXPR
2229 _M_erase_at_end(pointer __pos) _GLIBCXX_NOEXCEPT
2231 if (size_type __n = this->_M_impl._M_finish - __pos)
2234 _M_get_Tp_allocator());
2235 this->_M_impl._M_finish = __pos;
2236 _GLIBCXX_ASAN_ANNOTATE_SHRINK(__n);
2240 _GLIBCXX20_CONSTEXPR
2242 _M_erase(iterator __position);
2244 _GLIBCXX20_CONSTEXPR
2246 _M_erase(iterator __first, iterator __last);
2248#if __cplusplus >= 201103L
2253 _GLIBCXX20_CONSTEXPR
2258 this->_M_impl._M_swap_data(__x._M_impl);
2259 __tmp._M_impl._M_swap_data(__x._M_impl);
2260 std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
2265 _GLIBCXX20_CONSTEXPR
2269 if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
2275 this->_M_assign_aux(std::make_move_iterator(__x.begin()),
2276 std::make_move_iterator(__x.end()),
2277 std::random_access_iterator_tag());
2283 template<
typename _Up>
2284 _GLIBCXX20_CONSTEXPR
2286 _M_data_ptr(_Up* __ptr)
const _GLIBCXX_NOEXCEPT
2289#if __cplusplus >= 201103L
2290 template<
typename _Ptr>
2291 _GLIBCXX20_CONSTEXPR
2292 typename std::pointer_traits<_Ptr>::element_type*
2293 _M_data_ptr(_Ptr __ptr)
const
2294 {
return empty() ? nullptr : std::__to_address(__ptr); }
2296 template<
typename _Ptr>
2298 _M_data_ptr(_Ptr __ptr)
const
2299 {
return empty() ? (value_type*)0 : __ptr.operator->(); }