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