00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #ifndef _STL_BVECTOR_H
00058 #define _STL_BVECTOR_H 1
00059
00060 #include <initializer_list>
00061
00062 _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
00063
00064 typedef unsigned long _Bit_type;
00065 enum { _S_word_bit = int(__CHAR_BIT__ * sizeof(_Bit_type)) };
00066
00067 struct _Bit_reference
00068 {
00069 _Bit_type * _M_p;
00070 _Bit_type _M_mask;
00071
00072 _Bit_reference(_Bit_type * __x, _Bit_type __y)
00073 : _M_p(__x), _M_mask(__y) { }
00074
00075 _Bit_reference() : _M_p(0), _M_mask(0) { }
00076
00077 operator bool() const
00078 { return !!(*_M_p & _M_mask); }
00079
00080 _Bit_reference&
00081 operator=(bool __x)
00082 {
00083 if (__x)
00084 *_M_p |= _M_mask;
00085 else
00086 *_M_p &= ~_M_mask;
00087 return *this;
00088 }
00089
00090 _Bit_reference&
00091 operator=(const _Bit_reference& __x)
00092 { return *this = bool(__x); }
00093
00094 bool
00095 operator==(const _Bit_reference& __x) const
00096 { return bool(*this) == bool(__x); }
00097
00098 bool
00099 operator<(const _Bit_reference& __x) const
00100 { return !bool(*this) && bool(__x); }
00101
00102 void
00103 flip()
00104 { *_M_p ^= _M_mask; }
00105 };
00106
00107 struct _Bit_iterator_base
00108 : public std::iterator<std::random_access_iterator_tag, bool>
00109 {
00110 _Bit_type * _M_p;
00111 unsigned int _M_offset;
00112
00113 _Bit_iterator_base(_Bit_type * __x, unsigned int __y)
00114 : _M_p(__x), _M_offset(__y) { }
00115
00116 void
00117 _M_bump_up()
00118 {
00119 if (_M_offset++ == int(_S_word_bit) - 1)
00120 {
00121 _M_offset = 0;
00122 ++_M_p;
00123 }
00124 }
00125
00126 void
00127 _M_bump_down()
00128 {
00129 if (_M_offset-- == 0)
00130 {
00131 _M_offset = int(_S_word_bit) - 1;
00132 --_M_p;
00133 }
00134 }
00135
00136 void
00137 _M_incr(ptrdiff_t __i)
00138 {
00139 difference_type __n = __i + _M_offset;
00140 _M_p += __n / int(_S_word_bit);
00141 __n = __n % int(_S_word_bit);
00142 if (__n < 0)
00143 {
00144 __n += int(_S_word_bit);
00145 --_M_p;
00146 }
00147 _M_offset = static_cast<unsigned int>(__n);
00148 }
00149
00150 bool
00151 operator==(const _Bit_iterator_base& __i) const
00152 { return _M_p == __i._M_p && _M_offset == __i._M_offset; }
00153
00154 bool
00155 operator<(const _Bit_iterator_base& __i) const
00156 {
00157 return _M_p < __i._M_p
00158 || (_M_p == __i._M_p && _M_offset < __i._M_offset);
00159 }
00160
00161 bool
00162 operator!=(const _Bit_iterator_base& __i) const
00163 { return !(*this == __i); }
00164
00165 bool
00166 operator>(const _Bit_iterator_base& __i) const
00167 { return __i < *this; }
00168
00169 bool
00170 operator<=(const _Bit_iterator_base& __i) const
00171 { return !(__i < *this); }
00172
00173 bool
00174 operator>=(const _Bit_iterator_base& __i) const
00175 { return !(*this < __i); }
00176 };
00177
00178 inline ptrdiff_t
00179 operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
00180 {
00181 return (int(_S_word_bit) * (__x._M_p - __y._M_p)
00182 + __x._M_offset - __y._M_offset);
00183 }
00184
00185 struct _Bit_iterator : public _Bit_iterator_base
00186 {
00187 typedef _Bit_reference reference;
00188 typedef _Bit_reference* pointer;
00189 typedef _Bit_iterator iterator;
00190
00191 _Bit_iterator() : _Bit_iterator_base(0, 0) { }
00192
00193 _Bit_iterator(_Bit_type * __x, unsigned int __y)
00194 : _Bit_iterator_base(__x, __y) { }
00195
00196 reference
00197 operator*() const
00198 { return reference(_M_p, 1UL << _M_offset); }
00199
00200 iterator&
00201 operator++()
00202 {
00203 _M_bump_up();
00204 return *this;
00205 }
00206
00207 iterator
00208 operator++(int)
00209 {
00210 iterator __tmp = *this;
00211 _M_bump_up();
00212 return __tmp;
00213 }
00214
00215 iterator&
00216 operator--()
00217 {
00218 _M_bump_down();
00219 return *this;
00220 }
00221
00222 iterator
00223 operator--(int)
00224 {
00225 iterator __tmp = *this;
00226 _M_bump_down();
00227 return __tmp;
00228 }
00229
00230 iterator&
00231 operator+=(difference_type __i)
00232 {
00233 _M_incr(__i);
00234 return *this;
00235 }
00236
00237 iterator&
00238 operator-=(difference_type __i)
00239 {
00240 *this += -__i;
00241 return *this;
00242 }
00243
00244 iterator
00245 operator+(difference_type __i) const
00246 {
00247 iterator __tmp = *this;
00248 return __tmp += __i;
00249 }
00250
00251 iterator
00252 operator-(difference_type __i) const
00253 {
00254 iterator __tmp = *this;
00255 return __tmp -= __i;
00256 }
00257
00258 reference
00259 operator[](difference_type __i) const
00260 { return *(*this + __i); }
00261 };
00262
00263 inline _Bit_iterator
00264 operator+(ptrdiff_t __n, const _Bit_iterator& __x)
00265 { return __x + __n; }
00266
00267 struct _Bit_const_iterator : public _Bit_iterator_base
00268 {
00269 typedef bool reference;
00270 typedef bool const_reference;
00271 typedef const bool* pointer;
00272 typedef _Bit_const_iterator const_iterator;
00273
00274 _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }
00275
00276 _Bit_const_iterator(_Bit_type * __x, unsigned int __y)
00277 : _Bit_iterator_base(__x, __y) { }
00278
00279 _Bit_const_iterator(const _Bit_iterator& __x)
00280 : _Bit_iterator_base(__x._M_p, __x._M_offset) { }
00281
00282 const_reference
00283 operator*() const
00284 { return _Bit_reference(_M_p, 1UL << _M_offset); }
00285
00286 const_iterator&
00287 operator++()
00288 {
00289 _M_bump_up();
00290 return *this;
00291 }
00292
00293 const_iterator
00294 operator++(int)
00295 {
00296 const_iterator __tmp = *this;
00297 _M_bump_up();
00298 return __tmp;
00299 }
00300
00301 const_iterator&
00302 operator--()
00303 {
00304 _M_bump_down();
00305 return *this;
00306 }
00307
00308 const_iterator
00309 operator--(int)
00310 {
00311 const_iterator __tmp = *this;
00312 _M_bump_down();
00313 return __tmp;
00314 }
00315
00316 const_iterator&
00317 operator+=(difference_type __i)
00318 {
00319 _M_incr(__i);
00320 return *this;
00321 }
00322
00323 const_iterator&
00324 operator-=(difference_type __i)
00325 {
00326 *this += -__i;
00327 return *this;
00328 }
00329
00330 const_iterator
00331 operator+(difference_type __i) const
00332 {
00333 const_iterator __tmp = *this;
00334 return __tmp += __i;
00335 }
00336
00337 const_iterator
00338 operator-(difference_type __i) const
00339 {
00340 const_iterator __tmp = *this;
00341 return __tmp -= __i;
00342 }
00343
00344 const_reference
00345 operator[](difference_type __i) const
00346 { return *(*this + __i); }
00347 };
00348
00349 inline _Bit_const_iterator
00350 operator+(ptrdiff_t __n, const _Bit_const_iterator& __x)
00351 { return __x + __n; }
00352
00353 inline void
00354 __fill_bvector(_Bit_iterator __first, _Bit_iterator __last, bool __x)
00355 {
00356 for (; __first != __last; ++__first)
00357 *__first = __x;
00358 }
00359
00360 inline void
00361 fill(_Bit_iterator __first, _Bit_iterator __last, const bool& __x)
00362 {
00363 if (__first._M_p != __last._M_p)
00364 {
00365 std::fill(__first._M_p + 1, __last._M_p, __x ? ~0 : 0);
00366 __fill_bvector(__first, _Bit_iterator(__first._M_p + 1, 0), __x);
00367 __fill_bvector(_Bit_iterator(__last._M_p, 0), __last, __x);
00368 }
00369 else
00370 __fill_bvector(__first, __last, __x);
00371 }
00372
00373 template<typename _Alloc>
00374 struct _Bvector_base
00375 {
00376 typedef typename _Alloc::template rebind<_Bit_type>::other
00377 _Bit_alloc_type;
00378
00379 struct _Bvector_impl
00380 : public _Bit_alloc_type
00381 {
00382 _Bit_iterator _M_start;
00383 _Bit_iterator _M_finish;
00384 _Bit_type* _M_end_of_storage;
00385
00386 _Bvector_impl()
00387 : _Bit_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage(0)
00388 { }
00389
00390 _Bvector_impl(const _Bit_alloc_type& __a)
00391 : _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage(0)
00392 { }
00393 };
00394
00395 public:
00396 typedef _Alloc allocator_type;
00397
00398 _Bit_alloc_type&
00399 _M_get_Bit_allocator()
00400 { return *static_cast<_Bit_alloc_type*>(&this->_M_impl); }
00401
00402 const _Bit_alloc_type&
00403 _M_get_Bit_allocator() const
00404 { return *static_cast<const _Bit_alloc_type*>(&this->_M_impl); }
00405
00406 allocator_type
00407 get_allocator() const
00408 { return allocator_type(_M_get_Bit_allocator()); }
00409
00410 _Bvector_base()
00411 : _M_impl() { }
00412
00413 _Bvector_base(const allocator_type& __a)
00414 : _M_impl(__a) { }
00415
00416 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00417 _Bvector_base(_Bvector_base&& __x)
00418 : _M_impl(__x._M_get_Bit_allocator())
00419 {
00420 this->_M_impl._M_start = __x._M_impl._M_start;
00421 this->_M_impl._M_finish = __x._M_impl._M_finish;
00422 this->_M_impl._M_end_of_storage = __x._M_impl._M_end_of_storage;
00423 __x._M_impl._M_start = _Bit_iterator();
00424 __x._M_impl._M_finish = _Bit_iterator();
00425 __x._M_impl._M_end_of_storage = 0;
00426 }
00427 #endif
00428
00429 ~_Bvector_base()
00430 { this->_M_deallocate(); }
00431
00432 protected:
00433 _Bvector_impl _M_impl;
00434
00435 _Bit_type*
00436 _M_allocate(size_t __n)
00437 { return _M_impl.allocate((__n + int(_S_word_bit) - 1)
00438 / int(_S_word_bit)); }
00439
00440 void
00441 _M_deallocate()
00442 {
00443 if (_M_impl._M_start._M_p)
00444 _M_impl.deallocate(_M_impl._M_start._M_p,
00445 _M_impl._M_end_of_storage - _M_impl._M_start._M_p);
00446 }
00447 };
00448
00449 _GLIBCXX_END_NESTED_NAMESPACE
00450
00451
00452 #include <bits/stl_vector.h>
00453
00454 _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 template<typename _Alloc>
00474 class vector<bool, _Alloc> : protected _Bvector_base<_Alloc>
00475 {
00476 typedef _Bvector_base<_Alloc> _Base;
00477
00478 public:
00479 typedef bool value_type;
00480 typedef size_t size_type;
00481 typedef ptrdiff_t difference_type;
00482 typedef _Bit_reference reference;
00483 typedef bool const_reference;
00484 typedef _Bit_reference* pointer;
00485 typedef const bool* const_pointer;
00486 typedef _Bit_iterator iterator;
00487 typedef _Bit_const_iterator const_iterator;
00488 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00489 typedef std::reverse_iterator<iterator> reverse_iterator;
00490 typedef _Alloc allocator_type;
00491
00492 allocator_type get_allocator() const
00493 { return _Base::get_allocator(); }
00494
00495 protected:
00496 using _Base::_M_allocate;
00497 using _Base::_M_deallocate;
00498 using _Base::_M_get_Bit_allocator;
00499
00500 public:
00501 vector()
00502 : _Base() { }
00503
00504 explicit
00505 vector(const allocator_type& __a)
00506 : _Base(__a) { }
00507
00508 explicit
00509 vector(size_type __n, const bool& __value = bool(),
00510 const allocator_type& __a = allocator_type())
00511 : _Base(__a)
00512 {
00513 _M_initialize(__n);
00514 std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_of_storage,
00515 __value ? ~0 : 0);
00516 }
00517
00518 vector(const vector& __x)
00519 : _Base(__x._M_get_Bit_allocator())
00520 {
00521 _M_initialize(__x.size());
00522 _M_copy_aligned(__x.begin(), __x.end(), this->_M_impl._M_start);
00523 }
00524
00525 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00526 vector(vector&& __x)
00527 : _Base(std::forward<_Base>(__x)) { }
00528
00529 vector(initializer_list<bool> __l,
00530 const allocator_type& __a = allocator_type())
00531 : _Base(__a)
00532 {
00533 _M_initialize_range(__l.begin(), __l.end(),
00534 random_access_iterator_tag());
00535 }
00536 #endif
00537
00538 template<typename _InputIterator>
00539 vector(_InputIterator __first, _InputIterator __last,
00540 const allocator_type& __a = allocator_type())
00541 : _Base(__a)
00542 {
00543 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
00544 _M_initialize_dispatch(__first, __last, _Integral());
00545 }
00546
00547 ~vector() { }
00548
00549 vector&
00550 operator=(const vector& __x)
00551 {
00552 if (&__x == this)
00553 return *this;
00554 if (__x.size() > capacity())
00555 {
00556 this->_M_deallocate();
00557 _M_initialize(__x.size());
00558 }
00559 this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
00560 begin());
00561 return *this;
00562 }
00563
00564 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00565 vector&
00566 operator=(vector&& __x)
00567 {
00568
00569 this->clear();
00570 this->swap(__x);
00571 return *this;
00572 }
00573
00574 vector&
00575 operator=(initializer_list<bool> __l)
00576 {
00577 this->assign (__l.begin(), __l.end());
00578 return *this;
00579 }
00580 #endif
00581
00582
00583
00584
00585
00586 void
00587 assign(size_type __n, const bool& __x)
00588 { _M_fill_assign(__n, __x); }
00589
00590 template<typename _InputIterator>
00591 void
00592 assign(_InputIterator __first, _InputIterator __last)
00593 {
00594 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
00595 _M_assign_dispatch(__first, __last, _Integral());
00596 }
00597
00598 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00599 void
00600 assign(initializer_list<bool> __l)
00601 { this->assign(__l.begin(), __l.end()); }
00602 #endif
00603
00604 iterator
00605 begin()
00606 { return this->_M_impl._M_start; }
00607
00608 const_iterator
00609 begin() const
00610 { return this->_M_impl._M_start; }
00611
00612 iterator
00613 end()
00614 { return this->_M_impl._M_finish; }
00615
00616 const_iterator
00617 end() const
00618 { return this->_M_impl._M_finish; }
00619
00620 reverse_iterator
00621 rbegin()
00622 { return reverse_iterator(end()); }
00623
00624 const_reverse_iterator
00625 rbegin() const
00626 { return const_reverse_iterator(end()); }
00627
00628 reverse_iterator
00629 rend()
00630 { return reverse_iterator(begin()); }
00631
00632 const_reverse_iterator
00633 rend() const
00634 { return const_reverse_iterator(begin()); }
00635
00636 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00637 const_iterator
00638 cbegin() const
00639 { return this->_M_impl._M_start; }
00640
00641 const_iterator
00642 cend() const
00643 { return this->_M_impl._M_finish; }
00644
00645 const_reverse_iterator
00646 crbegin() const
00647 { return const_reverse_iterator(end()); }
00648
00649 const_reverse_iterator
00650 crend() const
00651 { return const_reverse_iterator(begin()); }
00652 #endif
00653
00654 size_type
00655 size() const
00656 { return size_type(end() - begin()); }
00657
00658 size_type
00659 max_size() const
00660 {
00661 const size_type __isize =
00662 __gnu_cxx::__numeric_traits<difference_type>::__max
00663 - int(_S_word_bit) + 1;
00664 const size_type __asize = _M_get_Bit_allocator().max_size();
00665 return (__asize <= __isize / int(_S_word_bit)
00666 ? __asize * int(_S_word_bit) : __isize);
00667 }
00668
00669 size_type
00670 capacity() const
00671 { return size_type(const_iterator(this->_M_impl._M_end_of_storage, 0)
00672 - begin()); }
00673
00674 bool
00675 empty() const
00676 { return begin() == end(); }
00677
00678 reference
00679 operator[](size_type __n)
00680 {
00681 return *iterator(this->_M_impl._M_start._M_p
00682 + __n / int(_S_word_bit), __n % int(_S_word_bit));
00683 }
00684
00685 const_reference
00686 operator[](size_type __n) const
00687 {
00688 return *const_iterator(this->_M_impl._M_start._M_p
00689 + __n / int(_S_word_bit), __n % int(_S_word_bit));
00690 }
00691
00692 protected:
00693 void
00694 _M_range_check(size_type __n) const
00695 {
00696 if (__n >= this->size())
00697 __throw_out_of_range(__N("vector<bool>::_M_range_check"));
00698 }
00699
00700 public:
00701 reference
00702 at(size_type __n)
00703 { _M_range_check(__n); return (*this)[__n]; }
00704
00705 const_reference
00706 at(size_type __n) const
00707 { _M_range_check(__n); return (*this)[__n]; }
00708
00709 void
00710 reserve(size_type __n);
00711
00712 reference
00713 front()
00714 { return *begin(); }
00715
00716 const_reference
00717 front() const
00718 { return *begin(); }
00719
00720 reference
00721 back()
00722 { return *(end() - 1); }
00723
00724 const_reference
00725 back() const
00726 { return *(end() - 1); }
00727
00728
00729
00730
00731
00732
00733 void
00734 data() { }
00735
00736 void
00737 push_back(bool __x)
00738 {
00739 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage)
00740 *this->_M_impl._M_finish++ = __x;
00741 else
00742 _M_insert_aux(end(), __x);
00743 }
00744
00745 void
00746 swap(vector& __x)
00747 {
00748 std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
00749 std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
00750 std::swap(this->_M_impl._M_end_of_storage,
00751 __x._M_impl._M_end_of_storage);
00752
00753
00754
00755 std::__alloc_swap<typename _Base::_Bit_alloc_type>::
00756 _S_do_it(_M_get_Bit_allocator(), __x._M_get_Bit_allocator());
00757 }
00758
00759
00760 static void
00761 swap(reference __x, reference __y)
00762 {
00763 bool __tmp = __x;
00764 __x = __y;
00765 __y = __tmp;
00766 }
00767
00768 iterator
00769 insert(iterator __position, const bool& __x = bool())
00770 {
00771 const difference_type __n = __position - begin();
00772 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage
00773 && __position == end())
00774 *this->_M_impl._M_finish++ = __x;
00775 else
00776 _M_insert_aux(__position, __x);
00777 return begin() + __n;
00778 }
00779
00780 template<typename _InputIterator>
00781 void
00782 insert(iterator __position,
00783 _InputIterator __first, _InputIterator __last)
00784 {
00785 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
00786 _M_insert_dispatch(__position, __first, __last, _Integral());
00787 }
00788
00789 void
00790 insert(iterator __position, size_type __n, const bool& __x)
00791 { _M_fill_insert(__position, __n, __x); }
00792
00793 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00794 void insert(iterator __p, initializer_list<bool> __l)
00795 { this->insert(__p, __l.begin(), __l.end()); }
00796 #endif
00797
00798 void
00799 pop_back()
00800 { --this->_M_impl._M_finish; }
00801
00802 iterator
00803 erase(iterator __position)
00804 {
00805 if (__position + 1 != end())
00806 std::copy(__position + 1, end(), __position);
00807 --this->_M_impl._M_finish;
00808 return __position;
00809 }
00810
00811 iterator
00812 erase(iterator __first, iterator __last)
00813 {
00814 _M_erase_at_end(std::copy(__last, end(), __first));
00815 return __first;
00816 }
00817
00818 void
00819 resize(size_type __new_size, bool __x = bool())
00820 {
00821 if (__new_size < size())
00822 _M_erase_at_end(begin() + difference_type(__new_size));
00823 else
00824 insert(end(), __new_size - size(), __x);
00825 }
00826
00827 void
00828 flip()
00829 {
00830 for (_Bit_type * __p = this->_M_impl._M_start._M_p;
00831 __p != this->_M_impl._M_end_of_storage; ++__p)
00832 *__p = ~*__p;
00833 }
00834
00835 void
00836 clear()
00837 { _M_erase_at_end(begin()); }
00838
00839
00840 protected:
00841
00842 iterator
00843 _M_copy_aligned(const_iterator __first, const_iterator __last,
00844 iterator __result)
00845 {
00846 _Bit_type* __q = std::copy(__first._M_p, __last._M_p, __result._M_p);
00847 return std::copy(const_iterator(__last._M_p, 0), __last,
00848 iterator(__q, 0));
00849 }
00850
00851 void
00852 _M_initialize(size_type __n)
00853 {
00854 _Bit_type* __q = this->_M_allocate(__n);
00855 this->_M_impl._M_end_of_storage = (__q
00856 + ((__n + int(_S_word_bit) - 1)
00857 / int(_S_word_bit)));
00858 this->_M_impl._M_start = iterator(__q, 0);
00859 this->_M_impl._M_finish = this->_M_impl._M_start + difference_type(__n);
00860 }
00861
00862
00863
00864
00865
00866 template<typename _Integer>
00867 void
00868 _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
00869 {
00870 _M_initialize(static_cast<size_type>(__n));
00871 std::fill(this->_M_impl._M_start._M_p,
00872 this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
00873 }
00874
00875 template<typename _InputIterator>
00876 void
00877 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
00878 __false_type)
00879 { _M_initialize_range(__first, __last,
00880 std::__iterator_category(__first)); }
00881
00882 template<typename _InputIterator>
00883 void
00884 _M_initialize_range(_InputIterator __first, _InputIterator __last,
00885 std::input_iterator_tag)
00886 {
00887 for (; __first != __last; ++__first)
00888 push_back(*__first);
00889 }
00890
00891 template<typename _ForwardIterator>
00892 void
00893 _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
00894 std::forward_iterator_tag)
00895 {
00896 const size_type __n = std::distance(__first, __last);
00897 _M_initialize(__n);
00898 std::copy(__first, __last, this->_M_impl._M_start);
00899 }
00900
00901
00902
00903 template<typename _Integer>
00904 void
00905 _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
00906 { _M_fill_assign(__n, __val); }
00907
00908 template<class _InputIterator>
00909 void
00910 _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
00911 __false_type)
00912 { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
00913
00914 void
00915 _M_fill_assign(size_t __n, bool __x)
00916 {
00917 if (__n > size())
00918 {
00919 std::fill(this->_M_impl._M_start._M_p,
00920 this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
00921 insert(end(), __n - size(), __x);
00922 }
00923 else
00924 {
00925 _M_erase_at_end(begin() + __n);
00926 std::fill(this->_M_impl._M_start._M_p,
00927 this->_M_impl._M_end_of_storage, __x ? ~0 : 0);
00928 }
00929 }
00930
00931 template<typename _InputIterator>
00932 void
00933 _M_assign_aux(_InputIterator __first, _InputIterator __last,
00934 std::input_iterator_tag)
00935 {
00936 iterator __cur = begin();
00937 for (; __first != __last && __cur != end(); ++__cur, ++__first)
00938 *__cur = *__first;
00939 if (__first == __last)
00940 _M_erase_at_end(__cur);
00941 else
00942 insert(end(), __first, __last);
00943 }
00944
00945 template<typename _ForwardIterator>
00946 void
00947 _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
00948 std::forward_iterator_tag)
00949 {
00950 const size_type __len = std::distance(__first, __last);
00951 if (__len < size())
00952 _M_erase_at_end(std::copy(__first, __last, begin()));
00953 else
00954 {
00955 _ForwardIterator __mid = __first;
00956 std::advance(__mid, size());
00957 std::copy(__first, __mid, begin());
00958 insert(end(), __mid, __last);
00959 }
00960 }
00961
00962
00963
00964
00965
00966 template<typename _Integer>
00967 void
00968 _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
00969 __true_type)
00970 { _M_fill_insert(__pos, __n, __x); }
00971
00972 template<typename _InputIterator>
00973 void
00974 _M_insert_dispatch(iterator __pos,
00975 _InputIterator __first, _InputIterator __last,
00976 __false_type)
00977 { _M_insert_range(__pos, __first, __last,
00978 std::__iterator_category(__first)); }
00979
00980 void
00981 _M_fill_insert(iterator __position, size_type __n, bool __x);
00982
00983 template<typename _InputIterator>
00984 void
00985 _M_insert_range(iterator __pos, _InputIterator __first,
00986 _InputIterator __last, std::input_iterator_tag)
00987 {
00988 for (; __first != __last; ++__first)
00989 {
00990 __pos = insert(__pos, *__first);
00991 ++__pos;
00992 }
00993 }
00994
00995 template<typename _ForwardIterator>
00996 void
00997 _M_insert_range(iterator __position, _ForwardIterator __first,
00998 _ForwardIterator __last, std::forward_iterator_tag);
00999
01000 void
01001 _M_insert_aux(iterator __position, bool __x);
01002
01003 size_type
01004 _M_check_len(size_type __n, const char* __s) const
01005 {
01006 if (max_size() - size() < __n)
01007 __throw_length_error(__N(__s));
01008
01009 const size_type __len = size() + std::max(size(), __n);
01010 return (__len < size() || __len > max_size()) ? max_size() : __len;
01011 }
01012
01013 void
01014 _M_erase_at_end(iterator __pos)
01015 { this->_M_impl._M_finish = __pos; }
01016 };
01017
01018 _GLIBCXX_END_NESTED_NAMESPACE
01019
01020 #endif