📄 _slist.h
字号:
#ifdef _STLP_MEMBER_TEMPLATES // Check whether it's an integral type. If so, it's not an iterator. template <class _InIter> void _M_insert_after_range(_Node_base* __pos, _InIter __first, _InIter __last) { typedef typename _Is_integer<_InIter>::_Integral _Integral; _M_insert_after_range(__pos, __first, __last, _Integral()); } template <class _Integer> void _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x, const __true_type&) { _M_insert_after_fill(__pos, __n, __x); } template <class _InIter> void _M_insert_after_range(_Node_base* __pos, _InIter __first, _InIter __last, const __false_type&) { while (__first != __last) { __pos = __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } }#else /* _STLP_MEMBER_TEMPLATES */ void _M_insert_after_range(_Node_base* __pos, const_iterator __first, const_iterator __last) { while (__first != __last) { __pos = __slist_make_link(__pos, _M_create_node(*__first)); ++__first; } } 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: iterator insert_after(iterator __pos, const value_type& __x) { return iterator(_M_insert_after(__pos._M_node, __x)); } iterator insert_after(iterator __pos) { return insert_after(__pos, value_type()); } void insert_after(iterator __pos, size_type __n, const value_type& __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 */ iterator insert(iterator __pos, const value_type& __x) { return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __x)); } iterator insert(iterator __pos) { return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), value_type())); } void insert(iterator __pos, size_type __n, const value_type& __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((_Node*) this->_M_erase_after(__pos._M_node)); } iterator erase_after(iterator __before_first, iterator __last) { return iterator((_Node*) this->_M_erase_after(__before_first._M_node, __last._M_node)); } iterator erase(iterator __pos) { return iterator((_Node*) this->_M_erase_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node))); } iterator erase(iterator __first, iterator __last) { return iterator((_Node*) this->_M_erase_after( _Sl_global_inst::__previous(&this->_M_head._M_data, __first._M_node), __last._M_node)); } void resize(size_type new_size, const _Tp& __x); void resize(size_type new_size) { resize(new_size, _Tp()); } 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 _Tp& __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(((_Node*) __cur->_M_next)->_M_data)) this->_M_erase_after(__cur); else __cur = __cur->_M_next; } } template <class _BinaryPredicate> void unique(_BinaryPredicate __pred) { _Node* __cur = (_Node*) this->_M_head._M_data._M_next; if (__cur) { while (__cur->_M_next) { if (__pred(((_Node*)__cur)->_M_data, ((_Node*)(__cur->_M_next))->_M_data)) this->_M_erase_after(__cur); else __cur = (_Node*) __cur->_M_next; } } } template <class _StrictWeakOrdering> void merge(slist<_Tp,_Alloc>& __x, _StrictWeakOrdering __comp) { _Node_base* __n1 = &this->_M_head._M_data; while (__n1->_M_next && __x._M_head._M_data._M_next) { if (__comp(((_Node*) __x._M_head._M_data._M_next)->_M_data, ((_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 */};template <class _Tp, class _Alloc>inline bool _STLP_CALLoperator==(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2){ typedef typename slist<_Tp,_Alloc>::const_iterator const_iterator; const_iterator __end1 = _SL1.end(); const_iterator __end2 = _SL2.end(); const_iterator __i1 = _SL1.begin(); const_iterator __i2 = _SL2.begin(); while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) { ++__i1; ++__i2; } return __i1 == __end1 && __i2 == __end2;}# define _STLP_EQUAL_OPERATOR_SPECIALIZED# define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc># define _STLP_TEMPLATE_CONTAINER slist<_Tp, _Alloc># include <stl/_relops_cont.h># undef _STLP_TEMPLATE_CONTAINER# undef _STLP_TEMPLATE_HEADER# undef _STLP_EQUAL_OPERATOR_SPECIALIZED_STLP_END_NAMESPACE# if !defined (_STLP_LINK_TIME_INSTANTIATION)# include <stl/_slist.c># endif# undef slist# define __slist__ __FULL_NAME(slist)#if defined (_STLP_DEBUG) && !defined (_STLP_INTERNAL_DBG_SLIST_H)# include <stl/debug/_slist.h>#endif_STLP_BEGIN_NAMESPACE// Specialization of insert_iterator so that insertions will be constant// time rather than linear time.#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATIONtemplate <class _Tp, class _Alloc>class insert_iterator<slist<_Tp, _Alloc> > {protected: typedef slist<_Tp, _Alloc> _Container; _Container* container; typename _Container::iterator iter;public: typedef _Container container_type; typedef output_iterator_tag iterator_category; typedef void value_type; typedef void difference_type; typedef void pointer; typedef void reference; insert_iterator(_Container& __x, typename _Container::iterator __i) : container(&__x) { if (__i == __x.begin()) iter = __x.before_begin(); else iter = __x.previous(__i); } insert_iterator<_Container>& operator=(const typename _Container::value_type& __val) { iter = container->insert_after(iter, __val); return *this; } insert_iterator<_Container>& operator*() { return *this; } insert_iterator<_Container>& operator++() { return *this; } insert_iterator<_Container>& operator++(int) { return *this; }};#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */_STLP_END_NAMESPACE# if defined ( _STLP_USE_WRAPPER_FOR_ALLOC_PARAM )# include <stl/wrappers/_slist.h># endif#endif /* _STLP_INTERNAL_SLIST_H */// Local Variables:// mode:C++// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -