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

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