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