home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional Developers Kit 1992 November / Disc01 / Disc01.mdf / runnable / ibmc / ibmclass / itbseq.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-26  |  5.0 KB  |  146 lines

  1. /* Copyright (c) IBM Corp. 1992 */
  2. #include <ibexcept.h>
  3.  
  4. template <class Element, class ElementOps>
  5. Boolean IGTabularSequence <Element, ElementOps>::Cursor::setToFirst ()
  6. { return ivCollection->setToFirst (*this);
  7. }
  8.  
  9. template <class Element, class ElementOps>
  10. Boolean IGTabularSequence <Element, ElementOps>::Cursor::setToNext ()
  11. { return ivCollection->setToNext (*this);
  12. }
  13.  
  14. template <class Element, class ElementOps>
  15. Boolean IGTabularSequence <Element, ElementOps>::Cursor::isValid () const
  16. { return ivImpl.ivIsValid;
  17. }
  18.  
  19. template <class Element, class ElementOps>
  20. void IGTabularSequence <Element, ElementOps>::Cursor::invalidate ()
  21. { ivImpl.ivIsValid = False;
  22. }
  23.  
  24. template < class Element, class ElementOps >
  25. void IGTabularSequence < Element, ElementOps >::Operations::
  26. copyFrom (INumber index, void const* element) const
  27. { cvElementOps.assign
  28.     (((Node*)ivNodes) [index].ivElement, *(Element const*)element);
  29. }
  30.  
  31. template < class Element, class ElementOps >
  32. void const* IGTabularSequence < Element, ElementOps >::Operations::
  33. elementAt (INumber index) const
  34. { return &((Node*)ivNodes) [index].ivElement;
  35. }
  36.  
  37. template < class Element, class ElementOps >
  38. void IGTabularSequence < Element, ElementOps >::Operations::
  39. swap (INumber index1, INumber index2) const
  40. { Element e;
  41.   cvElementOps.assign (e, ((Node*)ivNodes) [index1].ivElement);
  42.   cvElementOps.assign
  43.     (((Node*)ivNodes) [index1].ivElement,
  44.      ((Node*)ivNodes) [index2].ivElement);
  45.   cvElementOps.assign (((Node*)ivNodes) [index2].ivElement, e);
  46. }
  47.  
  48. template < class Element, class ElementOps >
  49. Boolean IGTabularSequence < Element, ElementOps >::Operations::
  50. constantFunctionIteration (void *iterationFunction,
  51.                void* env,
  52.                INumber index) const
  53. { return (*(Boolean (*) (Element const&, void*)) iterationFunction)
  54.        (((Node*)ivNodes) [index].ivElement, env);
  55. }
  56.  
  57. template < class Element, class ElementOps >
  58. Boolean IGTabularSequence < Element, ElementOps >::Operations::
  59. functionIteration (void *iterationFunction, void* env, INumber index)
  60. { return (*(Boolean (*) (Element&, void*)) iterationFunction)
  61.        (((Node*)ivNodes) [index].ivElement, env);
  62. }
  63.    
  64. template < class Element, class ElementOps >
  65. Boolean IGTabularSequence < Element, ElementOps >::Operations::
  66. constantIteratorIteration (void* iterator, INumber index) const
  67. { return ((IConstantIterator < Element >*)iterator)->
  68.            applyTo (((Node*)ivNodes) [index].ivElement);
  69. }
  70.  
  71. template < class Element, class ElementOps >
  72. Boolean IGTabularSequence < Element, ElementOps >::Operations::
  73. iteratorIteration (void* iterator, INumber index)
  74. { return ((IIterator < Element >*)iterator)->
  75.            applyTo (((Node*)ivNodes) [index].ivElement);
  76. }
  77.    
  78. template < class Element, class ElementOps >
  79. long IGTabularSequence < Element, ElementOps >::Operations::
  80. functionComparison (void *comparisonFunction,
  81.             void const* element1,
  82.             void const* element2)
  83. { return (*(long (*) (Element const&, Element const&) const)
  84.         comparisonFunction)
  85.            (*(Element*)element1, *(Element*)element2);
  86. }
  87.  
  88. template < class Element, class ElementOps >
  89. long IGTabularSequence < Element, ElementOps >::Operations::
  90. functionComparison (void *comparisonFunction,
  91.             INumber index1,
  92.             INumber index2)
  93. { return (*(long (*) (Element const&, Element const&) const)
  94.         comparisonFunction)
  95.            (((Node*)ivNodes) [index1].ivElement,
  96.             ((Node*)ivNodes) [index2].ivElement);
  97. }
  98.  
  99. template < class Element, class ElementOps >
  100. void IGTabularSequence < Element, ElementOps >::Operations::
  101. blockLeft (INumber lTarget, INumber lMoveCount)
  102. { for (INumber i = lTarget; lMoveCount > 0; i++, lMoveCount--)
  103.     ((Node*)ivNodes) [i] = ((Node*)ivNodes) [i+1];
  104. }
  105.  
  106. template < class Element, class ElementOps >
  107. void IGTabularSequence < Element, ElementOps >::Operations::
  108. blockRight (INumber lTarget, INumber lMoveCount)
  109. { for (INumber i = lTarget + lMoveCount - 1; lMoveCount > 0; i--, lMoveCount--)
  110.     ((Node*)ivNodes) [i] = ((Node*)ivNodes) [i-1];
  111. }
  112.  
  113. template < class Element, class ElementOps >
  114. void IGTabularSequence < Element, ElementOps >::Operations::
  115. copy (ITabularSequenceImpl::Table const& from)
  116. { INumber toIndex = ivLast;
  117.   INumber fromIndex = from.ivFirst;
  118.   for (INumber i = 0; i < from.ivNumberOfElements; i++) {
  119.     incMod (toIndex);
  120.     ((Node*)ivNodes) [toIndex] = ((Node*)from.ivNodes) [fromIndex];
  121.     incMod (fromIndex);
  122.   }
  123.   ivNumberOfElements += from.ivNumberOfElements;
  124.   ivLast = toIndex;
  125. }
  126.  
  127. template < class Element, class ElementOps >
  128. void IGTabularSequence < Element, ElementOps >::Operations::
  129. expand (INumber n)
  130. { ITabularSequenceImpl::Table tab = *this;
  131.  
  132.   n += ivNumberOfElements;
  133.  
  134.   while (ivAllocatedElements < n)
  135.     ivAllocatedElements *= 2;
  136.   (Node*&)ivNodes = new Node [ivAllocatedElements];
  137.   ivFirst = 0;
  138.   ivLast = ivAllocatedElements;
  139.   ivNumberOfElements = 0;
  140.   copy (tab);
  141.   delete (Node*)tab.ivNodes;
  142. }
  143.  
  144. template <class Element, class ElementOps>
  145. ElementOps IGTabularSequence <Element, ElementOps>::cvElementOps;
  146.