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

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