home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional Developers Kit 1992 November / Disc01 / Disc01.mdf / cppbeta / bbxxk / ikssseq.if_ / IKSSSEQ.IF
Encoding:
Text File  |  1992-10-26  |  13.1 KB  |  397 lines

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