// This may look like C code, but it is really -*- C++ -*- /* Copyright (C) 1988 Free Software Foundation written by Doug Lea (dl@rocky.oswego.edu) 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. */ #ifndef _BSTSet_h #ifdef __GNUG__ #pragma interface #endif #define _BSTSet_h 1 #include ".Set.h" #ifndef _BSTNode #define _BSTNode 1 struct BSTNode { BSTNode* lt; BSTNode* rt; BSTNode* par; item; BSTNode( h, BSTNode* l=0, BSTNode* r=0, BSTNode* p = 0); ~BSTNode(); }; inline BSTNode::BSTNode( h, BSTNode* l, BSTNode* r, BSTNode* p) :item(h), lt(l), rt(r), par(p) {} inline BSTNode::~BSTNode() {} typedef BSTNode* BSTNodePtr; #endif class BSTSet : public Set { protected: BSTNode* root; BSTNode* leftmost(); BSTNode* rightmost(); BSTNode* pred(BSTNode* t); BSTNode* succ(BSTNode* t); void _kill(BSTNode* t); BSTNode* _copy(BSTNode* t); public: BSTSet(); BSTSet(BSTSet& a); ~BSTSet(); Pix add( item); void del( item); int contains( item); void clear(); Pix first(); void next(Pix& i); & operator () (Pix i); Pix seek( item); Pix last(); void prev(Pix& i); int operator == (BSTSet& b); int operator != (BSTSet& b); int operator <= (BSTSet& b); void balance(); int OK(); }; inline BSTSet::~BSTSet() { _kill(root); } inline BSTSet::BSTSet() { root = 0; count = 0; } inline BSTSet::BSTSet(BSTSet& a) { count = a.count; root = _copy(a.root); } inline int BSTSet::operator != (BSTSet& b) { return ! (*this == b); } inline Pix BSTSet::first() { return Pix(leftmost()); } inline Pix BSTSet::last() { return Pix(rightmost()); } inline void BSTSet::next(Pix& i) { if (i != 0) i = Pix(succ((BSTNode*)i)); } inline void BSTSet::prev(Pix& i) { if (i != 0) i = Pix(pred((BSTNode*)i)); } inline & BSTSet::operator () (Pix i) { if (i == 0) error("null Pix"); return ((BSTNode*)i)->item; } inline void BSTSet::clear() { _kill(root); count = 0; root = 0; } inline int BSTSet::contains( key) { return seek(key) != 0; } #endif