_slist.h
来自「stl的源码」· C头文件 代码 · 共 915 行 · 第 1/3 页
H
915 行
/* * * 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_SLIST_H#define _STLP_INTERNAL_SLIST_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#ifndef _STLP_INTERNAL_SLIST_BASE_H# include <stl/_slist_base.h>#endif_STLP_BEGIN_NAMESPACE_STLP_MOVE_TO_PRIV_NAMESPACEtemplate <class _Tp>class _Slist_node : public _Slist_node_base {public: _Tp _M_data; __TRIVIAL_STUFF(_Slist_node)};struct _Slist_iterator_base { typedef size_t size_type; typedef ptrdiff_t difference_type; typedef forward_iterator_tag iterator_category; _Slist_node_base *_M_node; _Slist_iterator_base(_Slist_node_base *__x) : _M_node(__x) {} void _M_incr() { _M_node = _M_node->_M_next; }};template <class _Tp, class _Traits>class _Slist_iterator : public _Slist_iterator_base {public: typedef typename _Traits::value_type value_type; typedef typename _Traits::pointer pointer; typedef typename _Traits::reference reference; typedef forward_iterator_tag iterator_category; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Slist_iterator<_Tp, _Traits> _Self; typedef typename _Traits::_NonConstTraits _NonConstTraits; typedef _Slist_iterator<_Tp, _NonConstTraits> iterator; typedef typename _Traits::_ConstTraits _ConstTraits; typedef _Slist_iterator<_Tp, _ConstTraits> const_iterator; typedef _Slist_node<value_type> _Node; explicit _Slist_iterator(_Slist_node_base *__x) : _Slist_iterator_base(__x) {} _Slist_iterator() : _Slist_iterator_base(0) {} //copy constructor for iterator and constructor from iterator for const_iterator _Slist_iterator(const iterator& __x) : _Slist_iterator_base(__x._M_node) {} reference operator*() const { return __STATIC_CAST(_Node*, this->_M_node)->_M_data; } _STLP_DEFINE_ARROW_OPERATOR _Self& operator++() { _M_incr(); return *this; } _Self operator++(int) { _Self __tmp = *this; _M_incr(); 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 _Slist_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* _STLP_CALL value_type(const _STLP_PRIV _Slist_iterator<_Tp, _Traits>&) { return __STATIC_CAST(_Tp*, 0); }inline ptrdiff_t* _STLP_CALL distance_type(const _STLP_PRIV _Slist_iterator_base&) { return 0; }inline forward_iterator_tag _STLP_CALL iterator_category(const _STLP_PRIV _Slist_iterator_base&) { return forward_iterator_tag(); }_STLP_MOVE_TO_PRIV_NAMESPACE#endif /* OLD_QUERIES */// Base class that encapsulates details of allocators and simplifies EHtemplate <class _Tp, class _Alloc>class _Slist_base {protected: typedef _Slist_node<_Tp> _Node; typedef typename _Alloc_traits<_Node,_Alloc>::allocator_type _M_node_allocator_type; typedef _Slist_base<_Tp, _Alloc> _Self;public: typedef _STLP_alloc_proxy<_Slist_node_base, _Node, _M_node_allocator_type> _AllocProxy; _STLP_FORCE_ALLOCATORS(_Tp, _Alloc) typedef _Alloc allocator_type; _Slist_base(const allocator_type& __a) : _M_head(_STLP_CONVERT_ALLOCATOR(__a, _Node), _Slist_node_base() ) { _M_head._M_data._M_next = 0; }#if !defined (_STLP_NO_MOVE_SEMANTIC) _Slist_base(__move_source<_Self> src) : _M_head(__move_source<_AllocProxy>(src.get()._M_head)) { src.get()._M_head._M_data._M_next = 0; }#endif ~_Slist_base() { _M_erase_after(&_M_head._M_data, 0); }protected: _Slist_node_base* _M_erase_after(_Slist_node_base* __pos) { _Node* __next = __STATIC_CAST(_Node*, __pos->_M_next); _Slist_node_base* __next_next = __next->_M_next; __pos->_M_next = __next_next; _STLP_STD::_Destroy(&__next->_M_data); _M_head.deallocate(__next,1); return __next_next; } _Slist_node_base* _M_erase_after(_Slist_node_base*, _Slist_node_base*);public: allocator_type get_allocator() const { return _STLP_CONVERT_ALLOCATOR((const _M_node_allocator_type&)_M_head, _Tp); } _AllocProxy _M_head;};#if defined (_STLP_USE_PTR_SPECIALIZATIONS)# define slist _STLP_PTR_IMPL_NAME(slist)#elif defined (_STLP_DEBUG)# define slist _STLP_NON_DBG_NAME(slist)#else_STLP_MOVE_TO_STD_NAMESPACE#endiftemplate <class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >class slist;#if !defined (slist)_STLP_MOVE_TO_PRIV_NAMESPACE#endif// helper functions to reduce code duplicationtemplate <class _Tp, class _Alloc, class _BinaryPredicate>void _Slist_unique(slist<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);template <class _Tp, class _Alloc, class _StrictWeakOrdering>void _Slist_merge(slist<_Tp, _Alloc>& __that, slist<_Tp, _Alloc>& __x, _StrictWeakOrdering __comp);template <class _Tp, class _Alloc, class _StrictWeakOrdering>void _Slist_sort(slist<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);#if !defined (slist)_STLP_MOVE_TO_STD_NAMESPACE#endiftemplate <class _Tp, class _Alloc>class slist : protected _STLP_PRIV _Slist_base<_Tp,_Alloc>#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (slist) , public __stlport_class<slist<_Tp, _Alloc> >#endif{private: typedef _STLP_PRIV _Slist_base<_Tp,_Alloc> _Base; typedef slist<_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 size_t size_type; typedef ptrdiff_t difference_type; typedef forward_iterator_tag _Iterator_category; typedef _STLP_PRIV _Slist_iterator<_Tp, _Nonconst_traits<_Tp> > iterator; typedef _STLP_PRIV _Slist_iterator<_Tp, _Const_traits<_Tp> > const_iterator; _STLP_FORCE_ALLOCATORS(_Tp, _Alloc) typedef typename _Base::allocator_type allocator_type;private: typedef _STLP_PRIV _Slist_node<_Tp> _Node; typedef _STLP_PRIV _Slist_node_base _Node_base;#if !defined(_STLP_DONT_SUP_DFLT_PARAM) _Node* _M_create_node(const value_type& __x = _Tp()) {#else _Node* _M_create_node(const value_type& __x) {#endif /*_STLP_DONT_SUP_DFLT_PARAM*/ _Node* __node = this->_M_head.allocate(1); _STLP_TRY { _Copy_Construct(&__node->_M_data, __x); __node->_M_next = 0; } _STLP_UNWIND(this->_M_head.deallocate(__node, 1)) return __node; }#if defined(_STLP_DONT_SUP_DFLT_PARAM) _Node* _M_create_node() { _Node* __node = this->_M_head.allocate(1); _STLP_TRY { _STLP_STD::_Construct(&__node->_M_data); __node->_M_next = 0; } _STLP_UNWIND(this->_M_head.deallocate(__node, 1)) return __node; }#endif /*_STLP_DONT_SUP_DFLT_PARAM*/public: allocator_type get_allocator() const { return _Base::get_allocator(); }#if !defined (_STLP_DONT_SUP_DFLT_PARAM) explicit slist(const allocator_type& __a = allocator_type())#else slist() : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type()) {} slist(const allocator_type& __a)#endif : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a) {}#if !defined (_STLP_DONT_SUP_DFLT_PARAM) explicit slist(size_type __n, const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp), const allocator_type& __a = allocator_type())#else explicit slist(size_type __n) : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type()) { _M_insert_after_fill(&this->_M_head._M_data, __n, _STLP_DEFAULT_CONSTRUCTED(_Tp)); } slist(size_type __n, const value_type& __x) : _STLP_PRIV _Slist_base<_Tp,_Alloc>(allocator_type()) { _M_insert_after_fill(&this->_M_head._M_data, __n, __x); } slist(size_type __n, const value_type& __x, const allocator_type& __a)#endif : _STLP_PRIV _Slist_base<_Tp,_Alloc>(__a) { _M_insert_after_fill(&this->_M_head._M_data, __n, __x); }#if defined (_STLP_MEMBER_TEMPLATES) // We don't need any dispatching tricks here, because _M_insert_after_range // already does them.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?