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

📄 slist

📁 linux下编程用 编译软件
💻
📖 第 1 页 / 共 2 页
字号:
// Singly-linked list implementation -*- C++ -*-// Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.//// This file is part of the GNU ISO C++ Library.  This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,// USA.// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License./* * Copyright (c) 1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Silicon Graphics makes no * representations about the suitability of this software for any * purpose.  It is provided "as is" without express or implied warranty. * *//** @file ext/slist *  This file is a GNU extension to the Standard C++ Library (possibly *  containing extensions from the HP/SGI STL subset).  */#ifndef _SLIST#define _SLIST 1#include <bits/stl_algobase.h>#include <bits/allocator.h>#include <bits/stl_construct.h>#include <bits/stl_uninitialized.h>#include <bits/concept_check.h>namespace __gnu_cxx{  using std::size_t;  using std::ptrdiff_t;  using std::_Construct;  using std::_Destroy;  using std::allocator;  struct _Slist_node_base  {    _Slist_node_base* _M_next;  };    inline _Slist_node_base*  __slist_make_link(_Slist_node_base* __prev_node,		    _Slist_node_base* __new_node)  {    __new_node->_M_next = __prev_node->_M_next;    __prev_node->_M_next = __new_node;    return __new_node;  }  inline _Slist_node_base*  __slist_previous(_Slist_node_base* __head,		   const _Slist_node_base* __node)  {    while (__head && __head->_M_next != __node)      __head = __head->_M_next;    return __head;  }  inline const _Slist_node_base*  __slist_previous(const _Slist_node_base* __head,		   const _Slist_node_base* __node)  {    while (__head && __head->_M_next != __node)      __head = __head->_M_next;    return __head;  }  inline void  __slist_splice_after(_Slist_node_base* __pos,		       _Slist_node_base* __before_first,		       _Slist_node_base* __before_last)  {    if (__pos != __before_first && __pos != __before_last)      {	_Slist_node_base* __first = __before_first->_M_next;	_Slist_node_base* __after = __pos->_M_next;	__before_first->_M_next = __before_last->_M_next;	__pos->_M_next = __first;	__before_last->_M_next = __after;      }  }  inline void  __slist_splice_after(_Slist_node_base* __pos, _Slist_node_base* __head)  {    _Slist_node_base* __before_last = __slist_previous(__head, 0);    if (__before_last != __head)      {	_Slist_node_base* __after = __pos->_M_next;	__pos->_M_next = __head->_M_next;	__head->_M_next = 0;	__before_last->_M_next = __after;      }  }  inline _Slist_node_base*  __slist_reverse(_Slist_node_base* __node)  {    _Slist_node_base* __result = __node;    __node = __node->_M_next;    __result->_M_next = 0;    while(__node)      {	_Slist_node_base* __next = __node->_M_next;	__node->_M_next = __result;	__result = __node;	__node = __next;      }    return __result;  }  inline size_t  __slist_size(_Slist_node_base* __node)  {    size_t __result = 0;    for (; __node != 0; __node = __node->_M_next)      ++__result;    return __result;  }  template <class _Tp>    struct _Slist_node : public _Slist_node_base    {      _Tp _M_data;    };  struct _Slist_iterator_base  {    typedef size_t                    size_type;    typedef ptrdiff_t                 difference_type;    typedef std::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; }    bool    operator==(const _Slist_iterator_base& __x) const    { return _M_node == __x._M_node; }    bool    operator!=(const _Slist_iterator_base& __x) const    { return _M_node != __x._M_node; }  };  template <class _Tp, class _Ref, class _Ptr>    struct _Slist_iterator : public _Slist_iterator_base    {      typedef _Slist_iterator<_Tp, _Tp&, _Tp*>             iterator;      typedef _Slist_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;      typedef _Slist_iterator<_Tp, _Ref, _Ptr>             _Self;      typedef _Tp              value_type;      typedef _Ptr             pointer;      typedef _Ref             reference;      typedef _Slist_node<_Tp> _Node;      explicit      _Slist_iterator(_Node* __x)      : _Slist_iterator_base(__x) {}      _Slist_iterator()      : _Slist_iterator_base(0) {}      _Slist_iterator(const iterator& __x)      : _Slist_iterator_base(__x._M_node) {}      reference      operator*() const      { return ((_Node*) _M_node)->_M_data; }      pointer      operator->() const      { return &(operator*()); }      _Self&      operator++()      {	_M_incr();	return *this;      }      _Self      operator++(int)      {	_Self __tmp = *this;	_M_incr();	return __tmp;      }    };  template <class _Tp, class _Alloc>    struct _Slist_base    : public _Alloc::template rebind<_Slist_node<_Tp> >::other    {      typedef typename _Alloc::template rebind<_Slist_node<_Tp> >::other        _Node_alloc;      typedef _Alloc allocator_type;      allocator_type      get_allocator() const      { return *static_cast<const _Node_alloc*>(this); }      _Slist_base(const allocator_type& __a)      : _Node_alloc(__a)      { this->_M_head._M_next = 0; }      ~_Slist_base()      { _M_erase_after(&this->_M_head, 0); }    protected:      _Slist_node_base _M_head;      _Slist_node<_Tp>*      _M_get_node()      { return _Node_alloc::allocate(1); }        void      _M_put_node(_Slist_node<_Tp>* __p)      { _Node_alloc::deallocate(__p, 1); }    protected:      _Slist_node_base* _M_erase_after(_Slist_node_base* __pos)      {	_Slist_node<_Tp>* __next = (_Slist_node<_Tp>*) (__pos->_M_next);	_Slist_node_base* __next_next = __next->_M_next;	__pos->_M_next = __next_next;	get_allocator().destroy(&__next->_M_data);	_M_put_node(__next);	return __next_next;      }      _Slist_node_base* _M_erase_after(_Slist_node_base*, _Slist_node_base*);    };  template <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;	  get_allocator().destroy(&__tmp->_M_data);	  _M_put_node(__tmp);	}      __before_first->_M_next = __last_node;      return __last_node;    }  /**   *  This is an SGI extension.   *  @ingroup SGIextensions   *  @doctodo   */  template <class _Tp, class _Alloc = allocator<_Tp> >    class slist : private _Slist_base<_Tp,_Alloc>    {      // concept requirements      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)	    private:      typedef _Slist_base<_Tp,_Alloc> _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;            typedef _Slist_iterator<_Tp, _Tp&, _Tp*>             iterator;      typedef _Slist_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;            typedef typename _Base::allocator_type allocator_type;      allocator_type      get_allocator() const      { return _Base::get_allocator(); }    private:      typedef _Slist_node<_Tp>      _Node;      typedef _Slist_node_base      _Node_base;      typedef _Slist_iterator_base  _Iterator_base;            _Node*      _M_create_node(const value_type& __x)      {	_Node* __node = this->_M_get_node();	try	  {	    get_allocator().construct(&__node->_M_data, __x);	    __node->_M_next = 0;	  }	catch(...)	  {	    this->_M_put_node(__node);	    __throw_exception_again;	  }	return __node;      }      _Node*      _M_create_node()      {	_Node* __node = this->_M_get_node();	try	  {	    get_allocator().construct(&__node->_M_data, value_type());	    __node->_M_next = 0;	  }	catch(...)	  {	    this->_M_put_node(__node);	    __throw_exception_again;	  }	return __node;      }    public:      explicit      slist(const allocator_type& __a = allocator_type())      : _Base(__a) {}      slist(size_type __n, const value_type& __x,	    const allocator_type& __a =  allocator_type())      : _Base(__a)      { _M_insert_after_fill(&this->_M_head, __n, __x); }      explicit      slist(size_type __n)      : _Base(allocator_type())      { _M_insert_after_fill(&this->_M_head, __n, value_type()); }      // We don't need any dispatching tricks here, because      // _M_insert_after_range already does them.      template <class _InputIterator>        slist(_InputIterator __first, _InputIterator __last,	      const allocator_type& __a =  allocator_type())	: _Base(__a)        { _M_insert_after_range(&this->_M_head, __first, __last); }      slist(const slist& __x)      : _Base(__x.get_allocator())      { _M_insert_after_range(&this->_M_head, __x.begin(), __x.end()); }      slist&      operator= (const slist& __x);      ~slist() {}    public:      // assign(), a generalized assignment member function.  Two      // versions: one that takes a count, and one that takes a range.      // The range version is a member template, so we dispatch on whether      // or not the type is an integer.            void      assign(size_type __n, const _Tp& __val)      { _M_fill_assign(__n, __val); }      void      _M_fill_assign(size_type __n, const _Tp& __val);      template <class _InputIterator>        void        assign(_InputIterator __first, _InputIterator __last)        {	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;	  _M_assign_dispatch(__first, __last, _Integral());	}      template <class _Integer>      void      _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)      { _M_fill_assign((size_type) __n, (_Tp) __val); }      template <class _InputIterator>      void      _M_assign_dispatch(_InputIterator __first, _InputIterator __last,			 __false_type);    public:      iterator      begin()      { return iterator((_Node*)this->_M_head._M_next); }      const_iterator      begin() const      { return const_iterator((_Node*)this->_M_head._M_next);}      iterator      end()      { return iterator(0); }      const_iterator      end() const      { return const_iterator(0); }      // Experimental new feature: before_begin() returns a      // non-dereferenceable iterator that, when incremented, yields      // begin().  This iterator may be used as the argument to      // insert_after, erase_after, etc.  Note that even for an empty      // slist, before_begin() is not the same iterator as end().  It      // is always necessary to increment before_begin() at least once to      // obtain end().      iterator      before_begin()      { return iterator((_Node*) &this->_M_head); }      const_iterator      before_begin() const      { return const_iterator((_Node*) &this->_M_head); }      size_type      size() const      { return __slist_size(this->_M_head._M_next); }      size_type      max_size() const      { return size_type(-1); }      bool      empty() const      { return this->_M_head._M_next == 0; }      void      swap(slist& __x)      { std::swap(this->_M_head._M_next, __x._M_head._M_next); }    public:      reference      front()      { return ((_Node*) this->_M_head._M_next)->_M_data; }      const_reference      front() const      { return ((_Node*) this->_M_head._M_next)->_M_data; }      void      push_front(const value_type& __x)      { __slist_make_link(&this->_M_head, _M_create_node(__x)); }      void      push_front()      { __slist_make_link(&this->_M_head, _M_create_node()); }      void      pop_front()      {	_Node* __node = (_Node*) this->_M_head._M_next;	this->_M_head._M_next = __node->_M_next;	get_allocator().destroy(&__node->_M_data);	this->_M_put_node(__node);      }      iterator      previous(const_iterator __pos)      { return iterator((_Node*) __slist_previous(&this->_M_head,						  __pos._M_node)); }      const_iterator      previous(const_iterator __pos) const      { return const_iterator((_Node*) __slist_previous(&this->_M_head,							__pos._M_node)); }    private:      _Node*      _M_insert_after(_Node_base* __pos, const value_type& __x)      { return (_Node*) (__slist_make_link(__pos, _M_create_node(__x))); }      _Node*      _M_insert_after(_Node_base* __pos)      { return (_Node*) (__slist_make_link(__pos, _M_create_node())); }      void      _M_insert_after_fill(_Node_base* __pos,			   size_type __n, const value_type& __x)      {	for (size_type __i = 0; __i < __n; ++__i)	  __pos = __slist_make_link(__pos, _M_create_node(__x));      }      // Check whether it's an integral type.  If so, it's not an iterator.      template <class _InIterator>        void        _M_insert_after_range(_Node_base* __pos,			      _InIterator __first, _InIterator __last)        {	  typedef typename std::__is_integer<_InIterator>::__type _Integral;	  _M_insert_after_range(__pos, __first, __last, _Integral());	}      template <class _Integer>        void        _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x,			      __true_type)        { _M_insert_after_fill(__pos, __n, __x); }      template <class _InIterator>

⌨️ 快捷键说明

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