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

📄 _list.h

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Copyright (c) 1996,1997 * Silicon Graphics Computer Systems, Inc. * * Copyright (c) 1997 * Moscow Center for SPARC Technology * * 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. * *//* NOTE: This is an internal header file, included by other STL headers. *   You should not attempt to use it directly. */#ifndef _STLP_INTERNAL_LIST_H#define _STLP_INTERNAL_LIST_H# ifndef _STLP_INTERNAL_ALGOBASE_H#  include <stl/_algobase.h># endif# ifndef _STLP_INTERNAL_ALLOC_H#  include <stl/_alloc.h># endif# ifndef _STLP_INTERNAL_ITERATOR_H#  include <stl/_iterator.h># endif# ifndef _STLP_INTERNAL_CONSTRUCT_H#  include <stl/_construct.h># endif# ifndef _STLP_INTERNAL_FUNCTION_BASE_H#  include <stl/_function_base.h># endif_STLP_BEGIN_NAMESPACE# undef list# define  list  __WORKAROUND_DBG_RENAME(list)struct _List_node_base {  _List_node_base* _M_next;  _List_node_base* _M_prev;};template <class _Dummy>class _List_global {public:  typedef _List_node_base _Node;  static void  _STLP_CALL _Transfer(_List_node_base* __position,                                     _List_node_base* __first, _List_node_base* __last);};# if defined (_STLP_USE_TEMPLATE_EXPORT) _STLP_EXPORT_TEMPLATE_CLASS _List_global<bool>;# endiftypedef _List_global<bool> _List_global_inst;template <class _Tp>struct _List_node : public _List_node_base {  _Tp _M_data;  __TRIVIAL_STUFF(_List_node)#ifdef __DMC__  // for some reason, Digital Mars C++ needs a constructor... private:  _List_node();#endif};struct _List_iterator_base {  typedef size_t                     size_type;  typedef ptrdiff_t                  difference_type;  typedef bidirectional_iterator_tag iterator_category;  _List_node_base* _M_node;  _List_iterator_base(_List_node_base* __x) : _M_node(__x) {}  _List_iterator_base() {}  void _M_incr() { _M_node = _M_node->_M_next; }  void _M_decr() { _M_node = _M_node->_M_prev; }  bool operator==(const _List_iterator_base& __y ) const {     return _M_node == __y._M_node;   }  bool operator!=(const _List_iterator_base& __y ) const {     return _M_node != __y._M_node;   }};  template<class _Tp, class _Traits>struct _List_iterator : public _List_iterator_base {  typedef _Tp value_type;  typedef typename _Traits::pointer    pointer;  typedef typename _Traits::reference  reference;  typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;  typedef _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;  typedef _List_iterator<_Tp, _Traits>                       _Self;  typedef bidirectional_iterator_tag iterator_category;  typedef _List_node<_Tp> _Node;  typedef size_t size_type;  typedef ptrdiff_t difference_type;  _List_iterator(_Node* __x) : _List_iterator_base(__x) {}  _List_iterator() {}  _List_iterator(const iterator& __x) :  _List_iterator_base(__x._M_node) {}  reference operator*() const { return ((_Node*)_M_node)->_M_data; }  _STLP_DEFINE_ARROW_OPERATOR  _Self& operator++() {     this->_M_incr();    return *this;  }  _Self operator++(int) {     _Self __tmp = *this;    this->_M_incr();    return __tmp;  }  _Self& operator--() {     this->_M_decr();    return *this;  }  _Self operator--(int) {     _Self __tmp = *this;    this->_M_decr();    return __tmp;  }};#ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIEStemplate <class _Tp, class _Traits>inline _Tp* value_type(const _List_iterator<_Tp, _Traits>&) { return 0; }inline bidirectional_iterator_tag iterator_category(const _List_iterator_base&) { return bidirectional_iterator_tag();}inline ptrdiff_t* distance_type(const _List_iterator_base&) { return 0; }#endif// Base class that encapsulates details of allocators and helps // to simplify EHtemplate <class _Tp, class _Alloc>class _List_base {protected:  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)  typedef _List_node<_Tp> _Node;  typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type           _Node_allocator_type;public:  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type          allocator_type;  allocator_type get_allocator() const {     return _STLP_CONVERT_ALLOCATOR((const _Node_allocator_type&)_M_node, _Tp);  }  _List_base(const allocator_type& __a) : _M_node(_STLP_CONVERT_ALLOCATOR(__a, _Node), (_Node*)0) {    _Node* __n = _M_node.allocate(1);    __n->_M_next = __n;    __n->_M_prev = __n;    _M_node._M_data = __n;  }  ~_List_base() {    clear();    _M_node.deallocate(_M_node._M_data, 1);  }  void clear();public:  _STLP_alloc_proxy<_Node*, _Node, _Node_allocator_type>  _M_node;};template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >class list;// helper functions to reduce code duplicationtemplate <class _Tp, class _Alloc, class _Predicate> void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred);template <class _Tp, class _Alloc, class _BinaryPredicate>void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);template <class _Tp, class _Alloc, class _StrictWeakOrdering>void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,	      _StrictWeakOrdering __comp);template <class _Tp, class _Alloc, class _StrictWeakOrdering>void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);template <class _Tp, class _Alloc>class list : public _List_base<_Tp, _Alloc> {  typedef _List_base<_Tp, _Alloc> _Base;  typedef list<_Tp, _Alloc> _Self;public:        typedef _Tp value_type;  typedef value_type* pointer;  typedef const value_type* const_pointer;  typedef value_type& reference;  typedef const value_type& const_reference;  typedef _List_node<_Tp> _Node;  typedef size_t size_type;  typedef ptrdiff_t difference_type;  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)  typedef typename _Base::allocator_type allocator_type;  typedef bidirectional_iterator_tag _Iterator_category;public:  typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;  typedef _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;protected:  _Node* _M_create_node(const _Tp& __x)  {    _Node* __p = this->_M_node.allocate(1);    _STLP_TRY {      _Construct(&__p->_M_data, __x);    }    _STLP_UNWIND(this->_M_node.deallocate(__p, 1));    return __p;  }  _Node* _M_create_node()  {    _Node* __p = this->_M_node.allocate(1);    _STLP_TRY {      _Construct(&__p->_M_data);    }    _STLP_UNWIND(this->_M_node.deallocate(__p, 1));    return __p;  }public:# if !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)))  explicit# endif  list(const allocator_type& __a = allocator_type()) :    _List_base<_Tp, _Alloc>(__a) {}  iterator begin()             { return iterator((_Node*)(this->_M_node._M_data->_M_next)); }  const_iterator begin() const { return const_iterator((_Node*)(this->_M_node._M_data->_M_next)); }  iterator end()             { return this->_M_node._M_data; }  const_iterator end() const { return this->_M_node._M_data; }  reverse_iterator rbegin()     { return reverse_iterator(end()); }  const_reverse_iterator rbegin() const     { return const_reverse_iterator(end()); }  reverse_iterator rend()    { return reverse_iterator(begin()); }  const_reverse_iterator rend() const    { return const_reverse_iterator(begin()); }  bool empty() const { return this->_M_node._M_data->_M_next == this->_M_node._M_data; }  size_type size() const {    size_type __result = distance(begin(), end());    return __result;  }  size_type max_size() const { return size_type(-1); }

⌨️ 快捷键说明

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