⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _slist.c

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 C
字号:
/* * * Copyright (c) 1996,1997 * Silicon Graphics Computer Systems, Inc. * * Copyright (c) 1999  * Boris Fomitchev * * This material is provided "as is", with absolutely no warranty expressed * or implied. Any use is at your own risk. * * Permission to use or copy this software for any purpose is hereby granted  * without fee, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */#ifndef _STLP_SLIST_C#define _STLP_SLIST_C#ifndef _STLP_INTERNAL_SLIST_H# include <stl/_slist.h>#endif# undef slist# define  slist  __WORKAROUND_DBG_RENAME(slist)# if defined (_STLP_NESTED_TYPE_PARAM_BUG) #  define size_type          size_t# endif_STLP_BEGIN_NAMESPACEtemplate <class _Tp, class _Alloc> _Slist_node_base*_Slist_base<_Tp,_Alloc>::_M_erase_after(_Slist_node_base* __before_first,                                        _Slist_node_base* __last_node) {  _Slist_node<_Tp>* __cur = (_Slist_node<_Tp>*) (__before_first->_M_next);  while (__cur != __last_node) {    _Slist_node<_Tp>* __tmp = __cur;    __cur = (_Slist_node<_Tp>*) __cur->_M_next;    _STLP_STD::_Destroy(&__tmp->_M_data);    _M_head.deallocate(__tmp,1);  }  __before_first->_M_next = __last_node;  return __last_node;}template <class _Tp, class _Alloc>slist<_Tp,_Alloc>& slist<_Tp,_Alloc>::operator=(const slist<_Tp,_Alloc>& __x){  if (&__x != this) {    _Node_base* __p1 = &this->_M_head._M_data;    _Node* __n1 = (_Node*) this->_M_head._M_data._M_next;    const _Node* __n2 = (const _Node*) __x._M_head._M_data._M_next;    while (__n1 && __n2) {      __n1->_M_data = __n2->_M_data;      __p1 = __n1;      __n1 = (_Node*) __n1->_M_next;      __n2 = (const _Node*) __n2->_M_next;    }    if (__n2 == 0)      this->_M_erase_after(__p1, 0);    else      _M_insert_after_range(__p1, const_iterator((_Node*)__n2),                                   const_iterator(0));  }  return *this;}template <class _Tp, class _Alloc>void slist<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) {  _Node_base* __prev = &this->_M_head._M_data;  _Node* __node = (_Node*) this->_M_head._M_data._M_next;  for ( ; __node != 0 && __n > 0 ; --__n) {    __node->_M_data = __val;    __prev = __node;    __node = (_Node*) __node->_M_next;  }  if (__n > 0)    _M_insert_after_fill(__prev, __n, __val);  else    this->_M_erase_after(__prev, 0);}template <class _Tp, class _Alloc>void slist<_Tp,_Alloc>::resize(size_type __len, const _Tp& __x){  _Node_base* __cur = &this->_M_head._M_data;  while (__cur->_M_next != 0 && __len > 0) {    --__len;    __cur = __cur->_M_next;  }  if (__cur->_M_next)     this->_M_erase_after(__cur, 0);  else    _M_insert_after_fill(__cur, __len, __x);}template <class _Tp, class _Alloc>void slist<_Tp,_Alloc>::remove(const _Tp& __val){  _Node_base* __cur = &this->_M_head._M_data;  while (__cur && __cur->_M_next) {    if (((_Node*) __cur->_M_next)->_M_data == __val)      this->_M_erase_after(__cur);    else      __cur = __cur->_M_next;  }}template <class _Tp, class _Alloc> void slist<_Tp,_Alloc>::unique(){  _Node_base* __cur = this->_M_head._M_data._M_next;  if (__cur) {    while (__cur->_M_next) {      if (((_Node*)__cur)->_M_data ==           ((_Node*)(__cur->_M_next))->_M_data)        this->_M_erase_after(__cur);      else        __cur = __cur->_M_next;    }  }}template <class _Tp, class _Alloc>void slist<_Tp,_Alloc>::merge(slist<_Tp,_Alloc>& __x){  _Node_base* __n1 = &this->_M_head._M_data;  while (__n1->_M_next && __x._M_head._M_data._M_next) {    if (((_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 _Tp, class _Alloc>void slist<_Tp,_Alloc>::sort(){  if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {    _Self __carry;    _Self __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);        __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]);    this->swap(__counter[__fill-1]);  }}# undef slist# undef size_type_STLP_END_NAMESPACE#endif /*  _STLP_SLIST_C */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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