home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
IIBSTKSS.H
< prev
next >
Wrap
Text File
|
1993-09-22
|
16KB
|
486 lines
/*******************************************************************************
* *
* COPYRIGHT: *
* IBM C/C++ Tools Version 2.01 - Collection Class Library *
* Licensed Materials - Property of IBM *
* (C) Copyright IBM Corporation 1992, 1993 *
* All Rights Reserved *
* US Government Users Restricted Rights - Use, duplication, or disclosure *
* restricted by GSA ADP Schedule Contract with IBM Corp. *
* *
*******************************************************************************/
#ifndef _IIBSTKSS_H
#define _IIBSTKSS_H
#include <iglobals.h>
class IBSTKeySortedSetImpl
{
public:
class Node
{
public:
virtual IBoolean isLeaf () const = 0;
};
class Lnode : public Node
{
public:
virtual IBoolean isLeaf () const;
public:
virtual void const*
getElement () const = 0;
virtual void* getElement () = 0;
virtual void replaceElement (void const* element) = 0;
virtual IBoolean isKeyEqualTo (void const* lnode) const = 0;
virtual IBoolean isKeyEqualToKeyOfElement (void const* element) const = 0;
virtual IBoolean isKeyEqualToKey (void const* key) const = 0;
};
class Inode : public Node
{
friend class IBSTKeySortedSetImpl;
public:
inline Inode (Node**, void* keys);
inline Inode (Inode const&, Node**, void* keys);
virtual IBoolean isLeaf () const;
protected:
void* ivKeys;
Node** ivPtrs;
INumber ivm;
};
class Operations
{
public:
virtual Lnode* newLnode (void const* element) const = 0;
virtual Lnode* newLnodeFromLnode (void const* lnode) const = 0;
virtual Inode* newInode () const = 0;
virtual Inode* newInode (void const* inode) const = 0;
virtual void* newKey () const = 0;
virtual void deleteLnode (void* lnode) const = 0;
virtual void deleteInode (void* inode) const = 0;
virtual void deleteKey (void *key) const = 0;
virtual IBoolean isKeyLessThan (void const* key1,
void const* key2) const = 0;
virtual void copyKey (void* toKey,
unsigned int toIndex,
void const* fromKey,
unsigned int fromIndex) const = 0;
void copyKey (void* toKey,
void const* fromKey)
{ copyKey (toKey, 0, fromKey, 0); }
void copyKey (void* toKey,
unsigned int toIndex,
void const* fromKey)
{ copyKey (toKey, toIndex, fromKey, 0); }
void copyKey (void* toKey,
void const* fromKey,
unsigned int fromIndex)
{ copyKey (toKey, 0, fromKey, fromIndex); }
virtual IBoolean isKeyLessThanLnode (void const* key,
void const* lnode) const = 0;
virtual void copyKeyFromLnode (void* key,
void const* lnode) = 0;
virtual IBoolean isKeyGreaterThanLnode(void const* key,
unsigned int index,
void const* lnode) const = 0;
virtual IBoolean isKeyGreaterThanKey (void const* key1,
unsigned int index,
void const* key2) const = 0;
virtual IBoolean isKeyGreaterThanElement
(void const* key,
unsigned int index,
void const* element) const = 0;
virtual IBoolean constantFunctionIteration
(void *function,
void* env,
void const* lnode) const = 0;
virtual IBoolean functionIteration (void *function,
void* env,
void* lnode) const = 0;
virtual IBoolean constantIteratorIteration
(void* iterator,
void const* lnode) const = 0;
virtual IBoolean iteratorIteration (void* iterator,
void* lnode) const = 0;
virtual long functionComparison (void *compareFunction,
void const* lnode1,
void const* lnode2) const = 0;
};
inline IBSTKeySortedSetImpl (INumber, Operations*);
IBSTKeySortedSetImpl (IBSTKeySortedSetImpl const&,
Operations*);
inline ~IBSTKeySortedSetImpl ();
inline IBoolean add (void const* element);
IBoolean add (void const* element, Lnode*&);
inline void addAllFrom (IBSTKeySortedSetImpl const&);
inline void const*
elementAt (Lnode* const&) const;
inline void* elementAt (Lnode* const&);
inline void const*
anyElement () const;
void removeAt (Lnode* const&);
INumber removeAll (void* predicate,
void* environment);
inline void replaceAt (Lnode* const&, void const* element);
inline void removeAll ();
inline IBoolean isBounded () const;
inline INumber maxNumberOfElements () const;
inline INumber numberOfElements () const;
inline IBoolean isEmpty () const;
inline IBoolean isFull () const;
IBoolean setToFirst (Lnode*&) const;
IBoolean setToNext (Lnode*&) const;
IBoolean allElementsDo (void* function,
void* environment) const;
IBoolean allElementsDo (void* function,
void* environment);
IBoolean allElementsDo (void* iterator) const;
IBoolean allElementsDo (void* iterator);
IBoolean containsAllKeysFrom (IBSTKeySortedSetImpl const&) const;
IBoolean containsElementWithKey (void const* key) const;
IBoolean locateElementWithKey (void const* key, Lnode*&) const;
IBoolean replaceElementWithKey (void const* element);
IBoolean replaceElementWithKey (void const* element,
Lnode*&);
IBoolean addOrReplaceElementWithKey (void const* element);
IBoolean addOrReplaceElementWithKey (void const* element, Lnode*&);
IBoolean removeElementWithKey (void const* key);
void const*
elementWithKey (void const* key) const;
void* elementWithKey (void const* key);
void removeFirst ();
void removeLast ();
void removeAtPosition (IPosition);
inline void const*
firstElement () const;
void const*
lastElement () const;
void const*
elementAtPosition (IPosition) const;
IBoolean setToLast (Lnode*&) const;
IBoolean setToPrevious (Lnode*&) const;
void setToPosition (IPosition, Lnode*&) const;
IBoolean isFirst (Lnode* const&) const;
IBoolean isLast (Lnode* const&) const;
IBSTKeySortedSetImpl&
operator = (IBSTKeySortedSetImpl const&);
long compare (IBSTKeySortedSetImpl const&,
void *function) const;
IBoolean checkNode (Lnode const*, Node const*) const;
IBoolean checkNode (Lnode const*) const;
IBoolean isConsistent () const;
private:
inline IBoolean isUnderflown (Inode const*) const;
IBoolean allElementsDoSubtree (void* function,
void* environment,
Node const*) const;
IBoolean allElementsDoSubtree (void* function,
void* environment,
Node*);
IBoolean allElementsDoSubtree (void* iterator,
Node const*) const;
IBoolean allElementsDoSubtree (void* iterator,
Node*);
IPosition binarySearchInPage (Inode const*,
Lnode const*) const;
IPosition binarySearchInPageWithKey (Inode const*,
void const* key) const;
IPosition binarySearchInPageWithElement
(Inode const*,
void const* element) const;
IBoolean setToNextSubtree (Lnode*&, Inode const*) const;
IBoolean setToPreviousSubtree (Lnode*&, Inode const*) const;
IBoolean addAid (Node*,
Lnode*,
Node*&,
void* key,
Lnode*&);
Lnode* minimumLeaf (Node*) const;
Lnode* maximumLeaf (Node*) const;
INumber removeAllSubtree (Node*);
void addAllFromSubtree (Node const*, Lnode*&);
void removeAid (Inode*, Lnode*);
void handleUnderflow (Inode*, Inode*, IPosition);
void joinInodes (Inode*, Inode*, Inode*,
IPosition);
Node* copySubtree (Node const*);
IBoolean locateWithKeySubtree (void const* key,
Lnode*&,
Node*) const;
IBoolean containsAllKeysFromSubtree (Node const*,
Lnode*&) const;
IBoolean locateElementWithKeySubtree(void const* key,
Lnode*&,
Node*) const;
IBoolean locateElementWithKeyOfElement
(void const* element,
Lnode*&) const;
IBoolean locateElementWithKeyOfElementSubtree
(void const* element,
Lnode*&,
Node*) const;
IBoolean containsElementWithKey (Lnode const*) const;
IBoolean locateElementWithKey (Lnode const*,
Lnode*&) const;
IBoolean locateElementWithKeySubtree(Lnode const* lnode,
Lnode*& cursor,
Node* node) const;
//
// PRIVATE members
//
private:
Operations* ivOps;
Node* ivRoot;
INumber ivHeight;
INumber ivTreeOrder;
INumber ivNoElements;
};
//
// INLINE methods
//
#include <ibexcept.h>
//
// Inode
//
IBSTKeySortedSetImpl::Inode::
Inode (Node** ptrs, void* keys)
: ivPtrs(ptrs)
, ivKeys(keys)
{ ivm = 0;
}
IBSTKeySortedSetImpl::Inode::
Inode(Inode const& inode, Node** ptrs, void* keys)
: ivPtrs(ptrs)
, ivKeys(keys)
{ ivm = inode.ivm;
}
//
// IBSTKeySortedSetImpl
//
IBSTKeySortedSetImpl::
IBSTKeySortedSetImpl (INumber order, Operations* ops)
{ ivOps = ops;
ivTreeOrder = order;
ivRoot = 0;
ivHeight = 0;
ivNoElements = 0;
}
IBSTKeySortedSetImpl::
~IBSTKeySortedSetImpl ()
{ removeAll();
}
IBoolean
IBSTKeySortedSetImpl::
add (void const* element)
{ Lnode* dummy;
return add(element, dummy);
}
void IBSTKeySortedSetImpl::
addAllFrom (IBSTKeySortedSetImpl const& tree)
{ if (tree.ivRoot != 0) {
Lnode* dummy;
addAllFromSubtree(tree.ivRoot, dummy);
}
}
void const* IBSTKeySortedSetImpl::
elementAt (Lnode* const& cursor) const
{ return cursor->getElement();
}
void* IBSTKeySortedSetImpl::
elementAt (Lnode* const& cursor)
{ return cursor->getElement();
}
void const* IBSTKeySortedSetImpl::
anyElement () const
{ return firstElement();
}
void IBSTKeySortedSetImpl::
replaceAt (Lnode* const& cursor, void const* element)
{ cursor->replaceElement(element);
}
void IBSTKeySortedSetImpl::
removeAll ()
{ if (ivRoot != 0) {
removeAllSubtree(ivRoot);
ivRoot = 0;
ivHeight = 0;
ivNoElements = 0;
}
else {
IASSERT(ivNoElements == 0);
}
}
IBoolean IBSTKeySortedSetImpl::
isBounded () const
{ return False;
}
INumber IBSTKeySortedSetImpl::
maxNumberOfElements () const
{ IASSERT(False);
return 0;
}
INumber IBSTKeySortedSetImpl::
numberOfElements () const
{ return ivNoElements;
}
IBoolean IBSTKeySortedSetImpl::
isEmpty () const
{ return ivRoot == 0;
}
IBoolean IBSTKeySortedSetImpl::
isFull () const
{ return False;
}
void const* IBSTKeySortedSetImpl::
firstElement () const
{ Lnode* cursor;
IBoolean b = setToFirst(cursor);
IASSERT (b);
return elementAt (cursor);
}
IBoolean IBSTKeySortedSetImpl::
isUnderflown (Inode const* inode) const
{ return inode->ivm < (ivTreeOrder + 1) / 2;
}
#endif