home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
IBAGKS.IF
< prev
next >
Wrap
Text File
|
1993-09-22
|
18KB
|
528 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 IWBagOnKeySet < Element, ElementOps, Base >::
checkCursorIsForThis (ICursor const& cursor) const
{
#ifndef INO_CHECKS
ICHECK (((Cursor const&)cursor).isFor (*this),
ICursorInvalidException, ICursorNotForThisText)
#endif
}
template < class Element, class ElementOps, class Base >
inline void IWBagOnKeySet < Element, ElementOps, Base >::
checkCursor (ICursor const& cursor) const
{
#ifndef INO_CHECKS
ICHECK (((Cursor const&)cursor).isFor (*this),
ICursorInvalidException, ICursorNotForThisText)
ICHECK (cursor.isValid (), ICursorInvalidException, IInvalidCursorText)
#endif
}
template < class Element, class ElementOps, class Base >
inline IWBagOnKeySet < Element, ElementOps, Base >::
IWBagOnKeySet (INumber n)
: ivBase (n)
, ivNumberOfElements (0)
{
}
template < class Element, class ElementOps, class Base >
inline IWBagOnKeySet < Element, ElementOps, Base >::
IWBagOnKeySet (IWBagOnKeySet < Element, ElementOps, Base > const& collection)
: ivBase (collection.ivBase)
, ivNumberOfElements (collection.ivNumberOfElements)
{
}
template < class Element, class ElementOps, class Base >
inline IWBagOnKeySet < Element, ElementOps, Base >& IWBagOnKeySet < Element, ElementOps, Base >::
operator= (IWBagOnKeySet < Element, ElementOps, Base > const& collection)
{ ivBase.operator= (collection.ivBase);
ivNumberOfElements = collection.ivNumberOfElements;
return *this;
}
template < class Element, class ElementOps, class Base >
inline IWBagOnKeySet < Element, ElementOps, Base >::
~IWBagOnKeySet ()
{
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
add (Element const& element)
{ Cursor dummy (*this);
return add (element, dummy);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
add (Element const& element, ICursor &cursor)
{ ((Cursor&) cursor).occurrence = 1;
IBKeyElm < Element > e (element);
if (ivBase.locateOrAddElementWithKey (e, cursor))
ivBase.elementAt (cursor).occurrences++;
ivNumberOfElements++;
return True;
}
template < class Element, class ElementOps, class Base >
inline void IWBagOnKeySet < Element, ElementOps, Base >::
addAllFrom (IWBagOnKeySet < 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& IWBagOnKeySet < Element, ElementOps, Base >::
elementAt (ICursor const& cursor) const
{ return ivBase.elementAt (cursor).elem;
}
template < class Element, class ElementOps, class Base >
inline Element& IWBagOnKeySet < Element, ElementOps, Base >::
elementAt (ICursor const& cursor)
{ return ivBase.elementAt (cursor).elem;
}
template < class Element, class ElementOps, class Base >
inline Element const& IWBagOnKeySet < Element, ElementOps, Base >::
anyElement () const
{ return ivBase.anyElement ().elem;
}
template < class Element, class ElementOps, class Base >
inline void IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
removeAll ()
{ ivBase.removeAll ();
ivNumberOfElements = 0;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
isBounded () const
{ return ivBase.isBounded ();
}
template < class Element, class ElementOps, class Base >
inline INumber IWBagOnKeySet < Element, ElementOps, Base >::
maxNumberOfElements () const
{ return ivBase.maxNumberOfElements ();
}
template < class Element, class ElementOps, class Base >
inline INumber IWBagOnKeySet < Element, ElementOps, Base >::
numberOfElements () const
{ return ivNumberOfElements;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
isEmpty () const
{ return ivBase.isEmpty ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
isFull () const
{ return ivBase.isBounded () &&
ivNumberOfElements == ivBase.maxNumberOfElements ();
}
template < class Element, class ElementOps, class Base >
inline ICursor* IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
setToFirst (ICursor &cursor) const
{ checkCursorIsForThis (cursor);
return ((Cursor&) cursor).Cursor::setToFirst ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
setToNext (ICursor &cursor) const
{ checkCursor (cursor);
return ((Cursor&) cursor).Cursor::setToNext ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
isConsistent () const
{ return ivBase.isConsistent ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
contains (Element const& element) const
{ return ivBase.containsElementWithKey (element);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
containsAllFrom (IWBagOnKeySet < Element, ElementOps, Base > const& collection) const
{ return ivBase.containsAllKeysFrom (collection.ivBase);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
locateOrAdd (Element const& element)
{ Cursor dummy (*this);
return locateOrAdd (element, dummy);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
locateOrAdd (Element const& element, ICursor &cursor)
{ ((Cursor&)cursor).occurrence = 1;
IBKeyElm < Element > e (element);
IBoolean result = ivBase.locateOrAddElementWithKey (e, cursor);
if (! result)
ivNumberOfElements++;
return result;
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
numberOfDifferentElements () const
{ return ivBase.numberOfElements ();
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
setToNextDifferentElement (ICursor& cursor) const
{ ((Cursor&)cursor).occurrence = 1;
return ivBase.setToNext (cursor);
}
template < class Element, class ElementOps, class Base >
inline IBoolean IWBagOnKeySet < Element, ElementOps, Base >::
operator== (IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
operator!= (IWBagOnKeySet < Element, ElementOps, Base > const& collection) const
{ return ! operator== (collection);
}
template < class Element, class ElementOps, class Base >
inline void IWBagOnKeySet < Element, ElementOps, Base >::
unionWith (IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
intersectionWith (IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
differenceWith (IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
addUnion (IWBagOnKeySet < Element, ElementOps, Base > const& collection1,
IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
addIntersection (IWBagOnKeySet < Element, ElementOps, Base > const& collection1,
IWBagOnKeySet < 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 IWBagOnKeySet < Element, ElementOps, Base >::
addDifference (IWBagOnKeySet < Element, ElementOps, Base > const& collection1,
IWBagOnKeySet < 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;
}
}
}
}