home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v1.zip / IBMCPP / IBMCLASS / IBAGKSS.H < prev    next >
Text File  |  1993-09-22  |  9KB  |  233 lines

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