home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
ISBKSS.IF
< prev
next >
Wrap
Text File
|
1993-09-22
|
23KB
|
673 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. *
* *
*******************************************************************************/
#include <ibexcept.h>
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
checkNotEmpty () const
{
#ifndef INO_CHECKS
ICHECK (!isEmpty (), IEmptyException, ICollectionIsEmptyText)
#endif
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
checkCursorIsValid (ICursor const& cursor) const
{
#ifndef INO_CHECKS
ICHECK (cursor.isValid (),
ICursorInvalidException, IInvalidCursorText)
#endif
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
checkPositionExists (IPosition position) const
{
#ifndef INO_CHECKS
ICHECK (1 <= position && position <= numberOfElements(),
IPositionInvalidException, IInvalidPositionText)
#endif
}
template < class Element, class ElementOps, class Base >
inline IWSrtBagOnKSSet < Element, ElementOps, Base >::
IWSrtBagOnKSSet (INumber n)
: ivBase (n)
, ivNumberOfElements (0)
{
}
template < class Element, class ElementOps, class Base >
inline IWSrtBagOnKSSet < Element, ElementOps, Base >::
IWSrtBagOnKSSet (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection)
: ivBase (collection.ivBase)
, ivNumberOfElements (collection.ivNumberOfElements)
{
}
template < class Element, class ElementOps, class Base >
inline IWSrtBagOnKSSet < Element, ElementOps, Base >& IWSrtBagOnKSSet < Element, ElementOps, Base >::
operator= (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection)
{ ivBase.operator= (collection.ivBase);
ivNumberOfElements = collection.ivNumberOfElements;
return *this;
}
template < class Element, class ElementOps, class Base >
inline IWSrtBagOnKSSet < Element, ElementOps, Base >::
~IWSrtBagOnKSSet ()
{
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
add (Element const& element)
{ Cursor dummy (*this);
return add (element, dummy);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
add (Element const& element, ICursor &cursor)
{ ((Cursor&) cursor).occurrence = 1;
ISBKSElm < Element > e (element);
if (ivBase.locateOrAddElementWithKey (e, cursor))
ivBase.elementAt (cursor).occurrences++;
ivNumberOfElements++;
return True;
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
addAllFrom (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection)
{
#ifndef INO_CHECKS
ICHECK (this != &collection,
IIdenticalCollectionException, IIdenticalCollectionText)
#endif
Base::Cursor thisCursor (ivBase), collectionCursor (collection.ivBase);
forCursor (collectionCursor) {
if (ivBase.locateOrAddElementWithKey
(collectionCursor.element(), thisCursor))
ivBase.elementAt (thisCursor).occurrences +=
collectionCursor.element().occurrences;
ivNumberOfElements +=
collectionCursor.element().occurrences;
}
}
template < class Element, class ElementOps, class Base >
inline Element const& IWSrtBagOnKSSet < Element, ElementOps, Base >::
elementAt (ICursor const& cursor) const
{ return ivBase.elementAt (cursor).elem;
}
template < class Element, class ElementOps, class Base >
inline Element& IWSrtBagOnKSSet < Element, ElementOps, Base >::
elementAt (ICursor const& cursor)
{ return ivBase.elementAt (cursor).elem;
}
template < class Element, class ElementOps, class Base >
inline Element const& IWSrtBagOnKSSet < Element, ElementOps, Base >::
anyElement () const
{ return ivBase.anyElement ().elem;
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
removeAt (ICursor const& cursor)
{ if (--ivBase.elementAt (cursor).occurrences == 0)
ivBase.removeAt (cursor);
ivNumberOfElements--;
}
template < class Element, class ElementOps, class Base >
inline INumber IWSrtBagOnKSSet < Element, ElementOps, Base >::
removeAll (IBoolean (*predicate) (Element const&, void*), void* env)
{ RemoveEnv re;
re.predicate = predicate;
re.removeCount = 0;
re.env = env;
ivBase.removeAll (removePredicate, &re);
ivNumberOfElements -= re.removeCount;
return re.removeCount;
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
replaceAt (ICursor const& cursor, Element const& element)
{
#ifndef INO_CHECKS
ICHECK (elementOps().equal (ivBase.elementAt (cursor).elem, element),
IInvalidReplacementException, IInvalidReplacementText)
#endif
elementOps().assign (ivBase.elementAt (cursor).elem, element);
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
removeAll ()
{ ivBase.removeAll ();
ivNumberOfElements = 0;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
isBounded () const
{ return ivBase.isBounded ();
}
template < class Element, class ElementOps, class Base >
inline INumber IWSrtBagOnKSSet < Element, ElementOps, Base >::
maxNumberOfElements () const
{ return ivBase.maxNumberOfElements ();
}
template < class Element, class ElementOps, class Base >
inline INumber IWSrtBagOnKSSet < Element, ElementOps, Base >::
numberOfElements () const
{ return ivNumberOfElements;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
isEmpty () const
{ return ivBase.isEmpty ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
isFull () const
{ return ivBase.isBounded () &&
ivNumberOfElements == ivBase.maxNumberOfElements ();
}
template < class Element, class ElementOps, class Base >
inline ICursor* IWSrtBagOnKSSet < Element, ElementOps, Base >::
newCursor () const
{ ICursor* result = new Cursor (*this);
ICHECK (result != 0, IOutOfMemory, IOutOfMemoryText)
return result;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
setToFirst (ICursor &cursor) const
{ IBoolean result = ivBase.setToFirst (cursor);
if (result)
((Cursor&)cursor).occurrence = 1;
return result;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
setToNext (ICursor &cursor) const
{ checkCursorIsValid (cursor);
if (((Cursor&)cursor).occurrence ==
ivBase.elementAt (cursor).occurrences) {
((Cursor&)cursor).occurrence = 1;
return ivBase.setToNext (cursor);
}
else {
((Cursor&)cursor).occurrence++;
return True;
}
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
allElementsDo (IBoolean (*iterationFunction) (Element &, void*),
void* environment)
{ Cursor cursor (*this);
forCursor (cursor)
if (! (*iterationFunction) (ivBase.elementAt (cursor).elem, environment))
return False;
return True;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
allElementsDo (IIterator <Element>& iterator)
{ Cursor cursor (*this);
forCursor (cursor)
if (! iterator.applyTo (ivBase.elementAt (cursor).elem))
return False;
return True;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
allElementsDo (IBoolean (*iterationFunction) (Element const&, void*),
void* environment) const
{ Cursor cursor (*this);
forCursor (cursor)
if (! (*iterationFunction) (ivBase.elementAt (cursor).elem, environment))
return False;
return True;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
allElementsDo (IConstantIterator <Element>& iterator) const
{ Cursor cursor (*this);
forCursor (cursor)
if (! iterator.applyTo (ivBase.elementAt (cursor).elem))
return False;
return True;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
isConsistent () const
{ return ivBase.isConsistent ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
contains (Element const& element) const
{ return ivBase.containsElementWithKey (element);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
containsAllFrom (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection) const
{ return ivBase.containsAllKeysFrom (collection.ivBase);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
locate (Element const& element, ICursor &cursor) const
{ ((Cursor&)cursor).occurrence = 1;
return ivBase.locateElementWithKey (element, cursor);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
locateOrAdd (Element const& element)
{ Cursor dummy (*this);
return locateOrAdd (element, dummy);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
locateOrAdd (Element const& element, ICursor &cursor)
{ ((Cursor&)cursor).occurrence = 1;
ISBKSElm < Element > e (element);
IBoolean result = ivBase.locateOrAddElementWithKey (e, cursor);
if (! result)
ivNumberOfElements++;
return result;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
remove (Element const& element)
{ Cursor cursor (*this);
if (locate (element, cursor)) {
removeAt (cursor);
return True;
}
else
return False;
}
template < class Element, class ElementOps, class Base >
inline INumber IWSrtBagOnKSSet < Element, ElementOps, Base >::
numberOfOccurrences (Element const& element) const
{ Cursor cursor (*this);
if (locate (element, cursor))
return ivBase.elementAt (cursor).occurrences;
else
return 0;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
locateNext (Element const& element, ICursor& cursor) const
{ if (elementOps().equal (element, elementAt (cursor))) {
if (ivBase.elementAt (cursor).occurrences ==
((Cursor&) cursor).occurrence) {
cursor.invalidate ();
return False;
} else {
((Cursor&) cursor).occurrence++;
return True;
}
}
else {
((Cursor&) cursor).occurrence = 1;
return ivBase.locateElementWithKey (element, cursor);
}
}
template < class Element, class ElementOps, class Base >
inline INumber IWSrtBagOnKSSet < Element, ElementOps, Base >::
removeAllOccurrences (Element const& element)
{ Cursor cursor (*this);
if (! ivBase.locateElementWithKey (element, cursor))
return 0;
INumber result = ivBase.elementAt (cursor).occurrences;
ivNumberOfElements -= result;
ivBase.removeAt (cursor);
return result;
}
template < class Element, class ElementOps, class Base >
inline INumber IWSrtBagOnKSSet < Element, ElementOps, Base >::
numberOfDifferentElements () const
{ return ivBase.numberOfElements ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
setToNextDifferentElement (ICursor& cursor) const
{ ((Cursor&)cursor).occurrence = 1;
return ivBase.setToNext (cursor);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
operator== (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection) const
{ if (ivNumberOfElements != collection.ivNumberOfElements)
return False;
Base::Cursor cursor (ivBase);
forCursor (cursor) {
if (collection.numberOfOccurrences (cursor.element().elem) !=
ivBase.elementAt (cursor).occurrences)
return False;
}
return True;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
operator!= (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection) const
{ return ! operator== (collection);
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
unionWith (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection)
{ if (this != &collection)
addAllFrom (collection);
else
{ Base::Cursor cursor (ivBase);
forCursor (cursor) {
ivBase.elementAt (cursor).occurrences *= 2;
}
ivNumberOfElements *= 2;
}
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
intersectionWith (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection)
{ if (this != &collection)
{ Base::Cursor cursor (ivBase);
forCursor (cursor) {
INumber occ = collection.numberOfOccurrences (cursor.element().elem);
INumber& thisOcc = ivBase.elementAt (cursor).occurrences;
if (occ < thisOcc) {
ivNumberOfElements -= thisOcc - occ;
thisOcc = occ;
}
}
ivBase.removeAll (cleanupPredicate);
}
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
differenceWith (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection)
{ if (this == &collection)
removeAll ();
else
{ Base::Cursor cursor (ivBase);
forCursor (cursor) {
INumber occ = collection.numberOfOccurrences (cursor.element ().elem);
INumber& thisOcc = ivBase.elementAt (cursor).occurrences;
INumber n = (thisOcc < occ ? thisOcc : occ);
thisOcc -= n;
ivNumberOfElements -= n;
}
ivBase.removeAll (cleanupPredicate);
}
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
addUnion (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection1,
IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection2)
{ if (this == &collection1) {
if (this == &collection2) {
Base::Cursor cursor (ivBase);
forCursor (cursor) {
ivBase.elementAt (cursor).occurrences *= 3;
}
ivNumberOfElements *= 3;
}
else {
unionWith (collection1);
unionWith (collection2);
}
}
else {
unionWith (collection2);
unionWith (collection1);
}
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
addIntersection (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection1,
IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection2)
{ if (this == &collection1) {
if (this == &collection2)
unionWith (*this);
else
addIntersection (collection2, collection1);
}
else {
Base::Cursor cursor2 (collection2.ivBase);
forCursor (cursor2) {
Element const& e = cursor2.element ().elem;
INumber n1, n2;
n1 = collection1.numberOfOccurrences (e);
n2 = cursor2.element ().occurrences;
INumber n = (n1 < n2 ? n1 : n2);
if (n > 0) {
Base::Cursor cursor (ivBase);
if (ivBase.locateOrAddElementWithKey (e, cursor))
ivBase.elementAt (cursor).occurrences += n;
else
ivBase.elementAt (cursor).occurrences = n;
ivNumberOfElements += n;
}
}
}
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
addDifference (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection1,
IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection2)
{ if (this == &collection1) {
if (this == &collection2)
return;
else {
unionWith (*this);
Base::Cursor cursor2 (collection2.ivBase);
forCursor (cursor2) {
Element const& e = cursor2.element ().elem;
INumber n1, n2;
n1 = numberOfOccurrences (e) / 2;
n2 = cursor2.element ().occurrences;
INumber n = (n1 < n2 ? n1 : n2);
if (n > 0) {
Base::Cursor cursor (ivBase);
ivBase.locateElementWithKey (e, cursor);
ivBase.elementAt (cursor).occurrences -= n;
ivNumberOfElements -= n;
}
}
}
}
else {
Base::Cursor cursor1 (collection1.ivBase);
forCursor (cursor1) {
Element const& e = cursor1.element ().elem;
INumber n1, n2;
n1 = cursor1.element ().occurrences;
n2 = collection2.numberOfOccurrences (e);
INumber n = (n1 < n2 ? 0 : n1 - n2);
if (n > 0) {
Base::Cursor cursor (ivBase);
if (ivBase.locateOrAddElementWithKey (e, cursor))
ivBase.elementAt (cursor).occurrences += n;
else
ivBase.elementAt (cursor).occurrences = n;
ivNumberOfElements += n;
}
}
}
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
removeFirst ()
{ checkNotEmpty ();
Cursor cursor (*this);
setToFirst (cursor);
removeAt (cursor);
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
removeLast ()
{ checkNotEmpty ();
Cursor cursor (*this);
setToLast (cursor);
removeAt (cursor);
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
removeAtPosition (IPosition position)
{ Cursor cursor (*this);
setToPosition (position, cursor);
removeAt (cursor);
}
template < class Element, class ElementOps, class Base >
inline Element const& IWSrtBagOnKSSet < Element, ElementOps, Base >::
firstElement () const
{ checkNotEmpty ();
Cursor cursor (*this);
setToFirst (cursor);
return elementAt (cursor);
}
template < class Element, class ElementOps, class Base >
inline Element const& IWSrtBagOnKSSet < Element, ElementOps, Base >::
lastElement () const
{ checkNotEmpty ();
Cursor cursor (*this);
setToLast (cursor);
return elementAt (cursor);
}
template < class Element, class ElementOps, class Base >
inline Element const& IWSrtBagOnKSSet < Element, ElementOps, Base >::
elementAtPosition (IPosition position) const
{ Cursor cursor (*this);
setToPosition (position, cursor);
return elementAt (cursor);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
setToLast (ICursor &cursor) const
{ IBoolean result = ivBase.setToLast (cursor);
if (result)
((Cursor&)cursor).occurrence =
ivBase.elementAt (cursor).occurrences;
return result;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
setToPrevious (ICursor &cursor) const
{ checkCursorIsValid (cursor);
if (((Cursor&)cursor).occurrence == 1) {
IBoolean result = ivBase.setToPrevious (cursor);
if (result)
((Cursor&)cursor).occurrence =
ivBase.elementAt (cursor).occurrences;
return result;
}
else {
((Cursor&)cursor).occurrence--;
return True;
}
}
template < class Element, class ElementOps, class Base >
inline void IWSrtBagOnKSSet < Element, ElementOps, Base >::
setToPosition (IPosition position, ICursor &cursor) const
{ checkPositionExists (position);
setToFirst (cursor);
for (int i = 1; i < position; i++) setToNext (cursor);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
isFirst (ICursor const& cursor) const
{ return ivBase.isFirst (cursor) &&
((Cursor const&)cursor).occurrence == 1;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWSrtBagOnKSSet < Element, ElementOps, Base >::
isLast (ICursor const& cursor) const
{ return ivBase.isLast (cursor) &&
((Cursor const&)cursor).occurrence ==
ivBase.elementAt (cursor).occurrences;
}
template < class Element, class ElementOps, class Base >
inline long IWSrtBagOnKSSet < Element, ElementOps, Base >::
compare (IWSrtBagOnKSSet < Element, ElementOps, Base > const& collection,
long (*comparisonFunction) (Element const&, Element const&)) const
{ long result = 0;
Cursor thisCursor (*this);
Cursor collectionCursor (collection);
for (thisCursor.setToFirst (), collectionCursor.setToFirst ();
result == 0 && thisCursor.isValid () && collectionCursor.isValid ();
thisCursor.setToNext (), collectionCursor.setToNext ()) {
result = (*comparisonFunction) (elementAt (thisCursor),
collection.elementAt (collectionCursor));
}
if (result == 0) {
if (thisCursor.isValid () && ! collectionCursor.isValid ())
result = 1;
else if (! thisCursor.isValid () && collectionCursor.isValid ())
result = -1;
else {
}
}
return result;
}