libstdc++
stl_bvector.h
Go to the documentation of this file.
1// vector<bool> specialization -*- C++ -*-
2
3// Copyright (C) 2001-2024 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-1999
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_bvector.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_BVECTOR_H
57#define _STL_BVECTOR_H 1
58
59#ifndef _GLIBCXX_ALWAYS_INLINE
60#define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__))
61#endif
62
63#if __cplusplus >= 201103L
64#include <initializer_list>
66#endif
67
68namespace std _GLIBCXX_VISIBILITY(default)
69{
70_GLIBCXX_BEGIN_NAMESPACE_VERSION
71
72 typedef unsigned long _Bit_type;
73 enum { _S_word_bit = int(__CHAR_BIT__ * sizeof(_Bit_type)) };
74
75 __attribute__((__nonnull__))
76 _GLIBCXX20_CONSTEXPR
77 void
78 __fill_bvector_n(_Bit_type*, size_t, bool) _GLIBCXX_NOEXCEPT;
79
80_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
81
82 struct _Bit_reference
83 {
84 private:
85 template<typename, typename> friend class vector;
86 friend struct _Bit_iterator;
87 friend struct _Bit_const_iterator;
88
89 _GLIBCXX20_CONSTEXPR
90 _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
91
92 _Bit_type * _M_p;
93 _Bit_type _M_mask;
94
95 _GLIBCXX20_CONSTEXPR
96 _Bit_reference(_Bit_type * __x, _Bit_type __y)
97 : _M_p(__x), _M_mask(__y) { }
98
99 public:
100#if __cplusplus >= 201103L
101 _Bit_reference(const _Bit_reference&) = default;
102#endif
103
104 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
105 operator bool() const _GLIBCXX_NOEXCEPT
106 { return !!(*_M_p & _M_mask); }
107
108 _GLIBCXX20_CONSTEXPR
109 _Bit_reference&
110 operator=(bool __x) _GLIBCXX_NOEXCEPT
111 {
112 if (__x)
113 *_M_p |= _M_mask;
114 else
115 *_M_p &= ~_M_mask;
116 return *this;
117 }
118
119#if __cplusplus > 202002L
120 constexpr const _Bit_reference&
121 operator=(bool __x) const noexcept
122 {
123 if (__x)
124 *_M_p |= _M_mask;
125 else
126 *_M_p &= ~_M_mask;
127 return *this;
128 }
129#endif // C++23
130
131 _GLIBCXX20_CONSTEXPR
132 _Bit_reference&
133 operator=(const _Bit_reference& __x) _GLIBCXX_NOEXCEPT
134 { return *this = bool(__x); }
135
136 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
137 bool
138 operator==(const _Bit_reference& __x) const
139 { return bool(*this) == bool(__x); }
140
141 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
142 bool
143 operator<(const _Bit_reference& __x) const
144 { return !bool(*this) && bool(__x); }
145
146 _GLIBCXX20_CONSTEXPR
147 void
148 flip() _GLIBCXX_NOEXCEPT
149 { *_M_p ^= _M_mask; }
150
151#if __cplusplus >= 201103L
152 _GLIBCXX20_CONSTEXPR
153 friend void
154 swap(_Bit_reference __x, _Bit_reference __y) noexcept
155 {
156 bool __tmp = __x;
157 __x = __y;
158 __y = __tmp;
159 }
160
161 _GLIBCXX20_CONSTEXPR
162 friend void
163 swap(_Bit_reference __x, bool& __y) noexcept
164 {
165 bool __tmp = __x;
166 __x = __y;
167 __y = __tmp;
168 }
169
170 _GLIBCXX20_CONSTEXPR
171 friend void
172 swap(bool& __x, _Bit_reference __y) noexcept
173 {
174 bool __tmp = __x;
175 __x = __y;
176 __y = __tmp;
177 }
178#endif
179 };
180
181// Ignore warnings about std::iterator.
182#pragma GCC diagnostic push
183#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
184 struct _Bit_iterator_base
185 : public std::iterator<std::random_access_iterator_tag, bool>
186 {
187 _Bit_type * _M_p;
188 unsigned int _M_offset;
189
190 _GLIBCXX20_CONSTEXPR _GLIBCXX_ALWAYS_INLINE
191 void
192 _M_assume_normalized() const
193 {
194#if __has_attribute(__assume__) && !defined(_GLIBCXX_CLANG)
195 unsigned int __ofst = _M_offset;
196 __attribute__ ((__assume__ (__ofst < unsigned(_S_word_bit))));
197#endif
198 }
199
200 _GLIBCXX20_CONSTEXPR
201 _Bit_iterator_base(_Bit_type * __x, unsigned int __y)
202 : _M_p(__x), _M_offset(__y) { }
203
204 _GLIBCXX20_CONSTEXPR
205 void
206 _M_bump_up()
207 {
208 _M_assume_normalized();
209 if (_M_offset++ == int(_S_word_bit) - 1)
210 {
211 _M_offset = 0;
212 ++_M_p;
213 }
214 }
215
216 _GLIBCXX20_CONSTEXPR
217 void
218 _M_bump_down()
219 {
220 _M_assume_normalized();
221 if (_M_offset-- == 0)
222 {
223 _M_offset = int(_S_word_bit) - 1;
224 --_M_p;
225 }
226 }
227
228 _GLIBCXX20_CONSTEXPR
229 void
230 _M_incr(ptrdiff_t __i)
231 {
232 _M_assume_normalized();
233 difference_type __n = __i + _M_offset;
234 _M_p += __n / int(_S_word_bit);
235 __n = __n % int(_S_word_bit);
236 if (__n < 0)
237 {
238 __n += int(_S_word_bit);
239 --_M_p;
240 }
241 _M_offset = static_cast<unsigned int>(__n);
242 }
243
244 _GLIBCXX_NODISCARD
245 friend _GLIBCXX20_CONSTEXPR bool
246 operator==(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
247 {
248 __x._M_assume_normalized();
249 __y._M_assume_normalized();
250 return __x._M_p == __y._M_p && __x._M_offset == __y._M_offset;
251 }
252
253#if __cpp_lib_three_way_comparison
254 [[nodiscard]]
255 friend constexpr strong_ordering
256 operator<=>(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
257 noexcept
258 {
259 __x._M_assume_normalized();
260 __y._M_assume_normalized();
261 if (const auto __cmp = __x._M_p <=> __y._M_p; __cmp != 0)
262 return __cmp;
263 return __x._M_offset <=> __y._M_offset;
264 }
265#else
266 _GLIBCXX_NODISCARD
267 friend bool
268 operator<(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
269 {
270 __x._M_assume_normalized();
271 __y._M_assume_normalized();
272 return __x._M_p < __y._M_p
273 || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
274 }
275
276 _GLIBCXX_NODISCARD
277 friend bool
278 operator!=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
279 { return !(__x == __y); }
280
281 _GLIBCXX_NODISCARD
282 friend bool
283 operator>(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
284 { return __y < __x; }
285
286 _GLIBCXX_NODISCARD
287 friend bool
288 operator<=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
289 { return !(__y < __x); }
290
291 _GLIBCXX_NODISCARD
292 friend bool
293 operator>=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
294 { return !(__x < __y); }
295#endif // three-way comparison
296
297 friend _GLIBCXX20_CONSTEXPR ptrdiff_t
298 operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
299 {
300 __x._M_assume_normalized();
301 __y._M_assume_normalized();
302 return (int(_S_word_bit) * (__x._M_p - __y._M_p)
303 + __x._M_offset - __y._M_offset);
304 }
305 };
306#pragma GCC diagnostic pop
307
308 struct _Bit_iterator : public _Bit_iterator_base
309 {
310 typedef _Bit_reference reference;
311#if __cplusplus > 201703L
312 typedef void pointer;
313#else
314 typedef _Bit_reference* pointer;
315#endif
316 typedef _Bit_iterator iterator;
317
318 _GLIBCXX20_CONSTEXPR
319 _Bit_iterator() : _Bit_iterator_base(0, 0) { }
320
321 _GLIBCXX20_CONSTEXPR
322 _Bit_iterator(_Bit_type * __x, unsigned int __y)
323 : _Bit_iterator_base(__x, __y) { }
324
325 _GLIBCXX20_CONSTEXPR
326 iterator
327 _M_const_cast() const
328 { return *this; }
329
330 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
331 reference
332 operator*() const
333 {
334 _M_assume_normalized();
335 return reference(_M_p, 1UL << _M_offset);
336 }
337
338 _GLIBCXX20_CONSTEXPR
339 iterator&
340 operator++()
341 {
342 _M_bump_up();
343 return *this;
344 }
345
346 _GLIBCXX20_CONSTEXPR
347 iterator
348 operator++(int)
349 {
350 iterator __tmp = *this;
351 _M_bump_up();
352 return __tmp;
353 }
354
355 _GLIBCXX20_CONSTEXPR
356 iterator&
357 operator--()
358 {
359 _M_bump_down();
360 return *this;
361 }
362
363 _GLIBCXX20_CONSTEXPR
364 iterator
365 operator--(int)
366 {
367 iterator __tmp = *this;
368 _M_bump_down();
369 return __tmp;
370 }
371
372 _GLIBCXX20_CONSTEXPR
373 iterator&
374 operator+=(difference_type __i)
375 {
376 _M_incr(__i);
377 return *this;
378 }
379
380 _GLIBCXX20_CONSTEXPR
381 iterator&
382 operator-=(difference_type __i)
383 {
384 *this += -__i;
385 return *this;
386 }
387
388 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
389 reference
390 operator[](difference_type __i) const
391 { return *(*this + __i); }
392
393 _GLIBCXX_NODISCARD
394 friend _GLIBCXX20_CONSTEXPR iterator
395 operator+(const iterator& __x, difference_type __n)
396 {
397 iterator __tmp = __x;
398 __tmp += __n;
399 return __tmp;
400 }
401
402 _GLIBCXX_NODISCARD
403 friend _GLIBCXX20_CONSTEXPR iterator
404 operator+(difference_type __n, const iterator& __x)
405 { return __x + __n; }
406
407 _GLIBCXX_NODISCARD
408 friend _GLIBCXX20_CONSTEXPR iterator
409 operator-(const iterator& __x, difference_type __n)
410 {
411 iterator __tmp = __x;
412 __tmp -= __n;
413 return __tmp;
414 }
415 };
416
417 struct _Bit_const_iterator : public _Bit_iterator_base
418 {
419 typedef bool reference;
420 typedef bool const_reference;
421#if __cplusplus > 201703L
422 typedef void pointer;
423#else
424 typedef const bool* pointer;
425#endif
426 typedef _Bit_const_iterator const_iterator;
427
428 _GLIBCXX20_CONSTEXPR
429 _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }
430
431 _GLIBCXX20_CONSTEXPR
432 _Bit_const_iterator(_Bit_type * __x, unsigned int __y)
433 : _Bit_iterator_base(__x, __y) { }
434
435 _GLIBCXX20_CONSTEXPR
436 _Bit_const_iterator(const _Bit_iterator& __x)
437 : _Bit_iterator_base(__x._M_p, __x._M_offset) { }
438
439 _GLIBCXX20_CONSTEXPR
440 _Bit_iterator
441 _M_const_cast() const
442 { return _Bit_iterator(_M_p, _M_offset); }
443
444 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
445 const_reference
446 operator*() const
447 {
448 _M_assume_normalized();
449 return _Bit_reference(_M_p, 1UL << _M_offset);
450 }
451
452 _GLIBCXX20_CONSTEXPR
453 const_iterator&
454 operator++()
455 {
456 _M_bump_up();
457 return *this;
458 }
459
460 _GLIBCXX20_CONSTEXPR
461 const_iterator
462 operator++(int)
463 {
464 const_iterator __tmp = *this;
465 _M_bump_up();
466 return __tmp;
467 }
468
469 _GLIBCXX20_CONSTEXPR
470 const_iterator&
471 operator--()
472 {
473 _M_bump_down();
474 return *this;
475 }
476
477 _GLIBCXX20_CONSTEXPR
478 const_iterator
479 operator--(int)
480 {
481 const_iterator __tmp = *this;
482 _M_bump_down();
483 return __tmp;
484 }
485
486 _GLIBCXX20_CONSTEXPR
487 const_iterator&
488 operator+=(difference_type __i)
489 {
490 _M_incr(__i);
491 return *this;
492 }
493
494 _GLIBCXX20_CONSTEXPR
495 const_iterator&
496 operator-=(difference_type __i)
497 {
498 *this += -__i;
499 return *this;
500 }
501
502 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
503 const_reference
504 operator[](difference_type __i) const
505 { return *(*this + __i); }
506
507 _GLIBCXX_NODISCARD
508 friend _GLIBCXX20_CONSTEXPR const_iterator
509 operator+(const const_iterator& __x, difference_type __n)
510 {
511 const_iterator __tmp = __x;
512 __tmp += __n;
513 return __tmp;
514 }
515
516 _GLIBCXX_NODISCARD
517 friend _GLIBCXX20_CONSTEXPR const_iterator
518 operator-(const const_iterator& __x, difference_type __n)
519 {
520 const_iterator __tmp = __x;
521 __tmp -= __n;
522 return __tmp;
523 }
524
525 _GLIBCXX_NODISCARD
526 friend _GLIBCXX20_CONSTEXPR const_iterator
527 operator+(difference_type __n, const const_iterator& __x)
528 { return __x + __n; }
529 };
530
531 template<typename _Alloc>
532 struct _Bvector_base
533 {
535 rebind<_Bit_type>::other _Bit_alloc_type;
537 _Bit_alloc_traits;
538 typedef typename _Bit_alloc_traits::pointer _Bit_pointer;
539
540 struct _Bvector_impl_data
541 {
542#if !_GLIBCXX_INLINE_VERSION
543 _Bit_iterator _M_start;
544#else
545 // We don't need the offset field for the start, it's always zero.
546 struct {
547 _Bit_type* _M_p;
548 // Allow assignment from iterators (assume offset is zero):
549 _GLIBCXX20_CONSTEXPR
550 void operator=(_Bit_iterator __it) { _M_p = __it._M_p; }
551 } _M_start;
552#endif
553 _Bit_iterator _M_finish;
554 _Bit_pointer _M_end_of_storage;
555
556 _GLIBCXX20_CONSTEXPR
557 _Bvector_impl_data() _GLIBCXX_NOEXCEPT
558 : _M_start(), _M_finish(), _M_end_of_storage()
559 { }
560
561#if __cplusplus >= 201103L
562 _Bvector_impl_data(const _Bvector_impl_data&) = default;
563
564 _Bvector_impl_data&
565 operator=(const _Bvector_impl_data&) = default;
566
567 _GLIBCXX20_CONSTEXPR
568 _Bvector_impl_data(_Bvector_impl_data&& __x) noexcept
569 : _Bvector_impl_data(__x)
570 { __x._M_reset(); }
571
572 _GLIBCXX20_CONSTEXPR
573 void
574 _M_move_data(_Bvector_impl_data&& __x) noexcept
575 {
576 *this = __x;
577 __x._M_reset();
578 }
579#endif
580
581 _GLIBCXX20_CONSTEXPR
582 void
583 _M_reset() _GLIBCXX_NOEXCEPT
584 { *this = _Bvector_impl_data(); }
585
586 _GLIBCXX20_CONSTEXPR
587 void
588 _M_swap_data(_Bvector_impl_data& __x) _GLIBCXX_NOEXCEPT
589 {
590 // Do not use std::swap(_M_start, __x._M_start), etc as it loses
591 // information used by TBAA.
592 std::swap(*this, __x);
593 }
594 };
595
596 struct _Bvector_impl
597 : public _Bit_alloc_type, public _Bvector_impl_data
598 {
599 _GLIBCXX20_CONSTEXPR
600 _Bvector_impl() _GLIBCXX_NOEXCEPT_IF(
601 is_nothrow_default_constructible<_Bit_alloc_type>::value)
602#if __cpp_concepts && __glibcxx_type_trait_variable_templates
603 requires is_default_constructible_v<_Bit_alloc_type>
604#endif
605 : _Bit_alloc_type()
606 { }
607
608 _GLIBCXX20_CONSTEXPR
609 _Bvector_impl(const _Bit_alloc_type& __a) _GLIBCXX_NOEXCEPT
610 : _Bit_alloc_type(__a)
611 { }
612
613#if __cplusplus >= 201103L
614 // Not defaulted, to enforce noexcept(true) even when
615 // !is_nothrow_move_constructible<_Bit_alloc_type>.
616 _GLIBCXX20_CONSTEXPR
617 _Bvector_impl(_Bvector_impl&& __x) noexcept
618 : _Bit_alloc_type(std::move(__x)), _Bvector_impl_data(std::move(__x))
619 { }
620
621 _GLIBCXX20_CONSTEXPR
622 _Bvector_impl(_Bit_alloc_type&& __a, _Bvector_impl&& __x) noexcept
623 : _Bit_alloc_type(std::move(__a)), _Bvector_impl_data(std::move(__x))
624 { }
625#endif
626
627 _GLIBCXX20_CONSTEXPR
628 _Bit_type*
629 _M_end_addr() const _GLIBCXX_NOEXCEPT
630 {
631 if (this->_M_end_of_storage)
632 return std::__addressof(this->_M_end_of_storage[-1]) + 1;
633 return 0;
634 }
635 };
636
637 public:
638 typedef _Alloc allocator_type;
639
640 _GLIBCXX20_CONSTEXPR
641 _Bit_alloc_type&
642 _M_get_Bit_allocator() _GLIBCXX_NOEXCEPT
643 { return this->_M_impl; }
644
645 _GLIBCXX20_CONSTEXPR
646 const _Bit_alloc_type&
647 _M_get_Bit_allocator() const _GLIBCXX_NOEXCEPT
648 { return this->_M_impl; }
649
650 _GLIBCXX20_CONSTEXPR
651 allocator_type
652 get_allocator() const _GLIBCXX_NOEXCEPT
653 { return allocator_type(_M_get_Bit_allocator()); }
654
655#if __cplusplus >= 201103L
656 _Bvector_base() = default;
657#else
658 _Bvector_base() { }
659#endif
660
661 _GLIBCXX20_CONSTEXPR
662 _Bvector_base(const allocator_type& __a)
663 : _M_impl(_Bit_alloc_type(__a)) { }
664
665#if __cplusplus >= 201103L
666 _Bvector_base(_Bvector_base&&) = default;
667
668 _GLIBCXX20_CONSTEXPR
669 _Bvector_base(_Bvector_base&& __x, const allocator_type& __a) noexcept
670 : _M_impl(_Bit_alloc_type(__a), std::move(__x._M_impl))
671 { }
672#endif
673
674 _GLIBCXX20_CONSTEXPR
675 ~_Bvector_base()
676 { this->_M_deallocate(); }
677
678 protected:
679 _Bvector_impl _M_impl;
680
681 _GLIBCXX20_CONSTEXPR
682 _Bit_pointer
683 _M_allocate(size_t __n)
684 {
685 _Bit_pointer __p = _Bit_alloc_traits::allocate(_M_impl, _S_nword(__n));
686#if __cpp_lib_is_constant_evaluated && __cpp_constexpr_dynamic_alloc
687 if (std::is_constant_evaluated())
688 {
689 __n = _S_nword(__n);
690 for (size_t __i = 0; __i < __n; ++__i)
691 std::construct_at(std::to_address(__p) + __i);
692 }
693#endif
694 return __p;
695 }
696
697 _GLIBCXX20_CONSTEXPR
698 void
699 _M_deallocate()
700 {
701 if (_M_impl._M_start._M_p)
702 {
703 const size_t __n = _M_impl._M_end_addr() - _M_impl._M_start._M_p;
705 _M_impl._M_end_of_storage - __n,
706 __n);
707 _M_impl._M_reset();
708 }
709 }
710
711#if __cplusplus >= 201103L
712 _GLIBCXX20_CONSTEXPR
713 void
714 _M_move_data(_Bvector_base&& __x) noexcept
715 { _M_impl._M_move_data(std::move(__x._M_impl)); }
716#endif
717
718 _GLIBCXX_CONSTEXPR
719 static size_t
720 _S_nword(size_t __n)
721 { return (__n + int(_S_word_bit) - 1) / int(_S_word_bit); }
722 };
723
724 /**
725 * @brief A specialization of vector for booleans which offers fixed time
726 * access to individual elements in any order.
727 *
728 * @ingroup sequences
729 * @headerfile vector
730 * @since C++98
731 *
732 * @tparam _Alloc Allocator type.
733 *
734 * Note that vector<bool> does not actually meet the requirements for being
735 * a container. This is because the reference and pointer types are not
736 * really references and pointers to bool. See DR96 for details. @see
737 * vector for function documentation.
738 *
739 * In some terminology a %vector can be described as a dynamic
740 * C-style array, it offers fast and efficient access to individual
741 * elements in any order and saves the user from worrying about
742 * memory and size allocation. Subscripting ( @c [] ) access is
743 * also provided as with C-style arrays.
744 */
745 template<typename _Alloc>
746 class vector<bool, _Alloc> : protected _Bvector_base<_Alloc>
747 {
748 typedef _Bvector_base<_Alloc> _Base;
749 typedef typename _Base::_Bit_pointer _Bit_pointer;
751
752#if __cplusplus >= 201103L
753 friend struct std::hash<vector>;
754#endif
755
756 public:
757 typedef bool value_type;
758 typedef size_t size_type;
759 typedef ptrdiff_t difference_type;
760 typedef _Bit_reference reference;
761 typedef bool const_reference;
762 typedef _Bit_reference* pointer;
763 typedef const bool* const_pointer;
764 typedef _Bit_iterator iterator;
765 typedef _Bit_const_iterator const_iterator;
768 typedef _Alloc allocator_type;
769
770 _GLIBCXX20_CONSTEXPR
771 allocator_type
772 get_allocator() const
773 { return _Base::get_allocator(); }
774
775 protected:
776 using _Base::_M_allocate;
777 using _Base::_M_deallocate;
778 using _Base::_S_nword;
779 using _Base::_M_get_Bit_allocator;
780
781 public:
782#if __cplusplus >= 201103L
783 vector() = default;
784#else
785 vector() { }
786#endif
787
788 _GLIBCXX20_CONSTEXPR
789 explicit
790 vector(const allocator_type& __a)
791 : _Base(__a) { }
792
793#if __cplusplus >= 201103L
794 _GLIBCXX20_CONSTEXPR
795 explicit
796 vector(size_type __n, const allocator_type& __a = allocator_type())
797 : vector(__n, false, __a)
798 { }
799
800 _GLIBCXX20_CONSTEXPR
801 vector(size_type __n, const bool& __value,
802 const allocator_type& __a = allocator_type())
803#else
804 explicit
805 vector(size_type __n, const bool& __value = bool(),
806 const allocator_type& __a = allocator_type())
807#endif
808 : _Base(__a)
809 {
810 _M_initialize(__n);
811 _M_initialize_value(__value);
812 }
813
814 _GLIBCXX20_CONSTEXPR
815 vector(const vector& __x)
816 : _Base(_Bit_alloc_traits::_S_select_on_copy(__x._M_get_Bit_allocator()))
817 {
818 const_iterator __xbegin = __x.begin(), __xend = __x.end();
819 _M_initialize(__x.size());
820 _M_copy_aligned(__xbegin, __xend, begin());
821 }
822
823#if __cplusplus >= 201103L
824 vector(vector&&) = default;
825
826 private:
827 _GLIBCXX20_CONSTEXPR
828 vector(vector&& __x, const allocator_type& __a, true_type) noexcept
829 : _Base(std::move(__x), __a)
830 { }
831
832 _GLIBCXX20_CONSTEXPR
833 vector(vector&& __x, const allocator_type& __a, false_type)
834 : _Base(__a)
835 {
836 if (__x.get_allocator() == __a)
837 this->_M_move_data(std::move(__x));
838 else
839 {
840 _M_initialize(__x.size());
841 _M_copy_aligned(__x.begin(), __x.end(), begin());
842 __x.clear();
843 }
844 }
845
846 public:
847 _GLIBCXX20_CONSTEXPR
848 vector(vector&& __x, const __type_identity_t<allocator_type>& __a)
849 noexcept(_Bit_alloc_traits::_S_always_equal())
850 : vector(std::move(__x), __a,
852 { }
853
854 _GLIBCXX20_CONSTEXPR
855 vector(const vector& __x, const __type_identity_t<allocator_type>& __a)
856 : _Base(__a)
857 {
858 _M_initialize(__x.size());
859 _M_copy_aligned(__x.begin(), __x.end(), begin());
860 }
861
862 _GLIBCXX20_CONSTEXPR
864 const allocator_type& __a = allocator_type())
865 : _Base(__a)
866 {
867 _M_initialize_range(__l.begin(), __l.end(),
869 }
870#endif
871
872#if __cplusplus >= 201103L
873 template<typename _InputIterator,
874 typename = std::_RequireInputIter<_InputIterator>>
875 _GLIBCXX20_CONSTEXPR
876 vector(_InputIterator __first, _InputIterator __last,
877 const allocator_type& __a = allocator_type())
878 : _Base(__a)
879 {
880 _M_initialize_range(__first, __last,
881 std::__iterator_category(__first));
882 }
883#else
884 template<typename _InputIterator>
885 vector(_InputIterator __first, _InputIterator __last,
886 const allocator_type& __a = allocator_type())
887 : _Base(__a)
888 {
889 // Check whether it's an integral type. If so, it's not an iterator.
890 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
891 _M_initialize_dispatch(__first, __last, _Integral());
892 }
893#endif
894
895 _GLIBCXX20_CONSTEXPR
896 ~vector() _GLIBCXX_NOEXCEPT { }
897
898 _GLIBCXX20_CONSTEXPR
899 vector&
900 operator=(const vector& __x)
901 {
902 if (&__x == this)
903 return *this;
904#if __cplusplus >= 201103L
905 if (_Bit_alloc_traits::_S_propagate_on_copy_assign())
906 {
907 if (this->_M_get_Bit_allocator() != __x._M_get_Bit_allocator())
908 {
909 this->_M_deallocate();
910 std::__alloc_on_copy(_M_get_Bit_allocator(),
911 __x._M_get_Bit_allocator());
912 _M_initialize(__x.size());
913 }
914 else
915 std::__alloc_on_copy(_M_get_Bit_allocator(),
916 __x._M_get_Bit_allocator());
917 }
918#endif
919 if (__x.size() > capacity())
920 {
921 this->_M_deallocate();
922 _M_initialize(__x.size());
923 }
924 this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
925 begin());
926 return *this;
927 }
928
929#if __cplusplus >= 201103L
930 _GLIBCXX20_CONSTEXPR
931 vector&
932 operator=(vector&& __x) noexcept(_Bit_alloc_traits::_S_nothrow_move())
933 {
934 if (_Bit_alloc_traits::_S_propagate_on_move_assign()
935 || this->_M_get_Bit_allocator() == __x._M_get_Bit_allocator())
936 {
937 this->_M_deallocate();
938 this->_M_move_data(std::move(__x));
939 std::__alloc_on_move(_M_get_Bit_allocator(),
940 __x._M_get_Bit_allocator());
941 }
942 else
943 {
944 if (__x.size() > capacity())
945 {
946 this->_M_deallocate();
947 _M_initialize(__x.size());
948 }
949 this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
950 begin());
951 __x.clear();
952 }
953 return *this;
954 }
955
956 _GLIBCXX20_CONSTEXPR
957 vector&
959 {
960 this->assign(__l.begin(), __l.end());
961 return *this;
962 }
963#endif
964
965 // assign(), a generalized assignment member function. Two
966 // versions: one that takes a count, and one that takes a range.
967 // The range version is a member template, so we dispatch on whether
968 // or not the type is an integer.
969 _GLIBCXX20_CONSTEXPR
970 void
971 assign(size_type __n, const bool& __x)
972 { _M_fill_assign(__n, __x); }
973
974#if __cplusplus >= 201103L
975 template<typename _InputIterator,
976 typename = std::_RequireInputIter<_InputIterator>>
977 _GLIBCXX20_CONSTEXPR
978 void
979 assign(_InputIterator __first, _InputIterator __last)
980 { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
981#else
982 template<typename _InputIterator>
983 void
984 assign(_InputIterator __first, _InputIterator __last)
985 {
986 // Check whether it's an integral type. If so, it's not an iterator.
987 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
988 _M_assign_dispatch(__first, __last, _Integral());
989 }
990#endif
991
992#if __cplusplus >= 201103L
993 _GLIBCXX20_CONSTEXPR
994 void
996 { _M_assign_aux(__l.begin(), __l.end(), random_access_iterator_tag()); }
997#endif
998
999 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1000 iterator
1001 begin() _GLIBCXX_NOEXCEPT
1002 { return iterator(this->_M_impl._M_start._M_p, 0); }
1003
1004 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1005 const_iterator
1006 begin() const _GLIBCXX_NOEXCEPT
1007 { return const_iterator(this->_M_impl._M_start._M_p, 0); }
1008
1009 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1010 iterator
1011 end() _GLIBCXX_NOEXCEPT
1012 { return this->_M_impl._M_finish; }
1013
1014 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1015 const_iterator
1016 end() const _GLIBCXX_NOEXCEPT
1017 { return this->_M_impl._M_finish; }
1018
1019 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1021 rbegin() _GLIBCXX_NOEXCEPT
1022 { return reverse_iterator(end()); }
1023
1024 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1026 rbegin() const _GLIBCXX_NOEXCEPT
1027 { return const_reverse_iterator(end()); }
1028
1029 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1031 rend() _GLIBCXX_NOEXCEPT
1032 { return reverse_iterator(begin()); }
1033
1034 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1036 rend() const _GLIBCXX_NOEXCEPT
1037 { return const_reverse_iterator(begin()); }
1038
1039#if __cplusplus >= 201103L
1040 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1041 const_iterator
1042 cbegin() const noexcept
1043 { return const_iterator(this->_M_impl._M_start._M_p, 0); }
1044
1045 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1046 const_iterator
1047 cend() const noexcept
1048 { return this->_M_impl._M_finish; }
1049
1050 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1052 crbegin() const noexcept
1053 { return const_reverse_iterator(end()); }
1054
1055 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1057 crend() const noexcept
1058 { return const_reverse_iterator(begin()); }
1059#endif
1060
1061 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1062 size_type
1063 size() const _GLIBCXX_NOEXCEPT
1064 { return size_type(end() - begin()); }
1065
1066 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1067 size_type
1068 max_size() const _GLIBCXX_NOEXCEPT
1069 {
1070 const size_type __isize =
1071 __gnu_cxx::__numeric_traits<difference_type>::__max
1072 - int(_S_word_bit) + 1;
1073 const size_type __asize
1074 = _Bit_alloc_traits::max_size(_M_get_Bit_allocator());
1075 return (__asize <= __isize / int(_S_word_bit)
1076 ? __asize * int(_S_word_bit) : __isize);
1077 }
1078
1079 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1080 size_type
1081 capacity() const _GLIBCXX_NOEXCEPT
1082 { return size_type(const_iterator(this->_M_impl._M_end_addr(), 0)
1083 - begin()); }
1084
1085 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1086 bool
1087 empty() const _GLIBCXX_NOEXCEPT
1088 { return begin() == end(); }
1089
1090 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1091 reference
1092 operator[](size_type __n)
1093 {
1094 __glibcxx_requires_subscript(__n);
1095 return begin()[__n];
1096 }
1097
1098 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1099 const_reference
1100 operator[](size_type __n) const
1101 {
1102 __glibcxx_requires_subscript(__n);
1103 return begin()[__n];
1104 }
1105
1106 protected:
1107 _GLIBCXX20_CONSTEXPR
1108 void
1109 _M_range_check(size_type __n) const
1110 {
1111 if (__n >= this->size())
1112 __throw_out_of_range_fmt(__N("vector<bool>::_M_range_check: __n "
1113 "(which is %zu) >= this->size() "
1114 "(which is %zu)"),
1115 __n, this->size());
1116 }
1117
1118 public:
1119 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1120 reference
1121 at(size_type __n)
1122 {
1123 _M_range_check(__n);
1124 return (*this)[__n];
1125 }
1126
1127 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1128 const_reference
1129 at(size_type __n) const
1130 {
1131 _M_range_check(__n);
1132 return (*this)[__n];
1133 }
1134
1135 _GLIBCXX20_CONSTEXPR
1136 void
1137 reserve(size_type __n)
1138 {
1139 if (__n > max_size())
1140 __throw_length_error(__N("vector::reserve"));
1141 if (capacity() < __n)
1142 _M_reallocate(__n);
1143 }
1144
1145 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1146 reference
1147 front()
1148 {
1149 __glibcxx_requires_nonempty();
1150 return *begin();
1151 }
1152
1153 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1154 const_reference
1155 front() const
1156 {
1157 __glibcxx_requires_nonempty();
1158 return *begin();
1159 }
1160
1161 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1162 reference
1163 back()
1164 {
1165 __glibcxx_requires_nonempty();
1166 return *(end() - 1);
1167 }
1168
1169 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1170 const_reference
1171 back() const
1172 {
1173 __glibcxx_requires_nonempty();
1174 return *(end() - 1);
1175 }
1176
1177 _GLIBCXX20_CONSTEXPR
1178 void
1179 push_back(bool __x)
1180 {
1181 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
1182 *this->_M_impl._M_finish++ = __x;
1183 else
1184 _M_insert_aux(end(), __x);
1185 }
1186
1187 _GLIBCXX20_CONSTEXPR
1188 void
1189 swap(vector& __x) _GLIBCXX_NOEXCEPT
1190 {
1191#if __cplusplus >= 201103L
1192 __glibcxx_assert(_Bit_alloc_traits::propagate_on_container_swap::value
1193 || _M_get_Bit_allocator() == __x._M_get_Bit_allocator());
1194#endif
1195 this->_M_impl._M_swap_data(__x._M_impl);
1196 _Bit_alloc_traits::_S_on_swap(_M_get_Bit_allocator(),
1197 __x._M_get_Bit_allocator());
1198 }
1199
1200 // [23.2.5]/1, third-to-last entry in synopsis listing
1201 _GLIBCXX20_CONSTEXPR
1202 static void
1203 swap(reference __x, reference __y) _GLIBCXX_NOEXCEPT
1204 {
1205 bool __tmp = __x;
1206 __x = __y;
1207 __y = __tmp;
1208 }
1209
1210 _GLIBCXX20_CONSTEXPR
1211 iterator
1212#if __cplusplus >= 201103L
1213 insert(const_iterator __position, const bool& __x)
1214#else
1215 insert(iterator __position, const bool& __x)
1216#endif
1217 {
1218 const difference_type __n = __position - begin();
1219 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr()
1220 && __position == end())
1221 *this->_M_impl._M_finish++ = __x;
1222 else
1223 _M_insert_aux(__position._M_const_cast(), __x);
1224 return begin() + __n;
1225 }
1226
1227#if _GLIBCXX_USE_DEPRECATED
1228 _GLIBCXX_DEPRECATED_SUGGEST("insert(position, false)")
1229 iterator
1230 insert(const_iterator __position)
1231 { return this->insert(__position._M_const_cast(), false); }
1232#endif
1233
1234#if __cplusplus >= 201103L
1235 template<typename _InputIterator,
1236 typename = std::_RequireInputIter<_InputIterator>>
1237 _GLIBCXX20_CONSTEXPR
1238 iterator
1239 insert(const_iterator __position,
1240 _InputIterator __first, _InputIterator __last)
1241 {
1242 difference_type __offset = __position - cbegin();
1243 _M_insert_range(__position._M_const_cast(),
1244 __first, __last,
1245 std::__iterator_category(__first));
1246 return begin() + __offset;
1247 }
1248#else
1249 template<typename _InputIterator>
1250 void
1251 insert(iterator __position,
1252 _InputIterator __first, _InputIterator __last)
1253 {
1254 // Check whether it's an integral type. If so, it's not an iterator.
1255 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1256 _M_insert_dispatch(__position, __first, __last, _Integral());
1257 }
1258#endif
1259
1260#if __cplusplus >= 201103L
1261 _GLIBCXX20_CONSTEXPR
1262 iterator
1263 insert(const_iterator __position, size_type __n, const bool& __x)
1264 {
1265 difference_type __offset = __position - cbegin();
1266 _M_fill_insert(__position._M_const_cast(), __n, __x);
1267 return begin() + __offset;
1268 }
1269#else
1270 void
1271 insert(iterator __position, size_type __n, const bool& __x)
1272 { _M_fill_insert(__position, __n, __x); }
1273#endif
1274
1275#if __cplusplus >= 201103L
1276 _GLIBCXX20_CONSTEXPR
1277 iterator
1278 insert(const_iterator __p, initializer_list<bool> __l)
1279 { return this->insert(__p, __l.begin(), __l.end()); }
1280#endif
1281
1282 _GLIBCXX20_CONSTEXPR
1283 void
1284 pop_back()
1285 { --this->_M_impl._M_finish; }
1286
1287 _GLIBCXX20_CONSTEXPR
1288 iterator
1289#if __cplusplus >= 201103L
1290 erase(const_iterator __position)
1291#else
1292 erase(iterator __position)
1293#endif
1294 { return _M_erase(__position._M_const_cast()); }
1295
1296 _GLIBCXX20_CONSTEXPR
1297 iterator
1298#if __cplusplus >= 201103L
1299 erase(const_iterator __first, const_iterator __last)
1300#else
1301 erase(iterator __first, iterator __last)
1302#endif
1303 { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
1304
1305 _GLIBCXX20_CONSTEXPR
1306 void
1307 resize(size_type __new_size, bool __x = bool())
1308 {
1309 if (__new_size < size())
1310 _M_erase_at_end(begin() + difference_type(__new_size));
1311 else
1312 insert(end(), __new_size - size(), __x);
1313 }
1314
1315#if __cplusplus >= 201103L
1316 _GLIBCXX20_CONSTEXPR
1317 void
1319 { _M_shrink_to_fit(); }
1320#endif
1321
1322 _GLIBCXX20_CONSTEXPR
1323 void
1324 flip() _GLIBCXX_NOEXCEPT
1325 {
1326 _Bit_type * const __end = this->_M_impl._M_end_addr();
1327 for (_Bit_type * __p = this->_M_impl._M_start._M_p; __p != __end; ++__p)
1328 *__p = ~*__p;
1329 }
1330
1331 _GLIBCXX20_CONSTEXPR
1332 void
1333 clear() _GLIBCXX_NOEXCEPT
1334 { _M_erase_at_end(begin()); }
1335
1336#if __cplusplus >= 201103L
1337 template<typename... _Args>
1338#if __cplusplus > 201402L
1339 _GLIBCXX20_CONSTEXPR
1340 reference
1341#else
1342 void
1343#endif
1344 emplace_back(_Args&&... __args)
1345 {
1346 push_back(bool(__args...));
1347#if __cplusplus > 201402L
1348 return back();
1349#endif
1350 }
1351
1352 template<typename... _Args>
1353 _GLIBCXX20_CONSTEXPR
1354 iterator
1355 emplace(const_iterator __pos, _Args&&... __args)
1356 { return insert(__pos, bool(__args...)); }
1357#endif
1358
1359 protected:
1360 // Precondition: __first._M_offset == 0 && __result._M_offset == 0.
1361 _GLIBCXX20_CONSTEXPR
1362 iterator
1363 _M_copy_aligned(const_iterator __first, const_iterator __last,
1364 iterator __result)
1365 {
1366 _Bit_type* __q = std::copy(__first._M_p, __last._M_p, __result._M_p);
1367 return std::copy(const_iterator(__last._M_p, 0), __last,
1368 iterator(__q, 0));
1369 }
1370
1371 _GLIBCXX20_CONSTEXPR
1372 void
1373 _M_initialize(size_type __n)
1374 {
1375 if (__n)
1376 {
1377 _Bit_pointer __q = this->_M_allocate(__n);
1378 this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
1379 iterator __start = iterator(std::__addressof(*__q), 0);
1380 this->_M_impl._M_start = __start;
1381 this->_M_impl._M_finish = __start + difference_type(__n);
1382 }
1383 }
1384
1385 _GLIBCXX20_CONSTEXPR
1386 void
1387 _M_initialize_value(bool __x) _GLIBCXX_NOEXCEPT
1388 {
1389 if (_Bit_type* __p = this->_M_impl._M_start._M_p)
1390 __fill_bvector_n(__p, this->_M_impl._M_end_addr() - __p, __x);
1391 }
1392
1393 _GLIBCXX20_CONSTEXPR
1394 void
1395 _M_reallocate(size_type __n);
1396
1397#if __cplusplus >= 201103L
1398 _GLIBCXX20_CONSTEXPR
1399 bool
1400 _M_shrink_to_fit();
1401#endif
1402
1403#if __cplusplus < 201103L
1404 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1405 // 438. Ambiguity in the "do the right thing" clause
1406 template<typename _Integer>
1407 void
1408 _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1409 {
1410 _M_initialize(static_cast<size_type>(__n));
1411 _M_initialize_value(__x);
1412 }
1413
1414 template<typename _InputIterator>
1415 void
1416 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1417 __false_type)
1418 { _M_initialize_range(__first, __last,
1419 std::__iterator_category(__first)); }
1420#endif
1421
1422 template<typename _InputIterator>
1423 _GLIBCXX20_CONSTEXPR
1424 void
1425 _M_initialize_range(_InputIterator __first, _InputIterator __last,
1427 {
1428 for (; __first != __last; ++__first)
1429 push_back(*__first);
1430 }
1431
1432 template<typename _ForwardIterator>
1433 _GLIBCXX20_CONSTEXPR
1434 void
1435 _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
1437 {
1438 const size_type __n = std::distance(__first, __last);
1439 _M_initialize(__n);
1440 std::copy(__first, __last, begin());
1441 }
1442
1443#if __cplusplus < 201103L
1444 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1445 // 438. Ambiguity in the "do the right thing" clause
1446 template<typename _Integer>
1447 void
1448 _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1449 { _M_fill_assign(__n, __val); }
1450
1451 template<class _InputIterator>
1452 void
1453 _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1454 __false_type)
1455 { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
1456#endif
1457
1458 _GLIBCXX20_CONSTEXPR
1459 void
1460 _M_fill_assign(size_t __n, bool __x)
1461 {
1462 if (__n > size())
1463 {
1464 _M_initialize_value(__x);
1465 insert(end(), __n - size(), __x);
1466 }
1467 else
1468 {
1469 _M_erase_at_end(begin() + __n);
1470 _M_initialize_value(__x);
1471 }
1472 }
1473
1474 template<typename _InputIterator>
1475 _GLIBCXX20_CONSTEXPR
1476 void
1477 _M_assign_aux(_InputIterator __first, _InputIterator __last,
1479 {
1480 iterator __cur = begin();
1481 for (; __first != __last && __cur != end(); ++__cur, (void)++__first)
1482 *__cur = *__first;
1483 if (__first == __last)
1484 _M_erase_at_end(__cur);
1485 else
1486 insert(end(), __first, __last);
1487 }
1488
1489 template<typename _ForwardIterator>
1490 _GLIBCXX20_CONSTEXPR
1491 void
1492 _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1494 {
1495 const size_type __len = std::distance(__first, __last);
1496 if (__len < size())
1497 _M_erase_at_end(std::copy(__first, __last, begin()));
1498 else
1499 {
1500 _ForwardIterator __mid = __first;
1501 std::advance(__mid, size());
1502 std::copy(__first, __mid, begin());
1503 insert(end(), __mid, __last);
1504 }
1505 }
1506
1507#if __cplusplus < 201103L
1508 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1509 // 438. Ambiguity in the "do the right thing" clause
1510 template<typename _Integer>
1511 void
1512 _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
1513 __true_type)
1514 { _M_fill_insert(__pos, __n, __x); }
1515
1516 template<typename _InputIterator>
1517 void
1518 _M_insert_dispatch(iterator __pos,
1519 _InputIterator __first, _InputIterator __last,
1520 __false_type)
1521 { _M_insert_range(__pos, __first, __last,
1522 std::__iterator_category(__first)); }
1523#endif
1524
1525 _GLIBCXX20_CONSTEXPR
1526 void
1527 _M_fill_insert(iterator __position, size_type __n, bool __x);
1528
1529 template<typename _InputIterator>
1530 _GLIBCXX20_CONSTEXPR
1531 void
1532 _M_insert_range(iterator __pos, _InputIterator __first,
1533 _InputIterator __last, std::input_iterator_tag)
1534 {
1535 for (; __first != __last; ++__first)
1536 {
1537 __pos = insert(__pos, *__first);
1538 ++__pos;
1539 }
1540 }
1541
1542 template<typename _ForwardIterator>
1543 _GLIBCXX20_CONSTEXPR
1544 void
1545 _M_insert_range(iterator __position, _ForwardIterator __first,
1546 _ForwardIterator __last, std::forward_iterator_tag);
1547
1548 _GLIBCXX20_CONSTEXPR
1549 void
1550 _M_insert_aux(iterator __position, bool __x);
1551
1552 _GLIBCXX20_CONSTEXPR
1553 size_type
1554 _M_check_len(size_type __n, const char* __s) const
1555 {
1556 if (max_size() - size() < __n)
1557 __throw_length_error(__N(__s));
1558
1559 const size_type __len = size() + std::max(size(), __n);
1560 return (__len < size() || __len > max_size()) ? max_size() : __len;
1561 }
1562
1563 _GLIBCXX20_CONSTEXPR
1564 void
1565 _M_erase_at_end(iterator __pos)
1566 { this->_M_impl._M_finish = __pos; }
1567
1568 _GLIBCXX20_CONSTEXPR
1569 iterator
1570 _M_erase(iterator __pos);
1571
1572 _GLIBCXX20_CONSTEXPR
1573 iterator
1574 _M_erase(iterator __first, iterator __last);
1575
1576 protected:
1577 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1578 // DR 464. Suggestion for new member functions in standard containers.
1579 // N.B. DR 464 says nothing about vector<bool> but we need something
1580 // here due to the using-declaration in __gnu_debug::vector.
1581 // vector class.
1582#if __cplusplus >= 201103L
1583 void data() = delete;
1584#else
1585 void data() { }
1586#endif
1587 };
1588
1589_GLIBCXX_END_NAMESPACE_CONTAINER
1590
1591 // Fill a partial word.
1592 _GLIBCXX20_CONSTEXPR
1593 inline void
1594 __fill_bvector(_Bit_type* __v, unsigned int __first, unsigned int __last,
1595 bool __x) _GLIBCXX_NOEXCEPT
1596 {
1597 const _Bit_type __fmask = ~0ul << __first;
1598 const _Bit_type __lmask = ~0ul >> (_S_word_bit - __last);
1599 const _Bit_type __mask = __fmask & __lmask;
1600
1601 if (__x)
1602 *__v |= __mask;
1603 else
1604 *__v &= ~__mask;
1605 }
1606
1607 // Fill N full words, as if using memset, but usable in constant expressions.
1608 __attribute__((__nonnull__))
1609 _GLIBCXX20_CONSTEXPR
1610 inline void
1611 __fill_bvector_n(_Bit_type* __p, size_t __n, bool __x) _GLIBCXX_NOEXCEPT
1612 {
1613#if __cpp_lib_is_constant_evaluated
1614 if (std::is_constant_evaluated())
1615 {
1616 for (size_t __i = 0; __i < __n; ++__i)
1617 __p[__i] = __x ? ~0ul : 0ul;
1618 return;
1619 }
1620#endif
1621 __builtin_memset(__p, __x ? ~0 : 0, __n * sizeof(_Bit_type));
1622 }
1623
1624
1625 _GLIBCXX20_CONSTEXPR
1626 inline void
1627 __fill_a1(_GLIBCXX_STD_C::_Bit_iterator __first,
1628 _GLIBCXX_STD_C::_Bit_iterator __last, const bool& __x)
1629 {
1630 if (__first._M_p != __last._M_p)
1631 {
1632 _Bit_type* __first_p = __first._M_p;
1633 if (__first._M_offset != 0)
1634 __fill_bvector(__first_p++, __first._M_offset, _S_word_bit, __x);
1635
1636 __fill_bvector_n(__first_p, __last._M_p - __first_p, __x);
1637
1638 if (__last._M_offset != 0)
1639 __fill_bvector(__last._M_p, 0, __last._M_offset, __x);
1640 }
1641 else if (__first._M_offset != __last._M_offset)
1642 __fill_bvector(__first._M_p, __first._M_offset, __last._M_offset, __x);
1643 }
1644
1645#if __cplusplus >= 201103L
1646 // DR 1182.
1647 /// std::hash specialization for vector<bool>.
1648 template<typename _Alloc>
1649 struct hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>
1650 : public __hash_base<size_t, _GLIBCXX_STD_C::vector<bool, _Alloc>>
1651 {
1652 size_t
1653 operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>&) const noexcept;
1654 };
1655#endif // C++11
1656
1657_GLIBCXX_END_NAMESPACE_VERSION
1658} // namespace std
1659
1660#endif
constexpr bool operator<=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
Definition chrono.h:855
constexpr bool operator>=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
Definition chrono.h:869
constexpr bool operator<(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
Definition chrono.h:822
constexpr bool operator>(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
Definition chrono.h:862
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
Definition complex:400
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
Definition complex:370
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
Definition complex:340
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
Definition ptr_traits.h:228
__bool_constant< true > true_type
The type used as a compile-time boolean with true value.
Definition type_traits:113
__bool_constant< false > false_type
The type used as a compile-time boolean with false value.
Definition type_traits:116
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Definition move.h:127
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
Definition move.h:51
constexpr const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
initializer_list
Primary class template hash.
typename __detected_or_t< is_empty< _Alloc >, __equal, _Alloc >::type is_always_equal
Whether all instances of the allocator type compare equal.
Marking input iterators.
Forward iterators support a superset of input iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Common iterator class.
ptrdiff_t difference_type
Distance between iterators is represented as this type.
A standard container which offers fixed time access to individual elements in any order.
Definition stl_vector.h:429
constexpr iterator insert(const_iterator __position, const value_type &__x)
Inserts given value into vector before specified iterator.
Definition vector.tcc:135
constexpr void push_back(const value_type &__x)
Add data to the end of the vector.
constexpr reverse_iterator rbegin() noexcept
Definition stl_vector.h:913
constexpr iterator end() noexcept
Definition stl_vector.h:893
vector()=default
Creates a vector with no elements.
constexpr iterator emplace(const_iterator __position, _Args &&... __args)
Inserts an object in vector before specified iterator.
constexpr iterator begin() noexcept
Definition stl_vector.h:873
constexpr size_type capacity() const noexcept
constexpr ~vector() noexcept
Definition stl_vector.h:733
constexpr void assign(size_type __n, const value_type &__val)
Assigns a given value to a vector.
Definition stl_vector.h:808
constexpr _Tp * data() noexcept
constexpr vector & operator=(const vector &__x)
Vector assignment operator.
constexpr void pop_back() noexcept
Removes last element.
constexpr void reserve(size_type __n)
Attempt to preallocate enough memory for specified number of elements.
Definition vector.tcc:68
constexpr reference at(size_type __n)
Provides access to the data contained in the vector.
constexpr void resize(size_type __new_size)
Resizes the vector to the specified number of elements.
constexpr void _M_range_check(size_type __n) const
Safety check used only from at().
constexpr reference front() noexcept
constexpr iterator erase(const_iterator __position)
Remove element at given position.
constexpr bool empty() const noexcept
constexpr reverse_iterator rend() noexcept
Definition stl_vector.h:933
constexpr const_reverse_iterator crbegin() const noexcept
Definition stl_vector.h:974
constexpr const_iterator cbegin() const noexcept
Definition stl_vector.h:954
constexpr void clear() noexcept
constexpr allocator_type get_allocator() const noexcept
Get a copy of the memory allocation object.
Definition stl_vector.h:310
constexpr size_type size() const noexcept
Definition stl_vector.h:992
constexpr reference back() noexcept
constexpr const_reverse_iterator crend() const noexcept
Definition stl_vector.h:984
constexpr const_iterator cend() const noexcept
Definition stl_vector.h:964
constexpr reference operator[](size_type __n) noexcept
Subscript access to the data contained in the vector.
constexpr void shrink_to_fit()
constexpr size_type max_size() const noexcept
Definition stl_vector.h:998
Uniform interface to C++98 and C++11 allocators.
static constexpr pointer allocate(_Alloc &__a, size_type __n)
Allocate memory.
static constexpr void deallocate(_Alloc &__a, pointer __p, size_type __n)
Deallocate memory.