📄 skipset.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 + -