home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v1.zip / IBMCPP / IBMCLASS / IBAGKS.H < prev    next >
Text File  |  1993-09-22  |  9KB  |  234 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 _IBAGKS_H
  13. #define _IBAGKS_H
  14.  
  15. #include <iglobals.h>
  16. #include <icursor.h>
  17.  
  18. template < class Element >
  19. class IBKeyElm {
  20. public:
  21.   Element elem;
  22.   INumber occurrences;
  23.   IBKeyElm () {}
  24.   IBKeyElm (Element const& e) : elem (e), occurrences (1) {}
  25.   IBKeyElm (Element const& e, INumber occurrences)
  26.   : elem (e), occurrences (occurrences) {}
  27.  
  28.   friend inline Element const& key (IBKeyElm < Element > const& e)
  29.   { return e.elem; }
  30. };
  31.  
  32. template < class Element, class ElementOps, class Base >
  33. class IWBagOnKeySet {
  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 IWBagOnKeySet < Element, ElementOps, Base >;
  44.     IBoolean isFor (IWBagOnKeySet < Element, ElementOps, Base > const& c) const
  45.     { return Base::Cursor::isFor (c.ivBase); }
  46.  
  47.   public:
  48.     Cursor (IWBagOnKeySet < Element, ElementOps, Base > const& c)
  49.     : Base::Cursor (c.ivBase) {}
  50.  
  51.     IBoolean setToFirst ();
  52.     IBoolean setToNext  ();
  53.  
  54.     Element const& element () const
  55.     { return Base::Cursor::element ().elem; }
  56.     IBoolean operator== (Cursor const& cursor) const
  57.     { return Base::Cursor::operator== (cursor) &&
  58.              occurrence == cursor.occurrence; }
  59.     IBoolean operator!= (Cursor const& cursor) const
  60.     { return ! operator== (cursor); }
  61.   };
  62.  
  63.                   IWBagOnKeySet             (INumber
  64.                                                numberOfElements = 100);
  65.  
  66.                   IWBagOnKeySet             (IWBagOnKeySet < Element, ElementOps, Base > const&);
  67.  
  68.    IWBagOnKeySet < Element, ElementOps, Base >&
  69.                   operator =                  (IWBagOnKeySet < Element, ElementOps, Base > const&);
  70.  
  71.                  ~IWBagOnKeySet             ();
  72.  
  73.    IBoolean       add                         (Element const&);
  74.  
  75.    IBoolean       add                         (Element const&,
  76.                                                ICursor&);
  77.  
  78.    void           addAllFrom                  (IWBagOnKeySet < Element, ElementOps, Base > const&);
  79.  
  80.    Element const& elementAt                   (ICursor const&) const;
  81.  
  82.    Element&       elementAt                   (ICursor const&);
  83.  
  84.    Element const& anyElement                  () const;
  85.  
  86.    void           removeAt                    (ICursor const&);
  87.  
  88.    INumber        removeAll                   (IBoolean (*property)
  89.                                                (Element const&, void*),
  90.                                                void* additionalArgument = 0);
  91.  
  92.    void           replaceAt                   (ICursor const&,
  93.                                                Element const&);
  94.  
  95.    void           removeAll                   ();
  96.  
  97.    IBoolean       isBounded                   () const;
  98.  
  99.    INumber        maxNumberOfElements         () const;
  100.  
  101.    INumber        numberOfElements            () const;
  102.  
  103.    IBoolean       isEmpty                     () const;
  104.  
  105.    IBoolean       isFull                      () const;
  106.  
  107.    ICursor*       newCursor                   () const;
  108.  
  109.    IBoolean       setToFirst                  (ICursor&) const;
  110.  
  111.    IBoolean       setToNext                   (ICursor&) const;
  112.  
  113.    IBoolean       allElementsDo               (IBoolean (*function)
  114.                                                   (Element&, void*),
  115.                                                void* additionalArgument = 0);
  116.  
  117.    IBoolean       allElementsDo               (IIterator <Element>&);
  118.  
  119.    IBoolean       allElementsDo               (IBoolean (*function)
  120.                                                (Element const&, void*),
  121.                                                void* additionalArgument = 0)
  122.                                                const;
  123.  
  124.    IBoolean       allElementsDo               (IConstantIterator
  125.                                                   <Element>&) const;
  126.  
  127.    IBoolean       isConsistent                () const;
  128.  
  129.    IBoolean       contains                    (Element const&) const;
  130.  
  131.    IBoolean       containsAllFrom             (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
  132.  
  133.    IBoolean       locate                      (Element const&, ICursor&)
  134.                                                const;
  135.  
  136.    IBoolean       locateOrAdd                 (Element const&);
  137.  
  138.    IBoolean       locateOrAdd                 (Element const&,
  139.                                                ICursor&);
  140.  
  141.    IBoolean       remove                      (Element const&);
  142.  
  143.    INumber        numberOfOccurrences         (Element const&) const;
  144.  
  145.    IBoolean       locateNext                  (Element const&, ICursor&)
  146.                                                const;
  147.  
  148.    INumber        removeAllOccurrences        (Element const&);
  149.  
  150.    INumber        numberOfDifferentElements   () const;
  151.  
  152.    IBoolean       setToNextDifferentElement   (ICursor&) const;
  153.  
  154.    IBoolean       operator ==                 (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
  155.  
  156.    IBoolean       operator !=                 (IWBagOnKeySet < Element, ElementOps, Base > const&) const;
  157.  
  158.    void           unionWith                   (IWBagOnKeySet < Element, ElementOps, Base > const&);
  159.  
  160.    void           intersectionWith            (IWBagOnKeySet < Element, ElementOps, Base > const&);
  161.  
  162.    void           differenceWith              (IWBagOnKeySet < Element, ElementOps, Base > const&);
  163.  
  164.    void           addUnion                    (IWBagOnKeySet < Element, ElementOps, Base > const&,
  165.                                                IWBagOnKeySet < Element, ElementOps, Base > const&);
  166.  
  167.    void           addIntersection             (IWBagOnKeySet < Element, ElementOps, Base > const&,
  168.                                                IWBagOnKeySet < Element, ElementOps, Base > const&);
  169.  
  170.    void           addDifference               (IWBagOnKeySet < Element, ElementOps, Base > const&,
  171.                                                IWBagOnKeySet < Element, ElementOps, Base > const&);
  172.  
  173. protected:
  174.  
  175.   void                checkCursorIsForThis (ICursor const&) const;
  176.   void                checkCursor          (ICursor const&) const;
  177.  
  178.   struct RemoveEnv {
  179.     IBoolean (*predicate) (Element const&, void*);
  180.     void* env;
  181.     INumber removeCount;
  182.   };
  183.   static IBoolean removePredicate (IBKeyElm < Element > const&, void*);
  184.   static IBoolean cleanupPredicate (IBKeyElm < Element > const&, void*);
  185.  
  186.   static ElementOps elementOps ()
  187.   { ElementOps ops;
  188.     return ops;
  189.   }
  190.  
  191. };
  192.  
  193. template < class Element, class ElementOps >
  194. class IBKSOps : public ElementOps {
  195. public:
  196.   void           assign(IBKeyElm < Element >& e1,
  197.                         IBKeyElm < Element > const& e2) const
  198.                  { ElementOps::assign (e1.elem, e2.elem);
  199.                    e1.occurrences = e2.occurrences; }
  200.   Element const& key (IBKeyElm < Element > const& e) const
  201.                  { return e.elem; }
  202.   ElementOps keyOps;
  203. };
  204.  
  205. #define IDefineGBagOnGKeySet(GKeySet, GBag) \
  206. template < class Element, class ElementOps > \
  207. class GKeySet ## ForGBag : \
  208.   public GKeySet < IBKeyElm < Element >, Element, \
  209.                    IBKSOps < Element, ElementOps > > { \
  210. public: \
  211.   GKeySet ## ForGBag (INumber n = 100) : \
  212.     GKeySet < IBKeyElm < Element >, Element, \
  213.               IBKSOps < Element, ElementOps > > (n) {} \
  214. }; \
  215. template < class Element, class ElementOps > \
  216. class GBag : \
  217.   public IWBagOnKeySet < Element, ElementOps, \
  218.                          GKeySet ## ForGBag < Element, ElementOps > > { \
  219. public: \
  220.   GBag (INumber n = 100) : \
  221.     IWBagOnKeySet < Element, ElementOps, \
  222.                     GKeySet ## ForGBag < Element, ElementOps > > (n) {} \
  223. };
  224.  
  225. #include <ibagks.if>
  226.  
  227. #ifdef __IBMCPP__
  228. #ifndef __TEMPINC__
  229. #include <ibagks.c>
  230. #endif
  231. #endif
  232.  
  233. #endif
  234.