stl_bvector.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:25k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996,1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_BVECTOR_H
  30. #define __SGI_STL_INTERNAL_BVECTOR_H
  31. __STL_BEGIN_NAMESPACE 
  32. static const int __WORD_BIT = int(CHAR_BIT*sizeof(unsigned int));
  33. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  34. #pragma set woff 1174
  35. #pragma set woff 1375
  36. #endif
  37. struct _Bit_reference {
  38.   unsigned int* _M_p;
  39.   unsigned int _M_mask;
  40.   _Bit_reference(unsigned int* __x, unsigned int __y) 
  41.     : _M_p(__x), _M_mask(__y) {}
  42. public:
  43.   _Bit_reference() : _M_p(0), _M_mask(0) {}
  44.   operator bool() const { return !(!(*_M_p & _M_mask)); }
  45.   _Bit_reference& operator=(bool __x)
  46.   {
  47.     if (__x)  *_M_p |= _M_mask;
  48.     else      *_M_p &= ~_M_mask;
  49.     return *this;
  50.   }
  51.   _Bit_reference& operator=(const _Bit_reference& __x) 
  52.     { return *this = bool(__x); }
  53.   bool operator==(const _Bit_reference& __x) const
  54.     { return bool(*this) == bool(__x); }
  55.   bool operator<(const _Bit_reference& __x) const {
  56.     return !bool(*this) && bool(__x);
  57.   }
  58.   void flip() { *_M_p ^= _M_mask; }
  59. };
  60. inline void swap(_Bit_reference __x, _Bit_reference __y)
  61. {
  62.   bool __tmp = __x;
  63.   __x = __y;
  64.   __y = __tmp;
  65. }
  66. struct _Bit_iterator : public random_access_iterator<bool, ptrdiff_t> {
  67.   typedef _Bit_reference  reference;
  68.   typedef _Bit_reference* pointer;
  69.   typedef _Bit_iterator   iterator;
  70.   unsigned int* _M_p;
  71.   unsigned int _M_offset;
  72.   void bump_up() {
  73.     if (_M_offset++ == __WORD_BIT - 1) {
  74.       _M_offset = 0;
  75.       ++_M_p;
  76.     }
  77.   }
  78.   void bump_down() {
  79.     if (_M_offset-- == 0) {
  80.       _M_offset = __WORD_BIT - 1;
  81.       --_M_p;
  82.     }
  83.   }
  84.   _Bit_iterator() : _M_p(0), _M_offset(0) {}
  85.   _Bit_iterator(unsigned int* __x, unsigned int __y) 
  86.     : _M_p(__x), _M_offset(__y) {}
  87.   reference operator*() const { return reference(_M_p, 1U << _M_offset); }
  88.   iterator& operator++() {
  89.     bump_up();
  90.     return *this;
  91.   }
  92.   iterator operator++(int) {
  93.     iterator __tmp = *this;
  94.     bump_up();
  95.     return __tmp;
  96.   }
  97.   iterator& operator--() {
  98.     bump_down();
  99.     return *this;
  100.   }
  101.   iterator operator--(int) {
  102.     iterator __tmp = *this;
  103.     bump_down();
  104.     return __tmp;
  105.   }
  106.   iterator& operator+=(difference_type __i) {
  107.     difference_type __n = __i + _M_offset;
  108.     _M_p += __n / __WORD_BIT;
  109.     __n = __n % __WORD_BIT;
  110.     if (__n < 0) {
  111.       _M_offset = (unsigned int) __n + __WORD_BIT;
  112.       --_M_p;
  113.     } else
  114.       _M_offset = (unsigned int) __n;
  115.     return *this;
  116.   }
  117.   iterator& operator-=(difference_type __i) {
  118.     *this += -__i;
  119.     return *this;
  120.   }
  121.   iterator operator+(difference_type __i) const {
  122.     iterator __tmp = *this;
  123.     return __tmp += __i;
  124.   }
  125.   iterator operator-(difference_type __i) const {
  126.     iterator __tmp = *this;
  127.     return __tmp -= __i;
  128.   }
  129.   difference_type operator-(iterator __x) const {
  130.     return __WORD_BIT * (_M_p - __x._M_p) + _M_offset - __x._M_offset;
  131.   }
  132.   reference operator[](difference_type __i) { return *(*this + __i); }
  133.   bool operator==(const iterator& __x) const {
  134.     return _M_p == __x._M_p && _M_offset == __x._M_offset;
  135.   }
  136.   bool operator!=(const iterator& __x) const {
  137.     return _M_p != __x._M_p || _M_offset != __x._M_offset;
  138.   }
  139.   bool operator<(iterator __x) const {
  140.     return _M_p < __x._M_p || (_M_p == __x._M_p && _M_offset < __x._M_offset);
  141.   }
  142. };
  143. struct _Bit_const_iterator
  144.   : public random_access_iterator<bool, ptrdiff_t>
  145. {
  146.   typedef bool                 reference;
  147.   typedef bool                 const_reference;
  148.   typedef const bool*          pointer;
  149.   typedef _Bit_const_iterator  const_iterator;
  150.   unsigned int* _M_p;
  151.   unsigned int _M_offset;
  152.   void bump_up() {
  153.     if (_M_offset++ == __WORD_BIT - 1) {
  154.       _M_offset = 0;
  155.       ++_M_p;
  156.     }
  157.   }
  158.   void bump_down() {
  159.     if (_M_offset-- == 0) {
  160.       _M_offset = __WORD_BIT - 1;
  161.       --_M_p;
  162.     }
  163.   }
  164.   _Bit_const_iterator() : _M_p(0), _M_offset(0) {}
  165.   _Bit_const_iterator(unsigned int* __x, unsigned int __y) 
  166.     : _M_p(__x), _M_offset(__y) {}
  167.   _Bit_const_iterator(const _Bit_iterator& __x) 
  168.     : _M_p(__x._M_p), _M_offset(__x._M_offset) {}
  169.   const_reference operator*() const {
  170.     return _Bit_reference(_M_p, 1U << _M_offset);
  171.   }
  172.   const_iterator& operator++() {
  173.     bump_up();
  174.     return *this;
  175.   }
  176.   const_iterator operator++(int) {
  177.     const_iterator __tmp = *this;
  178.     bump_up();
  179.     return __tmp;
  180.   }
  181.   const_iterator& operator--() {
  182.     bump_down();
  183.     return *this;
  184.   }
  185.   const_iterator operator--(int) {
  186.     const_iterator __tmp = *this;
  187.     bump_down();
  188.     return __tmp;
  189.   }
  190.   const_iterator& operator+=(difference_type __i) {
  191.     difference_type __n = __i + _M_offset;
  192.     _M_p += __n / __WORD_BIT;
  193.     __n = __n % __WORD_BIT;
  194.     if (__n < 0) {
  195.       _M_offset = (unsigned int) __n + __WORD_BIT;
  196.       --_M_p;
  197.     } else
  198.       _M_offset = (unsigned int) __n;
  199.     return *this;
  200.   }
  201.   const_iterator& operator-=(difference_type __i) {
  202.     *this += -__i;
  203.     return *this;
  204.   }
  205.   const_iterator operator+(difference_type __i) const {
  206.     const_iterator __tmp = *this;
  207.     return __tmp += __i;
  208.   }
  209.   const_iterator operator-(difference_type __i) const {
  210.     const_iterator __tmp = *this;
  211.     return __tmp -= __i;
  212.   }
  213.   difference_type operator-(const_iterator __x) const {
  214.     return __WORD_BIT * (_M_p - __x._M_p) + _M_offset - __x._M_offset;
  215.   }
  216.   const_reference operator[](difference_type __i) { 
  217.     return *(*this + __i); 
  218.   }
  219.   bool operator==(const const_iterator& __x) const {
  220.     return _M_p == __x._M_p && _M_offset == __x._M_offset;
  221.   }
  222.   bool operator!=(const const_iterator& __x) const {
  223.     return _M_p != __x._M_p || _M_offset != __x._M_offset;
  224.   }
  225.   bool operator<(const_iterator __x) const {
  226.     return _M_p < __x._M_p || (_M_p == __x._M_p && _M_offset < __x._M_offset);
  227.   }
  228. };
  229. // Bit-vector base class, which encapsulates the difference between
  230. //  old SGI-style allocators and standard-conforming allocators.
  231. #ifdef __STL_USE_STD_ALLOCATORS
  232. // Base class for ordinary allocators.
  233. template <class _Allocator, bool __is_static>
  234. class _Bvector_alloc_base {
  235. public:
  236.   typedef typename _Alloc_traits<bool, _Allocator>::allocator_type
  237.           allocator_type;
  238.   allocator_type get_allocator() const { return _M_data_allocator; }
  239.   _Bvector_alloc_base(const allocator_type& __a)
  240.     : _M_data_allocator(__a), _M_start(), _M_finish(), _M_end_of_storage(0) {}
  241. protected:
  242.   unsigned int* _M_bit_alloc(size_t __n) 
  243.     { return _M_data_allocator.allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
  244.   void _M_deallocate() {
  245.     if (_M_start._M_p)
  246.       _M_data_allocator.deallocate(_M_start._M_p, 
  247.                                    _M_end_of_storage - _M_start._M_p);
  248.   }  
  249.   typename _Alloc_traits<unsigned int, _Allocator>::allocator_type 
  250.           _M_data_allocator;
  251.   _Bit_iterator _M_start;
  252.   _Bit_iterator _M_finish;
  253.   unsigned int* _M_end_of_storage;
  254. };
  255. // Specialization for instanceless allocators.
  256. template <class _Allocator>
  257. class _Bvector_alloc_base<_Allocator, true> {
  258. public:
  259.   typedef typename _Alloc_traits<bool, _Allocator>::allocator_type
  260.           allocator_type;
  261.   allocator_type get_allocator() const { return allocator_type(); }
  262.   _Bvector_alloc_base(const allocator_type&)
  263.     : _M_start(), _M_finish(), _M_end_of_storage(0) {}
  264. protected:
  265.   typedef typename _Alloc_traits<unsigned int, _Allocator>::_Alloc_type
  266.           _Alloc_type;
  267.           
  268.   unsigned int* _M_bit_alloc(size_t __n) 
  269.     { return _Alloc_type::allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
  270.   void _M_deallocate() {
  271.     if (_M_start._M_p)
  272.       _Alloc_type::deallocate(_M_start._M_p,
  273.                               _M_end_of_storage - _M_start._M_p);
  274.   }  
  275.   _Bit_iterator _M_start;
  276.   _Bit_iterator _M_finish;
  277.   unsigned int* _M_end_of_storage;
  278. };  
  279. template <class _Alloc>
  280. class _Bvector_base
  281.   : public _Bvector_alloc_base<_Alloc,
  282.                                _Alloc_traits<bool, _Alloc>::_S_instanceless>
  283. {
  284.   typedef _Bvector_alloc_base<_Alloc,
  285.                               _Alloc_traits<bool, _Alloc>::_S_instanceless>
  286.           _Base;
  287. public:
  288.   typedef typename _Base::allocator_type allocator_type;
  289.   _Bvector_base(const allocator_type& __a) : _Base(__a) {}
  290.   ~_Bvector_base() { _Base::_M_deallocate(); }
  291. };
  292. #else /* __STL_USE_STD_ALLOCATORS */
  293. template <class _Alloc>
  294. class _Bvector_base
  295. {
  296. public:
  297.   typedef _Alloc allocator_type;
  298.   allocator_type get_allocator() const { return allocator_type(); }
  299.   _Bvector_base(const allocator_type&)
  300.     : _M_start(), _M_finish(), _M_end_of_storage(0) {}
  301.   ~_Bvector_base() { _M_deallocate(); }
  302. protected:
  303.   typedef simple_alloc<unsigned int, _Alloc> _Alloc_type;
  304.   
  305.   unsigned int* _M_bit_alloc(size_t __n) 
  306.     { return _Alloc_type::allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
  307.   void _M_deallocate() {
  308.     if (_M_start._M_p)
  309.       _Alloc_type::deallocate(_M_start._M_p,
  310.                               _M_end_of_storage - _M_start._M_p);
  311.   }
  312.   _Bit_iterator _M_start;
  313.   _Bit_iterator _M_finish;
  314.   unsigned int* _M_end_of_storage;  
  315. };
  316. #endif /* __STL_USE_STD_ALLOCATORS */
  317. // The next few lines are confusing.  What we're doing is declaring a
  318. //  partial specialization of vector<T, Alloc> if we have the necessary
  319. //  compiler support.  Otherwise, we define a class bit_vector which uses
  320. //  the default allocator. 
  321. #if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && !defined(__STL_NO_BOOL)
  322. #define __SGI_STL_VECBOOL_TEMPLATE
  323. #define __BVECTOR vector
  324. #else
  325. #undef __SGI_STL_VECBOOL_TEMPLATE
  326. #define __BVECTOR bit_vector
  327. #endif
  328. #      ifdef __SGI_STL_VECBOOL_TEMPLATE
  329.        __STL_END_NAMESPACE
  330. #      include <stl_vector.h>
  331.        __STL_BEGIN_NAMESPACE
  332. template<class _Alloc> class vector<bool,_Alloc>
  333.   : public _Bvector_base<_Alloc>
  334. #      else /* __SGI_STL_VECBOOL_TEMPLATE */
  335. class bit_vector
  336.   : public _Bvector_base<__STL_DEFAULT_ALLOCATOR(bool) >
  337. #      endif /* __SGI_STL_VECBOOL_TEMPLATE */
  338. {
  339. #      ifdef __SGI_STL_VECBOOL_TEMPLATE
  340.   typedef _Bvector_base<_Alloc> _Base;
  341. #      else /* __SGI_STL_VECBOOL_TEMPLATE */
  342.   typedef _Bvector_base<__STL_DEFAULT_ALLOCATOR(bool) > _Base;
  343. #      endif /* __SGI_STL_VECBOOL_TEMPLATE */
  344. public:
  345.   typedef bool value_type;
  346.   typedef size_t size_type;
  347.   typedef ptrdiff_t difference_type; 
  348.   typedef _Bit_reference reference;
  349.   typedef bool const_reference;
  350.   typedef _Bit_reference* pointer;
  351.   typedef const bool* const_pointer;
  352.   typedef _Bit_iterator                iterator;
  353.   typedef _Bit_const_iterator          const_iterator;
  354. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  355.   typedef reverse_iterator<const_iterator> const_reverse_iterator;
  356.   typedef reverse_iterator<iterator> reverse_iterator;
  357. #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  358.   typedef reverse_iterator<const_iterator, value_type, const_reference, 
  359.                            difference_type> const_reverse_iterator;
  360.   typedef reverse_iterator<iterator, value_type, reference, difference_type>
  361.           reverse_iterator;
  362. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  363.   typedef typename _Base::allocator_type allocator_type;
  364.   allocator_type get_allocator() const { return _Base::get_allocator(); }
  365. protected:
  366. #ifdef __STL_USE_NAMESPACES  
  367.   using _Base::_M_bit_alloc;
  368.   using _Base::_M_deallocate;
  369.   using _Base::_M_start;
  370.   using _Base::_M_finish;
  371.   using _Base::_M_end_of_storage;
  372. #endif /* __STL_USE_NAMESPACES */
  373. protected:
  374.   void _M_initialize(size_type __n) {
  375.     unsigned int* __q = _M_bit_alloc(__n);
  376.     _M_end_of_storage = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
  377.     _M_start = iterator(__q, 0);
  378.     _M_finish = _M_start + difference_type(__n);
  379.   }
  380.   void _M_insert_aux(iterator __position, bool __x) {
  381.     if (_M_finish._M_p != _M_end_of_storage) {
  382.       copy_backward(__position, _M_finish, _M_finish + 1);
  383.       *__position = __x;
  384.       ++_M_finish;
  385.     }
  386.     else {
  387.       size_type __len = size() ? 2 * size() : __WORD_BIT;
  388.       unsigned int* __q = _M_bit_alloc(__len);
  389.       iterator __i = copy(begin(), __position, iterator(__q, 0));
  390.       *__i++ = __x;
  391.       _M_finish = copy(__position, end(), __i);
  392.       _M_deallocate();
  393.       _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
  394.       _M_start = iterator(__q, 0);
  395.     }
  396.   }
  397. #ifdef __STL_MEMBER_TEMPLATES
  398.   template <class _InputIterator>
  399.   void _M_initialize_range(_InputIterator __first, _InputIterator __last,
  400.                            input_iterator_tag) {
  401.     _M_start = iterator();
  402.     _M_finish = iterator();
  403.     _M_end_of_storage = 0;
  404.     for ( ; __first != __last; ++__first) 
  405.       push_back(*__first);
  406.   }
  407.   template <class _ForwardIterator>
  408.   void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
  409.                            forward_iterator_tag) {
  410.     size_type __n = 0;
  411.     distance(__first, __last, __n);
  412.     _M_initialize(__n);
  413.     copy(__first, __last, _M_start);
  414.   }
  415.   template <class _InputIterator>
  416.   void _M_insert_range(iterator __pos,
  417.                        _InputIterator __first, _InputIterator __last,
  418.                        input_iterator_tag) {
  419.     for ( ; __first != __last; ++__first) {
  420.       __pos = insert(__pos, *__first);
  421.       ++__pos;
  422.     }
  423.   }
  424.   template <class _ForwardIterator>
  425.   void _M_insert_range(iterator __position,
  426.                        _ForwardIterator __first, _ForwardIterator __last,
  427.                        forward_iterator_tag) {
  428.     if (__first != __last) {
  429.       size_type __n = 0;
  430.       distance(__first, __last, __n);
  431.       if (capacity() - size() >= __n) {
  432.         copy_backward(__position, end(), _M_finish + difference_type(__n));
  433.         copy(__first, __last, __position);
  434.         _M_finish += difference_type(__n);
  435.       }
  436.       else {
  437.         size_type __len = size() + max(size(), __n);
  438.         unsigned int* __q = _M_bit_alloc(__len);
  439.         iterator __i = copy(begin(), __position, iterator(__q, 0));
  440.         __i = copy(__first, __last, __i);
  441.         _M_finish = copy(__position, end(), __i);
  442.         _M_deallocate();
  443.         _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
  444.         _M_start = iterator(__q, 0);
  445.       }
  446.     }
  447.   }      
  448. #endif /* __STL_MEMBER_TEMPLATES */
  449. public:
  450.   iterator begin() { return _M_start; }
  451.   const_iterator begin() const { return _M_start; }
  452.   iterator end() { return _M_finish; }
  453.   const_iterator end() const { return _M_finish; }
  454.   reverse_iterator rbegin() { return reverse_iterator(end()); }
  455.   const_reverse_iterator rbegin() const { 
  456.     return const_reverse_iterator(end()); 
  457.   }
  458.   reverse_iterator rend() { return reverse_iterator(begin()); }
  459.   const_reverse_iterator rend() const { 
  460.     return const_reverse_iterator(begin()); 
  461.   }
  462.   size_type size() const { return size_type(end() - begin()); }
  463.   size_type max_size() const { return size_type(-1); }
  464.   size_type capacity() const {
  465.     return size_type(const_iterator(_M_end_of_storage, 0) - begin());
  466.   }
  467.   bool empty() const { return begin() == end(); }
  468.   reference operator[](size_type __n) {
  469.     return *(begin() + difference_type(__n));
  470.   }
  471.   const_reference operator[](size_type __n) const {
  472.     return *(begin() + difference_type(__n));
  473.   }
  474.   explicit __BVECTOR(const allocator_type& __a = allocator_type())
  475.     : _Base(__a) {}
  476.   __BVECTOR(size_type __n, bool __value,
  477.             const allocator_type& __a = allocator_type())
  478.     : _Base(__a)
  479.   {
  480.     _M_initialize(__n);
  481.     fill(_M_start._M_p, _M_end_of_storage, __value ? ~0 : 0);
  482.   }
  483.   explicit __BVECTOR(size_type __n)
  484.     : _Base(allocator_type())
  485.   {
  486.     _M_initialize(__n);
  487.     fill(_M_start._M_p, _M_end_of_storage, 0);
  488.   }
  489.   __BVECTOR(const __BVECTOR& __x) : _Base(__x.get_allocator()) {
  490.     _M_initialize(__x.size());
  491.     copy(__x.begin(), __x.end(), _M_start);
  492.   }
  493. #ifdef __STL_MEMBER_TEMPLATES
  494.   // Check whether it's an integral type.  If so, it's not an iterator.
  495.   template <class _InputIterator>
  496.   __BVECTOR(_InputIterator __first, _InputIterator __last,
  497.             const allocator_type& __a = allocator_type())
  498.     : _Base(__a)
  499.   {
  500.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  501.     _M_initialize_dispatch(__first, __last, _Integral());
  502.   }
  503.     
  504.   template <class _Integer>
  505.   void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) {
  506.     _M_initialize(__n);
  507.     fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);
  508.   }
  509.     
  510.   template <class _InputIterator>
  511.   void _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
  512.                               __false_type) {
  513.     _M_initialize_range(__first, __last, __ITERATOR_CATEGORY(__first));
  514.   }
  515. #else /* __STL_MEMBER_TEMPLATES */
  516.   __BVECTOR(const_iterator __first, const_iterator __last,
  517.             const allocator_type& __a = allocator_type())
  518.     : _Base(__a)
  519.   {
  520.     size_type __n = 0;
  521.     distance(__first, __last, __n);
  522.     _M_initialize(__n);
  523.     copy(__first, __last, _M_start);
  524.   }
  525.   __BVECTOR(const bool* __first, const bool* __last,
  526.             const allocator_type& __a = allocator_type())
  527.     : _Base(__a)
  528.   {
  529.     size_type __n = 0;
  530.     distance(__first, __last, __n);
  531.     _M_initialize(__n);
  532.     copy(__first, __last, _M_start);
  533.   }
  534. #endif /* __STL_MEMBER_TEMPLATES */
  535.   ~__BVECTOR() { }
  536.   __BVECTOR& operator=(const __BVECTOR& __x) {
  537.     if (&__x == this) return *this;
  538.     if (__x.size() > capacity()) {
  539.       _M_deallocate();
  540.       _M_initialize(__x.size());
  541.     }
  542.     copy(__x.begin(), __x.end(), begin());
  543.     _M_finish = begin() + difference_type(__x.size());
  544.     return *this;
  545.   }
  546.   // assign(), a generalized assignment member function.  Two
  547.   // versions: one that takes a count, and one that takes a range.
  548.   // The range version is a member template, so we dispatch on whether
  549.   // or not the type is an integer.
  550.   void assign(size_t __n, bool __x) {
  551.     if (__n > size()) {
  552.       fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);
  553.       insert(end(), __n - size(), __x);
  554.     }
  555.     else {
  556.       erase(begin() + __n, end());
  557.       fill(_M_start._M_p, _M_end_of_storage, __x ? ~0 : 0);
  558.     }
  559.   }
  560. #ifdef __STL_MEMBER_TEMPLATES
  561.   template <class _InputIterator>
  562.   void assign(_InputIterator __first, _InputIterator __last) {
  563.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  564.     _M_assign_dispatch(__first, __last, _Integral());
  565.   }
  566.   template <class _Integer>
  567.   void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
  568.     { assign((size_t) __n, (bool) __val); }
  569.   template <class _InputIter>
  570.   void _M_assign_dispatch(_InputIter __first, _InputIter __last, __false_type)
  571.     { _M_assign_aux(__first, __last, __ITERATOR_CATEGORY(__first)); }
  572.   template <class _InputIterator>
  573.   void _M_assign_aux(_InputIterator __first, _InputIterator __last,
  574.                      input_iterator_tag) {
  575.     iterator __cur = begin();
  576.     for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
  577.       *__cur = *__first;
  578.     if (__first == __last)
  579.       erase(__cur, end());
  580.     else
  581.       insert(end(), __first, __last);
  582.   }
  583.   template <class _ForwardIterator>
  584.   void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
  585.                      forward_iterator_tag) {
  586.     size_type __len = 0;
  587.     distance(__first, __last, __len);
  588.     if (__len < size())
  589.       erase(copy(__first, __last, begin()), end());
  590.     else {
  591.       _ForwardIterator __mid = __first;
  592.       advance(__mid, size());
  593.       copy(__first, __mid, begin());
  594.       insert(end(), __mid, __last);
  595.     }
  596.   }    
  597. #endif /* __STL_MEMBER_TEMPLATES */
  598.   void reserve(size_type __n) {
  599.     if (capacity() < __n) {
  600.       unsigned int* __q = _M_bit_alloc(__n);
  601.       _M_finish = copy(begin(), end(), iterator(__q, 0));
  602.       _M_deallocate();
  603.       _M_start = iterator(__q, 0);
  604.       _M_end_of_storage = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
  605.     }
  606.   }
  607.   reference front() { return *begin(); }
  608.   const_reference front() const { return *begin(); }
  609.   reference back() { return *(end() - 1); }
  610.   const_reference back() const { return *(end() - 1); }
  611.   void push_back(bool __x) {
  612.     if (_M_finish._M_p != _M_end_of_storage)
  613.       *_M_finish++ = __x;
  614.     else
  615.       _M_insert_aux(end(), __x);
  616.   }
  617.   void swap(__BVECTOR& __x) {
  618.     __STD::swap(_M_start, __x._M_start);
  619.     __STD::swap(_M_finish, __x._M_finish);
  620.     __STD::swap(_M_end_of_storage, __x._M_end_of_storage);
  621.   }
  622.   iterator insert(iterator __position, bool __x = bool()) {
  623.     difference_type __n = __position - begin();
  624.     if (_M_finish._M_p != _M_end_of_storage && __position == end())
  625.       *_M_finish++ = __x;
  626.     else
  627.       _M_insert_aux(__position, __x);
  628.     return begin() + __n;
  629.   }
  630. #ifdef __STL_MEMBER_TEMPLATES
  631.   // Check whether it's an integral type.  If so, it's not an iterator.
  632.   template <class _InputIterator>
  633.   void insert(iterator __position,
  634.               _InputIterator __first, _InputIterator __last) {
  635.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  636.     _M_insert_dispatch(__position, __first, __last, _Integral());
  637.   }
  638.   template <class _Integer>
  639.   void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
  640.                           __true_type) {
  641.     insert(__pos, (size_type) __n, (bool) __x);
  642.   }
  643.   template <class _InputIterator>
  644.   void _M_insert_dispatch(iterator __pos,
  645.                           _InputIterator __first, _InputIterator __last,
  646.                           __false_type) {
  647.     _M_insert_range(__pos, __first, __last, __ITERATOR_CATEGORY(__first));
  648.   }
  649. #else /* __STL_MEMBER_TEMPLATES */
  650.   void insert(iterator __position,
  651.               const_iterator __first, const_iterator __last) {
  652.     if (__first == __last) return;
  653.     size_type __n = 0;
  654.     distance(__first, __last, __n);
  655.     if (capacity() - size() >= __n) {
  656.       copy_backward(__position, end(), _M_finish + __n);
  657.       copy(__first, __last, __position);
  658.       _M_finish += __n;
  659.     }
  660.     else {
  661.       size_type __len = size() + max(size(), __n);
  662.       unsigned int* __q = _M_bit_alloc(__len);
  663.       iterator __i = copy(begin(), __position, iterator(__q, 0));
  664.       __i = copy(__first, __last, __i);
  665.       _M_finish = copy(__position, end(), __i);
  666.       _M_deallocate();
  667.       _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
  668.       _M_start = iterator(__q, 0);
  669.     }
  670.   }
  671.   void insert(iterator __position, const bool* __first, const bool* __last) {
  672.     if (__first == __last) return;
  673.     size_type __n = 0;
  674.     distance(__first, __last, __n);
  675.     if (capacity() - size() >= __n) {
  676.       copy_backward(__position, end(), _M_finish + __n);
  677.       copy(__first, __last, __position);
  678.       _M_finish += __n;
  679.     }
  680.     else {
  681.       size_type __len = size() + max(size(), __n);
  682.       unsigned int* __q = _M_bit_alloc(__len);
  683.       iterator __i = copy(begin(), __position, iterator(__q, 0));
  684.       __i = copy(__first, __last, __i);
  685.       _M_finish = copy(__position, end(), __i);
  686.       _M_deallocate();
  687.       _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
  688.       _M_start = iterator(__q, 0);
  689.     }
  690.   }
  691. #endif /* __STL_MEMBER_TEMPLATES */
  692.   
  693.   void insert(iterator __position, size_type __n, bool __x) {
  694.     if (__n == 0) return;
  695.     if (capacity() - size() >= __n) {
  696.       copy_backward(__position, end(), _M_finish + difference_type(__n));
  697.       fill(__position, __position + difference_type(__n), __x);
  698.       _M_finish += difference_type(__n);
  699.     }
  700.     else {
  701.       size_type __len = size() + max(size(), __n);
  702.       unsigned int* __q = _M_bit_alloc(__len);
  703.       iterator __i = copy(begin(), __position, iterator(__q, 0));
  704.       fill_n(__i, __n, __x);
  705.       _M_finish = copy(__position, end(), __i + difference_type(__n));
  706.       _M_deallocate();
  707.       _M_end_of_storage = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
  708.       _M_start = iterator(__q, 0);
  709.     }
  710.   }
  711.   void pop_back() { --_M_finish; }
  712.   iterator erase(iterator __position) {
  713.     if (__position + 1 != end())
  714.       copy(__position + 1, end(), __position);
  715.       --_M_finish;
  716.     return __position;
  717.   }
  718.   iterator erase(iterator __first, iterator __last) {
  719.     _M_finish = copy(__last, end(), __first);
  720.     return __first;
  721.   }
  722.   void resize(size_type __new_size, bool __x = bool()) {
  723.     if (__new_size < size()) 
  724.       erase(begin() + difference_type(__new_size), end());
  725.     else
  726.       insert(end(), __new_size - size(), __x);
  727.   }
  728.   void clear() { erase(begin(), end()); }
  729. };
  730. #ifdef __SGI_STL_VECBOOL_TEMPLATE
  731. typedef vector<bool, alloc> bit_vector;
  732. #else /* __SGI_STL_VECBOOL_TEMPLATE */
  733. inline bool 
  734. operator==(const bit_vector& __x, const bit_vector& __y)
  735. {
  736.   return (__x.size() == __y.size() && 
  737.           equal(__x.begin(), __x.end(), __y.begin()));
  738. }
  739. inline bool 
  740. operator<(const bit_vector& __x, const bit_vector& __y)
  741. {
  742.   return lexicographical_compare(__x.begin(), __x.end(), 
  743.                                  __y.begin(), __y.end());
  744. }
  745. #endif /* __SGI_STL_VECBOOL_TEMPLATE */
  746. #undef __SGI_STL_VECBOOL_TEMPLATE
  747. #undef __BVECTOR
  748. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  749. #pragma reset woff 1174
  750. #pragma reset woff 1375
  751. #endif
  752. __STL_END_NAMESPACE 
  753. #endif /* __SGI_STL_INTERNAL_BVECTOR_H */
  754. // Local Variables:
  755. // mode:C++
  756. // End: