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