home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
ISBKSS.H
< prev
next >
Wrap
Text File
|
1993-09-22
|
10KB
|
264 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 _ISBKSS_H
#define _ISBKSS_H
#include <iglobals.h>
#include <icursor.h>
template < class Element >
class ISBKSElm {
public:
Element elem;
INumber occurrences;
ISBKSElm () {}
ISBKSElm (Element const& e) : elem (e), occurrences (1) {}
ISBKSElm (Element const& e, INumber occurrences)
: elem (e), occurrences (occurrences) {}
friend inline Element const& key (ISBKSElm < Element > const& e)
{ return e.elem; }
};
template < class Element, class ElementOps, class Base >
class IWSrtBagOnKSSet {
Base ivBase;
INumber ivNumberOfElements;
class Cursor;
friend class Cursor;
public:
class Cursor : public Base::Cursor {
protected:
INumber occurrence;
friend class IWSrtBagOnKSSet < Element, ElementOps, Base >;
IBoolean isFor (IWSrtBagOnKSSet < Element, ElementOps, Base > const& c) const
{ return Base::Cursor::isFor (c.ivBase); }
public:
Cursor (IWSrtBagOnKSSet < Element, ElementOps, Base > const& c)
: Base::Cursor (c.ivBase) {}
IBoolean setToFirst ();
IBoolean setToNext ();
Element const& element () const
{ return Base::Cursor::element ().elem; }
IBoolean setToLast ();
IBoolean setToPrevious ();
IBoolean operator== (Cursor const& cursor) const
{ return Base::Cursor::operator== (cursor) &&
occurrence == cursor.occurrence; }
IBoolean operator!= (Cursor const& cursor) const
{ return ! operator== (cursor); }
};
IWSrtBagOnKSSet (INumber
numberOfElements = 100);
IWSrtBagOnKSSet (IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
IWSrtBagOnKSSet < Element, ElementOps, Base >&
operator = (IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
~IWSrtBagOnKSSet ();
IBoolean add (Element const&);
IBoolean add (Element const&,
ICursor&);
void addAllFrom (IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
Element const& elementAt (ICursor const&) const;
Element& elementAt (ICursor const&);
Element const& anyElement () const;
void removeAt (ICursor const&);
INumber removeAll (IBoolean (*property)
(Element const&, void*),
void* additionalArgument = 0);
void replaceAt (ICursor const&,
Element const&);
void removeAll ();
IBoolean isBounded () const;
INumber maxNumberOfElements () const;
INumber numberOfElements () const;
IBoolean isEmpty () const;
IBoolean isFull () const;
ICursor* newCursor () const;
IBoolean setToFirst (ICursor&) const;
IBoolean setToNext (ICursor&) const;
IBoolean allElementsDo (IBoolean (*function)
(Element&, void*),
void* additionalArgument = 0);
IBoolean allElementsDo (IIterator <Element>&);
IBoolean allElementsDo (IBoolean (*function)
(Element const&, void*),
void* additionalArgument = 0)
const;
IBoolean allElementsDo (IConstantIterator
<Element>&) const;
IBoolean isConsistent () const;
IBoolean contains (Element const&) const;
IBoolean containsAllFrom (IWSrtBagOnKSSet < Element, ElementOps, Base > const&) const;
IBoolean locate (Element const&, ICursor&)
const;
IBoolean locateOrAdd (Element const&);
IBoolean locateOrAdd (Element const&,
ICursor&);
IBoolean remove (Element const&);
INumber numberOfOccurrences (Element const&) const;
IBoolean locateNext (Element const&, ICursor&)
const;
INumber removeAllOccurrences (Element const&);
INumber numberOfDifferentElements () const;
IBoolean setToNextDifferentElement (ICursor&) const;
IBoolean operator == (IWSrtBagOnKSSet < Element, ElementOps, Base > const&) const;
IBoolean operator != (IWSrtBagOnKSSet < Element, ElementOps, Base > const&) const;
void unionWith (IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
void intersectionWith (IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
void differenceWith (IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
void addUnion (IWSrtBagOnKSSet < Element, ElementOps, Base > const&,
IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
void addIntersection (IWSrtBagOnKSSet < Element, ElementOps, Base > const&,
IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
void addDifference (IWSrtBagOnKSSet < Element, ElementOps, Base > const&,
IWSrtBagOnKSSet < Element, ElementOps, Base > const&);
void removeFirst ();
void removeLast ();
void removeAtPosition (IPosition);
Element const& firstElement () const;
Element const& lastElement () const;
Element const& elementAtPosition (IPosition) const;
IBoolean setToLast (ICursor&) const;
IBoolean setToPrevious (ICursor&) const;
void setToPosition (IPosition,
ICursor&) const;
IBoolean isFirst (ICursor const&) const;
IBoolean isLast (ICursor const&) const;
long compare (IWSrtBagOnKSSet < Element, ElementOps, Base > const&,
long (*comparisonFunction)
(Element const&,
Element const&)) const;
protected:
void checkNotEmpty () const;
void checkCursorIsValid (ICursor const&) const;
void checkPositionExists (IPosition) const;
struct RemoveEnv {
IBoolean (*predicate) (Element const&, void*);
void* env;
INumber removeCount;
};
static IBoolean removePredicate (ISBKSElm < Element > const&, void*);
static IBoolean cleanupPredicate (ISBKSElm < Element > const&, void*);
static ElementOps elementOps ()
{ ElementOps ops;
return ops;
}
};
template < class Element, class ElementOps >
class ISBKSSOps : public ElementOps {
public:
void assign(ISBKSElm < Element >& e1,
ISBKSElm < Element > const& e2) const
{ ElementOps::assign (e1.elem, e2.elem);
e1.occurrences = e2.occurrences; }
Element const& key (ISBKSElm < Element > const& e) const
{ return e.elem; }
ElementOps keyOps;
};
#define IDefineGSortedBagOnGKeySortedSet(GKSSet, GSBag) \
template < class Element, class ElementOps > \
class GKSSet ## ForGSBag : \
public GKSSet < ISBKSElm < Element >, Element, \
ISBKSSOps < Element, ElementOps > > { \
public: \
GKSSet ## ForGSBag (INumber n = 100) : \
GKSSet < ISBKSElm < Element >, Element, \
ISBKSSOps < Element, ElementOps > > (n) {} \
}; \
template < class Element, class ElementOps > \
class GSBag : \
public IWSrtBagOnKSSet < Element, ElementOps, \
GKSSet ## ForGSBag < Element, ElementOps > > { \
public: \
GSBag (INumber n = 100) : \
IWSrtBagOnKSSet < Element, ElementOps, \
GKSSet ## ForGSBag < Element, ElementOps > > (n) {} \
};
#include <isbkss.if>
#ifdef __IBMCPP__
#ifndef __TEMPINC__
#include <isbkss.c>
#endif
#endif
#endif