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

📄 skipset.hp

📁 早期freebsd实现
💻 HP
字号:
// This may look like C code, but it is really -*- C++ -*-/* Copyright (C) 1991 Free Software FoundationThis file is part of the GNU C++ Library.  This library is freesoftware; you can redistribute it and/or modify it under the terms ofthe GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at youroption) any later version.  This library is distributed in the hopethat it will be useful, but WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULARPURPOSE.  See the GNU Library General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA.*//* * Sets implemented via William Pugh SkipList algorithms. * CACM, June 1990, p 668-676. * */#ifndef _<T>SkipSet_h#ifdef __GNUG__#pragma interface#endif#define _<T>SkipSet_h 1#include "<T>.Set.h"#include <values.h>#include <MLCG.h>class <T>SkipSet;class <T>RealSkipSetNode;class <T>SkipSetNode{friend class <T>SkipSet;  private:    <T>RealSkipSetNode * * forward;    <T>SkipSetNode(int size);};class <T>RealSkipSetNode : public <T>SkipSetNode{friend class <T>SkipSet;  private:    <T>             item;    <T>RealSkipSetNode(<T&> h, int size);};typedef <T>RealSkipSetNode* <T>SkipSetNodePtr;inline <T>SkipSetNode::<T>SkipSetNode(int size): forward(new <T>SkipSetNodePtr[size+1]){}inline <T>RealSkipSetNode::<T>RealSkipSetNode(<T&> h, int size): item(h),  <T>SkipSetNode(size){}class <T>SkipSet : public <T>Set{friend class <T>SkipSetinit;  protected:    <T>SkipSetNode*   header;    int               level;    int               max_levels;    int               randoms_left;    long              random_bits;        static MLCG*      gen;    int               random_level(void);        <T>SkipSetNodePtr leftmost(void);    <T>SkipSetNodePtr rightmost(void);    <T>SkipSetNodePtr pred(<T>SkipSetNodePtr t);    <T>SkipSetNodePtr succ(<T>SkipSetNodePtr t);    void              _kill(void);      private:    enum { BITS_IN_RANDOM = LONGBITS-1 };  public:    <T>SkipSet(long size=DEFAULT_INITIAL_CAPACITY);    <T>SkipSet(<T>SkipSet& a);    ~<T>SkipSet();        Pix             add(<T&> i);    void            del(<T&> i);    int             contains(<T&> i);        void            clear(void);        Pix             first(void);    void            next(Pix& i);    <T>&            operator () (Pix i);    Pix             seek(<T&> i);        Pix             last(void);    void            prev(Pix& i);        void            operator |= (<T>SkipSet& b);    void            operator -= (<T>SkipSet& b);    void            operator &= (<T>SkipSet& b);        int             operator == (<T>SkipSet& b);    int             operator != (<T>SkipSet& b);    int             operator <= (<T>SkipSet& b);         int             OK(void);};/* *  A little overkill on the inlines. * */inline <T>SkipSet::~<T>SkipSet(void){  _kill();  delete header;}inline int <T>SkipSet::operator != (<T>SkipSet& b){  return ! (*this == b);}inline <T>SkipSetNodePtr <T>SkipSet::leftmost(void){  return header->forward[0];}inline <T>SkipSetNodePtr <T>SkipSet::succ(<T>SkipSetNodePtr t){  <T>SkipSetNodePtr result = 0;  if (t->forward[0]!=header) result = t->forward[0];  return result;}inline Pix <T>SkipSet::first(void){  return Pix(leftmost());}inline Pix <T>SkipSet::last(void){  return Pix(rightmost());}inline void <T>SkipSet::next(Pix& i){  if (i != 0) i = Pix(succ((<T>SkipSetNodePtr)i));}inline void <T>SkipSet::prev(Pix& i){  if (i != 0) i = Pix(pred((<T>SkipSetNodePtr)i));}inline <T>& <T>SkipSet::operator () (Pix i){  if (i == 0) error("null Pix");  return ((<T>SkipSetNodePtr)i)->item;}inline int <T>SkipSet::contains(<T&> key){  return seek(key) != 0;}static class <T>SkipSetinit{  public:    <T>SkipSetinit();    ~<T>SkipSetinit();  private:    static int count;} <T>skipSetinit;#endif

⌨️ 快捷键说明

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