Whole document tree
    

Whole document tree

stl_bvector.h Source File
Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

stl_bvector.h

Go to the documentation of this file.
00001 // bit_vector and vector<bool> specialization -*- C++ -*-
00002 
00003 // Copyright (C) 2001 Free Software Foundation, Inc.
00004 //
00005 // This file is part of the GNU ISO C++ Library.  This library is free
00006 // software; you can redistribute it and/or modify it under the
00007 // terms of the GNU General Public License as published by the
00008 // Free Software Foundation; either version 2, or (at your option)
00009 // any later version.
00010 
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 // GNU General Public License for more details.
00015 
00016 // You should have received a copy of the GNU General Public License along
00017 // with this library; see the file COPYING.  If not, write to the Free
00018 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
00019 // USA.
00020 
00021 // As a special exception, you may use this file as part of a free software
00022 // library without restriction.  Specifically, if other files instantiate
00023 // templates or use macros or inline functions from this file, or you compile
00024 // this file and link it with other files to produce an executable, this
00025 // file does not by itself cause the resulting executable to be covered by
00026 // the GNU General Public License.  This exception does not however
00027 // invalidate any other reasons why the executable file might be covered by
00028 // the GNU General Public License.
00029 
00030 /*
00031  *
00032  * Copyright (c) 1994
00033  * Hewlett-Packard Company
00034  *
00035  * Permission to use, copy, modify, distribute and sell this software
00036  * and its documentation for any purpose is hereby granted without fee,
00037  * provided that the above copyright notice appear in all copies and
00038  * that both that copyright notice and this permission notice appear
00039  * in supporting documentation.  Hewlett-Packard Company makes no
00040  * representations about the suitability of this software for any
00041  * purpose.  It is provided "as is" without express or implied warranty.
00042  *
00043  *
00044  * Copyright (c) 1996-1999
00045  * Silicon Graphics Computer Systems, Inc.
00046  *
00047  * Permission to use, copy, modify, distribute and sell this software
00048  * and its documentation for any purpose is hereby granted without fee,
00049  * provided that the above copyright notice appear in all copies and
00050  * that both that copyright notice and this permission notice appear
00051  * in supporting documentation.  Silicon Graphics makes no
00052  * representations about the suitability of this software for any
00053  * purpose.  It is provided "as is" without express or implied warranty.
00054  */
00055 
00056 /* NOTE: This is an internal header file, included by other STL headers.
00057  *   You should not attempt to use it directly.
00058  */
00059 
00060 #ifndef __SGI_STL_INTERNAL_BVECTOR_H
00061 #define __SGI_STL_INTERNAL_BVECTOR_H
00062 
00063 namespace std
00064 { 
00065 
00066 static const int __WORD_BIT = int(CHAR_BIT*sizeof(unsigned int));
00067 
00068 struct _Bit_reference {
00069   unsigned int* _M_p;
00070   unsigned int _M_mask;
00071   _Bit_reference(unsigned int* __x, unsigned int __y) 
00072     : _M_p(__x), _M_mask(__y) {}
00073 
00074 public:
00075   _Bit_reference() : _M_p(0), _M_mask(0) {}
00076   operator bool() const { return !(!(*_M_p & _M_mask)); }
00077   _Bit_reference& operator=(bool __x)
00078   {
00079     if (__x)  *_M_p |= _M_mask;
00080     else      *_M_p &= ~_M_mask;
00081     return *this;
00082   }
00083   _Bit_reference& operator=(const _Bit_reference& __x) 
00084     { return *this = bool(__x); }
00085   bool operator==(const _Bit_reference& __x) const
00086     { return bool(*this) == bool(__x); }
00087   bool operator<(const _Bit_reference& __x) const {
00088     return !bool(*this) && bool(__x);
00089   }
00090   void flip() { *_M_p ^= _M_mask; }
00091 };
00092 
00093 inline void swap(_Bit_reference __x, _Bit_reference __y)
00094 {
00095   bool __tmp = __x;
00096   __x = __y;
00097   __y = __tmp;
00098 }
00099 
00100 struct _Bit_iterator_base : public random_access_iterator<bool, ptrdiff_t> 
00101 {
00102   unsigned int* _M_p;
00103   unsigned int _M_offset;
00104 
00105   _Bit_iterator_base(unsigned int* __x, unsigned int __y)
00106     : _M_p(__x), _M_offset(__y) {}
00107 
00108   void _M_bump_up() {
00109     if (_M_offset++ == __WORD_BIT - 1) {
00110       _M_offset = 0;
00111       ++_M_p;
00112     }
00113   }
00114   void _M_bump_down() {
00115     if (_M_offset-- == 0) {
00116       _M_offset = __WORD_BIT - 1;
00117       --_M_p;
00118     }
00119   }
00120 
00121   void _M_incr(ptrdiff_t __i) {
00122     difference_type __n = __i + _M_offset;
00123     _M_p += __n / __WORD_BIT;
00124     __n = __n % __WORD_BIT;
00125     if (__n < 0) {
00126       _M_offset = (unsigned int) __n + __WORD_BIT;
00127       --_M_p;
00128     } else
00129       _M_offset = (unsigned int) __n;
00130   }
00131 
00132   bool operator==(const _Bit_iterator_base& __i) const {
00133     return _M_p == __i._M_p && _M_offset == __i._M_offset;
00134   }
00135   bool operator<(const _Bit_iterator_base& __i) const {
00136     return _M_p < __i._M_p || (_M_p == __i._M_p && _M_offset < __i._M_offset);
00137   }
00138   bool operator!=(const _Bit_iterator_base& __i) const {
00139     return !(*this == __i);
00140   }
00141   bool operator>(const _Bit_iterator_base& __i) const {
00142     return __i < *this;
00143   }
00144   bool operator<=(const _Bit_iterator_base& __i) const {
00145     return !(__i < *this); 
00146   }
00147   bool operator>=(const _Bit_iterator_base& __i) const {
00148     return !(*this < __i);
00149   }
00150 };
00151 
00152 inline ptrdiff_t
00153 operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
00154   return __WORD_BIT * (__x._M_p - __y._M_p) + __x._M_offset - __y._M_offset;
00155 }
00156 
00157 
00158 struct _Bit_iterator : public _Bit_iterator_base
00159 {
00160   typedef _Bit_reference  reference;
00161   typedef _Bit_reference* pointer;
00162   typedef _Bit_iterator   iterator;
00163 
00164   _Bit_iterator() : _Bit_iterator_base(0, 0) {}
00165   _Bit_iterator(unsigned int* __x, unsigned int __y) 
00166     : _Bit_iterator_base(__x, __y) {}
00167 
00168   reference operator*() const { return reference(_M_p, 1U << _M_offset); }
00169   iterator& operator++() {
00170     _M_bump_up();
00171     return *this;
00172   }
00173   iterator operator++(int) {
00174     iterator __tmp = *this;
00175     _M_bump_up();
00176     return __tmp;
00177   }
00178   iterator& operator--() {
00179     _M_bump_down();
00180     return *this;
00181   }
00182   iterator operator--(int) {
00183     iterator __tmp = *this;
00184     _M_bump_down();
00185     return __tmp;
00186   }
00187   iterator& operator+=(difference_type __i) {
00188     _M_incr(__i);
00189     return *this;
00190   }
00191   iterator& operator-=(difference_type __i) {
00192     *this += -__i;
00193     return *this;
00194   }
00195   iterator operator+(difference_type __i) const {
00196     iterator __tmp = *this;
00197     return __tmp += __i;
00198   }
00199   iterator operator-(difference_type __i) const {
00200     iterator __tmp = *this;
00201     return __tmp -= __i;
00202   }
00203 
00204   reference operator[](difference_type __i) { return *(*this + __i); }
00205 };
00206 
00207 inline _Bit_iterator 
00208 operator+(ptrdiff_t __n, const _Bit_iterator& __x) { return __x + __n; }
00209 
00210 
00211 struct _Bit_const_iterator : public _Bit_iterator_base
00212 {
00213   typedef bool                 reference;
00214   typedef bool                 const_reference;
00215   typedef const bool*          pointer;
00216   typedef _Bit_const_iterator  const_iterator;
00217 
00218   _Bit_const_iterator() : _Bit_iterator_base(0, 0) {}
00219   _Bit_const_iterator(unsigned int* __x, unsigned int __y) 
00220     : _Bit_iterator_base(__x, __y) {}
00221   _Bit_const_iterator(const _Bit_iterator& __x) 
00222     : _Bit_iterator_base(__x._M_p, __x._M_offset) {}
00223 
00224   const_reference operator*() const {
00225     return _Bit_reference(_M_p, 1U << _M_offset);
00226   }
00227   const_iterator& operator++() {
00228     _M_bump_up();
00229     return *this;
00230   }
00231   const_iterator operator++(int) {
00232     const_iterator __tmp = *this;
00233     _M_bump_up();
00234     return __tmp;
00235   }
00236   const_iterator& operator--() {
00237     _M_bump_down();
00238     return *this;
00239   }
00240   const_iterator operator--(int) {
00241     const_iterator __tmp = *this;
00242     _M_bump_down();
00243     return __tmp;
00244   }
00245   const_iterator& operator+=(difference_type __i) {
00246     _M_incr(__i);
00247     return *this;
00248   }
00249   const_iterator& operator-=(difference_type __i) {
00250     *this += -__i;
00251     return *this;
00252   }
00253   const_iterator operator+(difference_type __i) const {
00254     const_iterator __tmp = *this;
00255     return __tmp += __i;
00256   }
00257   const_iterator operator-(difference_type __i) const {
00258     const_iterator __tmp = *this;
00259     return __tmp -= __i;
00260   }
00261   const_reference operator[](difference_type __i) { 
00262     return *(*this + __i); 
00263   }
00264 };
00265 
00266 inline _Bit_const_iterator 
00267 operator+(ptrdiff_t __n, const _Bit_const_iterator& __x) { return __x + __n; }
00268 
00269 
00270 // Bit-vector base class, which encapsulates the difference between
00271 // old SGI-style allocators and standard-conforming allocators.
00272 
00273 // Base class for ordinary allocators.
00274 template <class _Allocator, bool __is_static>
00275 class _Bvector_alloc_base {
00276 public:
00277   typedef typename _Alloc_traits<bool, _Allocator>::allocator_type
00278           allocator_type;
00279   allocator_type get_allocator() const { return _M_data_allocator; }
00280 
00281   _Bvector_alloc_base(const allocator_type& __a)
00282     : _M_data_allocator(__a), _M_start(), _M_finish(), _M_end_of_storage(0) {}
00283 
00284 protected:
00285   unsigned int* _M_bit_alloc(size_t __n) 
00286     { return _M_data_allocator.allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
00287   void _M_deallocate() {
00288     if (_M_start._M_p)
00289       _M_data_allocator.deallocate(_M_start._M_p, 
00290                                    _M_end_of_storage - _M_start._M_p);
00291   }  
00292 
00293   typename _Alloc_traits<unsigned int, _Allocator>::allocator_type 
00294           _M_data_allocator;
00295   _Bit_iterator _M_start;
00296   _Bit_iterator _M_finish;
00297   unsigned int* _M_end_of_storage;
00298 };
00299 
00300 // Specialization for instanceless allocators.
00301 template <class _Allocator>
00302 class _Bvector_alloc_base<_Allocator, true> {
00303 public:
00304   typedef typename _Alloc_traits<bool, _Allocator>::allocator_type
00305           allocator_type;
00306   allocator_type get_allocator() const { return allocator_type(); }
00307 
00308   _Bvector_alloc_base(const allocator_type&)
00309     : _M_start(), _M_finish(), _M_end_of_storage(0) {}
00310 
00311 protected:
00312   typedef typename _Alloc_traits<unsigned int, _Allocator>::_Alloc_type
00313           _Alloc_type;
00314           
00315   unsigned int* _M_bit_alloc(size_t __n) 
00316     { return _Alloc_type::allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
00317   void _M_deallocate() {
00318     if (_M_start._M_p)
00319       _Alloc_type::deallocate(_M_start._M_p,
00320                               _M_end_of_storage - _M_start._M_p);
00321   }  
00322 
00323   _Bit_iterator _M_start;
00324   _Bit_iterator _M_finish;
00325   unsigned int* _M_end_of_storage;
00326 };  
00327 
00328 template <class _Alloc>
00329 class _Bvector_base
00330   : public _Bvector_alloc_base<_Alloc,
00331                                _Alloc_traits<bool, _Alloc>::_S_instanceless>
00332 {
00333   typedef _Bvector_alloc_base<_Alloc,
00334                               _Alloc_traits<bool, _Alloc>::_S_instanceless>
00335           _Base;
00336 public:
00337   typedef typename _Base::allocator_type allocator_type;
00338 
00339   _Bvector_base(const allocator_type& __a) : _Base(__a) {}
00340   ~_Bvector_base() { _Base::_M_deallocate(); }
00341 };
00342 
00343 } // namespace std
00344 
00345 // Declare a partial specialization of vector<T, Alloc>.
00346 #include <bits/stl_vector.h>
00347 namespace std
00348 {
00349 
00350 template <typename _Alloc> 
00351   class vector<bool, _Alloc> : public _Bvector_base<_Alloc> 
00352   {
00353   public:
00354     typedef bool value_type;
00355     typedef size_t size_type;
00356     typedef ptrdiff_t difference_type; 
00357     typedef _Bit_reference reference;
00358     typedef bool const_reference;
00359     typedef _Bit_reference* pointer;
00360     typedef const bool* const_pointer;
00361   
00362     typedef _Bit_iterator                iterator;
00363     typedef _Bit_const_iterator          const_iterator;
00364   
00365     typedef reverse_iterator<const_iterator> const_reverse_iterator;
00366     typedef reverse_iterator<iterator> reverse_iterator;
00367   
00368     typedef typename _Bvector_base<_Alloc>::allocator_type allocator_type;
00369     allocator_type get_allocator() const {
00370       return _Bvector_base<_Alloc>::get_allocator();
00371     }
00372   
00373   protected:
00374     using _Bvector_base<_Alloc>::_M_bit_alloc;
00375     using _Bvector_base<_Alloc>::_M_deallocate;
00376     using _Bvector_base<_Alloc>::_M_start;
00377     using _Bvector_base<_Alloc>::_M_finish;
00378     using _Bvector_base<_Alloc>::_M_end_of_storage;
00379   
00380   protected:
00381     void _M_initialize(size_type __n) {
00382       unsigned int* __q = _M_bit_alloc(__n);
00383       _M_end_of_storage = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
00384       _M_start = iterator(__q, 0);
00385       _M_finish = _M_start + difference_type(__n);
00386     }
00387     void _M_insert_aux(iterator __position, bool __x) {
00388       if (_M_finish._M_p != _M_end_of_storage) {
00389         copy_backward(__position, _M_finish, _M_finish + 1);
00390         *__position = __x;
00391         ++_M_finish;
00392       }
00393       else {
00394         size_type __len = size() ? 2 * size() : __WORD_BIT;
00395         unsigned int* __q = _M_bit_alloc(__len);
00396         iterator __i = copy(begin(), __position, iterator(__q, 0));
00397         *__i++ = __x;
00398         _M_finish = copy(__position, end(), __i);
00399         _M_deallocate();
00400         _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
00401         _M_start = iterator(__q, 0);
00402       }
00403     }
00404   
00405     template <class _InputIterator>
00406     void _M_initialize_range(_InputIterator __first, _InputIterator __last,
00407                              input_iterator_tag) {
00408       _M_start = iterator();
00409       _M_finish = iterator();
00410       _M_end_of_storage = 0;
00411       for ( ; __first != __last; ++__first) 
00412         push_back(*__first);
00413     }
00414   
00415     template <class _ForwardIterator>
00416     void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
00417                              forward_iterator_tag) {
00418       size_type __n = 0;
00419       distance(__first, __last, __n);
00420       _M_initialize(__n);
00421       copy(__first, __last, _M_start);
00422     }
00423   
00424     template <class _InputIterator>
00425     void _M_insert_range(iterator __pos,
00426                          _InputIterator __first, _InputIterator __last,
00427                          input_iterator_tag) {
00428       for ( ; __first != __last; ++__first) {
00429         __pos = insert(__pos, *__first);
00430         ++__pos;
00431       }
00432     }
00433   
00434     template <class _ForwardIterator>
00435     void _M_insert_range(iterator __position,
00436                          _ForwardIterator __first, _ForwardIterator __last,
00437                          forward_iterator_tag) {
00438       if (__first != __last) {
00439         size_type __n = 0;
00440         distance(__first, __last, __n);
00441         if (capacity() - size() >= __n) {
00442           copy_backward(__position, end(), _M_finish + difference_type(__n));
00443           copy(__first, __last, __position);
00444           _M_finish += difference_type(__n);
00445         }
00446         else {
00447           size_type __len = size() + max(size(), __n);
00448           unsigned int* __q = _M_bit_alloc(__len);
00449           iterator __i = copy(begin(), __position, iterator(__q, 0));
00450           __i = copy(__first, __last, __i);
00451           _M_finish = copy(__position, end(), __i);
00452           _M_deallocate();
00453           _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
00454           _M_start = iterator(__q, 0);
00455         }
00456       }
00457     }      
00458   
00459   public:
00460     iterator begin() { return _M_start; }
00461     const_iterator begin() const { return _M_start; }
00462     iterator end() { return _M_finish; }
00463     const_iterator end() const { return _M_finish; }
00464   
00465     reverse_iterator rbegin() { return reverse_iterator(end()); }
00466     const_reverse_iterator rbegin() const { 
00467       return const_reverse_iterator(end()); 
00468     }
00469     reverse_iterator rend() { return reverse_iterator(begin()); }
00470     const_reverse_iterator rend() const { 
00471       return const_reverse_iterator(begin()); 
00472     }
00473   
00474     size_type size() const { return size_type(end() - begin()); }
00475     size_type max_size() const { return size_type(-1); }
00476     size_type capacity() const {
00477       return size_type(const_iterator(_M_end_of_storage, 0) - begin());
00478     }
00479     bool empty() const { return begin() == end(); }
00480   
00481     reference operator[](size_type __n)
00482       { return *(begin() + difference_type(__n)); }
00483     const_reference operator[](size_type __n) const
00484       { return *(begin() + difference_type(__n)); }
00485   
00486     void _M_range_check(size_type __n) const {
00487       if (__n >= this->size())
00488         __throw_range_error("vector<bool>");
00489     }
00490   
00491     reference at(size_type __n)
00492       { _M_range_check(__n); return (*this)[__n]; }
00493     const_reference at(size_type __n) const
00494       { _M_range_check(__n); return (*this)[__n]; }
00495   
00496     explicit vector(const allocator_type& __a = allocator_type())
00497       : _Bvector_base<_Alloc>(__a) {}
00498   
00499     vector(size_type __n, bool __value,
00500               const allocator_type& __a = allocator_type())
00501       : _Bvector_base<_Alloc>(__a)
00502     {
00503       _M_initialize(__n);
00504       fill(_M_start._M_p, _M_end_of_storage, __value ? ~0 : 0);
00505     }
00506   
00507     explicit vector(size_type __n)
00508       : _Bvector_base<_Alloc>(allocator_type())
00509     {
00510       _M_initialize(__n);
00511       fill(_M_start._M_p, _M_end_of_storage, 0);
00512     }
00513   
00514     vector(const vector& __x) : _Bvector_base<_Alloc>(__x.get_allocator()) {
00515       _M_initialize(__x.size());
00516       copy(__x.begin(), __x.end(), _M_start);
00517     }
00518   
00519     // Check whether it's an integral type.  If so, it's not an iterator.
00520   
00521     template <class _Integer>
00522     void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) {
00523       _M_initialize(__n);
00524       fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);
00525     }
00526   
00527     template <class _InputIterator>
00528     void _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
00529                                 __false_type) {
00530       _M_initialize_range(__first, __last, __iterator_category(__first));
00531     }
00532   
00533     template <class _InputIterator>
00534     vector(_InputIterator __first, _InputIterator __last,
00535              const allocator_type& __a = allocator_type())
00536       : _Bvector_base<_Alloc>(__a)
00537     {
00538       typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
00539       _M_initialize_dispatch(__first, __last, _Integral());
00540     }
00541       
00542     ~vector() { }
00543   
00544     vector& operator=(const vector& __x) {
00545       if (&__x == this) return *this;
00546       if (__x.size() > capacity()) {
00547         _M_deallocate();
00548         _M_initialize(__x.size());
00549       }
00550       copy(__x.begin(), __x.end(), begin());
00551       _M_finish = begin() + difference_type(__x.size());
00552       return *this;
00553     }
00554   
00555     // assign(), a generalized assignment member function.  Two
00556     // versions: one that takes a count, and one that takes a range.
00557     // The range version is a member template, so we dispatch on whether
00558     // or not the type is an integer.
00559   
00560     void _M_fill_assign(size_t __n, bool __x) {
00561       if (__n > size()) {
00562         fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);
00563         insert(end(), __n - size(), __x);
00564       }
00565       else {
00566         erase(begin() + __n, end());
00567         fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);
00568       }
00569     }
00570   
00571     void assign(size_t __n, bool __x) { _M_fill_assign(__n, __x); }
00572   
00573     template <class _InputIterator>
00574     void assign(_InputIterator __first, _InputIterator __last) {
00575       typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
00576       _M_assign_dispatch(__first, __last, _Integral());
00577     }
00578   
00579     template <class _Integer>
00580     void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
00581       { _M_fill_assign((size_t) __n, (bool) __val); }
00582   
00583     template <class _InputIter>
00584     void _M_assign_dispatch(_InputIter __first, _InputIter __last, __false_type)
00585       { _M_assign_aux(__first, __last, __iterator_category(__first)); }
00586   
00587     template <class _InputIterator>
00588     void _M_assign_aux(_InputIterator __first, _InputIterator __last,
00589                        input_iterator_tag) {
00590       iterator __cur = begin();
00591       for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
00592         *__cur = *__first;
00593       if (__first == __last)
00594         erase(__cur, end());
00595       else
00596         insert(end(), __first, __last);
00597     }
00598   
00599     template <class _ForwardIterator>
00600     void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
00601                        forward_iterator_tag) {
00602       size_type __len = 0;
00603       distance(__first, __last, __len);
00604       if (__len < size())
00605         erase(copy(__first, __last, begin()), end());
00606       else {
00607         _ForwardIterator __mid = __first;
00608         advance(__mid, size());
00609         copy(__first, __mid, begin());
00610         insert(end(), __mid, __last);
00611       }
00612     }    
00613   
00614     void reserve(size_type __n) {
00615       if (capacity() < __n) {
00616         unsigned int* __q = _M_bit_alloc(__n);
00617         _M_finish = copy(begin(), end(), iterator(__q, 0));
00618         _M_deallocate();
00619         _M_start = iterator(__q, 0);
00620         _M_end_of_storage = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
00621       }
00622     }
00623   
00624     reference front() { return *begin(); }
00625     const_reference front() const { return *begin(); }
00626     reference back() { return *(end() - 1); }
00627     const_reference back() const { return *(end() - 1); }
00628     void push_back(bool __x) {
00629       if (_M_finish._M_p != _M_end_of_storage)
00630         *_M_finish++ = __x;
00631       else
00632         _M_insert_aux(end(), __x);
00633     }
00634     void swap(vector<bool, _Alloc>& __x) {
00635       std::swap(_M_start, __x._M_start);
00636       std::swap(_M_finish, __x._M_finish);
00637       std::swap(_M_end_of_storage, __x._M_end_of_storage);
00638     }
00639     iterator insert(iterator __position, bool __x = bool()) {
00640       difference_type __n = __position - begin();
00641       if (_M_finish._M_p != _M_end_of_storage && __position == end())
00642         *_M_finish++ = __x;
00643       else
00644         _M_insert_aux(__position, __x);
00645       return begin() + __n;
00646     }
00647   
00648     // Check whether it's an integral type.  If so, it's not an iterator.
00649   
00650     template <class _Integer>
00651     void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
00652                             __true_type) {
00653       _M_fill_insert(__pos, __n, __x);
00654     }
00655   
00656     template <class _InputIterator>
00657     void _M_insert_dispatch(iterator __pos,
00658                             _InputIterator __first, _InputIterator __last,
00659                             __false_type) {
00660       _M_insert_range(__pos, __first, __last, __iterator_category(__first));
00661     }
00662   
00663     template <class _InputIterator>
00664     void insert(iterator __position,
00665                 _InputIterator __first, _InputIterator __last) {
00666       typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
00667       _M_insert_dispatch(__position, __first, __last, _Integral());
00668     }
00669   
00670     void _M_fill_insert(iterator __position, size_type __n, bool __x) {
00671       if (__n == 0) return;
00672       if (capacity() - size() >= __n) {
00673         copy_backward(__position, end(), _M_finish + difference_type(__n));
00674         fill(__position, __position + difference_type(__n), __x);
00675         _M_finish += difference_type(__n);
00676       }
00677       else {
00678         size_type __len = size() + max(size(), __n);
00679         unsigned int* __q = _M_bit_alloc(__len);
00680         iterator __i = copy(begin(), __position, iterator(__q, 0));
00681         fill_n(__i, __n, __x);
00682         _M_finish = copy(__position, end(), __i + difference_type(__n));
00683         _M_deallocate();
00684         _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
00685         _M_start = iterator(__q, 0);
00686       }
00687     }
00688   
00689     void insert(iterator __position, size_type __n, bool __x) {
00690       _M_fill_insert(__position, __n, __x);
00691     }
00692   
00693     void pop_back() { --_M_finish; }
00694     iterator erase(iterator __position) {
00695       if (__position + 1 != end())
00696         copy(__position + 1, end(), __position);
00697         --_M_finish;
00698       return __position;
00699     }
00700     iterator erase(iterator __first, iterator __last) {
00701       _M_finish = copy(__last, end(), __first);
00702       return __first;
00703     }
00704     void resize(size_type __new_size, bool __x = bool()) {
00705       if (__new_size < size()) 
00706         erase(begin() + difference_type(__new_size), end());
00707       else
00708         insert(end(), __new_size - size(), __x);
00709     }
00710     void flip() {
00711       for (unsigned int* __p = _M_start._M_p; __p != _M_end_of_storage; ++__p)
00712         *__p = ~*__p;
00713     }
00714   
00715     void clear() { erase(begin(), end()); }
00716   };
00717 
00718 // This typedef is non-standard.  It is provided for backward compatibility.
00719 typedef vector<bool, alloc> bit_vector;
00720 
00721 } // namespace std 
00722 
00723 #endif /* __SGI_STL_INTERNAL_BVECTOR_H */
00724 
00725 // Local Variables:
00726 // mode:C++
00727 // End:

Generated on Mon Apr 8 03:11:38 2002 for libstdc++-v3 Source by doxygen1.2.15