home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) IBM Corp. 1992 */
- #include <ibexcept.h>
-
- template <class Element, class ElementOps>
- Boolean IGTabularSequence <Element, ElementOps>::Cursor::setToFirst ()
- { return ivCollection->setToFirst (*this);
- }
-
- template <class Element, class ElementOps>
- Boolean IGTabularSequence <Element, ElementOps>::Cursor::setToNext ()
- { return ivCollection->setToNext (*this);
- }
-
- template <class Element, class ElementOps>
- Boolean IGTabularSequence <Element, ElementOps>::Cursor::isValid () const
- { return ivImpl.ivIsValid;
- }
-
- template <class Element, class ElementOps>
- void IGTabularSequence <Element, ElementOps>::Cursor::invalidate ()
- { ivImpl.ivIsValid = False;
- }
-
- template < class Element, class ElementOps >
- void IGTabularSequence < Element, ElementOps >::Operations::
- copyFrom (INumber index, void const* element) const
- { cvElementOps.assign
- (((Node*)ivNodes) [index].ivElement, *(Element const*)element);
- }
-
- template < class Element, class ElementOps >
- void const* IGTabularSequence < Element, ElementOps >::Operations::
- elementAt (INumber index) const
- { return &((Node*)ivNodes) [index].ivElement;
- }
-
- template < class Element, class ElementOps >
- void IGTabularSequence < Element, ElementOps >::Operations::
- swap (INumber index1, INumber index2) const
- { Element e;
- cvElementOps.assign (e, ((Node*)ivNodes) [index1].ivElement);
- cvElementOps.assign
- (((Node*)ivNodes) [index1].ivElement,
- ((Node*)ivNodes) [index2].ivElement);
- cvElementOps.assign (((Node*)ivNodes) [index2].ivElement, e);
- }
-
- template < class Element, class ElementOps >
- Boolean IGTabularSequence < Element, ElementOps >::Operations::
- constantFunctionIteration (void *iterationFunction,
- void* env,
- INumber index) const
- { return (*(Boolean (*) (Element const&, void*)) iterationFunction)
- (((Node*)ivNodes) [index].ivElement, env);
- }
-
- template < class Element, class ElementOps >
- Boolean IGTabularSequence < Element, ElementOps >::Operations::
- functionIteration (void *iterationFunction, void* env, INumber index)
- { return (*(Boolean (*) (Element&, void*)) iterationFunction)
- (((Node*)ivNodes) [index].ivElement, env);
- }
-
- template < class Element, class ElementOps >
- Boolean IGTabularSequence < Element, ElementOps >::Operations::
- constantIteratorIteration (void* iterator, INumber index) const
- { return ((IConstantIterator < Element >*)iterator)->
- applyTo (((Node*)ivNodes) [index].ivElement);
- }
-
- template < class Element, class ElementOps >
- Boolean IGTabularSequence < Element, ElementOps >::Operations::
- iteratorIteration (void* iterator, INumber index)
- { return ((IIterator < Element >*)iterator)->
- applyTo (((Node*)ivNodes) [index].ivElement);
- }
-
- template < class Element, class ElementOps >
- long IGTabularSequence < Element, ElementOps >::Operations::
- functionComparison (void *comparisonFunction,
- void const* element1,
- void const* element2)
- { return (*(long (*) (Element const&, Element const&) const)
- comparisonFunction)
- (*(Element*)element1, *(Element*)element2);
- }
-
- template < class Element, class ElementOps >
- long IGTabularSequence < Element, ElementOps >::Operations::
- functionComparison (void *comparisonFunction,
- INumber index1,
- INumber index2)
- { return (*(long (*) (Element const&, Element const&) const)
- comparisonFunction)
- (((Node*)ivNodes) [index1].ivElement,
- ((Node*)ivNodes) [index2].ivElement);
- }
-
- template < class Element, class ElementOps >
- void IGTabularSequence < Element, ElementOps >::Operations::
- blockLeft (INumber lTarget, INumber lMoveCount)
- { for (INumber i = lTarget; lMoveCount > 0; i++, lMoveCount--)
- ((Node*)ivNodes) [i] = ((Node*)ivNodes) [i+1];
- }
-
- template < class Element, class ElementOps >
- void IGTabularSequence < Element, ElementOps >::Operations::
- blockRight (INumber lTarget, INumber lMoveCount)
- { for (INumber i = lTarget + lMoveCount - 1; lMoveCount > 0; i--, lMoveCount--)
- ((Node*)ivNodes) [i] = ((Node*)ivNodes) [i-1];
- }
-
- template < class Element, class ElementOps >
- void IGTabularSequence < Element, ElementOps >::Operations::
- copy (ITabularSequenceImpl::Table const& from)
- { INumber toIndex = ivLast;
- INumber fromIndex = from.ivFirst;
- for (INumber i = 0; i < from.ivNumberOfElements; i++) {
- incMod (toIndex);
- ((Node*)ivNodes) [toIndex] = ((Node*)from.ivNodes) [fromIndex];
- incMod (fromIndex);
- }
- ivNumberOfElements += from.ivNumberOfElements;
- ivLast = toIndex;
- }
-
- template < class Element, class ElementOps >
- void IGTabularSequence < Element, ElementOps >::Operations::
- expand (INumber n)
- { ITabularSequenceImpl::Table tab = *this;
-
- n += ivNumberOfElements;
-
- while (ivAllocatedElements < n)
- ivAllocatedElements *= 2;
- (Node*&)ivNodes = new Node [ivAllocatedElements];
- ivFirst = 0;
- ivLast = ivAllocatedElements;
- ivNumberOfElements = 0;
- copy (tab);
- delete (Node*)tab.ivNodes;
- }
-
- template <class Element, class ElementOps>
- ElementOps IGTabularSequence <Element, ElementOps>::cvElementOps;