📄 _list.h
字号:
/* * * 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 + -