home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v1.zip / IBMCPP / IBMCLASS / IKSBSEQ.IF < prev    next >
Text File  |  1993-09-22  |  17KB  |  481 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. #include <ibexcept.h>
  13.  
  14. template <class Element, class Key, class ElementOps, class Base>
  15. inline IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  16. IWKSBagOnSeq (INumber n)
  17. : ivBase (n) {
  18. }
  19.  
  20. template <class Element, class Key, class ElementOps, class Base>
  21. inline IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  22. IWKSBagOnSeq (IWKSBagOnSeq <Element, Key, ElementOps, Base>
  23.                  const& collection)
  24. : ivBase (collection.ivBase) {
  25. }
  26.  
  27. template <class Element, class Key, class ElementOps, class Base>
  28. inline IWKSBagOnSeq <Element, Key, ElementOps, Base>&
  29. IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  30. operator = (IWKSBagOnSeq <Element, Key, ElementOps, Base>
  31.             const& collection)
  32. { ivBase.operator = (collection.ivBase);
  33.   return *this;
  34. }
  35.  
  36. template <class Element, class Key, class ElementOps, class Base>
  37. inline IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  38. ~IWKSBagOnSeq () {
  39. }
  40.  
  41. template <class Element, class Key, class ElementOps, class Base>
  42. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  43. add (Element const& element)
  44. { Cursor dummy (*this);
  45.   return add (element, dummy);
  46. }
  47.  
  48. template <class Element, class Key, class ElementOps, class Base>
  49. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  50. add (Element const& element, ICursor& cursor)
  51. { locateKey (elementOps().key (element), cursor);
  52.   if (cursor.isValid ()) {
  53.     ivBase.addAsPrevious (element, cursor);
  54.   }
  55.   else {
  56.     ivBase.addAsLast (element, cursor);
  57.   }
  58.   return True;
  59. }
  60.  
  61. template <class Element, class Key, class ElementOps, class Base>
  62. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  63. addAllFrom (IWKSBagOnSeq < Element, Key, ElementOps, Base >
  64.             const& collection)
  65. {
  66. #ifndef INO_CHECKS
  67.   ICHECK (this != &collection,
  68.           IIdenticalCollectionException, IIdenticalCollectionText)
  69. #endif
  70.   Cursor cursor (collection);
  71.   forCursor (cursor) {
  72.     add (collection.elementAt (cursor));
  73.   }
  74. }
  75.  
  76. template <class Element, class Key, class ElementOps, class Base>
  77. inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  78. elementAt (ICursor const& cursor) const
  79. { return ivBase.elementAt (cursor);
  80. }
  81.  
  82. template <class Element, class Key, class ElementOps, class Base>
  83. inline Element& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  84. elementAt (ICursor const& cursor)
  85. { return ivBase.elementAt (cursor);
  86. }
  87.  
  88. template <class Element, class Key, class ElementOps, class Base>
  89. inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  90. anyElement () const
  91. { return ivBase.anyElement ();
  92. }
  93.  
  94. template <class Element, class Key, class ElementOps, class Base>
  95. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  96. removeAt (ICursor const& cursor)
  97. { ivBase.removeAt (cursor);
  98. }
  99.  
  100. template < class Element, class Key, class ElementOps, class Base >
  101. inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base >::
  102. removeAll (IBoolean (*predicate) (Element const&, void*), void* env)
  103. { return ivBase.removeAll (predicate, env);
  104. }
  105.  
  106. template <class Element, class Key, class ElementOps, class Base>
  107. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  108. replaceAt (ICursor const& cursor, Element const& element)
  109. {
  110. #ifndef INO_CHECKS
  111.   ICHECK (elementOps().keyOps.compare
  112.            (elementOps().key (ivBase.elementAt (cursor)),
  113.             elementOps().key (element)) == 0,
  114.           IInvalidReplacementException, IInvalidReplacementText)
  115. #endif
  116.   ivBase.replaceAt (cursor, element);
  117. }
  118.  
  119. template <class Element, class Key, class ElementOps, class Base>
  120. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  121. removeAll ()
  122. { ivBase.removeAll ();
  123. }
  124.  
  125. template <class Element, class Key, class ElementOps, class Base>
  126. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  127. isBounded () const
  128. { return ivBase.isBounded ();
  129. }
  130.  
  131. template <class Element, class Key, class ElementOps, class Base>
  132. inline INumber IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  133. maxNumberOfElements () const
  134. { return ivBase.maxNumberOfElements ();
  135. }
  136.  
  137. template <class Element, class Key, class ElementOps, class Base>
  138. inline INumber IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  139. numberOfElements () const
  140. { return ivBase.numberOfElements ();
  141. }
  142.  
  143. template <class Element, class Key, class ElementOps, class Base>
  144. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  145. isEmpty () const
  146. { return ivBase.isEmpty ();
  147. }
  148.  
  149. template <class Element, class Key, class ElementOps, class Base>
  150. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  151. isFull () const
  152. { return ivBase.isFull ();
  153. }
  154.  
  155. template <class Element, class Key, class ElementOps, class Base>
  156. inline ICursor* IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  157. newCursor () const
  158. { ICursor* result = new Cursor (*this);
  159.   ICHECK (result != 0, IOutOfMemory, IOutOfMemoryText)
  160.   return result;
  161. }
  162.  
  163. template <class Element, class Key, class ElementOps, class Base>
  164. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  165. setToFirst (ICursor& cursor) const
  166. { return ivBase.setToFirst (cursor);
  167. }
  168.  
  169. template <class Element, class Key, class ElementOps, class Base>
  170. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  171. setToNext (ICursor& cursor) const
  172. { return ivBase.setToNext (cursor);
  173. }
  174.  
  175. template <class Element, class Key, class ElementOps, class Base>
  176. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  177. allElementsDo (IBoolean (*iterationFunction) (Element&, void*),
  178.                                void* env) {
  179.   return ivBase.allElementsDo (iterationFunction, env);
  180. }
  181.  
  182. template <class Element, class Key, class ElementOps, class Base>
  183. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  184. allElementsDo (IIterator <Element>& iterator)
  185. { return ivBase.allElementsDo (iterator);
  186. }
  187.  
  188. template <class Element, class Key, class ElementOps, class Base>
  189. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  190. allElementsDo (IBoolean (*iterationFunction) (Element const&, void*),
  191.                                void* env) const {
  192.   return ivBase.allElementsDo (iterationFunction, env);
  193. }
  194.  
  195. template <class Element, class Key, class ElementOps, class Base>
  196. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  197. allElementsDo (IConstantIterator <Element>& iterator) const
  198. { return ivBase.allElementsDo (iterator);
  199. }
  200.  
  201. template <class Element, class Key, class ElementOps, class Base>
  202. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  203. isConsistent () const
  204. { return ivBase.isConsistent ();
  205. }
  206.  
  207. template <class Element, class Key, class ElementOps, class Base>
  208. inline Key const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  209. key (Element const& element) const
  210. { return elementOps().key (element);
  211. }
  212.  
  213. template <class Element, class Key, class ElementOps, class Base>
  214. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  215. containsElementWithKey (Key const& key) const
  216. { Cursor dummy (*this);
  217.   return locateKey (key, dummy);
  218. }
  219.  
  220. template <class Element, class Key, class ElementOps, class Base>
  221. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  222. containsAllKeysFrom (IWKSBagOnSeq <Element, Key, ElementOps, Base>
  223.                      const& collection) const
  224. { Cursor cursor (collection);
  225.   IBoolean result = True;
  226.   forCursor (cursor) {
  227.     if (! containsElementWithKey
  228.             (elementOps().key (collection.elementAt (cursor)))) {
  229.       result = False;
  230.       break;
  231.     }
  232.   }
  233.   return result;
  234. }
  235.  
  236. template <class Element, class Key, class ElementOps, class Base>
  237. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  238. locateElementWithKey (Key const& key, ICursor& cursor) const
  239. { IBoolean result = locateKey (key, cursor);
  240.   if (! result)
  241.     cursor.invalidate ();
  242.   return result;
  243. }
  244.  
  245. template <class Element, class Key, class ElementOps, class Base>
  246. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  247. replaceElementWithKey (Element const& element)
  248. { Cursor dummy (*this);
  249.   return replaceElementWithKey (element, dummy);
  250. }
  251.  
  252. template <class Element, class Key, class ElementOps, class Base>
  253. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  254. replaceElementWithKey (Element const& element, ICursor& cursor)
  255. { IBoolean result = locateKey (elementOps().key (element), cursor);
  256.   if (result)
  257.     ivBase.replaceAt (cursor, element);
  258.   else
  259.     cursor.invalidate ();
  260.   return result;
  261. }
  262.  
  263. template <class Element, class Key, class ElementOps, class Base>
  264. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  265. locateOrAddElementWithKey (Element const& element)
  266. { Cursor dummy (*this);
  267.   return locateOrAddElementWithKey (element, dummy);
  268. }
  269.  
  270. template <class Element, class Key, class ElementOps, class Base>
  271. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  272. locateOrAddElementWithKey (Element const& element, ICursor& cursor)
  273. { IBoolean result = locateKey (elementOps().key (element), cursor);
  274.   if (! result) {
  275.     add (element, cursor);
  276.   }
  277.   return result;
  278. }
  279.  
  280. template <class Element, class Key, class ElementOps, class Base>
  281. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  282. addOrReplaceElementWithKey (Element const& element)
  283. { Cursor dummy (*this);
  284.   return addOrReplaceElementWithKey (element, dummy);
  285. }
  286.  
  287. template <class Element, class Key, class ElementOps, class Base>
  288. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  289. addOrReplaceElementWithKey (Element const& element, ICursor& cursor)
  290. { IBoolean keyExists = locateKey (elementOps().key (element), cursor);
  291.   if (keyExists) {
  292.     ivBase.replaceAt (cursor, element);
  293.   }
  294.   else {
  295.     add (element, cursor);
  296.   }
  297.   return ! keyExists;
  298. }
  299.  
  300. template <class Element, class Key, class ElementOps, class Base>
  301. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  302. removeElementWithKey (Key const& key)
  303. { Cursor cursor (*this);
  304.   IBoolean result = locateKey (key, cursor);
  305.   if (result) {
  306.     ivBase.removeAt (cursor);
  307.   }
  308.   return result;
  309. }
  310.  
  311. template <class Element, class Key, class ElementOps, class Base>
  312. inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  313. elementWithKey (Key const& key) const
  314. { Cursor cursor (*this);
  315.   if (! locateElementWithKey (key, cursor))
  316.     ICHECK (False,
  317.             INotContainsKeyException, IKeyNotContainedText)
  318.   return elementAt (cursor);
  319. }
  320.  
  321. template <class Element, class Key, class ElementOps, class Base>
  322. inline Element& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  323. elementWithKey (Key const& key)
  324. { Cursor cursor (*this);
  325.   if (! locateElementWithKey (key, cursor))
  326.     ICHECK (False,
  327.             INotContainsKeyException, IKeyNotContainedText)
  328.   return elementAt (cursor);
  329. }
  330.  
  331. template < class Element, class Key, class ElementOps, class Base>
  332. inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base>::
  333. numberOfElementsWithKey (Key const& key) const
  334. { INumber result = 0;
  335.   Cursor cursor (*this);
  336.   for (locateElementWithKey (key, cursor);
  337.        cursor.isValid ();
  338.        locateNextElementWithKey (key, cursor))
  339.     result++;
  340.   return result;
  341. }
  342.  
  343. template < class Element, class Key, class ElementOps, class Base>
  344. inline IBoolean IWKSBagOnSeq < Element, Key, ElementOps, Base>::
  345. locateNextElementWithKey (Key const& key, ICursor& cursor) const
  346. { setToNext (cursor);
  347.   IBoolean result = locateKeyFwd (key, cursor);
  348.   if (! result)
  349.     cursor.invalidate ();
  350.   return result;
  351. }
  352.  
  353. template < class Element, class Key, class ElementOps, class Base>
  354. inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base>::
  355. removeAllElementsWithKey (Key const& key)
  356. { Key const* env = &key;
  357.   return removeAll (removePredicate, &env);
  358. }
  359.  
  360. template < class Element, class Key, class ElementOps, class Base>
  361. inline INumber IWKSBagOnSeq < Element, Key, ElementOps, Base>::
  362. numberOfDifferentKeys() const
  363. { INumber result = 0;
  364.   Cursor cursor (*this);
  365.   for (setToFirst (cursor);
  366.        cursor.isValid ();
  367.        setToNextWithDifferentKey (cursor))
  368.     result++;
  369.   return result;
  370. }
  371.  
  372. template < class Element, class Key, class ElementOps, class Base>
  373. inline IBoolean IWKSBagOnSeq < Element, Key, ElementOps, Base>::
  374. setToNextWithDifferentKey (ICursor& icursor) const
  375. { Cursor& cursor = (Cursor&)icursor;
  376.   Key const& key = elementOps().key (ivBase.elementAt (cursor));
  377.   for (; cursor.setToNext (); ) {
  378.     if (elementOps().keyOps.compare
  379.           (elementOps().key (ivBase.elementAt (cursor)), key) != 0)
  380.       return True;
  381.   }
  382.   return False;
  383. }
  384.  
  385. template <class Element, class Key, class ElementOps, class Base>
  386. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  387. removeFirst ()
  388. { ivBase.removeFirst ();
  389. }
  390.  
  391. template <class Element, class Key, class ElementOps, class Base>
  392. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  393. removeLast ()
  394. { ivBase.removeLast ();
  395. }
  396.  
  397. template <class Element, class Key, class ElementOps, class Base>
  398. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  399. removeAtPosition (IPosition position)
  400. { ivBase.removeAtPosition (position);
  401. }
  402.  
  403. template <class Element, class Key, class ElementOps, class Base>
  404. inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  405. firstElement () const
  406. { return ivBase.firstElement ();
  407. }
  408.  
  409. template <class Element, class Key, class ElementOps, class Base>
  410. inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  411. lastElement () const
  412. { return ivBase.lastElement ();
  413. }
  414.  
  415. template <class Element, class Key, class ElementOps, class Base>
  416. inline Element const& IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  417. elementAtPosition (IPosition position) const
  418. { return ivBase.elementAtPosition (position);
  419. }
  420.  
  421. template <class Element, class Key, class ElementOps, class Base>
  422. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  423. setToLast (ICursor& cursor) const
  424. { return ivBase.setToLast (cursor);
  425. }
  426.  
  427. template <class Element, class Key, class ElementOps, class Base>
  428. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  429. setToPrevious (ICursor& cursor) const
  430. { return ivBase.setToPrevious (cursor);
  431. }
  432.  
  433. template <class Element, class Key, class ElementOps, class Base>
  434. inline void IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  435. setToPosition (IPosition position, ICursor& cursor) const
  436. { ivBase.setToPosition (position, cursor);
  437. }
  438.  
  439. template <class Element, class Key, class ElementOps, class Base>
  440. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  441. isFirst (ICursor const& cursor) const
  442. { return ivBase.isFirst (cursor);
  443. }
  444.  
  445. template <class Element, class Key, class ElementOps, class Base>
  446. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  447. isLast (ICursor const& cursor) const
  448. { return ivBase.isLast (cursor);
  449. }
  450.  
  451. template <class Element, class Key, class ElementOps, class Base>
  452. inline long IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  453. compare (IWKSBagOnSeq <Element, Key, ElementOps, Base> const& collection,
  454.          long (*comparisonFunction) (Element const&, Element const&)) const {
  455.   return ivBase.compare (collection.ivBase, comparisonFunction);
  456. }
  457.  
  458. // private:
  459.  
  460. template <class Element, class Key, class ElementOps, class Base>
  461. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  462. locateKeyFwd (Key const& key, ICursor& icursor) const
  463. { Cursor& cursor = (Cursor&)icursor;
  464.   for ( ; cursor.isValid (); cursor.setToNext ()) {
  465.     long comp =
  466.       elementOps().keyOps.compare
  467.         (elementOps().key (ivBase.elementAt (cursor)), key);
  468.     if (comp >= 0) {
  469.       return comp == 0;
  470.     }
  471.   }
  472.   return False;
  473. }
  474.  
  475. template <class Element, class Key, class ElementOps, class Base>
  476. inline IBoolean IWKSBagOnSeq <Element, Key, ElementOps, Base>::
  477. locateKey (Key const& key, ICursor& icursor) const
  478. { setToFirst (icursor);
  479.   return locateKeyFwd (key, icursor);
  480. }
  481.