home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) IBM Corp. 1992 */
-
- #ifndef _IBAGKS_H
- #define _IBAGKS_H
-
- #include <iglobals.h>
- #include <icursor.h>
-
- template < class Element >
- class IBKeyElm {
- public:
- Element elem;
- INumber occurrences;
- IBKeyElm (Element const& e) : elem (e), occurrences (1) {}
- IBKeyElm (Element const& e, INumber occurrences)
- : elem (e), occurrences (occurrences) {}
-
- friend inline Element const& key (IBKeyElm < Element > const& e)
- { return e.elem; }
- };
-
- template < class Element, class ElementOps, class Base >
- class IWBagOnKeySet {
- Base ivBase;
- INumber ivNumberOfElements;
- class Cursor;
- friend class Cursor;
- public:
-
- class Cursor : public Base::Cursor {
- INumber occurrence;
- friend class IWBagOnKeySet < Element, ElementOps, Base >;
- public:
- Cursor (IWBagOnKeySet < Element, ElementOps, Base > const& c)
- : Base::Cursor (c.ivBase) {}
-
- Boolean setToFirst ();
- Boolean setToNext ();
-
- Element const& element ()
- { return Base::Cursor::element ().elem; }
- Boolean operator== (Cursor const& cursor)
- { return Base::Cursor::operator== (cursor) &&
- occurrence == cursor.occurrence; }
- Boolean operator!= (Cursor const& cursor)
- { return ! operator== (cursor); }
- };
-
- IWBagOnKeySet (INumber
- numberOfElements = 100,
- IBoundIndicator =
- IUnbounded);
-
- IWBagOnKeySet (IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- IWBagOnKeySet < Element, ElementOps, Base >& operator = (IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- ~IWBagOnKeySet ();
-
- Boolean add (Element const&);
-
- Boolean add (Element const&,
- ICursor&);
-
- void addAllFrom (IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- Element const& elementAt (ICursor const&) const;
-
- Element& elementAt (ICursor const&);
-
- Element const& anyElement () const;
-
- void removeAt (ICursor const&);
-
- INumber removeAll (Boolean (*property)
- (Element const&, void*),
- void* additionalArgument = 0);
-
- void replaceAt (ICursor const&,
- Element const&);
-
- void removeAll ();
-
- Boolean isBounded () const;
-
- INumber maxNumberOfElements () const;
-
- INumber numberOfElements () const;
-
- Boolean isEmpty () const;
-
- Boolean isFull () const;
-
- ICursor* newCursor () const;
-
- Boolean setToFirst (ICursor&) const;
-
- Boolean setToNext (ICursor&) const;
-
- Boolean allElementsDo (Boolean (*function)
- (Element&, void*),
- void* additionalArgument = 0);
-
- Boolean allElementsDo (IIterator <Element>&);
-
- Boolean allElementsDo (Boolean (*function)
- (Element const&, void*),
- void* additionalArgument = 0)
- const;
-
- Boolean allElementsDo (IConstantIterator
- <Element>&) const;
-
- Boolean contains (Element const&) const;
-
- Boolean containsAllFrom (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
-
- Boolean locate (Element const&, ICursor&)
- const;
-
- Boolean locateOrAdd (Element const&);
-
- Boolean locateOrAdd (Element const&,
- ICursor&);
-
- Boolean remove (Element const&);
-
- INumber numberOfOccurrences (Element const&) const;
-
- Boolean locateNext (Element const&, ICursor&)
- const;
-
- INumber removeAllOccurrences (Element const&);
-
- INumber numberOfDifferentElements () const;
-
- Boolean setToNextDifferentElement (ICursor&) const;
-
- Boolean operator == (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
-
- Boolean operator != (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
-
- void unionWith (IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- void intersectionWith (IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- void differenceWith (IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- void addUnion (IWBagOnKeySet < Element, ElementOps, Base > const&,
- IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- void addIntersection (IWBagOnKeySet < Element, ElementOps, Base > const&,
- IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- void addDifference (IWBagOnKeySet < Element, ElementOps, Base > const&,
- IWBagOnKeySet < Element, ElementOps, Base > const&);
-
- protected:
-
- void add (Element const&, INumber);
-
- struct RemoveEnv {
- Boolean (*predicate) (Element const&, void*);
- void* env;
- INumber removeCount;
- };
- static Boolean removePredicate (IBKeyElm < Element > const&, void*);
- static Boolean cleanupPredicate (IBKeyElm < Element > const&, void*);
-
- static ElementOps cvElementOps;
-
- };
-
- template < class Element, class ElementOps >
- class IBKSOps : public ElementOps {
- public:
- void assign(IBKeyElm < Element >& e1,
- IBKeyElm < Element > const& e2) const
- { ElementOps::assign (e1.elem, e2.elem);
- e1.occurrences = e2.occurrences; }
- Element const& key (IBKeyElm < Element > const& e) const
- { return e.elem; }
- ElementOps keyOps;
- };
-
- #define IDefineGBagOnGKeySet(GKeySet, GBag) \
- template < class Element, class ElementOps > \
- class GKeySet ## ForGBag : \
- public GKeySet < IBKeyElm < Element >, Element, \
- IBKSOps < Element, ElementOps > > { \
- public: \
- GKeySet ## ForGBag (INumber n = 100, IBoundIndicator b = IUnbounded) : \
- GKeySet < IBKeyElm < Element >, Element, \
- IBKSOps < Element, ElementOps > > (n, b) {} \
- }; \
- template < class Element, class ElementOps > \
- class GBag : \
- public IWBagOnKeySet < Element, ElementOps, \
- GKeySet ## ForGBag < Element, ElementOps > > { \
- public: \
- GBag (INumber n = 100, IBoundIndicator b = IUnbounded) : \
- IWBagOnKeySet < Element, ElementOps, \
- GKeySet ## ForGBag < Element, ElementOps > > (n, b) {} \
- };
-
- #include <ibagks.if>
-
- #ifdef __IBMCPP__
- #include <ibagks.c>
- #endif
-
- #endif