438 _M_deallocate(this->_M_impl._M_start,
439 this->_M_impl._M_end_of_storage
440 -
this->_M_impl._M_start);
447 template<
typename _Tp,
typename _Alloc>
454 if (size_type(this->_M_impl._M_end_of_storage
455 -
this->_M_impl._M_finish) >= __n)
462 std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
463 this->_M_impl._M_finish,
464 this->_M_impl._M_finish,
465 _M_get_Tp_allocator());
466 this->_M_impl._M_finish += __n;
474 this->_M_impl._M_finish =
475 std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
478 _M_get_Tp_allocator());
479 std::__uninitialized_move_a(__position.base(), __old_finish,
480 this->_M_impl._M_finish,
481 _M_get_Tp_allocator());
482 this->_M_impl._M_finish += __elems_after;
483 std::fill(__position.base(), __old_finish, __x_copy);
488 const size_type __len =
489 _M_check_len(__n,
"vector::_M_fill_insert");
490 const size_type __elems_before = __position -
begin();
491 pointer __new_start(this->_M_allocate(__len));
492 pointer __new_finish(__new_start);
496 std::__uninitialized_fill_n_a(__new_start + __elems_before,
498 _M_get_Tp_allocator());
499 __new_finish = pointer();
502 = std::__uninitialized_move_if_noexcept_a
503 (this->_M_impl._M_start, __position.base(),
504 __new_start, _M_get_Tp_allocator());
509 = std::__uninitialized_move_if_noexcept_a
510 (__position.base(), this->_M_impl._M_finish,
511 __new_finish, _M_get_Tp_allocator());
517 __new_start + __elems_before + __n,
518 _M_get_Tp_allocator());
521 _M_get_Tp_allocator());
522 _M_deallocate(__new_start, __len);
523 __throw_exception_again;
525 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
526 _M_get_Tp_allocator());
527 _M_deallocate(this->_M_impl._M_start,
528 this->_M_impl._M_end_of_storage
529 - this->_M_impl._M_start);
530 this->_M_impl._M_start = __new_start;
531 this->_M_impl._M_finish = __new_finish;
532 this->_M_impl._M_end_of_storage = __new_start + __len;
537#if __cplusplus >= 201103L
538 template<
typename _Tp,
typename _Alloc>
540 vector<_Tp, _Alloc>::
541 _M_default_append(size_type __n)
545 if (size_type(this->_M_impl._M_end_of_storage
546 - this->_M_impl._M_finish) >= __n)
548 this->_M_impl._M_finish =
549 std::__uninitialized_default_n_a(this->_M_impl._M_finish,
550 __n, _M_get_Tp_allocator());
554 const size_type __len =
555 _M_check_len(__n,
"vector::_M_default_append");
556 const size_type __size = this->size();
557 pointer __new_start(this->_M_allocate(__len));
558 pointer __destroy_from = pointer();
561 std::__uninitialized_default_n_a(__new_start + __size,
562 __n, _M_get_Tp_allocator());
563 __destroy_from = __new_start + __size;
564 std::__uninitialized_move_if_noexcept_a(
565 this->_M_impl._M_start, this->_M_impl._M_finish,
566 __new_start, _M_get_Tp_allocator());
572 _M_get_Tp_allocator());
573 _M_deallocate(__new_start, __len);
574 __throw_exception_again;
576 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
577 _M_get_Tp_allocator());
578 _M_deallocate(this->_M_impl._M_start,
579 this->_M_impl._M_end_of_storage
580 - this->_M_impl._M_start);
581 this->_M_impl._M_start = __new_start;
582 this->_M_impl._M_finish = __new_start + __size + __n;
583 this->_M_impl._M_end_of_storage = __new_start + __len;
588 template<
typename _Tp,
typename _Alloc>
590 vector<_Tp, _Alloc>::
593 if (capacity() == size())
595 return std::__shrink_to_fit_aux<vector>::_S_do_it(*
this);
599 template<
typename _Tp,
typename _Alloc>
600 template<
typename _InputIterator>
602 vector<_Tp, _Alloc>::
603 _M_range_insert(iterator __pos, _InputIterator __first,
606 for (; __first != __last; ++__first)
608 __pos = insert(__pos, *__first);
613 template<
typename _Tp,
typename _Alloc>
614 template<
typename _ForwardIterator>
616 vector<_Tp, _Alloc>::
617 _M_range_insert(iterator __position, _ForwardIterator __first,
620 if (__first != __last)
623 if (size_type(this->_M_impl._M_end_of_storage
624 - this->_M_impl._M_finish) >= __n)
626 const size_type __elems_after =
end() - __position;
627 pointer __old_finish(this->_M_impl._M_finish);
628 if (__elems_after > __n)
630 std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
631 this->_M_impl._M_finish,
632 this->_M_impl._M_finish,
633 _M_get_Tp_allocator());
634 this->_M_impl._M_finish += __n;
635 _GLIBCXX_MOVE_BACKWARD3(__position.base(),
636 __old_finish - __n, __old_finish);
637 std::copy(__first, __last, __position);
641 _ForwardIterator __mid = __first;
643 std::__uninitialized_copy_a(__mid, __last,
644 this->_M_impl._M_finish,
645 _M_get_Tp_allocator());
646 this->_M_impl._M_finish += __n - __elems_after;
647 std::__uninitialized_move_a(__position.base(),
649 this->_M_impl._M_finish,
650 _M_get_Tp_allocator());
651 this->_M_impl._M_finish += __elems_after;
652 std::copy(__first, __mid, __position);
657 const size_type __len =
658 _M_check_len(__n,
"vector::_M_range_insert");
659 pointer __new_start(this->_M_allocate(__len));
660 pointer __new_finish(__new_start);
664 = std::__uninitialized_move_if_noexcept_a
665 (this->_M_impl._M_start, __position.base(),
666 __new_start, _M_get_Tp_allocator());
668 = std::__uninitialized_copy_a(__first, __last,
670 _M_get_Tp_allocator());
672 = std::__uninitialized_move_if_noexcept_a
673 (__position.base(), this->_M_impl._M_finish,
674 __new_finish, _M_get_Tp_allocator());
679 _M_get_Tp_allocator());
680 _M_deallocate(__new_start, __len);
681 __throw_exception_again;
683 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
684 _M_get_Tp_allocator());
685 _M_deallocate(this->_M_impl._M_start,
686 this->_M_impl._M_end_of_storage
687 - this->_M_impl._M_start);
688 this->_M_impl._M_start = __new_start;
689 this->_M_impl._M_finish = __new_finish;
690 this->_M_impl._M_end_of_storage = __new_start + __len;
697 template<
typename _Alloc>
699 vector<bool, _Alloc>::
700 _M_reallocate(size_type __n)
702 _Bit_pointer __q = this->_M_allocate(__n);
704 this->_M_impl._M_finish = _M_copy_aligned(
begin(),
end(), __start);
705 this->_M_deallocate();
706 this->_M_impl._M_start = __start;
707 this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
710 template<
typename _Alloc>
712 vector<bool, _Alloc>::
713 _M_fill_insert(iterator __position, size_type __n,
bool __x)
717 if (capacity() - size() >= __n)
719 std::copy_backward(__position,
end(),
720 this->_M_impl._M_finish + difference_type(__n));
721 std::fill(__position, __position + difference_type(__n), __x);
722 this->_M_impl._M_finish += difference_type(__n);
726 const size_type __len =
727 _M_check_len(__n,
"vector<bool>::_M_fill_insert");
728 _Bit_pointer __q = this->_M_allocate(__len);
730 iterator __i = _M_copy_aligned(
begin(), __position, __start);
731 std::fill(__i, __i + difference_type(__n), __x);
732 this->_M_impl._M_finish = std::copy(__position,
end(),
733 __i + difference_type(__n));
734 this->_M_deallocate();
735 this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
736 this->_M_impl._M_start = __start;
740 template<
typename _Alloc>
741 template<
typename _ForwardIterator>
743 vector<bool, _Alloc>::
744 _M_insert_range(iterator __position, _ForwardIterator __first,
747 if (__first != __last)
750 if (capacity() - size() >= __n)
752 std::copy_backward(__position,
end(),
753 this->_M_impl._M_finish
754 + difference_type(__n));
755 std::copy(__first, __last, __position);
756 this->_M_impl._M_finish += difference_type(__n);
760 const size_type __len =
761 _M_check_len(__n,
"vector<bool>::_M_insert_range");
762 _Bit_pointer __q = this->_M_allocate(__len);
764 iterator __i = _M_copy_aligned(
begin(), __position, __start);
765 __i = std::copy(__first, __last, __i);
767 this->_M_deallocate();
768 this->_M_impl._M_end_of_storage = __q + _S_nword(
__len);
769 this->_M_impl._M_start =
__start;
774 template<
typename _Alloc>
776 vector<bool, _Alloc>::
777 _M_insert_aux(iterator __position,
bool __x)
779 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
781 std::copy_backward(__position, this->_M_impl._M_finish,
782 this->_M_impl._M_finish + 1);
784 ++this->_M_impl._M_finish;
788 const size_type __len =
789 _M_check_len(size_type(1),
"vector<bool>::_M_insert_aux");
790 _Bit_pointer __q = this->_M_allocate(__len);
792 iterator __i = _M_copy_aligned(
begin(), __position, __start);
794 this->_M_impl._M_finish = std::copy(__position,
end(), __i);
795 this->_M_deallocate();
796 this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
797 this->_M_impl._M_start = __start;
801 template<
typename _Alloc>
802 typename vector<bool, _Alloc>::iterator
803 vector<bool, _Alloc>::
804 _M_erase(iterator __position)
806 if (__position + 1 !=
end())
807 std::copy(__position + 1,
end(), __position);
808 --this->_M_impl._M_finish;
812 template<
typename _Alloc>
813 typename vector<bool, _Alloc>::iterator
814 vector<bool, _Alloc>::
815 _M_erase(iterator __first, iterator __last)
817 if (__first != __last)
818 _M_erase_at_end(std::copy(__last,
end(), __first));
822#if __cplusplus >= 201103L
823 template<
typename _Alloc>
825 vector<bool, _Alloc>::
828 if (capacity() - size() <
int(_S_word_bit))
832 _M_reallocate(size());
840_GLIBCXX_END_NAMESPACE_CONTAINER
843#if __cplusplus >= 201103L
845namespace std _GLIBCXX_VISIBILITY(default)
847_GLIBCXX_BEGIN_NAMESPACE_VERSION
849 template<
typename _Alloc>
851 hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>::
852 operator()(
const _GLIBCXX_STD_C::vector<bool, _Alloc>& __b)
const noexcept
855 using _GLIBCXX_STD_C::_S_word_bit;
856 using _GLIBCXX_STD_C::_Bit_type;
858 const size_t __words = __b.size() / _S_word_bit;
861 const size_t __clength = __words *
sizeof(_Bit_type);
862 __hash = std::_Hash_impl::hash(__b._M_impl._M_start._M_p, __clength);
865 const size_t __extrabits = __b.size() % _S_word_bit;
868 _Bit_type __hiword = *__b._M_impl._M_finish._M_p;
869 __hiword &= ~((~static_cast<_Bit_type>(0)) << __extrabits);
871 const size_t __clength
872 = (__extrabits + __CHAR_BIT__ - 1) / __CHAR_BIT__;
874 __hash = std::_Hash_impl::hash(&__hiword, __clength, __hash);
876 __hash = std::_Hash_impl::hash(&__hiword, __clength);
882_GLIBCXX_END_NAMESPACE_VERSION