home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v1.zip / IBMCPP / IBMCLASS / ITBSEQ.C < prev    next >
Text File  |  1993-09-22  |  6KB  |  157 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. IBoolean IGTabularSequence <Element, ElementOps>::Cursor::setToFirst ()
  16. { return ivCollection->setToFirst (*this);
  17. }
  18.  
  19. template <class Element, class ElementOps>
  20. IBoolean IGTabularSequence <Element, ElementOps>::Cursor::setToNext ()
  21. { return ivCollection->setToNext (*this);
  22. }
  23.  
  24. template <class Element, class ElementOps>
  25. IBoolean IGTabularSequence <Element, ElementOps>::Cursor::isValid () const
  26. { return ivImpl.ivIsValid;
  27. }
  28.  
  29. template <class Element, class ElementOps>
  30. void IGTabularSequence <Element, ElementOps>::Cursor::invalidate ()
  31. { ivImpl.ivIsValid = False;
  32. }
  33.  
  34. template < class Element, class ElementOps >
  35. void IGTabularSequence < Element, ElementOps >::Operations::
  36. copyFrom (INumber index, void const* element) const
  37. { elementOps().assign
  38.     (((Node*)ivNodes) [index].ivElement, *(Element const*)element);
  39. }
  40.  
  41. template < class Element, class ElementOps >
  42. void const* IGTabularSequence < Element, ElementOps >::Operations::
  43. elementAt (INumber index) const
  44. { return &((Node*)ivNodes) [index].ivElement;
  45. }
  46.  
  47. template < class Element, class ElementOps >
  48. void IGTabularSequence < Element, ElementOps >::Operations::
  49. swap (INumber index1, INumber index2) const
  50. { Element e;
  51.   elementOps().assign (e, ((Node*)ivNodes) [index1].ivElement);
  52.   elementOps().assign
  53.     (((Node*)ivNodes) [index1].ivElement,
  54.      ((Node*)ivNodes) [index2].ivElement);
  55.   elementOps().assign (((Node*)ivNodes) [index2].ivElement, e);
  56. }
  57.  
  58. template < class Element, class ElementOps >
  59. IBoolean IGTabularSequence < Element, ElementOps >::Operations::
  60. constantFunctionIteration (void *iterationFunction,
  61.                            void* env,
  62.                            INumber index) const
  63. { return (*(IBoolean (*) (Element const&, void*)) iterationFunction)
  64.            (((Node*)ivNodes) [index].ivElement, env);
  65. }
  66.  
  67. template < class Element, class ElementOps >
  68. IBoolean IGTabularSequence < Element, ElementOps >::Operations::
  69. functionIteration (void *iterationFunction, void* env, INumber index)
  70. { return (*(IBoolean (*) (Element&, void*)) iterationFunction)
  71.            (((Node*)ivNodes) [index].ivElement, env);
  72. }
  73.  
  74. template < class Element, class ElementOps >
  75. IBoolean IGTabularSequence < Element, ElementOps >::Operations::
  76. constantIteratorIteration (void* iterator, INumber index) const
  77. { return ((IConstantIterator < Element >*)iterator)->
  78.            applyTo (((Node*)ivNodes) [index].ivElement);
  79. }
  80.  
  81. template < class Element, class ElementOps >
  82. IBoolean IGTabularSequence < Element, ElementOps >::Operations::
  83. iteratorIteration (void* iterator, INumber index)
  84. { return ((IIterator < Element >*)iterator)->
  85.            applyTo (((Node*)ivNodes) [index].ivElement);
  86. }
  87.  
  88. template < class Element, class ElementOps >
  89. long IGTabularSequence < Element, ElementOps >::Operations::
  90. functionComparison (void *comparisonFunction,
  91.                     void const* element1,
  92.                     void const* element2)
  93. { return (*(long (*) (Element const&, Element const&) const)
  94.             comparisonFunction)
  95.            (*(Element*)element1, *(Element*)element2);
  96. }
  97.  
  98. template < class Element, class ElementOps >
  99. long IGTabularSequence < Element, ElementOps >::Operations::
  100. functionComparison (void *comparisonFunction,
  101.                     INumber index1,
  102.                     INumber index2)
  103. { return (*(long (*) (Element const&, Element const&) const)
  104.             comparisonFunction)
  105.            (((Node*)ivNodes) [index1].ivElement,
  106.             ((Node*)ivNodes) [index2].ivElement);
  107. }
  108.  
  109. template < class Element, class ElementOps >
  110. void IGTabularSequence < Element, ElementOps >::Operations::
  111. blockLeft (INumber lTarget, INumber lMoveCount)
  112. { for (INumber i = lTarget; lMoveCount > 0; i++, lMoveCount--)
  113.     ((Node*)ivNodes) [i] = ((Node*)ivNodes) [i+1];
  114. }
  115.  
  116. template < class Element, class ElementOps >
  117. void IGTabularSequence < Element, ElementOps >::Operations::
  118. blockRight (INumber lTarget, INumber lMoveCount)
  119. { for (INumber i = lTarget + lMoveCount - 1; lMoveCount > 0; i--, lMoveCount--)
  120.     ((Node*)ivNodes) [i] = ((Node*)ivNodes) [i-1];
  121. }
  122.  
  123. template < class Element, class ElementOps >
  124. void IGTabularSequence < Element, ElementOps >::Operations::
  125. copy (ITabularSequenceImpl::Table const& from)
  126. { INumber toIndex = ivLast;
  127.   INumber fromIndex = from.ivFirst;
  128.   for (INumber i = 0; i < from.ivNumberOfElements; i++) {
  129.     incMod (toIndex);
  130.     ((Node*)ivNodes) [toIndex] = ((Node*)from.ivNodes) [fromIndex];
  131.     from.incMod (fromIndex);
  132.   }
  133.   ivNumberOfElements += from.ivNumberOfElements;
  134.   ivLast = toIndex;
  135. }
  136.  
  137. template < class Element, class ElementOps >
  138. void IGTabularSequence < Element, ElementOps >::Operations::
  139. expand (INumber n)
  140. { n += ivNumberOfElements;
  141.  
  142.   INumber newAllocatedElements = ivAllocatedElements;
  143.   while (newAllocatedElements < n)
  144.     newAllocatedElements *= 2;
  145.   Node* newNodes = new Node [newAllocatedElements];
  146.   ICHECK (newNodes != 0, IOutOfMemory, IOutOfMemoryText)
  147.  
  148.   ITabularSequenceImpl::Table tab = *this;
  149.   (Node*&)ivNodes = newNodes;
  150.   ivAllocatedElements = newAllocatedElements;
  151.   ivFirst = 0;
  152.   ivLast = ivAllocatedElements - 1;
  153.   ivNumberOfElements = 0;
  154.   copy (tab);
  155.   delete[] (Node*)tab.ivNodes;
  156. }
  157.