_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 + -
显示快捷键?