home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
IKSBSEQ.IF
< prev
next >
Wrap
Text File
|
1993-09-22
|
17KB
|
481 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 Key, class ElementOps, class Base>
inline IWKSBagOnSeq <Element, Key, ElementOps, Base>::
IWKSBagOnSeq (INumber n)
: ivBase (n) {
}
template <class Element, class Key, class ElementOps, class Base>
inline IWKSBagOnSeq <Element, Key, ElementOps, Base>::
IWKSBagOnSeq (IWKSBagOnSeq <Element, Key, ElementOps, Base>
const& collection)
: ivBase (collection.ivBase) {
}
template <class Element, class Key, class ElementOps, class Base>
inline IWKSBagOnSeq <Element, Key, ElementOps, Base>&
IWKSBagOnSeq <Element, Key, ElementOps, Base>::
operator = (IWKSBagOnSeq <Element, Key, ElementOps, Base>
const& collection)
{ ivBase.operator = (collection.ivBase);
return *this;
}
template <class Element, class Key, class ElementOps, class Base>
inline IWKSBagOnSeq <Element, Key, ElementOps, Base>::
~IWKSBagOnSeq () {
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
add (Element const& element)
{ Cursor dummy (*this);
return add (element, dummy);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
add (Element const& element, ICursor& cursor)
{ locateKey (elementOps().key (element), cursor);
if (cursor.isValid ()) {
ivBase.addAsPrevious (element, cursor);
}
else {
ivBase.addAsLast (element, cursor);
}
return True;
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
addAllFrom (IWKSBagOnSeq < Element, Key, ElementOps, Base >
const& collection)
{
#ifndef INO_CHECKS
ICHECK (this != &collection,
IIdenticalCollectionException, IIdenticalCollectionText)
#endif
Cursor cursor (collection);
forCursor (cursor) {
add (collection.elementAt (cursor));
}
}
template <class Element, class Key, class ElementOps, class Base>
inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
elementAt (ICursor const& cursor) const
{ return ivBase.elementAt (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline Element& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
elementAt (ICursor const& cursor)
{ return ivBase.elementAt (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
anyElement () const
{ return ivBase.anyElement ();
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
removeAt (ICursor const& cursor)
{ ivBase.removeAt (cursor);
}
template < class Element, class Key, class ElementOps, class Base >
inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base >::
removeAll (IBoolean (*predicate) (Element const&, void*), void* env)
{ return ivBase.removeAll (predicate, env);
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
replaceAt (ICursor const& cursor, Element const& element)
{
#ifndef INO_CHECKS
ICHECK (elementOps().keyOps.compare
(elementOps().key (ivBase.elementAt (cursor)),
elementOps().key (element)) == 0,
IInvalidReplacementException, IInvalidReplacementText)
#endif
ivBase.replaceAt (cursor, element);
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
removeAll ()
{ ivBase.removeAll ();
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
isBounded () const
{ return ivBase.isBounded ();
}
template <class Element, class Key, class ElementOps, class Base>
inline INumber IWKSBagOnSeq <Element, Key, ElementOps, Base>::
maxNumberOfElements () const
{ return ivBase.maxNumberOfElements ();
}
template <class Element, class Key, class ElementOps, class Base>
inline INumber IWKSBagOnSeq <Element, Key, ElementOps, Base>::
numberOfElements () const
{ return ivBase.numberOfElements ();
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
isEmpty () const
{ return ivBase.isEmpty ();
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
isFull () const
{ return ivBase.isFull ();
}
template <class Element, class Key, class ElementOps, class Base>
inline ICursor* IWKSBagOnSeq <Element, Key, ElementOps, Base>::
newCursor () const
{ ICursor* result = new Cursor (*this);
ICHECK (result != 0, IOutOfMemory, IOutOfMemoryText)
return result;
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
setToFirst (ICursor& cursor) const
{ return ivBase.setToFirst (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
setToNext (ICursor& cursor) const
{ return ivBase.setToNext (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
allElementsDo (IBoolean (*iterationFunction) (Element&, void*),
void* env) {
return ivBase.allElementsDo (iterationFunction, env);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
allElementsDo (IIterator <Element>& iterator)
{ return ivBase.allElementsDo (iterator);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
allElementsDo (IBoolean (*iterationFunction) (Element const&, void*),
void* env) const {
return ivBase.allElementsDo (iterationFunction, env);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
allElementsDo (IConstantIterator <Element>& iterator) const
{ return ivBase.allElementsDo (iterator);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
isConsistent () const
{ return ivBase.isConsistent ();
}
template <class Element, class Key, class ElementOps, class Base>
inline Key const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
key (Element const& element) const
{ return elementOps().key (element);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
containsElementWithKey (Key const& key) const
{ Cursor dummy (*this);
return locateKey (key, dummy);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
containsAllKeysFrom (IWKSBagOnSeq <Element, Key, ElementOps, Base>
const& collection) const
{ Cursor cursor (collection);
IBoolean result = True;
forCursor (cursor) {
if (! containsElementWithKey
(elementOps().key (collection.elementAt (cursor)))) {
result = False;
break;
}
}
return result;
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
locateElementWithKey (Key const& key, ICursor& cursor) const
{ IBoolean result = locateKey (key, cursor);
if (! result)
cursor.invalidate ();
return result;
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
replaceElementWithKey (Element const& element)
{ Cursor dummy (*this);
return replaceElementWithKey (element, dummy);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
replaceElementWithKey (Element const& element, ICursor& cursor)
{ IBoolean result = locateKey (elementOps().key (element), cursor);
if (result)
ivBase.replaceAt (cursor, element);
else
cursor.invalidate ();
return result;
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
locateOrAddElementWithKey (Element const& element)
{ Cursor dummy (*this);
return locateOrAddElementWithKey (element, dummy);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
locateOrAddElementWithKey (Element const& element, ICursor& cursor)
{ IBoolean result = locateKey (elementOps().key (element), cursor);
if (! result) {
add (element, cursor);
}
return result;
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
addOrReplaceElementWithKey (Element const& element)
{ Cursor dummy (*this);
return addOrReplaceElementWithKey (element, dummy);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
addOrReplaceElementWithKey (Element const& element, ICursor& cursor)
{ IBoolean keyExists = locateKey (elementOps().key (element), cursor);
if (keyExists) {
ivBase.replaceAt (cursor, element);
}
else {
add (element, cursor);
}
return ! keyExists;
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
removeElementWithKey (Key const& key)
{ Cursor cursor (*this);
IBoolean result = locateKey (key, cursor);
if (result) {
ivBase.removeAt (cursor);
}
return result;
}
template <class Element, class Key, class ElementOps, class Base>
inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
elementWithKey (Key const& key) const
{ Cursor cursor (*this);
if (! locateElementWithKey (key, cursor))
ICHECK (False,
INotContainsKeyException, IKeyNotContainedText)
return elementAt (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline Element& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
elementWithKey (Key const& key)
{ Cursor cursor (*this);
if (! locateElementWithKey (key, cursor))
ICHECK (False,
INotContainsKeyException, IKeyNotContainedText)
return elementAt (cursor);
}
template < class Element, class Key, class ElementOps, class Base>
inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base>::
numberOfElementsWithKey (Key const& key) const
{ INumber result = 0;
Cursor cursor (*this);
for (locateElementWithKey (key, cursor);
cursor.isValid ();
locateNextElementWithKey (key, cursor))
result++;
return result;
}
template < class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq < Element, Key, ElementOps, Base>::
locateNextElementWithKey (Key const& key, ICursor& cursor) const
{ setToNext (cursor);
IBoolean result = locateKeyFwd (key, cursor);
if (! result)
cursor.invalidate ();
return result;
}
template < class Element, class Key, class ElementOps, class Base>
inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base>::
removeAllElementsWithKey (Key const& key)
{ Key const* env = &key;
return removeAll (removePredicate, &env);
}
template < class Element, class Key, class ElementOps, class Base>
inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base>::
numberOfDifferentKeys() const
{ INumber result = 0;
Cursor cursor (*this);
for (setToFirst (cursor);
cursor.isValid ();
setToNextWithDifferentKey (cursor))
result++;
return result;
}
template < class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq < Element, Key, ElementOps, Base>::
setToNextWithDifferentKey (ICursor& icursor) const
{ Cursor& cursor = (Cursor&)icursor;
Key const& key = elementOps().key (ivBase.elementAt (cursor));
for (; cursor.setToNext (); ) {
if (elementOps().keyOps.compare
(elementOps().key (ivBase.elementAt (cursor)), key) != 0)
return True;
}
return False;
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
removeFirst ()
{ ivBase.removeFirst ();
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
removeLast ()
{ ivBase.removeLast ();
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
removeAtPosition (IPosition position)
{ ivBase.removeAtPosition (position);
}
template <class Element, class Key, class ElementOps, class Base>
inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
firstElement () const
{ return ivBase.firstElement ();
}
template <class Element, class Key, class ElementOps, class Base>
inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
lastElement () const
{ return ivBase.lastElement ();
}
template <class Element, class Key, class ElementOps, class Base>
inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
elementAtPosition (IPosition position) const
{ return ivBase.elementAtPosition (position);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
setToLast (ICursor& cursor) const
{ return ivBase.setToLast (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
setToPrevious (ICursor& cursor) const
{ return ivBase.setToPrevious (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
setToPosition (IPosition position, ICursor& cursor) const
{ ivBase.setToPosition (position, cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
isFirst (ICursor const& cursor) const
{ return ivBase.isFirst (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
isLast (ICursor const& cursor) const
{ return ivBase.isLast (cursor);
}
template <class Element, class Key, class ElementOps, class Base>
inline long IWKSBagOnSeq <Element, Key, ElementOps, Base>::
compare (IWKSBagOnSeq <Element, Key, ElementOps, Base> const& collection,
long (*comparisonFunction) (Element const&, Element const&)) const {
return ivBase.compare (collection.ivBase, comparisonFunction);
}
// private:
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
locateKeyFwd (Key const& key, ICursor& icursor) const
{ Cursor& cursor = (Cursor&)icursor;
for ( ; cursor.isValid (); cursor.setToNext ()) {
long comp =
elementOps().keyOps.compare
(elementOps().key (ivBase.elementAt (cursor)), key);
if (comp >= 0) {
return comp == 0;
}
}
return False;
}
template <class Element, class Key, class ElementOps, class Base>
inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
locateKey (Key const& key, ICursor& icursor) const
{ setToFirst (icursor);
return locateKeyFwd (key, icursor);
}