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

📄 _list.h

📁 symbian 上的stl_port进过编译的。
💻 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_IMPL_H#define _STLP_INTERNAL_LIST_IMPL_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_STLP_MOVE_TO_PRIV_NAMESPACEstruct _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_base;  static void  _STLP_CALL _Transfer(_Node_base* __pos,                                    _Node_base* __first, _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>class _List_node : public _List_node_base {public:  _Tp _M_data;  __TRIVIAL_STUFF(_List_node)};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) {}  void _M_incr() { _M_node = _M_node->_M_next; }  void _M_decr() { _M_node = _M_node->_M_prev; }};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, _Traits>         _Self;  typedef typename _Traits::_NonConstTraits    _NonConstTraits;  typedef _List_iterator<_Tp, _NonConstTraits> iterator;  typedef typename _Traits::_ConstTraits       _ConstTraits;  typedef _List_iterator<_Tp, _ConstTraits>    const_iterator;  typedef bidirectional_iterator_tag iterator_category;  typedef _List_node<_Tp> _Node;  typedef size_t size_type;  typedef ptrdiff_t difference_type;  explicit _List_iterator(_List_node_base* __x) : _List_iterator_base(__x) {}  _List_iterator() : _List_iterator_base(0) {}  //copy constructor for iterator and constructor from iterator for const_iterator  _List_iterator(const iterator& __x) :  _List_iterator_base(__x._M_node) {}  reference operator*() const { return __STATIC_CAST(_Node*, this->_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;  }  bool operator==(const_iterator __y ) const {    return this->_M_node == __y._M_node;  }  bool operator!=(const_iterator __y ) const {    return this->_M_node != __y._M_node;  }};#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _Tp, class _Traits>struct __type_traits<_STLP_PRIV _List_iterator<_Tp, _Traits> > {  typedef __false_type   has_trivial_default_constructor;  typedef __true_type    has_trivial_copy_constructor;  typedef __true_type    has_trivial_assignment_operator;  typedef __true_type    has_trivial_destructor;  typedef __false_type   is_POD_type;};_STLP_MOVE_TO_PRIV_NAMESPACE#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)_STLP_MOVE_TO_STD_NAMESPACEtemplate <class _Tp, class _Traits>inline _Tp* value_type(const _STLP_PRIV _List_iterator<_Tp, _Traits>&) { return 0; }inline bidirectional_iterator_tag iterator_category(const _STLP_PRIV _List_iterator_base&) { return bidirectional_iterator_tag();}inline ptrdiff_t* distance_type(const _STLP_PRIV _List_iterator_base&) { return 0; }_STLP_MOVE_TO_PRIV_NAMESPACE#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_base _Node_base;  typedef _List_node<_Tp> _Node;  typedef _List_base<_Tp, _Alloc> _Self;  typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type _Node_allocator_type;public:  typedef _STLP_alloc_proxy<_Node_base, _Node, _Node_allocator_type> _AllocProxy;  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_base())  { _M_empty_initialize(); }  _List_base(__move_source<_Self> src) :    _M_node(__move_source<_AllocProxy>(src.get()._M_node)) {    if (src.get().empty())      //We force this to empty.      _M_empty_initialize();    else {      src.get()._M_empty_initialize();      _M_node._M_data._M_prev->_M_next = _M_node._M_data._M_next->_M_prev = &_M_node._M_data;    }  }  ~_List_base()  { clear(); }  void clear();  bool empty() const { return _M_node._M_data._M_next == &_M_node._M_data; }  void _M_empty_initialize() {    _M_node._M_data._M_next = &_M_node._M_data;    _M_node._M_data._M_prev = _M_node._M_data._M_next;  }public:  _AllocProxy _M_node;};#if defined (_STLP_USE_PTR_SPECIALIZATIONS)#  define list _STLP_PTR_IMPL_NAME(list)#elif defined (_STLP_DEBUG)#  define list _STLP_NON_DBG_NAME(list)#else_STLP_MOVE_TO_STD_NAMESPACE#endiftemplate <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >class list;#if !defined (list)_STLP_MOVE_TO_PRIV_NAMESPACE#endif// 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);#if !defined (list)_STLP_MOVE_TO_STD_NAMESPACE#endiftemplate <class _Tp, class _Alloc>class list : public _STLP_PRIV _List_base<_Tp, _Alloc>#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (list)           , public __stlport_class<list<_Tp, _Alloc> >#endif{  typedef _STLP_PRIV _List_base<_Tp, _Alloc> _Base;  typedef list<_Tp, _Alloc> _Self;  typedef _STLP_PRIV _List_node<_Tp> _Node;  typedef _STLP_PRIV _List_node_base _Node_base;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 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 _STLP_PRIV _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;  typedef _STLP_PRIV _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;protected:#if !defined(_STLP_DONT_SUP_DFLT_PARAM)  _Node_base* _M_create_node(const_reference __x = value_type()) {#else  _Node_base* _M_create_node(const_reference __x) {#endif /*!_STLP_DONT_SUP_DFLT_PARAM*/    _Node* __p = this->_M_node.allocate(1);    _STLP_TRY {      _Copy_Construct(&__p->_M_data, __x);    }    _STLP_UNWIND(this->_M_node.deallocate(__p, 1))    return __p;  }#if defined(_STLP_DONT_SUP_DFLT_PARAM)  _Node_base* _M_create_node() {    _Node* __p = this->_M_node.allocate(1);    _STLP_TRY {      _STLP_STD::_Construct(&__p->_M_data);    }    _STLP_UNWIND(this->_M_node.deallocate(__p, 1))    return __p;  }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/public:#if !defined (_STLP_DONT_SUP_DFLT_PARAM)  explicit list(size_type __n, const_reference __val = _STLP_DEFAULT_CONSTRUCTED(value_type),                const allocator_type& __a = allocator_type())#else  explicit list(size_type __n)    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())    { this->insert(begin(), __n, _STLP_DEFAULT_CONSTRUCTED(value_type)); }  list(size_type __n, const_reference __val)    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())    { this->insert(begin(), __n, __val); }  list(size_type __n, const_reference __val, const allocator_type& __a)#endif /*_STLP_DONT_SUP_DFLT_PARAM*/    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)    { this->insert(begin(), __n, __val); }#if defined (_STLP_MEMBER_TEMPLATES)  // We don't need any dispatching tricks here, because insert does all of  // that anyway.  template <class _InputIterator>  list(_InputIterator __first, _InputIterator __last,       const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)  { _M_insert(begin(), __first, __last); }#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)  template <class _InputIterator>  list(_InputIterator __first, _InputIterator __last)    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())  { _M_insert(begin(), __first, __last); }#  endif#else /* _STLP_MEMBER_TEMPLATES */  list(const value_type* __first, const value_type* __last,       const allocator_type& __a = allocator_type())    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)    { _M_insert(begin(), __first, __last); }  list(const_iterator __first, const_iterator __last,       const allocator_type& __a = allocator_type())    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)    { _M_insert(begin(), __first, __last); }#endif /* _STLP_MEMBER_TEMPLATES */#if !defined (_STLP_DONT_SUP_DFLT_PARAM)  explicit list(const allocator_type& __a = allocator_type())#else  list()    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type()) {}  list(const allocator_type& __a)#endif    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a) {}  list(const _Self& __x) : _STLP_PRIV _List_base<_Tp, _Alloc>(__x.get_allocator())  { _M_insert(begin(), __x.begin(), __x.end()); }  list(__move_source<_Self> src)    : _STLP_PRIV _List_base<_Tp, _Alloc>(__move_source<_Base>(src.get())) {}  ~list() {}  _Self& operator = (const _Self& __x);  iterator begin()                      { return iterator(this->_M_node._M_data._M_next); }  const_iterator begin() const          { return const_iterator(this->_M_node._M_data._M_next); }  iterator end()                        { return iterator(&this->_M_node._M_data); }  const_iterator end() const            { return const_iterator(__CONST_CAST(_Node_base*, &this->_M_node._M_data)); }

⌨️ 快捷键说明

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