_slist.h
来自「C++类模版库实现」· C头文件 代码 · 共 872 行 · 第 1/3 页
H
872 行
void _M_insert_after_range(_Node_base* __pos, const value_type* __first, const value_type* __last) { while (__first != __last) { __pos = __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } }#endif /* _STLP_MEMBER_TEMPLATES */public:#if !defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert_after(iterator __pos, const_reference __x = 0) {#else iterator insert_after(iterator __pos, const_reference __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ return iterator(_M_insert_after(__pos._M_node, __x)); }#if defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert_after(iterator __pos) { return insert_after(__pos, static_cast<void*>(0)); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void insert_after(iterator __pos, size_type __n, const_reference __x) { _M_insert_after_fill(__pos._M_node, __n, __x); }#ifdef _STLP_MEMBER_TEMPLATES // We don't need any dispatching tricks here, because _M_insert_after_range // already does them. template <class _InIter> void insert_after(iterator __pos, _InIter __first, _InIter __last) { _M_insert_after_range(__pos._M_node, __first, __last); }#else /* _STLP_MEMBER_TEMPLATES */ void insert_after(iterator __pos, const_iterator __first, const_iterator __last) { _M_insert_after_range(__pos._M_node, __first, __last); } void insert_after(iterator __pos, const value_type* __first, const value_type* __last) { _M_insert_after_range(__pos._M_node, __first, __last); }#endif /* _STLP_MEMBER_TEMPLATES */#if !defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert(iterator __pos, const_reference __x = 0) {#else iterator insert(iterator __pos, const_reference __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __x)); }#if defined(_STLP_DONT_SUP_DFLT_PARAM) iterator insert(iterator __pos) { return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), static_cast<void*>(0))); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void insert(iterator __pos, size_type __n, const_reference __x) { _M_insert_after_fill(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __n, __x); } #ifdef _STLP_MEMBER_TEMPLATES // We don't need any dispatching tricks here, because _M_insert_after_range // already does them. template <class _InIter> void insert(iterator __pos, _InIter __first, _InIter __last) { _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __first, __last); }#else /* _STLP_MEMBER_TEMPLATES */ void insert(iterator __pos, const_iterator __first, const_iterator __last) { _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __first, __last); } void insert(iterator __pos, const value_type* __first, const value_type* __last) { _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __first, __last); }#endif /* _STLP_MEMBER_TEMPLATES */public: iterator erase_after(iterator __pos) { return iterator(this->_M_erase_after(__pos._M_node)); } iterator erase_after(iterator __before_first, iterator __last) { return iterator(this->_M_erase_after(__before_first._M_node, __last._M_node)); } iterator erase(iterator __pos) { return iterator(this->_M_erase_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node))); } iterator erase(iterator __first, iterator __last) { return iterator(this->_M_erase_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __first._M_node), __last._M_node)); }#if !defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type new_size, const_reference __x = 0);#else void resize(size_type new_size, const_reference __x);#endif /*_STLP_DONT_SUP_DFLT_PARAM*/#if defined(_STLP_DONT_SUP_DFLT_PARAM) void resize(size_type new_size) { resize(new_size, static_cast<void*>(0)); }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ void clear() { this->_M_erase_after(&this->_M_head._M_data, 0); }public: // Moves the range [__before_first + 1, __before_last + 1) to *this, // inserting it immediately after __pos. This is constant time. void splice_after(iterator __pos, iterator __before_first, iterator __before_last) { if (__before_first != __before_last) { _Sl_global_inst::__splice_after(__pos._M_node, __before_first._M_node, __before_last._M_node); } } // Moves the element that follows __prev to *this, inserting it immediately // after __pos. This is constant time. void splice_after(iterator __pos, iterator __prev) { _Sl_global_inst::__splice_after(__pos._M_node, __prev._M_node, __prev._M_node->_M_next); } // Removes all of the elements from the list __x to *this, inserting // them immediately after __pos. __x must not be *this. Complexity: // linear in __x.size(). void splice_after(iterator __pos, _Self& __x) { _Sl_global_inst::__splice_after(__pos._M_node, &__x._M_head._M_data); } // Linear in distance(begin(), __pos), and linear in __x.size(). void splice(iterator __pos, _Self& __x) { if (__x._M_head._M_data._M_next) _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), &__x._M_head._M_data, _Sl_global_inst::__previous(&__x._M_head._M_data, 0)); } // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i). void splice(iterator __pos, _Self& __x, iterator __i) { _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), _Sl_global_inst::__previous(&__x._M_head._M_data, __i._M_node), __i._M_node); } // Linear in distance(begin(), __pos), in distance(__x.begin(), __first), // and in distance(__first, __last). void splice(iterator __pos, _Self& __x, iterator __first, iterator __last) { if (__first != __last) _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), _Sl_global_inst::__previous(&__x._M_head._M_data, __first._M_node), _Sl_global_inst::__previous(__first._M_node, __last._M_node)); }public: void reverse() { if (this->_M_head._M_data._M_next) this->_M_head._M_data._M_next = _Sl_global_inst::__reverse(this->_M_head._M_data._M_next); } void remove(const_reference __val); void unique(); void merge(_Self& __x); void sort(); #ifdef _STLP_MEMBER_TEMPLATES template <class _Predicate> void remove_if(_Predicate __pred) { _Node_base* __cur = &this->_M_head._M_data; while (__cur->_M_next) { if (__pred(static_cast<_Node*>(__cur->_M_next)->_M_data)) this->_M_erase_after(__cur); else __cur = __cur->_M_next; } } template <class _BinaryPredicate> void unique(_BinaryPredicate __pred) { _Node_base* __cur = this->_M_head._M_data._M_next; if (__cur) { while (__cur->_M_next) { if (__pred(static_cast<_Node*>(__cur)->_M_data, static_cast<_Node*>(__cur->_M_next)->_M_data)) this->_M_erase_after(__cur); else __cur = __cur->_M_next; } } } template <class _StrictWeakOrdering> void merge(_Self& __x, _StrictWeakOrdering __comp) { _Node_base* __n1 = &this->_M_head._M_data; while (__n1->_M_next && __x._M_head._M_data._M_next) { if (__comp(static_cast<_Node*>(__x._M_head._M_data._M_next)->_M_data, static_cast<_Node*>(__n1->_M_next)->_M_data)) _Sl_global_inst::__splice_after(__n1, &__x._M_head._M_data, __x._M_head._M_data._M_next); __n1 = __n1->_M_next; } if (__x._M_head._M_data._M_next) { __n1->_M_next = __x._M_head._M_data._M_next; __x._M_head._M_data._M_next = 0; } } template <class _StrictWeakOrdering> void sort(_StrictWeakOrdering __comp) { if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) { slist __carry; slist __counter[64]; int __fill = 0; while (!empty()) { _Sl_global_inst::__splice_after(&__carry._M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next); int __i = 0; while (__i < __fill && !__counter[__i].empty()) { __counter[__i].merge(__carry, __comp); __carry.swap(__counter[__i]); ++__i; } __carry.swap(__counter[__i]); if (__i == __fill) ++__fill; } for (int __i = 1; __i < __fill; ++__i) __counter[__i].merge(__counter[__i-1], __comp); this->swap(__counter[__fill-1]); } }#endif /* _STLP_MEMBER_TEMPLATES */};# if !defined (_STLP_LINK_TIME_INSTANTIATION)# include <stl/pointers/_slist.c># endif# if defined (_STLP_USE_TEMPLATE_EXPORT)_STLP_EXPORT_TEMPLATE_CLASS _Slist_node<void*>;typedef _Slist_node<void*> _VoidPtrSNode;_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<_Slist_node_base, _VoidPtrSNode, allocator<_VoidPtrSNode> >;_STLP_EXPORT_TEMPLATE_CLASS _Slist_base<void*, allocator<void*> >;_STLP_EXPORT_TEMPLATE_CLASS slist<void*, allocator<void*> >;# endiftemplate <class _Tp, class _Alloc>class slist<_Tp*, _Alloc> _STLP_STLPORT_CLASS_1 {private: //Member datas as a void* slist: typedef typename _Alloc_traits<void*, _Alloc>::allocator_type _VoidAlloc; typedef slist<void*, _VoidAlloc> _Base; typedef _Slist_iterator<void*, _Nonconst_traits<void*> > void_iterator; typedef _Slist_iterator<void*, _Const_traits<void*> > const_void_iterator; _Base _M_container; typedef __void_ptr_traits<_Tp> cast_traits; typedef slist<_Tp*, _Alloc> _Self;public: typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?