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

📄 _deque.h

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 H
📖 第 1 页 / 共 3 页
字号:
      return this->_M_start;    }    else if (__position._M_cur == this->_M_finish._M_cur) {      push_back(__x);      iterator __tmp = this->_M_finish;      --__tmp;      return __tmp;    }    else {      return _M_insert_aux(__position, __x);    }  }  iterator insert(iterator __position)    { return insert(__position, value_type()); }  void insert(iterator __pos, size_type __n, const value_type& __x) {    _M_fill_insert(__pos, __n, __x);  }  void _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);#ifdef _STLP_MEMBER_TEMPLATES    // Check whether it's an integral type.  If so, it's not an iterator.  template <class _InputIterator>  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;    _M_insert_dispatch(__pos, __first, __last, _Integral());  }  template <class _Integer>  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,                          const __true_type&) {    _M_fill_insert(__pos, (size_type) __n, (value_type) __x);  }  template <class _InputIterator>  void _M_insert_dispatch(iterator __pos,                          _InputIterator __first, _InputIterator __last,                          const __false_type&) {    insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));  }#else /* _STLP_MEMBER_TEMPLATES */  void insert(iterator __pos,              const value_type* __first, const value_type* __last);  void insert(iterator __pos,              const_iterator __first, const_iterator __last);#endif /* _STLP_MEMBER_TEMPLATES */  void resize(size_type __new_size, value_type __x) {    const size_type __len = size();    if (__new_size < __len)       erase(this->_M_start + __new_size, this->_M_finish);    else      insert(this->_M_finish, __new_size - __len, __x);  }  void resize(size_type new_size) { resize(new_size, value_type()); }public:                         // Erase  iterator erase(iterator __pos) {    iterator __next = __pos;    ++__next;    difference_type __index = __pos - this->_M_start;    if (size_type(__index) < this->size() >> 1) {      copy_backward(this->_M_start, __pos, __next);      pop_front();    }    else {      copy(__next, this->_M_finish, __pos);      pop_back();    }    return this->_M_start + __index;  }  iterator erase(iterator __first, iterator __last);  void clear(); protected:                        // Internal construction/destruction  void _M_fill_initialize(const value_type& __val);#ifdef _STLP_MEMBER_TEMPLATES   template <class _InputIterator>  void _M_range_initialize(_InputIterator __first,			   _InputIterator __last,			   const input_iterator_tag &) {    this->_M_initialize_map(0);    _STLP_TRY {      for ( ; __first != __last; ++__first)        push_back(*__first);    }    _STLP_UNWIND(clear());  } template <class _ForwardIterator> void  _M_range_initialize(_ForwardIterator __first,                           _ForwardIterator __last,                           const forward_iterator_tag &)  {   size_type __n = distance(__first, __last);   this->_M_initialize_map(__n);   _Map_pointer __cur_node;   _STLP_TRY {    for (__cur_node = this->_M_start._M_node;          __cur_node < this->_M_finish._M_node; 	 ++__cur_node) {      _ForwardIterator __mid = __first;      advance(__mid, this->buffer_size());      uninitialized_copy(__first, __mid, *__cur_node);      __first = __mid;    }    uninitialized_copy(__first, __last, this->_M_finish._M_first);   }  _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, iterator(*__cur_node, __cur_node))); }#endif /* _STLP_MEMBER_TEMPLATES */protected:                        // Internal push_* and pop_*  void _M_push_back_aux_v(const value_type&);  void _M_push_front_aux_v(const value_type&);# ifndef _STLP_NO_ANACHRONISMS  void _M_push_back_aux();  void _M_push_front_aux();# endif  void _M_pop_back_aux();  void _M_pop_front_aux();protected:                        // Internal insert functions#ifdef _STLP_MEMBER_TEMPLATEStemplate <class _InputIterator>void insert(iterator __pos,       _InputIterator __first,       _InputIterator __last,       const input_iterator_tag &){  copy(__first, __last, inserter(*this, __pos));}template <class _ForwardIterator>void  insert(iterator __pos,	     _ForwardIterator __first,	     _ForwardIterator __last,	     const forward_iterator_tag &) {  size_type __n = distance(__first, __last);  if (__pos._M_cur == this->_M_start._M_cur) {    iterator __new_start = _M_reserve_elements_at_front(__n);    _STLP_TRY {      uninitialized_copy(__first, __last, __new_start);      this->_M_start = __new_start;    }    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));  }  else if (__pos._M_cur == this->_M_finish._M_cur) {    iterator __new_finish = _M_reserve_elements_at_back(__n);    _STLP_TRY {      uninitialized_copy(__first, __last, this->_M_finish);      this->_M_finish = __new_finish;    }    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));  }  else    _M_insert_aux(__pos, __first, __last, __n);}#endif /* _STLP_MEMBER_TEMPLATES */  iterator _M_insert_aux(iterator __pos, const value_type& __x);  iterator _M_insert_aux(iterator __pos);  iterator _M_insert_aux_prepare(iterator __pos);  void _M_insert_aux(iterator __pos, size_type __n, const value_type& __x);#ifdef _STLP_MEMBER_TEMPLATES    template <class _ForwardIterator>  void _M_insert_aux(iterator __pos,                     _ForwardIterator __first,                     _ForwardIterator __last,                     size_type __n) {        const difference_type __elemsbefore = __pos - this->_M_start;    size_type __length = size();    if (__elemsbefore < difference_type(__length / 2)) {      iterator __new_start = _M_reserve_elements_at_front(__n);      iterator __old_start = this->_M_start;      __pos = this->_M_start + __elemsbefore;      _STLP_TRY {	if (__elemsbefore >= difference_type(__n)) {	  iterator __start_n = this->_M_start + difference_type(__n); 	  uninitialized_copy(this->_M_start, __start_n, __new_start);	  this->_M_start = __new_start;	  copy(__start_n, __pos, __old_start);	  copy(__first, __last, __pos - difference_type(__n));	}	else {	  _ForwardIterator __mid = __first;	  advance(__mid, difference_type(__n) - __elemsbefore);	  __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid,				    __new_start, _IsPODType());	  this->_M_start = __new_start;	  copy(__mid, __last, __old_start);	}      }      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));    }    else {      iterator __new_finish = _M_reserve_elements_at_back(__n);      iterator __old_finish = this->_M_finish;      const difference_type __elemsafter = 	difference_type(__length) - __elemsbefore;      __pos = this->_M_finish - __elemsafter;      _STLP_TRY {      if (__elemsafter > difference_type(__n)) {        iterator __finish_n = this->_M_finish - difference_type(__n);        uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);        this->_M_finish = __new_finish;        copy_backward(__pos, __finish_n, __old_finish);        copy(__first, __last, __pos);      }      else {        _ForwardIterator __mid = __first;        advance(__mid, __elemsafter);        __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish, _IsPODType());        this->_M_finish = __new_finish;        copy(__first, __mid, __pos);      }      }      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));    }  }#else /* _STLP_MEMBER_TEMPLATES */    void _M_insert_aux(iterator __pos,                     const value_type* __first, const value_type* __last,                     size_type __n);  void _M_insert_aux(iterator __pos,                      const_iterator __first, const_iterator __last,                     size_type __n); #endif /* _STLP_MEMBER_TEMPLATES */  iterator _M_reserve_elements_at_front(size_type __n) {    size_type __vacancies = this->_M_start._M_cur - this->_M_start._M_first;    if (__n > __vacancies)       _M_new_elements_at_front(__n - __vacancies);    return this->_M_start - difference_type(__n);  }  iterator _M_reserve_elements_at_back(size_type __n) {    size_type __vacancies = (this->_M_finish._M_last - this->_M_finish._M_cur) - 1;    if (__n > __vacancies)      _M_new_elements_at_back(__n - __vacancies);    return this->_M_finish + difference_type(__n);  }  void _M_new_elements_at_front(size_type __new_elements);  void _M_new_elements_at_back(size_type __new_elements);protected:                      // Allocation of _M_map and nodes  // Makes sure the _M_map has space for new nodes.  Does not actually  //  add the nodes.  Can invalidate _M_map pointers.  (And consequently,   //  deque iterators.)  void _M_reserve_map_at_back (size_type __nodes_to_add = 1) {    if (__nodes_to_add + 1 > this->_M_map_size._M_data - (this->_M_finish._M_node - this->_M_map._M_data))      _M_reallocate_map(__nodes_to_add, false);  }  void _M_reserve_map_at_front (size_type __nodes_to_add = 1) {    if (__nodes_to_add > size_type(this->_M_start._M_node - this->_M_map._M_data))      _M_reallocate_map(__nodes_to_add, true);  }  void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front); };# define _STLP_TEMPLATE_CONTAINER deque<_Tp, _Alloc># define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc># include <stl/_relops_cont.h># undef _STLP_TEMPLATE_CONTAINER# undef _STLP_TEMPLATE_HEADER_STLP_END_NAMESPACE // do a cleanup# undef deque# undef __deque__# define __deque__ __WORKAROUND_DBG_RENAME(deque)# if !defined (_STLP_LINK_TIME_INSTANTIATION)#  include <stl/_deque.c># endif#if defined (_STLP_DEBUG)# include <stl/debug/_deque.h>#endif# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)#  include <stl/wrappers/_deque.h># endif  #endif /* _STLP_INTERNAL_DEQUE_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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