stl_deque.h

来自「ARM Linux Tool 各种代码包括MTD」· C头文件 代码 · 共 1,323 行 · 第 1/3 页

H
1,323 行
字号
  size_type max_size() const { return size_type(-1); }  bool empty() const { return _M_finish == _M_start; }public:                         // Constructor, destructor.  explicit deque(const allocator_type& __a = allocator_type())     : _Base(__a, 0) {}  deque(const deque& __x) : _Base(__x.get_allocator(), __x.size())     { uninitialized_copy(__x.begin(), __x.end(), _M_start); }  deque(size_type __n, const value_type& __value,        const allocator_type& __a = allocator_type()) : _Base(__a, __n)    { _M_fill_initialize(__value); }  explicit deque(size_type __n) : _Base(allocator_type(), __n)    { _M_fill_initialize(value_type()); }  // Check whether it's an integral type.  If so, it's not an iterator.  template <class _InputIterator>  deque(_InputIterator __first, _InputIterator __last,        const allocator_type& __a = allocator_type()) : _Base(__a) {    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;    _M_initialize_dispatch(__first, __last, _Integral());  }  template <class _Integer>  void _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type) {    _M_initialize_map(__n);    _M_fill_initialize(__x);  }  template <class _InputIter>  void _M_initialize_dispatch(_InputIter __first, _InputIter __last,                              __false_type) {    _M_range_initialize(__first, __last, __iterator_category(__first));  }  ~deque() { destroy(_M_start, _M_finish); }  deque& operator= (const deque& __x) {    const size_type __len = size();    if (&__x != this) {      if (__len >= __x.size())        erase(copy(__x.begin(), __x.end(), _M_start), _M_finish);      else {        const_iterator __mid = __x.begin() + difference_type(__len);        copy(__x.begin(), __mid, _M_start);        insert(_M_finish, __mid, __x.end());      }    }    return *this;  }          void swap(deque& __x) {    std::swap(_M_start, __x._M_start);    std::swap(_M_finish, __x._M_finish);    std::swap(_M_map, __x._M_map);    std::swap(_M_map_size, __x._M_map_size);  }public:   // 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_type __n, const _Tp& __val) {    if (__n > size()) {      fill(begin(), end(), __val);      insert(end(), __n - size(), __val);    }    else {      erase(begin() + __n, end());      fill(begin(), end(), __val);    }  }  void assign(size_type __n, const _Tp& __val) {    _M_fill_assign(__n, __val);  }  template <class _InputIterator>  void assign(_InputIterator __first, _InputIterator __last) {    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;    _M_assign_dispatch(__first, __last, _Integral());  }private:                        // helper functions for assign()   template <class _Integer>  void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)    { _M_fill_assign((size_type) __n, (_Tp) __val); }  template <class _InputIterator>  void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,                          __false_type) {    _M_assign_aux(__first, __last, __iterator_category(__first));  }  template <class _InputIterator>  void _M_assign_aux(_InputIterator __first, _InputIterator __last,                     input_iterator_tag);  template <class _ForwardIterator>  void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,                     forward_iterator_tag) {    size_type __len = 0;    distance(__first, __last, __len);    if (__len > size()) {      _ForwardIterator __mid = __first;      advance(__mid, size());      copy(__first, __mid, begin());      insert(end(), __mid, __last);    }    else      erase(copy(__first, __last, begin()), end());  }public:                         // push_* and pop_*    void push_back(const value_type& __t) {    if (_M_finish._M_cur != _M_finish._M_last - 1) {      construct(_M_finish._M_cur, __t);      ++_M_finish._M_cur;    }    else      _M_push_back_aux(__t);  }  void push_back() {    if (_M_finish._M_cur != _M_finish._M_last - 1) {      construct(_M_finish._M_cur);      ++_M_finish._M_cur;    }    else      _M_push_back_aux();  }  void push_front(const value_type& __t) {    if (_M_start._M_cur != _M_start._M_first) {      construct(_M_start._M_cur - 1, __t);      --_M_start._M_cur;    }    else      _M_push_front_aux(__t);  }  void push_front() {    if (_M_start._M_cur != _M_start._M_first) {      construct(_M_start._M_cur - 1);      --_M_start._M_cur;    }    else      _M_push_front_aux();  }  void pop_back() {    if (_M_finish._M_cur != _M_finish._M_first) {      --_M_finish._M_cur;      destroy(_M_finish._M_cur);    }    else      _M_pop_back_aux();  }  void pop_front() {    if (_M_start._M_cur != _M_start._M_last - 1) {      destroy(_M_start._M_cur);      ++_M_start._M_cur;    }    else       _M_pop_front_aux();  }public:                         // Insert  iterator insert(iterator position, const value_type& __x) {    if (position._M_cur == _M_start._M_cur) {      push_front(__x);      return _M_start;    }    else if (position._M_cur == _M_finish._M_cur) {      push_back(__x);      iterator __tmp = _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);   // 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,                          __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,                          __false_type) {    insert(__pos, __first, __last, __iterator_category(__first));  }  void resize(size_type __new_size, const value_type& __x) {    const size_type __len = size();    if (__new_size < __len)       erase(_M_start + __new_size, _M_finish);    else      insert(_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;    size_type __index = __pos - _M_start;    if (__index < (size() >> 1)) {      copy_backward(_M_start, __pos, __next);      pop_front();    }    else {      copy(__next, _M_finish, __pos);      pop_back();    }    return _M_start + __index;  }  iterator erase(iterator __first, iterator __last);  void clear(); protected:                        // Internal construction/destruction  void _M_fill_initialize(const value_type& __value);  template <class _InputIterator>  void _M_range_initialize(_InputIterator __first, _InputIterator __last,                        input_iterator_tag);  template <class _ForwardIterator>  void _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,                        forward_iterator_tag);protected:                        // Internal push_* and pop_*  void _M_push_back_aux(const value_type&);  void _M_push_back_aux();  void _M_push_front_aux(const value_type&);  void _M_push_front_aux();  void _M_pop_back_aux();  void _M_pop_front_aux();protected:                        // Internal insert functions  template <class _InputIterator>  void insert(iterator __pos, _InputIterator __first, _InputIterator __last,              input_iterator_tag);  template <class _ForwardIterator>  void insert(iterator __pos,              _ForwardIterator __first, _ForwardIterator __last,              forward_iterator_tag);  iterator _M_insert_aux(iterator __pos, const value_type& __x);  iterator _M_insert_aux(iterator __pos);  void _M_insert_aux(iterator __pos, size_type __n, const value_type& __x);  template <class _ForwardIterator>  void _M_insert_aux(iterator __pos,                      _ForwardIterator __first, _ForwardIterator __last,                     size_type __n);  iterator _M_reserve_elements_at_front(size_type __n) {    size_type __vacancies = _M_start._M_cur - _M_start._M_first;    if (__n > __vacancies)       _M_new_elements_at_front(__n - __vacancies);    return _M_start - difference_type(__n);  }  iterator _M_reserve_elements_at_back(size_type __n) {    size_type __vacancies = (_M_finish._M_last - _M_finish._M_cur) - 1;    if (__n > __vacancies)      _M_new_elements_at_back(__n - __vacancies);    return _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 > _M_map_size - (_M_finish._M_node - _M_map))      _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(_M_start._M_node - _M_map))      _M_reallocate_map(__nodes_to_add, true);  }  void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);};// Non-inline member functionstemplate <class _Tp, class _Alloc>template <class _InputIter>void deque<_Tp, _Alloc>  ::_M_assign_aux(_InputIter __first, _InputIter __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 _Tp, class _Alloc>void deque<_Tp, _Alloc>::_M_fill_insert(iterator __pos,                                        size_type __n, const value_type& __x){  if (__pos._M_cur == _M_start._M_cur) {    iterator __new_start = _M_reserve_elements_at_front(__n);    __STL_TRY {      uninitialized_fill(__new_start, _M_start, __x);      _M_start = __new_start;    }    __STL_UNWIND(_M_destroy_nodes(__new_start._M_node, _M_start._M_node));  }  else if (__pos._M_cur == _M_finish._M_cur) {    iterator __new_finish = _M_reserve_elements_at_back(__n);    __STL_TRY {      uninitialized_fill(_M_finish, __new_finish, __x);      _M_finish = __new_finish;    }    __STL_UNWIND(_M_destroy_nodes(_M_finish._M_node + 1,                                   __new_finish._M_node + 1));      }  else     _M_insert_aux(__pos, __n, __x);}template <class _Tp, class _Alloc>typename deque<_Tp,_Alloc>::iterator deque<_Tp,_Alloc>::erase(iterator __first, iterator __last){  if (__first == _M_start && __last == _M_finish) {    clear();    return _M_finish;  }  else {    difference_type __n = __last - __first;    difference_type __elems_before = __first - _M_start;    if (static_cast<size_type>(__elems_before) < (size() - __n) / 2) {      copy_backward(_M_start, __first, __last);      iterator __new_start = _M_start + __n;      destroy(_M_start, __new_start);      _M_destroy_nodes(__new_start._M_node, _M_start._M_node);      _M_start = __new_start;    }    else {      copy(__last, _M_finish, __first);      iterator __new_finish = _M_finish - __n;      destroy(__new_finish, _M_finish);      _M_destroy_nodes(__new_finish._M_node + 1, _M_finish._M_node + 1);      _M_finish = __new_finish;    }    return _M_start + __elems_before;  }}template <class _Tp, class _Alloc> void deque<_Tp,_Alloc>::clear(){  for (_Map_pointer __node = _M_start._M_node + 1;       __node < _M_finish._M_node;       ++__node) {    destroy(*__node, *__node + _S_buffer_size());    _M_deallocate_node(*__node);  }  if (_M_start._M_node != _M_finish._M_node) {    destroy(_M_start._M_cur, _M_start._M_last);    destroy(_M_finish._M_first, _M_finish._M_cur);    _M_deallocate_node(_M_finish._M_first);  }  else    destroy(_M_start._M_cur, _M_finish._M_cur);  _M_finish = _M_start;}// Precondition: _M_start and _M_finish have already been initialized,// but none of the deque's elements have yet been constructed.template <class _Tp, class _Alloc>void deque<_Tp,_Alloc>::_M_fill_initialize(const value_type& __value) {  _Map_pointer __cur;  __STL_TRY {    for (__cur = _M_start._M_node; __cur < _M_finish._M_node; ++__cur)      uninitialized_fill(*__cur, *__cur + _S_buffer_size(), __value);    uninitialized_fill(_M_finish._M_first, _M_finish._M_cur, __value);  }  __STL_UNWIND(destroy(_M_start, iterator(*__cur, __cur)));}template <class _Tp, class _Alloc> template <class _InputIterator>void deque<_Tp,_Alloc>::_M_range_initialize(_InputIterator __first,                                            _InputIterator __last,                                            input_iterator_tag){  _M_initialize_map(0);  __STL_TRY {    for ( ; __first != __last; ++__first)      push_back(*__first);  }  __STL_UNWIND(clear());}

⌨️ 快捷键说明

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