diff options
Diffstat (limited to 'gnu/lib/libg++/g++-include/SkipSet.hP')
-rw-r--r-- | gnu/lib/libg++/g++-include/SkipSet.hP | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/gnu/lib/libg++/g++-include/SkipSet.hP b/gnu/lib/libg++/g++-include/SkipSet.hP new file mode 100644 index 000000000000..cd953052394d --- /dev/null +++ b/gnu/lib/libg++/g++-include/SkipSet.hP @@ -0,0 +1,187 @@ +// This may look like C code, but it is really -*- C++ -*- +/* +Copyright (C) 1991 Free Software Foundation + +This file is part of the GNU C++ Library. This library is free +software; you can redistribute it and/or modify it under the terms of +the GNU Library General Public License as published by the Free +Software Foundation; either version 2 of the License, 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 Library General Public License for more details. +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the Free Software +Foundation, 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 |