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