⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_bvector.h

📁 openRisc2000编译链接器等,用于i386 cygwin
💻 H
📖 第 1 页 / 共 2 页
字号:
  protected:    void _M_initialize(size_type __n)    {      _Bit_type* __q = this->_M_allocate(__n);      this->_M_impl._M_end_of_storage = __q 	                               + (__n + _S_word_bit - 1) / _S_word_bit;      this->_M_impl._M_start = iterator(__q, 0);      this->_M_impl._M_finish = this->_M_impl._M_start + difference_type(__n);    }    void _M_insert_aux(iterator __position, bool __x)    {      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage)	{	  std::copy_backward(__position, this->_M_impl._M_finish, 			     this->_M_impl._M_finish + 1);	  *__position = __x;	  ++this->_M_impl._M_finish;	}      else	{	  const size_type __len = size() ? 2 * size()	                                 : static_cast<size_type>(_S_word_bit);	  _Bit_type * __q = this->_M_allocate(__len);	  iterator __i = std::copy(begin(), __position, iterator(__q, 0));	  *__i++ = __x;	  this->_M_impl._M_finish = std::copy(__position, end(), __i);	  this->_M_deallocate();	  this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1)				    / _S_word_bit;	  this->_M_impl._M_start = iterator(__q, 0);	}    }    template<class _InputIterator>    void _M_initialize_range(_InputIterator __first, _InputIterator __last,                             input_iterator_tag)    {      this->_M_impl._M_start = iterator();      this->_M_impl._M_finish = iterator();      this->_M_impl._M_end_of_storage = 0;      for ( ; __first != __last; ++__first)        push_back(*__first);    }    template<class _ForwardIterator>    void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,                             forward_iterator_tag)    {      const size_type __n = std::distance(__first, __last);      _M_initialize(__n);      std::copy(__first, __last, this->_M_impl._M_start);    }    template<class _InputIterator>    void _M_insert_range(iterator __pos, _InputIterator __first, 			 _InputIterator __last, input_iterator_tag)    {      for ( ; __first != __last; ++__first)	{	  __pos = insert(__pos, *__first);	  ++__pos;	}    }    template<class _ForwardIterator>    void _M_insert_range(iterator __position, _ForwardIterator __first, 			 _ForwardIterator __last, forward_iterator_tag)    {      if (__first != __last)	{	  size_type __n = std::distance(__first, __last);	  if (capacity() - size() >= __n)	    {	      std::copy_backward(__position, end(),			       this->_M_impl._M_finish + difference_type(__n));	      std::copy(__first, __last, __position);	      this->_M_impl._M_finish += difference_type(__n);	    }	  else	    {	      const size_type __len = size() + std::max(size(), __n);	      _Bit_type * __q = this->_M_allocate(__len);	      iterator __i = std::copy(begin(), __position, iterator(__q, 0));	      __i = std::copy(__first, __last, __i);	      this->_M_impl._M_finish = std::copy(__position, end(), __i);	      this->_M_deallocate();	      this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1)		                                / _S_word_bit;	      this->_M_impl._M_start = iterator(__q, 0);	    }	}    }  public:    iterator begin()    { return this->_M_impl._M_start; }    const_iterator begin() const    { return this->_M_impl._M_start; }    iterator end()    { return this->_M_impl._M_finish; }    const_iterator end() const    { return this->_M_impl._M_finish; }    reverse_iterator rbegin()    { return reverse_iterator(end()); }    const_reverse_iterator rbegin() const    { return const_reverse_iterator(end()); }    reverse_iterator rend()    { return reverse_iterator(begin()); }    const_reverse_iterator rend() const    { return const_reverse_iterator(begin()); }    size_type size() const    { return size_type(end() - begin()); }    size_type max_size() const    { return size_type(-1); }    size_type capacity() const    { return size_type(const_iterator(this->_M_impl._M_end_of_storage, 0)		       - begin()); }    bool empty() const    { return begin() == end(); }    reference operator[](size_type __n)    { return *(begin() + difference_type(__n)); }    const_reference operator[](size_type __n) const    { return *(begin() + difference_type(__n)); }    void _M_range_check(size_type __n) const    {      if (__n >= this->size())        __throw_out_of_range(__N("vector<bool>::_M_range_check"));    }    reference at(size_type __n)    { _M_range_check(__n); return (*this)[__n]; }    const_reference at(size_type __n) const    { _M_range_check(__n); return (*this)[__n]; }    explicit vector(const allocator_type& __a = allocator_type())      : _Bvector_base<_Alloc>(__a) { }    vector(size_type __n, bool __value, 	   const allocator_type& __a = allocator_type())    : _Bvector_base<_Alloc>(__a)    {      _M_initialize(__n);      std::fill(this->_M_impl._M_start._M_p, this->_M_impl._M_end_of_storage, 		__value ? ~0 : 0);    }    explicit vector(size_type __n)    : _Bvector_base<_Alloc>(allocator_type())    {      _M_initialize(__n);      std::fill(this->_M_impl._M_start._M_p, 		this->_M_impl._M_end_of_storage, 0);    }    vector(const vector& __x) : _Bvector_base<_Alloc>(__x.get_allocator())    {      _M_initialize(__x.size());      std::copy(__x.begin(), __x.end(), this->_M_impl._M_start);    }    // Check whether it's an integral type.  If so, it's not an iterator.    template<class _Integer>    void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)    {      _M_initialize(__n);      std::fill(this->_M_impl._M_start._M_p, 		this->_M_impl._M_end_of_storage, __x ? ~0 : 0);    }    template<class _InputIterator>      void       _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,			     __false_type)      { _M_initialize_range(__first, __last, 			    std::__iterator_category(__first)); }    template<class _InputIterator>      vector(_InputIterator __first, _InputIterator __last,	     const allocator_type& __a = allocator_type())    : _Bvector_base<_Alloc>(__a)    {      typedef typename _Is_integer<_InputIterator>::_Integral _Integral;      _M_initialize_dispatch(__first, __last, _Integral());    }    ~vector() { }    vector& operator=(const vector& __x)    {      if (&__x == this)	return *this;      if (__x.size() > capacity())	{	  this->_M_deallocate();	  _M_initialize(__x.size());	}      std::copy(__x.begin(), __x.end(), begin());      this->_M_impl._M_finish = begin() + difference_type(__x.size());      return *this;    }    // assign(), a generalized assignment member function.  Two    // versions: one that takes a count, and one that takes a range.    // The range version is a member template, so we dispatch on whether    // or not the type is an integer.    void _M_fill_assign(size_t __n, bool __x)    {      if (__n > size())	{	  std::fill(this->_M_impl._M_start._M_p, 		    this->_M_impl._M_end_of_storage, __x ? ~0 : 0);	  insert(end(), __n - size(), __x);	}      else	{	  erase(begin() + __n, end());	  std::fill(this->_M_impl._M_start._M_p, 		    this->_M_impl._M_end_of_storage, __x ? ~0 : 0);	}    }    void assign(size_t __n, bool __x)    { _M_fill_assign(__n, __x); }    template<class _InputIterator>    void assign(_InputIterator __first, _InputIterator __last)    {      typedef typename _Is_integer<_InputIterator>::_Integral _Integral;      _M_assign_dispatch(__first, __last, _Integral());    }    template<class _Integer>    void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)    { _M_fill_assign((size_t) __n, (bool) __val); }    template<class _InputIterator>    void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,			    __false_type)    { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }    template<class _InputIterator>    void _M_assign_aux(_InputIterator __first, _InputIterator __last,                       input_iterator_tag)    {      iterator __cur = begin();      for ( ; __first != __last && __cur != end(); ++__cur, ++__first)        *__cur = *__first;      if (__first == __last)        erase(__cur, end());      else        insert(end(), __first, __last);    }    template<class _ForwardIterator>    void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,                       forward_iterator_tag)    {      const size_type __len = std::distance(__first, __last);      if (__len < size())        erase(std::copy(__first, __last, begin()), end());      else	{	  _ForwardIterator __mid = __first;	  std::advance(__mid, size());	  std::copy(__first, __mid, begin());	  insert(end(), __mid, __last);	}    }    void reserve(size_type __n)    {      if (__n > this->max_size())	__throw_length_error(__N("vector::reserve"));      if (this->capacity() < __n)	{	  _Bit_type* __q = this->_M_allocate(__n);	  this->_M_impl._M_finish = std::copy(begin(), end(), 					      iterator(__q, 0));	  this->_M_deallocate();	  this->_M_impl._M_start = iterator(__q, 0);	  this->_M_impl._M_end_of_storage = __q + (__n + _S_word_bit - 1) / _S_word_bit;	}    }    reference front()    { return *begin(); }    const_reference front() const    { return *begin(); }    reference back()    { return *(end() - 1); }    const_reference back() const    { return *(end() - 1); }    void push_back(bool __x)    {      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage)        *this->_M_impl._M_finish++ = __x;      else        _M_insert_aux(end(), __x);    }    void swap(vector<bool, _Alloc>& __x)    {      std::swap(this->_M_impl._M_start, __x._M_impl._M_start);      std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);      std::swap(this->_M_impl._M_end_of_storage, 		__x._M_impl._M_end_of_storage);    }    // [23.2.5]/1, third-to-last entry in synopsis listing    static void swap(reference __x, reference __y)    {      bool __tmp = __x;      __x = __y;      __y = __tmp;    }    iterator insert(iterator __position, bool __x = bool())    {      const difference_type __n = __position - begin();      if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage	  && __position == end())        *this->_M_impl._M_finish++ = __x;      else        _M_insert_aux(__position, __x);      return begin() + __n;    }    // Check whether it's an integral type.  If so, it's not an iterator.    template<class _Integer>    void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,                            __true_type)    { _M_fill_insert(__pos, __n, __x); }    template<class _InputIterator>    void _M_insert_dispatch(iterator __pos,                            _InputIterator __first, _InputIterator __last,                            __false_type)    { _M_insert_range(__pos, __first, __last,		      std::__iterator_category(__first)); }    template<class _InputIterator>    void insert(iterator __position,                _InputIterator __first, _InputIterator __last)    {      typedef typename _Is_integer<_InputIterator>::_Integral _Integral;      _M_insert_dispatch(__position, __first, __last, _Integral());    }    void _M_fill_insert(iterator __position, size_type __n, bool __x)    {      if (__n == 0)	return;      if (capacity() - size() >= __n)	{	  std::copy_backward(__position, end(),			     this->_M_impl._M_finish + difference_type(__n));	  std::fill(__position, __position + difference_type(__n), __x);	  this->_M_impl._M_finish += difference_type(__n);	}      else	{	  const size_type __len = size() + std::max(size(), __n);	  _Bit_type * __q = this->_M_allocate(__len);	  iterator __i = std::copy(begin(), __position, iterator(__q, 0));	  std::fill_n(__i, __n, __x);	  this->_M_impl._M_finish = std::copy(__position, end(),					      __i + difference_type(__n));	  this->_M_deallocate();	  this->_M_impl._M_end_of_storage = __q + (__len + _S_word_bit - 1)	                                    / _S_word_bit;	  this->_M_impl._M_start = iterator(__q, 0);	}    }    void insert(iterator __position, size_type __n, bool __x)    { _M_fill_insert(__position, __n, __x); }    void pop_back()    { --this->_M_impl._M_finish; }    iterator erase(iterator __position)    {      if (__position + 1 != end())        std::copy(__position + 1, end(), __position);      --this->_M_impl._M_finish;      return __position;    }    iterator erase(iterator __first, iterator __last)    {      this->_M_impl._M_finish = std::copy(__last, end(), __first);      return __first;    }    void resize(size_type __new_size, bool __x = bool())    {      if (__new_size < size())        erase(begin() + difference_type(__new_size), end());      else        insert(end(), __new_size - size(), __x);    }    void flip()    {      for (_Bit_type * __p = this->_M_impl._M_start._M_p;	   __p != this->_M_impl._M_end_of_storage; ++__p)        *__p = ~*__p;    }    void clear()    { erase(begin(), end()); }  };} // namespace std#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -