1 // Vector implementation -*- C++ -*-
2 
3 // Copyright (C) 2001-2020 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /*
26  *
27  * Copyright (c) 1994
28  * Hewlett-Packard Company
29  *
30  * Permission to use, copy, modify, distribute and sell this software
31  * and its documentation for any purpose is hereby granted without fee,
32  * provided that the above copyright notice appear in all copies and
33  * that both that copyright notice and this permission notice appear
34  * in supporting documentation.  Hewlett-Packard Company makes no
35  * representations about the suitability of this software for any
36  * purpose.  It is provided "as is" without express or implied warranty.
37  *
38  *
39  * Copyright (c) 1996
40  * Silicon Graphics Computer Systems, Inc.
41  *
42  * Permission to use, copy, modify, distribute and sell this software
43  * and its documentation for any purpose is hereby granted without fee,
44  * provided that the above copyright notice appear in all copies and
45  * that both that copyright notice and this permission notice appear
46  * in supporting documentation.  Silicon Graphics makes no
47  * representations about the suitability of this  software for any
48  * purpose.  It is provided "as is" without express or implied warranty.
49  */
50 
51 /** @file bits/stl_vector.h
52  *  This is an internal header file, included by other library headers.
53  *  Do not attempt to use it directly. @headername{vector}
54  */
55 
56 #ifndef _STL_VECTOR_H
57 #define _STL_VECTOR_H 1
58 
59 #include <bits/stl_iterator_base_funcs.h>
60 #include <bits/functexcept.h>
61 #include <bits/concept_check.h>
62 #if __cplusplus >= 201103L
63 #include <initializer_list>
64 #endif
65 #if __cplusplus > 201703L
66 # include <compare>
67 #endif
68 
69 #include <debug/assertions.h>
70 
71 #if _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
72 extern "C" void
73 __sanitizer_annotate_contiguous_container(const void*, const void*,
74 					  const void*, const void*);
75 #endif
76 
_GLIBCXX_VISIBILITY(default)77 namespace std _GLIBCXX_VISIBILITY(default)
78 {
79 _GLIBCXX_BEGIN_NAMESPACE_VERSION
80 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
81 
82   /// See bits/stl_deque.h's _Deque_base for an explanation.
83   template<typename _Tp, typename _Alloc>
84     struct _Vector_base
85     {
86       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
87 	rebind<_Tp>::other _Tp_alloc_type;
88       typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer
89        	pointer;
90 
91       struct _Vector_impl_data
92       {
93 	pointer _M_start;
94 	pointer _M_finish;
95 	pointer _M_end_of_storage;
96 
97 	_Vector_impl_data() _GLIBCXX_NOEXCEPT
98 	: _M_start(), _M_finish(), _M_end_of_storage()
99 	{ }
100 
101 #if __cplusplus >= 201103L
102 	_Vector_impl_data(_Vector_impl_data&& __x) noexcept
103 	: _M_start(__x._M_start), _M_finish(__x._M_finish),
104 	  _M_end_of_storage(__x._M_end_of_storage)
105 	{ __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
106 #endif
107 
108 	void
109 	_M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
110 	{
111 	  _M_start = __x._M_start;
112 	  _M_finish = __x._M_finish;
113 	  _M_end_of_storage = __x._M_end_of_storage;
114 	}
115 
116 	void
117 	_M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
118 	{
119 	  // Do not use std::swap(_M_start, __x._M_start), etc as it loses
120 	  // information used by TBAA.
121 	  _Vector_impl_data __tmp;
122 	  __tmp._M_copy_data(*this);
123 	  _M_copy_data(__x);
124 	  __x._M_copy_data(__tmp);
125 	}
126       };
127 
128       struct _Vector_impl
129 	: public _Tp_alloc_type, public _Vector_impl_data
130       {
131 	_Vector_impl() _GLIBCXX_NOEXCEPT_IF(
132 	    is_nothrow_default_constructible<_Tp_alloc_type>::value)
133 	: _Tp_alloc_type()
134 	{ }
135 
136 	_Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
137 	: _Tp_alloc_type(__a)
138 	{ }
139 
140 #if __cplusplus >= 201103L
141 	// Not defaulted, to enforce noexcept(true) even when
142 	// !is_nothrow_move_constructible<_Tp_alloc_type>.
143 	_Vector_impl(_Vector_impl&& __x) noexcept
144 	: _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
145 	{ }
146 
147 	_Vector_impl(_Tp_alloc_type&& __a) noexcept
148 	: _Tp_alloc_type(std::move(__a))
149 	{ }
150 
151 	_Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
152 	: _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
153 	{ }
154 #endif
155 
156 #if _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
157 	template<typename = _Tp_alloc_type>
158 	  struct _Asan
159 	  {
160 	    typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
161 	      ::size_type size_type;
162 
163 	    static void _S_shrink(_Vector_impl&, size_type) { }
164 	    static void _S_on_dealloc(_Vector_impl&) { }
165 
166 	    typedef _Vector_impl& _Reinit;
167 
168 	    struct _Grow
169 	    {
170 	      _Grow(_Vector_impl&, size_type) { }
171 	      void _M_grew(size_type) { }
172 	    };
173 	  };
174 
175 	// Enable ASan annotations for memory obtained from std::allocator.
176 	template<typename _Up>
177 	  struct _Asan<allocator<_Up> >
178 	  {
179 	    typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
180 	      ::size_type size_type;
181 
182 	    // Adjust ASan annotation for [_M_start, _M_end_of_storage) to
183 	    // mark end of valid region as __curr instead of __prev.
184 	    static void
185 	    _S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
186 	    {
187 	      __sanitizer_annotate_contiguous_container(__impl._M_start,
188 		  __impl._M_end_of_storage, __prev, __curr);
189 	    }
190 
191 	    static void
192 	    _S_grow(_Vector_impl& __impl, size_type __n)
193 	    { _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
194 
195 	    static void
196 	    _S_shrink(_Vector_impl& __impl, size_type __n)
197 	    { _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
198 
199 	    static void
200 	    _S_on_dealloc(_Vector_impl& __impl)
201 	    {
202 	      if (__impl._M_start)
203 		_S_adjust(__impl, __impl._M_finish, __impl._M_end_of_storage);
204 	    }
205 
206 	    // Used on reallocation to tell ASan unused capacity is invalid.
207 	    struct _Reinit
208 	    {
209 	      explicit _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
210 	      {
211 		// Mark unused capacity as valid again before deallocating it.
212 		_S_on_dealloc(_M_impl);
213 	      }
214 
215 	      ~_Reinit()
216 	      {
217 		// Mark unused capacity as invalid after reallocation.
218 		if (_M_impl._M_start)
219 		  _S_adjust(_M_impl, _M_impl._M_end_of_storage,
220 			    _M_impl._M_finish);
221 	      }
222 
223 	      _Vector_impl& _M_impl;
224 
225 #if __cplusplus >= 201103L
226 	      _Reinit(const _Reinit&) = delete;
227 	      _Reinit& operator=(const _Reinit&) = delete;
228 #endif
229 	    };
230 
231 	    // Tell ASan when unused capacity is initialized to be valid.
232 	    struct _Grow
233 	    {
234 	      _Grow(_Vector_impl& __impl, size_type __n)
235 	      : _M_impl(__impl), _M_n(__n)
236 	      { _S_grow(_M_impl, __n); }
237 
238 	      ~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }
239 
240 	      void _M_grew(size_type __n) { _M_n -= __n; }
241 
242 #if __cplusplus >= 201103L
243 	      _Grow(const _Grow&) = delete;
244 	      _Grow& operator=(const _Grow&) = delete;
245 #endif
246 	    private:
247 	      _Vector_impl& _M_impl;
248 	      size_type _M_n;
249 	    };
250 	  };
251 
252 #define _GLIBCXX_ASAN_ANNOTATE_REINIT \
253   typename _Base::_Vector_impl::template _Asan<>::_Reinit const \
254 	__attribute__((__unused__)) __reinit_guard(this->_M_impl)
255 #define _GLIBCXX_ASAN_ANNOTATE_GROW(n) \
256   typename _Base::_Vector_impl::template _Asan<>::_Grow \
257 	__attribute__((__unused__)) __grow_guard(this->_M_impl, (n))
258 #define _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n)
259 #define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \
260   _Base::_Vector_impl::template _Asan<>::_S_shrink(this->_M_impl, n)
261 #define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \
262   _Base::_Vector_impl::template _Asan<>::_S_on_dealloc(this->_M_impl)
263 #else // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR)
264 #define _GLIBCXX_ASAN_ANNOTATE_REINIT
265 #define _GLIBCXX_ASAN_ANNOTATE_GROW(n)
266 #define _GLIBCXX_ASAN_ANNOTATE_GREW(n)
267 #define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n)
268 #define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC
269 #endif // _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
270       };
271 
272     public:
273       typedef _Alloc allocator_type;
274 
275       _Tp_alloc_type&
276       _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
277       { return this->_M_impl; }
278 
279       const _Tp_alloc_type&
280       _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
281       { return this->_M_impl; }
282 
283       allocator_type
284       get_allocator() const _GLIBCXX_NOEXCEPT
285       { return allocator_type(_M_get_Tp_allocator()); }
286 
287 #if __cplusplus >= 201103L
288       _Vector_base() = default;
289 #else
290       _Vector_base() { }
291 #endif
292 
293       _Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
294       : _M_impl(__a) { }
295 
296       // Kept for ABI compatibility.
297 #if !_GLIBCXX_INLINE_VERSION
298       _Vector_base(size_t __n)
299       : _M_impl()
300       { _M_create_storage(__n); }
301 #endif
302 
303       _Vector_base(size_t __n, const allocator_type& __a)
304       : _M_impl(__a)
305       { _M_create_storage(__n); }
306 
307 #if __cplusplus >= 201103L
308       _Vector_base(_Vector_base&&) = default;
309 
310       // Kept for ABI compatibility.
311 # if !_GLIBCXX_INLINE_VERSION
312       _Vector_base(_Tp_alloc_type&& __a) noexcept
313       : _M_impl(std::move(__a)) { }
314 
315       _Vector_base(_Vector_base&& __x, const allocator_type& __a)
316       : _M_impl(__a)
317       {
318 	if (__x.get_allocator() == __a)
319 	  this->_M_impl._M_swap_data(__x._M_impl);
320 	else
321 	  {
322 	    size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
323 	    _M_create_storage(__n);
324 	  }
325       }
326 # endif
327 
328       _Vector_base(const allocator_type& __a, _Vector_base&& __x)
329       : _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
330       { }
331 #endif
332 
333       ~_Vector_base() _GLIBCXX_NOEXCEPT
334       {
335 	_M_deallocate(_M_impl._M_start,
336 		      _M_impl._M_end_of_storage - _M_impl._M_start);
337       }
338 
339     public:
340       _Vector_impl _M_impl;
341 
342       pointer
343       _M_allocate(size_t __n)
344       {
345 	typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
346 	return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
347       }
348 
349       void
350       _M_deallocate(pointer __p, size_t __n)
351       {
352 	typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
353 	if (__p)
354 	  _Tr::deallocate(_M_impl, __p, __n);
355       }
356 
357     protected:
358       void
359       _M_create_storage(size_t __n)
360       {
361 	this->_M_impl._M_start = this->_M_allocate(__n);
362 	this->_M_impl._M_finish = this->_M_impl._M_start;
363 	this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
364       }
365     };
366 
367   /**
368    *  @brief A standard container which offers fixed time access to
369    *  individual elements in any order.
370    *
371    *  @ingroup sequences
372    *
373    *  @tparam _Tp  Type of element.
374    *  @tparam _Alloc  Allocator type, defaults to allocator<_Tp>.
375    *
376    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
377    *  <a href="tables.html#66">reversible container</a>, and a
378    *  <a href="tables.html#67">sequence</a>, including the
379    *  <a href="tables.html#68">optional sequence requirements</a> with the
380    *  %exception of @c push_front and @c pop_front.
381    *
382    *  In some terminology a %vector can be described as a dynamic
383    *  C-style array, it offers fast and efficient access to individual
384    *  elements in any order and saves the user from worrying about
385    *  memory and size allocation.  Subscripting ( @c [] ) access is
386    *  also provided as with C-style arrays.
387   */
388   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
389     class vector : protected _Vector_base<_Tp, _Alloc>
390     {
391 #ifdef _GLIBCXX_CONCEPT_CHECKS
392       // Concept requirements.
393       typedef typename _Alloc::value_type		_Alloc_value_type;
394 # if __cplusplus < 201103L
395       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
396 # endif
397       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
398 #endif
399 
400 #if __cplusplus >= 201103L
401       static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
402 	  "std::vector must have a non-const, non-volatile value_type");
403 # if __cplusplus > 201703L || defined __STRICT_ANSI__
404       static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
405 	  "std::vector must have the same value_type as its allocator");
406 # endif
407 #endif
408 
409       typedef _Vector_base<_Tp, _Alloc>			_Base;
410       typedef typename _Base::_Tp_alloc_type		_Tp_alloc_type;
411       typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type>	_Alloc_traits;
412 
413     public:
414       typedef _Tp					value_type;
415       typedef typename _Base::pointer			pointer;
416       typedef typename _Alloc_traits::const_pointer	const_pointer;
417       typedef typename _Alloc_traits::reference		reference;
418       typedef typename _Alloc_traits::const_reference	const_reference;
419       typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
420       typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
421       const_iterator;
422       typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
423       typedef std::reverse_iterator<iterator>		reverse_iterator;
424       typedef size_t					size_type;
425       typedef ptrdiff_t					difference_type;
426       typedef _Alloc					allocator_type;
427 
428     private:
429 #if __cplusplus >= 201103L
430       static constexpr bool
431       _S_nothrow_relocate(true_type)
432       {
433 	return noexcept(std::__relocate_a(std::declval<pointer>(),
434 					  std::declval<pointer>(),
435 					  std::declval<pointer>(),
436 					  std::declval<_Tp_alloc_type&>()));
437       }
438 
439       static constexpr bool
440       _S_nothrow_relocate(false_type)
441       { return false; }
442 
443       static constexpr bool
444       _S_use_relocate()
445       {
446 	// Instantiating std::__relocate_a might cause an error outside the
447 	// immediate context (in __relocate_object_a's noexcept-specifier),
448 	// so only do it if we know the type can be move-inserted into *this.
449 	return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
450       }
451 
452       static pointer
453       _S_do_relocate(pointer __first, pointer __last, pointer __result,
454 		     _Tp_alloc_type& __alloc, true_type) noexcept
455       {
456 	return std::__relocate_a(__first, __last, __result, __alloc);
457       }
458 
459       static pointer
460       _S_do_relocate(pointer, pointer, pointer __result,
461 		     _Tp_alloc_type&, false_type) noexcept
462       { return __result; }
463 
464       static pointer
465       _S_relocate(pointer __first, pointer __last, pointer __result,
466 		  _Tp_alloc_type& __alloc) noexcept
467       {
468 	using __do_it = __bool_constant<_S_use_relocate()>;
469 	return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
470       }
471 #endif // C++11
472 
473     protected:
474       using _Base::_M_allocate;
475       using _Base::_M_deallocate;
476       using _Base::_M_impl;
477       using _Base::_M_get_Tp_allocator;
478 
479     public:
480       // [23.2.4.1] construct/copy/destroy
481       // (assign() and get_allocator() are also listed in this section)
482 
483       /**
484        *  @brief  Creates a %vector with no elements.
485        */
486 #if __cplusplus >= 201103L
487       vector() = default;
488 #else
489       vector() { }
490 #endif
491 
492       /**
493        *  @brief  Creates a %vector with no elements.
494        *  @param  __a  An allocator object.
495        */
496       explicit
497       vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
498       : _Base(__a) { }
499 
500 #if __cplusplus >= 201103L
501       /**
502        *  @brief  Creates a %vector with default constructed elements.
503        *  @param  __n  The number of elements to initially create.
504        *  @param  __a  An allocator.
505        *
506        *  This constructor fills the %vector with @a __n default
507        *  constructed elements.
508        */
509       explicit
510       vector(size_type __n, const allocator_type& __a = allocator_type())
511       : _Base(_S_check_init_len(__n, __a), __a)
512       { _M_default_initialize(__n); }
513 
514       /**
515        *  @brief  Creates a %vector with copies of an exemplar element.
516        *  @param  __n  The number of elements to initially create.
517        *  @param  __value  An element to copy.
518        *  @param  __a  An allocator.
519        *
520        *  This constructor fills the %vector with @a __n copies of @a __value.
521        */
522       vector(size_type __n, const value_type& __value,
523 	     const allocator_type& __a = allocator_type())
524       : _Base(_S_check_init_len(__n, __a), __a)
525       { _M_fill_initialize(__n, __value); }
526 #else
527       /**
528        *  @brief  Creates a %vector with copies of an exemplar element.
529        *  @param  __n  The number of elements to initially create.
530        *  @param  __value  An element to copy.
531        *  @param  __a  An allocator.
532        *
533        *  This constructor fills the %vector with @a __n copies of @a __value.
534        */
535       explicit
536       vector(size_type __n, const value_type& __value = value_type(),
537 	     const allocator_type& __a = allocator_type())
538       : _Base(_S_check_init_len(__n, __a), __a)
539       { _M_fill_initialize(__n, __value); }
540 #endif
541 
542       /**
543        *  @brief  %Vector copy constructor.
544        *  @param  __x  A %vector of identical element and allocator types.
545        *
546        *  All the elements of @a __x are copied, but any unused capacity in
547        *  @a __x  will not be copied
548        *  (i.e. capacity() == size() in the new %vector).
549        *
550        *  The newly-created %vector uses a copy of the allocator object used
551        *  by @a __x (unless the allocator traits dictate a different object).
552        */
553       vector(const vector& __x)
554       : _Base(__x.size(),
555 	_Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
556       {
557 	this->_M_impl._M_finish =
558 	  std::__uninitialized_copy_a(__x.begin(), __x.end(),
559 				      this->_M_impl._M_start,
560 				      _M_get_Tp_allocator());
561       }
562 
563 #if __cplusplus >= 201103L
564       /**
565        *  @brief  %Vector move constructor.
566        *
567        *  The newly-created %vector contains the exact contents of the
568        *  moved instance.
569        *  The contents of the moved instance are a valid, but unspecified
570        *  %vector.
571        */
572       vector(vector&&) noexcept = default;
573 
574       /// Copy constructor with alternative allocator
575       vector(const vector& __x, const allocator_type& __a)
576       : _Base(__x.size(), __a)
577       {
578 	this->_M_impl._M_finish =
579 	  std::__uninitialized_copy_a(__x.begin(), __x.end(),
580 				      this->_M_impl._M_start,
581 				      _M_get_Tp_allocator());
582       }
583 
584     private:
585       vector(vector&& __rv, const allocator_type& __m, true_type) noexcept
586       : _Base(__m, std::move(__rv))
587       { }
588 
589       vector(vector&& __rv, const allocator_type& __m, false_type)
590       : _Base(__m)
591       {
592 	if (__rv.get_allocator() == __m)
593 	  this->_M_impl._M_swap_data(__rv._M_impl);
594 	else if (!__rv.empty())
595 	  {
596 	    this->_M_create_storage(__rv.size());
597 	    this->_M_impl._M_finish =
598 	      std::__uninitialized_move_a(__rv.begin(), __rv.end(),
599 					  this->_M_impl._M_start,
600 					  _M_get_Tp_allocator());
601 	    __rv.clear();
602 	  }
603       }
604 
605     public:
606       /// Move constructor with alternative allocator
607       vector(vector&& __rv, const allocator_type& __m)
608       noexcept( noexcept(
609 	vector(std::declval<vector&&>(), std::declval<const allocator_type&>(),
610 	       std::declval<typename _Alloc_traits::is_always_equal>())) )
611       : vector(std::move(__rv), __m, typename _Alloc_traits::is_always_equal{})
612       { }
613 
614       /**
615        *  @brief  Builds a %vector from an initializer list.
616        *  @param  __l  An initializer_list.
617        *  @param  __a  An allocator.
618        *
619        *  Create a %vector consisting of copies of the elements in the
620        *  initializer_list @a __l.
621        *
622        *  This will call the element type's copy constructor N times
623        *  (where N is @a __l.size()) and do no memory reallocation.
624        */
625       vector(initializer_list<value_type> __l,
626 	     const allocator_type& __a = allocator_type())
627       : _Base(__a)
628       {
629 	_M_range_initialize(__l.begin(), __l.end(),
630 			    random_access_iterator_tag());
631       }
632 #endif
633 
634       /**
635        *  @brief  Builds a %vector from a range.
636        *  @param  __first  An input iterator.
637        *  @param  __last  An input iterator.
638        *  @param  __a  An allocator.
639        *
640        *  Create a %vector consisting of copies of the elements from
641        *  [first,last).
642        *
643        *  If the iterators are forward, bidirectional, or
644        *  random-access, then this will call the elements' copy
645        *  constructor N times (where N is distance(first,last)) and do
646        *  no memory reallocation.  But if only input iterators are
647        *  used, then this will do at most 2N calls to the copy
648        *  constructor, and logN memory reallocations.
649        */
650 #if __cplusplus >= 201103L
651       template<typename _InputIterator,
652 	       typename = std::_RequireInputIter<_InputIterator>>
653 	vector(_InputIterator __first, _InputIterator __last,
654 	       const allocator_type& __a = allocator_type())
655 	: _Base(__a)
656 	{
657 	  _M_range_initialize(__first, __last,
658 			      std::__iterator_category(__first));
659 	}
660 #else
661       template<typename _InputIterator>
662 	vector(_InputIterator __first, _InputIterator __last,
663 	       const allocator_type& __a = allocator_type())
664 	: _Base(__a)
665 	{
666 	  // Check whether it's an integral type.  If so, it's not an iterator.
667 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
668 	  _M_initialize_dispatch(__first, __last, _Integral());
669 	}
670 #endif
671 
672       /**
673        *  The dtor only erases the elements, and note that if the
674        *  elements themselves are pointers, the pointed-to memory is
675        *  not touched in any way.  Managing the pointer is the user's
676        *  responsibility.
677        */
678       ~vector() _GLIBCXX_NOEXCEPT
679       {
680 	std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
681 		      _M_get_Tp_allocator());
682 	_GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC;
683       }
684 
685       /**
686        *  @brief  %Vector assignment operator.
687        *  @param  __x  A %vector of identical element and allocator types.
688        *
689        *  All the elements of @a __x are copied, but any unused capacity in
690        *  @a __x will not be copied.
691        *
692        *  Whether the allocator is copied depends on the allocator traits.
693        */
694       vector&
695       operator=(const vector& __x);
696 
697 #if __cplusplus >= 201103L
698       /**
699        *  @brief  %Vector move assignment operator.
700        *  @param  __x  A %vector of identical element and allocator types.
701        *
702        *  The contents of @a __x are moved into this %vector (without copying,
703        *  if the allocators permit it).
704        *  Afterwards @a __x is a valid, but unspecified %vector.
705        *
706        *  Whether the allocator is moved depends on the allocator traits.
707        */
708       vector&
709       operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
710       {
711 	constexpr bool __move_storage =
712 	  _Alloc_traits::_S_propagate_on_move_assign()
713 	  || _Alloc_traits::_S_always_equal();
714 	_M_move_assign(std::move(__x), __bool_constant<__move_storage>());
715 	return *this;
716       }
717 
718       /**
719        *  @brief  %Vector list assignment operator.
720        *  @param  __l  An initializer_list.
721        *
722        *  This function fills a %vector with copies of the elements in the
723        *  initializer list @a __l.
724        *
725        *  Note that the assignment completely changes the %vector and
726        *  that the resulting %vector's size is the same as the number
727        *  of elements assigned.
728        */
729       vector&
730       operator=(initializer_list<value_type> __l)
731       {
732 	this->_M_assign_aux(__l.begin(), __l.end(),
733 			    random_access_iterator_tag());
734 	return *this;
735       }
736 #endif
737 
738       /**
739        *  @brief  Assigns a given value to a %vector.
740        *  @param  __n  Number of elements to be assigned.
741        *  @param  __val  Value to be assigned.
742        *
743        *  This function fills a %vector with @a __n copies of the given
744        *  value.  Note that the assignment completely changes the
745        *  %vector and that the resulting %vector's size is the same as
746        *  the number of elements assigned.
747        */
748       void
749       assign(size_type __n, const value_type& __val)
750       { _M_fill_assign(__n, __val); }
751 
752       /**
753        *  @brief  Assigns a range to a %vector.
754        *  @param  __first  An input iterator.
755        *  @param  __last   An input iterator.
756        *
757        *  This function fills a %vector with copies of the elements in the
758        *  range [__first,__last).
759        *
760        *  Note that the assignment completely changes the %vector and
761        *  that the resulting %vector's size is the same as the number
762        *  of elements assigned.
763        */
764 #if __cplusplus >= 201103L
765       template<typename _InputIterator,
766 	       typename = std::_RequireInputIter<_InputIterator>>
767 	void
768 	assign(_InputIterator __first, _InputIterator __last)
769 	{ _M_assign_dispatch(__first, __last, __false_type()); }
770 #else
771       template<typename _InputIterator>
772 	void
773 	assign(_InputIterator __first, _InputIterator __last)
774 	{
775 	  // Check whether it's an integral type.  If so, it's not an iterator.
776 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
777 	  _M_assign_dispatch(__first, __last, _Integral());
778 	}
779 #endif
780 
781 #if __cplusplus >= 201103L
782       /**
783        *  @brief  Assigns an initializer list to a %vector.
784        *  @param  __l  An initializer_list.
785        *
786        *  This function fills a %vector with copies of the elements in the
787        *  initializer list @a __l.
788        *
789        *  Note that the assignment completely changes the %vector and
790        *  that the resulting %vector's size is the same as the number
791        *  of elements assigned.
792        */
793       void
794       assign(initializer_list<value_type> __l)
795       {
796 	this->_M_assign_aux(__l.begin(), __l.end(),
797 			    random_access_iterator_tag());
798       }
799 #endif
800 
801       /// Get a copy of the memory allocation object.
802       using _Base::get_allocator;
803 
804       // iterators
805       /**
806        *  Returns a read/write iterator that points to the first
807        *  element in the %vector.  Iteration is done in ordinary
808        *  element order.
809        */
810       iterator
811       begin() _GLIBCXX_NOEXCEPT
812       { return iterator(this->_M_impl._M_start); }
813 
814       /**
815        *  Returns a read-only (constant) iterator that points to the
816        *  first element in the %vector.  Iteration is done in ordinary
817        *  element order.
818        */
819       const_iterator
820       begin() const _GLIBCXX_NOEXCEPT
821       { return const_iterator(this->_M_impl._M_start); }
822 
823       /**
824        *  Returns a read/write iterator that points one past the last
825        *  element in the %vector.  Iteration is done in ordinary
826        *  element order.
827        */
828       iterator
829       end() _GLIBCXX_NOEXCEPT
830       { return iterator(this->_M_impl._M_finish); }
831 
832       /**
833        *  Returns a read-only (constant) iterator that points one past
834        *  the last element in the %vector.  Iteration is done in
835        *  ordinary element order.
836        */
837       const_iterator
838       end() const _GLIBCXX_NOEXCEPT
839       { return const_iterator(this->_M_impl._M_finish); }
840 
841       /**
842        *  Returns a read/write reverse iterator that points to the
843        *  last element in the %vector.  Iteration is done in reverse
844        *  element order.
845        */
846       reverse_iterator
847       rbegin() _GLIBCXX_NOEXCEPT
848       { return reverse_iterator(end()); }
849 
850       /**
851        *  Returns a read-only (constant) reverse iterator that points
852        *  to the last element in the %vector.  Iteration is done in
853        *  reverse element order.
854        */
855       const_reverse_iterator
856       rbegin() const _GLIBCXX_NOEXCEPT
857       { return const_reverse_iterator(end()); }
858 
859       /**
860        *  Returns a read/write reverse iterator that points to one
861        *  before the first element in the %vector.  Iteration is done
862        *  in reverse element order.
863        */
864       reverse_iterator
865       rend() _GLIBCXX_NOEXCEPT
866       { return reverse_iterator(begin()); }
867 
868       /**
869        *  Returns a read-only (constant) reverse iterator that points
870        *  to one before the first element in the %vector.  Iteration
871        *  is done in reverse element order.
872        */
873       const_reverse_iterator
874       rend() const _GLIBCXX_NOEXCEPT
875       { return const_reverse_iterator(begin()); }
876 
877 #if __cplusplus >= 201103L
878       /**
879        *  Returns a read-only (constant) iterator that points to the
880        *  first element in the %vector.  Iteration is done in ordinary
881        *  element order.
882        */
883       const_iterator
884       cbegin() const noexcept
885       { return const_iterator(this->_M_impl._M_start); }
886 
887       /**
888        *  Returns a read-only (constant) iterator that points one past
889        *  the last element in the %vector.  Iteration is done in
890        *  ordinary element order.
891        */
892       const_iterator
893       cend() const noexcept
894       { return const_iterator(this->_M_impl._M_finish); }
895 
896       /**
897        *  Returns a read-only (constant) reverse iterator that points
898        *  to the last element in the %vector.  Iteration is done in
899        *  reverse element order.
900        */
901       const_reverse_iterator
902       crbegin() const noexcept
903       { return const_reverse_iterator(end()); }
904 
905       /**
906        *  Returns a read-only (constant) reverse iterator that points
907        *  to one before the first element in the %vector.  Iteration
908        *  is done in reverse element order.
909        */
910       const_reverse_iterator
911       crend() const noexcept
912       { return const_reverse_iterator(begin()); }
913 #endif
914 
915       // [23.2.4.2] capacity
916       /**  Returns the number of elements in the %vector.  */
917       size_type
918       size() const _GLIBCXX_NOEXCEPT
919       { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
920 
921       /**  Returns the size() of the largest possible %vector.  */
922       size_type
923       max_size() const _GLIBCXX_NOEXCEPT
924       { return _S_max_size(_M_get_Tp_allocator()); }
925 
926 #if __cplusplus >= 201103L
927       /**
928        *  @brief  Resizes the %vector to the specified number of elements.
929        *  @param  __new_size  Number of elements the %vector should contain.
930        *
931        *  This function will %resize the %vector to the specified
932        *  number of elements.  If the number is smaller than the
933        *  %vector's current size the %vector is truncated, otherwise
934        *  default constructed elements are appended.
935        */
936       void
937       resize(size_type __new_size)
938       {
939 	if (__new_size > size())
940 	  _M_default_append(__new_size - size());
941 	else if (__new_size < size())
942 	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
943       }
944 
945       /**
946        *  @brief  Resizes the %vector to the specified number of elements.
947        *  @param  __new_size  Number of elements the %vector should contain.
948        *  @param  __x  Data with which new elements should be populated.
949        *
950        *  This function will %resize the %vector to the specified
951        *  number of elements.  If the number is smaller than the
952        *  %vector's current size the %vector is truncated, otherwise
953        *  the %vector is extended and new elements are populated with
954        *  given data.
955        */
956       void
957       resize(size_type __new_size, const value_type& __x)
958       {
959 	if (__new_size > size())
960 	  _M_fill_insert(end(), __new_size - size(), __x);
961 	else if (__new_size < size())
962 	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
963       }
964 #else
965       /**
966        *  @brief  Resizes the %vector to the specified number of elements.
967        *  @param  __new_size  Number of elements the %vector should contain.
968        *  @param  __x  Data with which new elements should be populated.
969        *
970        *  This function will %resize the %vector to the specified
971        *  number of elements.  If the number is smaller than the
972        *  %vector's current size the %vector is truncated, otherwise
973        *  the %vector is extended and new elements are populated with
974        *  given data.
975        */
976       void
977       resize(size_type __new_size, value_type __x = value_type())
978       {
979 	if (__new_size > size())
980 	  _M_fill_insert(end(), __new_size - size(), __x);
981 	else if (__new_size < size())
982 	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
983       }
984 #endif
985 
986 #if __cplusplus >= 201103L
987       /**  A non-binding request to reduce capacity() to size().  */
988       void
989       shrink_to_fit()
990       { _M_shrink_to_fit(); }
991 #endif
992 
993       /**
994        *  Returns the total number of elements that the %vector can
995        *  hold before needing to allocate more memory.
996        */
997       size_type
998       capacity() const _GLIBCXX_NOEXCEPT
999       { return size_type(this->_M_impl._M_end_of_storage
1000 			 - this->_M_impl._M_start); }
1001 
1002       /**
1003        *  Returns true if the %vector is empty.  (Thus begin() would
1004        *  equal end().)
1005        */
1006       _GLIBCXX_NODISCARD bool
1007       empty() const _GLIBCXX_NOEXCEPT
1008       { return begin() == end(); }
1009 
1010       /**
1011        *  @brief  Attempt to preallocate enough memory for specified number of
1012        *          elements.
1013        *  @param  __n  Number of elements required.
1014        *  @throw  std::length_error  If @a n exceeds @c max_size().
1015        *
1016        *  This function attempts to reserve enough memory for the
1017        *  %vector to hold the specified number of elements.  If the
1018        *  number requested is more than max_size(), length_error is
1019        *  thrown.
1020        *
1021        *  The advantage of this function is that if optimal code is a
1022        *  necessity and the user can determine the number of elements
1023        *  that will be required, the user can reserve the memory in
1024        *  %advance, and thus prevent a possible reallocation of memory
1025        *  and copying of %vector data.
1026        */
1027       void
1028       reserve(size_type __n);
1029 
1030       // element access
1031       /**
1032        *  @brief  Subscript access to the data contained in the %vector.
1033        *  @param __n The index of the element for which data should be
1034        *  accessed.
1035        *  @return  Read/write reference to data.
1036        *
1037        *  This operator allows for easy, array-style, data access.
1038        *  Note that data access with this operator is unchecked and
1039        *  out_of_range lookups are not defined. (For checked lookups
1040        *  see at().)
1041        */
1042       reference
1043       operator[](size_type __n) _GLIBCXX_NOEXCEPT
1044       {
1045 	__glibcxx_requires_subscript(__n);
1046 	return *(this->_M_impl._M_start + __n);
1047       }
1048 
1049       /**
1050        *  @brief  Subscript access to the data contained in the %vector.
1051        *  @param __n The index of the element for which data should be
1052        *  accessed.
1053        *  @return  Read-only (constant) reference to data.
1054        *
1055        *  This operator allows for easy, array-style, data access.
1056        *  Note that data access with this operator is unchecked and
1057        *  out_of_range lookups are not defined. (For checked lookups
1058        *  see at().)
1059        */
1060       const_reference
1061       operator[](size_type __n) const _GLIBCXX_NOEXCEPT
1062       {
1063 	__glibcxx_requires_subscript(__n);
1064 	return *(this->_M_impl._M_start + __n);
1065       }
1066 
1067     protected:
1068       /// Safety check used only from at().
1069       void
1070       _M_range_check(size_type __n) const
1071       {
1072 	if (__n >= this->size())
1073 	  __throw_out_of_range_fmt(__N("vector::_M_range_check: __n "
1074 				       "(which is %zu) >= this->size() "
1075 				       "(which is %zu)"),
1076 				   __n, this->size());
1077       }
1078 
1079     public:
1080       /**
1081        *  @brief  Provides access to the data contained in the %vector.
1082        *  @param __n The index of the element for which data should be
1083        *  accessed.
1084        *  @return  Read/write reference to data.
1085        *  @throw  std::out_of_range  If @a __n is an invalid index.
1086        *
1087        *  This function provides for safer data access.  The parameter
1088        *  is first checked that it is in the range of the vector.  The
1089        *  function throws out_of_range if the check fails.
1090        */
1091       reference
1092       at(size_type __n)
1093       {
1094 	_M_range_check(__n);
1095 	return (*this)[__n];
1096       }
1097 
1098       /**
1099        *  @brief  Provides access to the data contained in the %vector.
1100        *  @param __n The index of the element for which data should be
1101        *  accessed.
1102        *  @return  Read-only (constant) reference to data.
1103        *  @throw  std::out_of_range  If @a __n is an invalid index.
1104        *
1105        *  This function provides for safer data access.  The parameter
1106        *  is first checked that it is in the range of the vector.  The
1107        *  function throws out_of_range if the check fails.
1108        */
1109       const_reference
1110       at(size_type __n) const
1111       {
1112 	_M_range_check(__n);
1113 	return (*this)[__n];
1114       }
1115 
1116       /**
1117        *  Returns a read/write reference to the data at the first
1118        *  element of the %vector.
1119        */
1120       reference
1121       front() _GLIBCXX_NOEXCEPT
1122       {
1123 	__glibcxx_requires_nonempty();
1124 	return *begin();
1125       }
1126 
1127       /**
1128        *  Returns a read-only (constant) reference to the data at the first
1129        *  element of the %vector.
1130        */
1131       const_reference
1132       front() const _GLIBCXX_NOEXCEPT
1133       {
1134 	__glibcxx_requires_nonempty();
1135 	return *begin();
1136       }
1137 
1138       /**
1139        *  Returns a read/write reference to the data at the last
1140        *  element of the %vector.
1141        */
1142       reference
1143       back() _GLIBCXX_NOEXCEPT
1144       {
1145 	__glibcxx_requires_nonempty();
1146 	return *(end() - 1);
1147       }
1148 
1149       /**
1150        *  Returns a read-only (constant) reference to the data at the
1151        *  last element of the %vector.
1152        */
1153       const_reference
1154       back() const _GLIBCXX_NOEXCEPT
1155       {
1156 	__glibcxx_requires_nonempty();
1157 	return *(end() - 1);
1158       }
1159 
1160       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1161       // DR 464. Suggestion for new member functions in standard containers.
1162       // data access
1163       /**
1164        *   Returns a pointer such that [data(), data() + size()) is a valid
1165        *   range.  For a non-empty %vector, data() == &front().
1166        */
1167       _Tp*
1168       data() _GLIBCXX_NOEXCEPT
1169       { return _M_data_ptr(this->_M_impl._M_start); }
1170 
1171       const _Tp*
1172       data() const _GLIBCXX_NOEXCEPT
1173       { return _M_data_ptr(this->_M_impl._M_start); }
1174 
1175       // [23.2.4.3] modifiers
1176       /**
1177        *  @brief  Add data to the end of the %vector.
1178        *  @param  __x  Data to be added.
1179        *
1180        *  This is a typical stack operation.  The function creates an
1181        *  element at the end of the %vector and assigns the given data
1182        *  to it.  Due to the nature of a %vector this operation can be
1183        *  done in constant time if the %vector has preallocated space
1184        *  available.
1185        */
1186       void
1187       push_back(const value_type& __x)
1188       {
1189 	if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
1190 	  {
1191 	    _GLIBCXX_ASAN_ANNOTATE_GROW(1);
1192 	    _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
1193 				     __x);
1194 	    ++this->_M_impl._M_finish;
1195 	    _GLIBCXX_ASAN_ANNOTATE_GREW(1);
1196 	  }
1197 	else
1198 	  _M_realloc_insert(end(), __x);
1199       }
1200 
1201 #if __cplusplus >= 201103L
1202       void
1203       push_back(value_type&& __x)
1204       { emplace_back(std::move(__x)); }
1205 
1206       template<typename... _Args>
1207 #if __cplusplus > 201402L
1208 	reference
1209 #else
1210 	void
1211 #endif
1212 	emplace_back(_Args&&... __args);
1213 #endif
1214 
1215       /**
1216        *  @brief  Removes last element.
1217        *
1218        *  This is a typical stack operation. It shrinks the %vector by one.
1219        *
1220        *  Note that no data is returned, and if the last element's
1221        *  data is needed, it should be retrieved before pop_back() is
1222        *  called.
1223        */
1224       void
1225       pop_back() _GLIBCXX_NOEXCEPT
1226       {
1227 	__glibcxx_requires_nonempty();
1228 	--this->_M_impl._M_finish;
1229 	_Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
1230 	_GLIBCXX_ASAN_ANNOTATE_SHRINK(1);
1231       }
1232 
1233 #if __cplusplus >= 201103L
1234       /**
1235        *  @brief  Inserts an object in %vector before specified iterator.
1236        *  @param  __position  A const_iterator into the %vector.
1237        *  @param  __args  Arguments.
1238        *  @return  An iterator that points to the inserted data.
1239        *
1240        *  This function will insert an object of type T constructed
1241        *  with T(std::forward<Args>(args)...) before the specified location.
1242        *  Note that this kind of operation could be expensive for a %vector
1243        *  and if it is frequently used the user should consider using
1244        *  std::list.
1245        */
1246       template<typename... _Args>
1247 	iterator
1248 	emplace(const_iterator __position, _Args&&... __args)
1249 	{ return _M_emplace_aux(__position, std::forward<_Args>(__args)...); }
1250 
1251       /**
1252        *  @brief  Inserts given value into %vector before specified iterator.
1253        *  @param  __position  A const_iterator into the %vector.
1254        *  @param  __x  Data to be inserted.
1255        *  @return  An iterator that points to the inserted data.
1256        *
1257        *  This function will insert a copy of the given value before
1258        *  the specified location.  Note that this kind of operation
1259        *  could be expensive for a %vector and if it is frequently
1260        *  used the user should consider using std::list.
1261        */
1262       iterator
1263       insert(const_iterator __position, const value_type& __x);
1264 #else
1265       /**
1266        *  @brief  Inserts given value into %vector before specified iterator.
1267        *  @param  __position  An iterator into the %vector.
1268        *  @param  __x  Data to be inserted.
1269        *  @return  An iterator that points to the inserted data.
1270        *
1271        *  This function will insert a copy of the given value before
1272        *  the specified location.  Note that this kind of operation
1273        *  could be expensive for a %vector and if it is frequently
1274        *  used the user should consider using std::list.
1275        */
1276       iterator
1277       insert(iterator __position, const value_type& __x);
1278 #endif
1279 
1280 #if __cplusplus >= 201103L
1281       /**
1282        *  @brief  Inserts given rvalue into %vector before specified iterator.
1283        *  @param  __position  A const_iterator into the %vector.
1284        *  @param  __x  Data to be inserted.
1285        *  @return  An iterator that points to the inserted data.
1286        *
1287        *  This function will insert a copy of the given rvalue before
1288        *  the specified location.  Note that this kind of operation
1289        *  could be expensive for a %vector and if it is frequently
1290        *  used the user should consider using std::list.
1291        */
1292       iterator
1293       insert(const_iterator __position, value_type&& __x)
1294       { return _M_insert_rval(__position, std::move(__x)); }
1295 
1296       /**
1297        *  @brief  Inserts an initializer_list into the %vector.
1298        *  @param  __position  An iterator into the %vector.
1299        *  @param  __l  An initializer_list.
1300        *
1301        *  This function will insert copies of the data in the
1302        *  initializer_list @a l into the %vector before the location
1303        *  specified by @a position.
1304        *
1305        *  Note that this kind of operation could be expensive for a
1306        *  %vector and if it is frequently used the user should
1307        *  consider using std::list.
1308        */
1309       iterator
1310       insert(const_iterator __position, initializer_list<value_type> __l)
1311       {
1312 	auto __offset = __position - cbegin();
1313 	_M_range_insert(begin() + __offset, __l.begin(), __l.end(),
1314 			std::random_access_iterator_tag());
1315 	return begin() + __offset;
1316       }
1317 #endif
1318 
1319 #if __cplusplus >= 201103L
1320       /**
1321        *  @brief  Inserts a number of copies of given data into the %vector.
1322        *  @param  __position  A const_iterator into the %vector.
1323        *  @param  __n  Number of elements to be inserted.
1324        *  @param  __x  Data to be inserted.
1325        *  @return  An iterator that points to the inserted data.
1326        *
1327        *  This function will insert a specified number of copies of
1328        *  the given data before the location specified by @a position.
1329        *
1330        *  Note that this kind of operation could be expensive for a
1331        *  %vector and if it is frequently used the user should
1332        *  consider using std::list.
1333        */
1334       iterator
1335       insert(const_iterator __position, size_type __n, const value_type& __x)
1336       {
1337 	difference_type __offset = __position - cbegin();
1338 	_M_fill_insert(begin() + __offset, __n, __x);
1339 	return begin() + __offset;
1340       }
1341 #else
1342       /**
1343        *  @brief  Inserts a number of copies of given data into the %vector.
1344        *  @param  __position  An iterator into the %vector.
1345        *  @param  __n  Number of elements to be inserted.
1346        *  @param  __x  Data to be inserted.
1347        *
1348        *  This function will insert a specified number of copies of
1349        *  the given data before the location specified by @a position.
1350        *
1351        *  Note that this kind of operation could be expensive for a
1352        *  %vector and if it is frequently used the user should
1353        *  consider using std::list.
1354        */
1355       void
1356       insert(iterator __position, size_type __n, const value_type& __x)
1357       { _M_fill_insert(__position, __n, __x); }
1358 #endif
1359 
1360 #if __cplusplus >= 201103L
1361       /**
1362        *  @brief  Inserts a range into the %vector.
1363        *  @param  __position  A const_iterator into the %vector.
1364        *  @param  __first  An input iterator.
1365        *  @param  __last   An input iterator.
1366        *  @return  An iterator that points to the inserted data.
1367        *
1368        *  This function will insert copies of the data in the range
1369        *  [__first,__last) into the %vector before the location specified
1370        *  by @a pos.
1371        *
1372        *  Note that this kind of operation could be expensive for a
1373        *  %vector and if it is frequently used the user should
1374        *  consider using std::list.
1375        */
1376       template<typename _InputIterator,
1377 	       typename = std::_RequireInputIter<_InputIterator>>
1378 	iterator
1379 	insert(const_iterator __position, _InputIterator __first,
1380 	       _InputIterator __last)
1381 	{
1382 	  difference_type __offset = __position - cbegin();
1383 	  _M_insert_dispatch(begin() + __offset,
1384 			     __first, __last, __false_type());
1385 	  return begin() + __offset;
1386 	}
1387 #else
1388       /**
1389        *  @brief  Inserts a range into the %vector.
1390        *  @param  __position  An iterator into the %vector.
1391        *  @param  __first  An input iterator.
1392        *  @param  __last   An input iterator.
1393        *
1394        *  This function will insert copies of the data in the range
1395        *  [__first,__last) into the %vector before the location specified
1396        *  by @a pos.
1397        *
1398        *  Note that this kind of operation could be expensive for a
1399        *  %vector and if it is frequently used the user should
1400        *  consider using std::list.
1401        */
1402       template<typename _InputIterator>
1403 	void
1404 	insert(iterator __position, _InputIterator __first,
1405 	       _InputIterator __last)
1406 	{
1407 	  // Check whether it's an integral type.  If so, it's not an iterator.
1408 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1409 	  _M_insert_dispatch(__position, __first, __last, _Integral());
1410 	}
1411 #endif
1412 
1413       /**
1414        *  @brief  Remove element at given position.
1415        *  @param  __position  Iterator pointing to element to be erased.
1416        *  @return  An iterator pointing to the next element (or end()).
1417        *
1418        *  This function will erase the element at the given position and thus
1419        *  shorten the %vector by one.
1420        *
1421        *  Note This operation could be expensive and if it is
1422        *  frequently used the user should consider using std::list.
1423        *  The user is also cautioned that this function only erases
1424        *  the element, and that if the element is itself a pointer,
1425        *  the pointed-to memory is not touched in any way.  Managing
1426        *  the pointer is the user's responsibility.
1427        */
1428       iterator
1429 #if __cplusplus >= 201103L
1430       erase(const_iterator __position)
1431       { return _M_erase(begin() + (__position - cbegin())); }
1432 #else
1433       erase(iterator __position)
1434       { return _M_erase(__position); }
1435 #endif
1436 
1437       /**
1438        *  @brief  Remove a range of elements.
1439        *  @param  __first  Iterator pointing to the first element to be erased.
1440        *  @param  __last  Iterator pointing to one past the last element to be
1441        *                  erased.
1442        *  @return  An iterator pointing to the element pointed to by @a __last
1443        *           prior to erasing (or end()).
1444        *
1445        *  This function will erase the elements in the range
1446        *  [__first,__last) and shorten the %vector accordingly.
1447        *
1448        *  Note This operation could be expensive and if it is
1449        *  frequently used the user should consider using std::list.
1450        *  The user is also cautioned that this function only erases
1451        *  the elements, and that if the elements themselves are
1452        *  pointers, the pointed-to memory is not touched in any way.
1453        *  Managing the pointer is the user's responsibility.
1454        */
1455       iterator
1456 #if __cplusplus >= 201103L
1457       erase(const_iterator __first, const_iterator __last)
1458       {
1459 	const auto __beg = begin();
1460 	const auto __cbeg = cbegin();
1461 	return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
1462       }
1463 #else
1464       erase(iterator __first, iterator __last)
1465       { return _M_erase(__first, __last); }
1466 #endif
1467 
1468       /**
1469        *  @brief  Swaps data with another %vector.
1470        *  @param  __x  A %vector of the same element and allocator types.
1471        *
1472        *  This exchanges the elements between two vectors in constant time.
1473        *  (Three pointers, so it should be quite fast.)
1474        *  Note that the global std::swap() function is specialized such that
1475        *  std::swap(v1,v2) will feed to this function.
1476        *
1477        *  Whether the allocators are swapped depends on the allocator traits.
1478        */
1479       void
1480       swap(vector& __x) _GLIBCXX_NOEXCEPT
1481       {
1482 #if __cplusplus >= 201103L
1483 	__glibcxx_assert(_Alloc_traits::propagate_on_container_swap::value
1484 			 || _M_get_Tp_allocator() == __x._M_get_Tp_allocator());
1485 #endif
1486 	this->_M_impl._M_swap_data(__x._M_impl);
1487 	_Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
1488 				  __x._M_get_Tp_allocator());
1489       }
1490 
1491       /**
1492        *  Erases all the elements.  Note that this function only erases the
1493        *  elements, and that if the elements themselves are pointers, the
1494        *  pointed-to memory is not touched in any way.  Managing the pointer is
1495        *  the user's responsibility.
1496        */
1497       void
1498       clear() _GLIBCXX_NOEXCEPT
1499       { _M_erase_at_end(this->_M_impl._M_start); }
1500 
1501     protected:
1502       /**
1503        *  Memory expansion handler.  Uses the member allocation function to
1504        *  obtain @a n bytes of memory, and then copies [first,last) into it.
1505        */
1506       template<typename _ForwardIterator>
1507 	pointer
1508 	_M_allocate_and_copy(size_type __n,
1509 			     _ForwardIterator __first, _ForwardIterator __last)
1510 	{
1511 	  pointer __result = this->_M_allocate(__n);
1512 	  __try
1513 	    {
1514 	      std::__uninitialized_copy_a(__first, __last, __result,
1515 					  _M_get_Tp_allocator());
1516 	      return __result;
1517 	    }
1518 	  __catch(...)
1519 	    {
1520 	      _M_deallocate(__result, __n);
1521 	      __throw_exception_again;
1522 	    }
1523 	}
1524 
1525 
1526       // Internal constructor functions follow.
1527 
1528       // Called by the range constructor to implement [23.1.1]/9
1529 
1530 #if __cplusplus < 201103L
1531       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1532       // 438. Ambiguity in the "do the right thing" clause
1533       template<typename _Integer>
1534 	void
1535 	_M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
1536 	{
1537 	  this->_M_impl._M_start = _M_allocate(_S_check_init_len(
1538 		static_cast<size_type>(__n), _M_get_Tp_allocator()));
1539 	  this->_M_impl._M_end_of_storage =
1540 	    this->_M_impl._M_start + static_cast<size_type>(__n);
1541 	  _M_fill_initialize(static_cast<size_type>(__n), __value);
1542 	}
1543 
1544       // Called by the range constructor to implement [23.1.1]/9
1545       template<typename _InputIterator>
1546 	void
1547 	_M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1548 			       __false_type)
1549 	{
1550 	  _M_range_initialize(__first, __last,
1551 			      std::__iterator_category(__first));
1552 	}
1553 #endif
1554 
1555       // Called by the second initialize_dispatch above
1556       template<typename _InputIterator>
1557 	void
1558 	_M_range_initialize(_InputIterator __first, _InputIterator __last,
1559 			    std::input_iterator_tag)
1560 	{
1561 	  __try {
1562 	    for (; __first != __last; ++__first)
1563 #if __cplusplus >= 201103L
1564 	      emplace_back(*__first);
1565 #else
1566 	      push_back(*__first);
1567 #endif
1568 	  } __catch(...) {
1569 	    clear();
1570 	    __throw_exception_again;
1571 	  }
1572 	}
1573 
1574       // Called by the second initialize_dispatch above
1575       template<typename _ForwardIterator>
1576 	void
1577 	_M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
1578 			    std::forward_iterator_tag)
1579 	{
1580 	  const size_type __n = std::distance(__first, __last);
1581 	  this->_M_impl._M_start
1582 	    = this->_M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
1583 	  this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
1584 	  this->_M_impl._M_finish =
1585 	    std::__uninitialized_copy_a(__first, __last,
1586 					this->_M_impl._M_start,
1587 					_M_get_Tp_allocator());
1588 	}
1589 
1590       // Called by the first initialize_dispatch above and by the
1591       // vector(n,value,a) constructor.
1592       void
1593       _M_fill_initialize(size_type __n, const value_type& __value)
1594       {
1595 	this->_M_impl._M_finish =
1596 	  std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
1597 					_M_get_Tp_allocator());
1598       }
1599 
1600 #if __cplusplus >= 201103L
1601       // Called by the vector(n) constructor.
1602       void
1603       _M_default_initialize(size_type __n)
1604       {
1605 	this->_M_impl._M_finish =
1606 	  std::__uninitialized_default_n_a(this->_M_impl._M_start, __n,
1607 					   _M_get_Tp_allocator());
1608       }
1609 #endif
1610 
1611       // Internal assign functions follow.  The *_aux functions do the actual
1612       // assignment work for the range versions.
1613 
1614       // Called by the range assign to implement [23.1.1]/9
1615 
1616       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1617       // 438. Ambiguity in the "do the right thing" clause
1618       template<typename _Integer>
1619 	void
1620 	_M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1621 	{ _M_fill_assign(__n, __val); }
1622 
1623       // Called by the range assign to implement [23.1.1]/9
1624       template<typename _InputIterator>
1625 	void
1626 	_M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1627 			   __false_type)
1628 	{ _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
1629 
1630       // Called by the second assign_dispatch above
1631       template<typename _InputIterator>
1632 	void
1633 	_M_assign_aux(_InputIterator __first, _InputIterator __last,
1634 		      std::input_iterator_tag);
1635 
1636       // Called by the second assign_dispatch above
1637       template<typename _ForwardIterator>
1638 	void
1639 	_M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1640 		      std::forward_iterator_tag);
1641 
1642       // Called by assign(n,t), and the range assign when it turns out
1643       // to be the same thing.
1644       void
1645       _M_fill_assign(size_type __n, const value_type& __val);
1646 
1647       // Internal insert functions follow.
1648 
1649       // Called by the range insert to implement [23.1.1]/9
1650 
1651       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1652       // 438. Ambiguity in the "do the right thing" clause
1653       template<typename _Integer>
1654 	void
1655 	_M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
1656 			   __true_type)
1657 	{ _M_fill_insert(__pos, __n, __val); }
1658 
1659       // Called by the range insert to implement [23.1.1]/9
1660       template<typename _InputIterator>
1661 	void
1662 	_M_insert_dispatch(iterator __pos, _InputIterator __first,
1663 			   _InputIterator __last, __false_type)
1664 	{
1665 	  _M_range_insert(__pos, __first, __last,
1666 			  std::__iterator_category(__first));
1667 	}
1668 
1669       // Called by the second insert_dispatch above
1670       template<typename _InputIterator>
1671 	void
1672 	_M_range_insert(iterator __pos, _InputIterator __first,
1673 			_InputIterator __last, std::input_iterator_tag);
1674 
1675       // Called by the second insert_dispatch above
1676       template<typename _ForwardIterator>
1677 	void
1678 	_M_range_insert(iterator __pos, _ForwardIterator __first,
1679 			_ForwardIterator __last, std::forward_iterator_tag);
1680 
1681       // Called by insert(p,n,x), and the range insert when it turns out to be
1682       // the same thing.
1683       void
1684       _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
1685 
1686 #if __cplusplus >= 201103L
1687       // Called by resize(n).
1688       void
1689       _M_default_append(size_type __n);
1690 
1691       bool
1692       _M_shrink_to_fit();
1693 #endif
1694 
1695 #if __cplusplus < 201103L
1696       // Called by insert(p,x)
1697       void
1698       _M_insert_aux(iterator __position, const value_type& __x);
1699 
1700       void
1701       _M_realloc_insert(iterator __position, const value_type& __x);
1702 #else
1703       // A value_type object constructed with _Alloc_traits::construct()
1704       // and destroyed with _Alloc_traits::destroy().
1705       struct _Temporary_value
1706       {
1707 	template<typename... _Args>
1708 	  explicit
1709 	  _Temporary_value(vector* __vec, _Args&&... __args) : _M_this(__vec)
1710 	  {
1711 	    _Alloc_traits::construct(_M_this->_M_impl, _M_ptr(),
1712 				     std::forward<_Args>(__args)...);
1713 	  }
1714 
1715 	~_Temporary_value()
1716 	{ _Alloc_traits::destroy(_M_this->_M_impl, _M_ptr()); }
1717 
1718 	value_type&
1719 	_M_val() { return *_M_ptr(); }
1720 
1721       private:
1722 	_Tp*
1723 	_M_ptr() { return reinterpret_cast<_Tp*>(&__buf); }
1724 
1725 	vector* _M_this;
1726 	typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __buf;
1727       };
1728 
1729       // Called by insert(p,x) and other functions when insertion needs to
1730       // reallocate or move existing elements. _Arg is either _Tp& or _Tp.
1731       template<typename _Arg>
1732 	void
1733 	_M_insert_aux(iterator __position, _Arg&& __arg);
1734 
1735       template<typename... _Args>
1736 	void
1737 	_M_realloc_insert(iterator __position, _Args&&... __args);
1738 
1739       // Either move-construct at the end, or forward to _M_insert_aux.
1740       iterator
1741       _M_insert_rval(const_iterator __position, value_type&& __v);
1742 
1743       // Try to emplace at the end, otherwise forward to _M_insert_aux.
1744       template<typename... _Args>
1745 	iterator
1746 	_M_emplace_aux(const_iterator __position, _Args&&... __args);
1747 
1748       // Emplacing an rvalue of the correct type can use _M_insert_rval.
1749       iterator
1750       _M_emplace_aux(const_iterator __position, value_type&& __v)
1751       { return _M_insert_rval(__position, std::move(__v)); }
1752 #endif
1753 
1754       // Called by _M_fill_insert, _M_insert_aux etc.
1755       size_type
1756       _M_check_len(size_type __n, const char* __s) const
1757       {
1758 	if (max_size() - size() < __n)
1759 	  __throw_length_error(__N(__s));
1760 
1761 	const size_type __len = size() + (std::max)(size(), __n);
1762 	return (__len < size() || __len > max_size()) ? max_size() : __len;
1763       }
1764 
1765       // Called by constructors to check initial size.
1766       static size_type
1767       _S_check_init_len(size_type __n, const allocator_type& __a)
1768       {
1769 	if (__n > _S_max_size(_Tp_alloc_type(__a)))
1770 	  __throw_length_error(
1771 	      __N("cannot create std::vector larger than max_size()"));
1772 	return __n;
1773       }
1774 
1775       static size_type
1776       _S_max_size(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
1777       {
1778 	// std::distance(begin(), end()) cannot be greater than PTRDIFF_MAX,
1779 	// and realistically we can't store more than PTRDIFF_MAX/sizeof(T)
1780 	// (even if std::allocator_traits::max_size says we can).
1781 	const size_t __diffmax
1782 	  = __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
1783 	const size_t __allocmax = _Alloc_traits::max_size(__a);
1784 	return (std::min)(__diffmax, __allocmax);
1785       }
1786 
1787       // Internal erase functions follow.
1788 
1789       // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
1790       // _M_assign_aux.
1791       void
1792       _M_erase_at_end(pointer __pos) _GLIBCXX_NOEXCEPT
1793       {
1794 	if (size_type __n = this->_M_impl._M_finish - __pos)
1795 	  {
1796 	    std::_Destroy(__pos, this->_M_impl._M_finish,
1797 			  _M_get_Tp_allocator());
1798 	    this->_M_impl._M_finish = __pos;
1799 	    _GLIBCXX_ASAN_ANNOTATE_SHRINK(__n);
1800 	  }
1801       }
1802 
1803       iterator
1804       _M_erase(iterator __position);
1805 
1806       iterator
1807       _M_erase(iterator __first, iterator __last);
1808 
1809 #if __cplusplus >= 201103L
1810     private:
1811       // Constant-time move assignment when source object's memory can be
1812       // moved, either because the source's allocator will move too
1813       // or because the allocators are equal.
1814       void
1815       _M_move_assign(vector&& __x, true_type) noexcept
1816       {
1817 	vector __tmp(get_allocator());
1818 	this->_M_impl._M_swap_data(__x._M_impl);
1819 	__tmp._M_impl._M_swap_data(__x._M_impl);
1820 	std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
1821       }
1822 
1823       // Do move assignment when it might not be possible to move source
1824       // object's memory, resulting in a linear-time operation.
1825       void
1826       _M_move_assign(vector&& __x, false_type)
1827       {
1828 	if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
1829 	  _M_move_assign(std::move(__x), true_type());
1830 	else
1831 	  {
1832 	    // The rvalue's allocator cannot be moved and is not equal,
1833 	    // so we need to individually move each element.
1834 	    this->_M_assign_aux(std::make_move_iterator(__x.begin()),
1835 			        std::make_move_iterator(__x.end()),
1836 				std::random_access_iterator_tag());
1837 	    __x.clear();
1838 	  }
1839       }
1840 #endif
1841 
1842       template<typename _Up>
1843 	_Up*
1844 	_M_data_ptr(_Up* __ptr) const _GLIBCXX_NOEXCEPT
1845 	{ return __ptr; }
1846 
1847 #if __cplusplus >= 201103L
1848       template<typename _Ptr>
1849 	typename std::pointer_traits<_Ptr>::element_type*
1850 	_M_data_ptr(_Ptr __ptr) const
1851 	{ return empty() ? nullptr : std::__to_address(__ptr); }
1852 #else
1853       template<typename _Up>
1854 	_Up*
1855 	_M_data_ptr(_Up* __ptr) _GLIBCXX_NOEXCEPT
1856 	{ return __ptr; }
1857 
1858       template<typename _Ptr>
1859 	value_type*
1860 	_M_data_ptr(_Ptr __ptr)
1861 	{ return empty() ? (value_type*)0 : __ptr.operator->(); }
1862 
1863       template<typename _Ptr>
1864 	const value_type*
1865 	_M_data_ptr(_Ptr __ptr) const
1866 	{ return empty() ? (const value_type*)0 : __ptr.operator->(); }
1867 #endif
1868     };
1869 
1870 #if __cpp_deduction_guides >= 201606
1871   template<typename _InputIterator, typename _ValT
1872 	     = typename iterator_traits<_InputIterator>::value_type,
1873 	   typename _Allocator = allocator<_ValT>,
1874 	   typename = _RequireInputIter<_InputIterator>,
1875 	   typename = _RequireAllocator<_Allocator>>
1876     vector(_InputIterator, _InputIterator, _Allocator = _Allocator())
1877       -> vector<_ValT, _Allocator>;
1878 #endif
1879 
1880   /**
1881    *  @brief  Vector equality comparison.
1882    *  @param  __x  A %vector.
1883    *  @param  __y  A %vector of the same type as @a __x.
1884    *  @return  True iff the size and elements of the vectors are equal.
1885    *
1886    *  This is an equivalence relation.  It is linear in the size of the
1887    *  vectors.  Vectors are considered equivalent if their sizes are equal,
1888    *  and if corresponding elements compare equal.
1889   */
1890   template<typename _Tp, typename _Alloc>
1891     inline bool
1892     operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1893     { return (__x.size() == __y.size()
1894 	      && std::equal(__x.begin(), __x.end(), __y.begin())); }
1895 
1896 #if __cpp_lib_three_way_comparison
1897   /**
1898    *  @brief  Vector ordering relation.
1899    *  @param  __x  A `vector`.
1900    *  @param  __y  A `vector` of the same type as `__x`.
1901    *  @return  A value indicating whether `__x` is less than, equal to,
1902    *           greater than, or incomparable with `__y`.
1903    *
1904    *  See `std::lexicographical_compare_three_way()` for how the determination
1905    *  is made. This operator is used to synthesize relational operators like
1906    *  `<` and `>=` etc.
1907   */
1908   template<typename _Tp, typename _Alloc>
1909     inline __detail::__synth3way_t<_Tp>
1910     operator<=>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1911     {
1912       return std::lexicographical_compare_three_way(__x.begin(), __x.end(),
1913 						    __y.begin(), __y.end(),
1914 						    __detail::__synth3way);
1915     }
1916 #else
1917   /**
1918    *  @brief  Vector ordering relation.
1919    *  @param  __x  A %vector.
1920    *  @param  __y  A %vector of the same type as @a __x.
1921    *  @return  True iff @a __x is lexicographically less than @a __y.
1922    *
1923    *  This is a total ordering relation.  It is linear in the size of the
1924    *  vectors.  The elements must be comparable with @c <.
1925    *
1926    *  See std::lexicographical_compare() for how the determination is made.
1927   */
1928   template<typename _Tp, typename _Alloc>
1929     inline bool
1930     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1931     { return std::lexicographical_compare(__x.begin(), __x.end(),
1932 					  __y.begin(), __y.end()); }
1933 
1934   /// Based on operator==
1935   template<typename _Tp, typename _Alloc>
1936     inline bool
1937     operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1938     { return !(__x == __y); }
1939 
1940   /// Based on operator<
1941   template<typename _Tp, typename _Alloc>
1942     inline bool
1943     operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1944     { return __y < __x; }
1945 
1946   /// Based on operator<
1947   template<typename _Tp, typename _Alloc>
1948     inline bool
1949     operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1950     { return !(__y < __x); }
1951 
1952   /// Based on operator<
1953   template<typename _Tp, typename _Alloc>
1954     inline bool
1955     operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1956     { return !(__x < __y); }
1957 #endif // three-way comparison
1958 
1959   /// See std::vector::swap().
1960   template<typename _Tp, typename _Alloc>
1961     inline void
1962     swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
1963     _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y)))
1964     { __x.swap(__y); }
1965 
1966 _GLIBCXX_END_NAMESPACE_CONTAINER
1967 
1968 #if __cplusplus >= 201703L
1969   namespace __detail::__variant
1970   {
1971     template<typename> struct _Never_valueless_alt; // see <variant>
1972 
1973     // Provide the strong exception-safety guarantee when emplacing a
1974     // vector into a variant, but only if move assignment cannot throw.
1975     template<typename _Tp, typename _Alloc>
1976       struct _Never_valueless_alt<_GLIBCXX_STD_C::vector<_Tp, _Alloc>>
1977       : std::is_nothrow_move_assignable<_GLIBCXX_STD_C::vector<_Tp, _Alloc>>
1978       { };
1979   }  // namespace __detail::__variant
1980 #endif // C++17
1981 
1982 _GLIBCXX_END_NAMESPACE_VERSION
1983 } // namespace std
1984 
1985 #endif /* _STL_VECTOR_H */
1986