home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional Developers Kit 1992 November / Disc01 / Disc01.mdf / runnable / ibmc / ibmclass / ibagks.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-26  |  7.5 KB  |  213 lines

  1. /* Copyright (c) IBM Corp. 1992 */
  2.  
  3. #ifndef _IBAGKS_H
  4. #define _IBAGKS_H
  5.  
  6. #include <iglobals.h>
  7. #include <icursor.h>
  8.  
  9. template < class Element >
  10. class IBKeyElm {
  11. public:
  12.   Element elem;
  13.   INumber occurrences;
  14.   IBKeyElm (Element const& e) : elem (e), occurrences (1) {}
  15.   IBKeyElm (Element const& e, INumber occurrences)
  16.   : elem (e), occurrences (occurrences) {}
  17.  
  18.   friend inline Element const& key (IBKeyElm < Element > const& e)
  19.   { return e.elem; }
  20. };
  21.  
  22. template < class Element, class ElementOps, class Base >
  23. class IWBagOnKeySet {
  24.   Base ivBase;
  25.   INumber ivNumberOfElements;
  26.   class Cursor;
  27.   friend class Cursor;
  28. public:
  29.  
  30.   class Cursor : public Base::Cursor {
  31.     INumber occurrence;
  32.     friend class IWBagOnKeySet < Element, ElementOps, Base >;
  33.   public:
  34.     Cursor (IWBagOnKeySet < Element, ElementOps, Base > const& c)
  35.     : Base::Cursor (c.ivBase) {}
  36.  
  37.     Boolean setToFirst ();
  38.     Boolean setToNext  ();
  39.  
  40.     Element const& element ()
  41.     { return Base::Cursor::element ().elem; }
  42.     Boolean operator== (Cursor const& cursor)
  43.     { return Base::Cursor::operator== (cursor) &&
  44.              occurrence == cursor.occurrence; }
  45.     Boolean operator!= (Cursor const& cursor)
  46.     { return ! operator== (cursor); }
  47.   };
  48.  
  49.                   IWBagOnKeySet             (INumber
  50.                                                numberOfElements = 100,
  51.                                                IBoundIndicator =
  52.                                                IUnbounded);
  53.  
  54.                   IWBagOnKeySet             (IWBagOnKeySet < Element, ElementOps, Base > const&);
  55.  
  56.    IWBagOnKeySet < Element, ElementOps, Base >&    operator =                  (IWBagOnKeySet < Element, ElementOps, Base > const&);
  57.  
  58.                  ~IWBagOnKeySet             ();
  59.  
  60.    Boolean        add                         (Element const&);
  61.  
  62.    Boolean        add                         (Element const&,
  63.                                                ICursor&);
  64.  
  65.    void           addAllFrom                  (IWBagOnKeySet < Element, ElementOps, Base > const&);
  66.  
  67.    Element const& elementAt                   (ICursor const&) const;
  68.  
  69.    Element&       elementAt                   (ICursor const&);
  70.  
  71.    Element const& anyElement                  () const;
  72.  
  73.    void           removeAt                    (ICursor const&);
  74.  
  75.    INumber        removeAll                   (Boolean (*property)
  76.                                                (Element const&, void*),
  77.                                                void* additionalArgument = 0);
  78.  
  79.    void           replaceAt                   (ICursor const&,
  80.                                                Element const&);
  81.  
  82.    void           removeAll                   ();
  83.  
  84.    Boolean        isBounded                   () const;
  85.  
  86.    INumber        maxNumberOfElements         () const;
  87.  
  88.    INumber        numberOfElements            () const;
  89.  
  90.    Boolean        isEmpty                     () const;
  91.  
  92.    Boolean        isFull                      () const;
  93.  
  94.    ICursor*       newCursor                   () const;
  95.  
  96.    Boolean        setToFirst                  (ICursor&) const;
  97.  
  98.    Boolean        setToNext                   (ICursor&) const;
  99.  
  100.    Boolean        allElementsDo               (Boolean (*function)
  101.                                                   (Element&, void*),
  102.                                                void* additionalArgument = 0);
  103.  
  104.    Boolean        allElementsDo               (IIterator <Element>&);
  105.  
  106.    Boolean        allElementsDo               (Boolean (*function)
  107.                                                (Element const&, void*),
  108.                                                void* additionalArgument = 0)
  109.                                                const;
  110.  
  111.    Boolean        allElementsDo               (IConstantIterator
  112.                                                   <Element>&) const;
  113.  
  114.    Boolean        contains                    (Element const&) const;
  115.  
  116.    Boolean        containsAllFrom             (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
  117.  
  118.    Boolean        locate                      (Element const&, ICursor&)
  119.                                                const;
  120.  
  121.    Boolean        locateOrAdd                 (Element const&);
  122.  
  123.    Boolean        locateOrAdd                 (Element const&,
  124.                                                ICursor&);
  125.  
  126.    Boolean        remove                      (Element const&);
  127.  
  128.    INumber        numberOfOccurrences         (Element const&) const;
  129.  
  130.    Boolean        locateNext                  (Element const&, ICursor&)
  131.                                                const;
  132.  
  133.    INumber        removeAllOccurrences        (Element const&);
  134.  
  135.    INumber        numberOfDifferentElements   () const;
  136.  
  137.    Boolean        setToNextDifferentElement   (ICursor&) const;
  138.  
  139.    Boolean        operator ==                 (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
  140.  
  141.    Boolean        operator !=                 (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
  142.  
  143.    void           unionWith                   (IWBagOnKeySet < Element, ElementOps, Base > const&);
  144.  
  145.    void           intersectionWith            (IWBagOnKeySet < Element, ElementOps, Base > const&);
  146.  
  147.    void           differenceWith              (IWBagOnKeySet < Element, ElementOps, Base > const&);
  148.  
  149.    void           addUnion                    (IWBagOnKeySet < Element, ElementOps, Base > const&,
  150.                                                IWBagOnKeySet < Element, ElementOps, Base > const&);
  151.  
  152.    void           addIntersection             (IWBagOnKeySet < Element, ElementOps, Base > const&,
  153.                                                IWBagOnKeySet < Element, ElementOps, Base > const&);
  154.  
  155.    void           addDifference               (IWBagOnKeySet < Element, ElementOps, Base > const&,
  156.                                                IWBagOnKeySet < Element, ElementOps, Base > const&);
  157.  
  158. protected:
  159.  
  160.   void add (Element const&, INumber);
  161.  
  162.   struct RemoveEnv {
  163.     Boolean (*predicate) (Element const&, void*);
  164.     void* env;
  165.     INumber removeCount;
  166.   };
  167.   static Boolean removePredicate (IBKeyElm < Element > const&, void*);
  168.   static Boolean cleanupPredicate (IBKeyElm < Element > const&, void*);
  169.  
  170.   static ElementOps cvElementOps;
  171.  
  172. };
  173.  
  174. template < class Element, class ElementOps >
  175. class IBKSOps : public ElementOps {
  176. public:
  177.   void           assign(IBKeyElm < Element >& e1,
  178.             IBKeyElm < Element > const& e2) const
  179.          { ElementOps::assign (e1.elem, e2.elem);
  180.            e1.occurrences = e2.occurrences; }
  181.   Element const& key (IBKeyElm < Element > const& e) const
  182.                  { return e.elem; }
  183.   ElementOps keyOps;
  184. };
  185.  
  186. #define IDefineGBagOnGKeySet(GKeySet, GBag) \
  187. template < class Element, class ElementOps > \
  188. class GKeySet ## ForGBag : \
  189.   public GKeySet < IBKeyElm < Element >, Element, \
  190.            IBKSOps < Element, ElementOps > > { \
  191. public: \
  192.   GKeySet ## ForGBag (INumber n = 100, IBoundIndicator b = IUnbounded) : \
  193.     GKeySet < IBKeyElm < Element >, Element, \
  194.               IBKSOps < Element, ElementOps > > (n, b) {} \
  195. }; \
  196. template < class Element, class ElementOps > \
  197. class GBag : \
  198.   public IWBagOnKeySet < Element, ElementOps, \
  199.                  GKeySet ## ForGBag < Element, ElementOps > > { \
  200. public: \
  201.   GBag (INumber n = 100, IBoundIndicator b = IUnbounded) : \
  202.     IWBagOnKeySet < Element, ElementOps, \
  203.             GKeySet ## ForGBag < Element, ElementOps > > (n, b) {} \
  204. };
  205.  
  206. #include <ibagks.if>
  207.  
  208. #ifdef __IBMCPP__
  209. #include <ibagks.c>
  210. #endif
  211.  
  212. #endif
  213.