📄 _deque.h
字号:
push_back(__x); iterator __tmp = this->_M_finish; --__tmp; return __tmp; } else { return _M_fill_insert_aux(__pos, 1, __x, _Movable()); } }#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS) iterator insert(iterator __pos) { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/ void insert(iterator __pos, size_type __n, const value_type& __x) { _M_fill_insert(__pos, __n, __x); }protected: iterator _M_fill_insert_aux(iterator __pos, size_type __n, const value_type& __x, const __true_type& /*_Movable*/); iterator _M_fill_insert_aux(iterator __pos, size_type __n, const value_type& __x, const __false_type& /*_Movable*/); void _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);#if defined (_STLP_MEMBER_TEMPLATES) template <class _Integer> void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x, const __true_type& /*_IsIntegral*/) { _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& /*_IsIntegral*/) { _M_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator)); }public: // 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 _IsIntegral<_InputIterator>::_Ret _Integral; _M_insert_dispatch(__pos, __first, __last, _Integral()); }#else /* _STLP_MEMBER_TEMPLATES */ void _M_insert_range_aux(iterator __pos, const value_type* __first, const value_type* __last, size_type __n, const __true_type& /*_Movable*/); void _M_insert_range_aux(iterator __pos, const value_type* __first, const value_type* __last, size_type __n, const __false_type& /*_Movable*/); void _M_insert_range_aux(iterator __pos, const_iterator __first, const_iterator __last, size_type __n, const __true_type& /*_Movable*/); void _M_insert_range_aux(iterator __pos, const_iterator __first, const_iterator __last, size_type __n, const __false_type& /*_Movable*/);public: 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 */public:#if !defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size, const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {#else void resize(size_type __new_size, const value_type& __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ 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); }#if defined (_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type __new_size) { resize(__new_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/protected: iterator _M_erase(iterator __pos, const __true_type& /*_Movable*/); iterator _M_erase(iterator __pos, const __false_type& /*_Movable*/); iterator _M_erase(iterator __first, iterator __last, const __true_type& /*_Movable*/); iterator _M_erase(iterator __first, iterator __last, const __false_type& /*_Movable*/);public: // Erase iterator erase(iterator __pos) { return _M_erase(__pos, _Movable()); } iterator erase(iterator __first, iterator __last) { if (__first == this->_M_start && __last == this->_M_finish) { clear(); return this->_M_finish; } else { if (__first == __last) return __first; return _M_erase(__first, __last, _Movable()); } } void clear();protected: // Internal construction/destruction void _M_fill_initialize(const value_type& __val, const __true_type& /*_TrivialInit*/) {} void _M_fill_initialize(const value_type& __val, const __false_type& /*_TrivialInit*/);#if defined (_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 = this->_M_start._M_node; _STLP_TRY { for (; __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_Range(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&);#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS) void _M_push_back_aux(); void _M_push_front_aux();#endif /*_STLP_DONT_SUP_DFLT_PARAM !_STLP_NO_ANACHRONISMS*/ void _M_pop_back_aux(); void _M_pop_front_aux();protected: // Internal insert functions#if defined (_STLP_MEMBER_TEMPLATES) template <class _InputIterator> void _M_insert(iterator __pos, _InputIterator __first, _InputIterator __last, const input_iterator_tag &) { copy(__first, __last, inserter(*this, __pos)); } template <class _ForwardIterator> void _M_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_range_aux(__pos, __first, __last, __n, _Movable()); } template <class _ForwardIterator> void _M_insert_range_aux(iterator __pos, _ForwardIterator __first, _ForwardIterator __last, size_type __n, const __true_type& /*_Movable*/) { 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); __pos = this->_M_start + __elemsbefore; _STLP_TRY { iterator __dst = __new_start; iterator __src = this->_M_start; for (; __src != __pos; ++__dst, ++__src) { _STLP_STD::_Move_Construct(&(*__dst), *__src); _STLP_STD::_Destroy_Moved(&(*__src)); } this->_M_start = __new_start; uninitialized_copy(__first, __last, __dst); } _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); const difference_type __elemsafter = difference_type(__length) - __elemsbefore; __pos = this->_M_finish - __elemsafter; _STLP_TRY { iterator __dst = __new_finish; iterator __src = this->_M_finish; for (--__src, --__dst; __src >= __pos; --__src, --__dst) { _STLP_STD::_Move_Construct(&(*__dst), *__src); _STLP_STD::_Destroy_Moved(&(*__src)); } this->_M_finish = __new_finish; uninitialized_copy(__first, __last, __pos); } _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1)) } } template <class _ForwardIterator> void _M_insert_range_aux(iterator __pos, _ForwardIterator __first, _ForwardIterator __last, size_type __n, const __false_type& /*_Movable*/) { 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); _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start); 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); _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish); 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)) } }#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);};#if defined (deque)# undef deque_STLP_MOVE_TO_STD_NAMESPACE#endif_STLP_END_NAMESPACE#if !defined (_STLP_LINK_TIME_INSTANTIATION)# include <stl/_deque.c>#endif#if defined (_STLP_USE_PTR_SPECIALIZATIONS)# include <stl/pointers/_deque.h>#endif#if defined (_STLP_DEBUG)# include <stl/debug/_deque.h>#endif_STLP_BEGIN_NAMESPACE#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#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)template <class _Tp, class _Alloc>struct __move_traits<deque<_Tp, _Alloc> > { typedef __stlp_movable implemented; typedef typename __move_traits<_Alloc>::complete complete;};#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */_STLP_END_NAMESPACE#endif /* _STLP_INTERNAL_DEQUE_H */// Local Variables:// mode:C++// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -