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