home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
ITBSEQ.C
< prev
next >
Wrap
Text File
|
1993-09-22
|
6KB
|
157 lines
/*******************************************************************************
* *
* COPYRIGHT: *
* IBM C/C++ Tools Version 2.01 - Collection Class Library *
* Licensed Materials - Property of IBM *
* (C) Copyright IBM Corporation 1992, 1993 *
* All Rights Reserved *
* US Government Users Restricted Rights - Use, duplication, or disclosure *
* restricted by GSA ADP Schedule Contract with IBM Corp. *
* *
*******************************************************************************/
#include <ibexcept.h>
template <class Element, class ElementOps>
IBoolean IGTabularSequence <Element, ElementOps>::Cursor::setToFirst ()
{ return ivCollection->setToFirst (*this);
}
template <class Element, class ElementOps>
IBoolean IGTabularSequence <Element, ElementOps>::Cursor::setToNext ()
{ return ivCollection->setToNext (*this);
}
template <class Element, class ElementOps>
IBoolean 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
{ elementOps().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;
elementOps().assign (e, ((Node*)ivNodes) [index1].ivElement);
elementOps().assign
(((Node*)ivNodes) [index1].ivElement,
((Node*)ivNodes) [index2].ivElement);
elementOps().assign (((Node*)ivNodes) [index2].ivElement, e);
}
template < class Element, class ElementOps >
IBoolean IGTabularSequence < Element, ElementOps >::Operations::
constantFunctionIteration (void *iterationFunction,
void* env,
INumber index) const
{ return (*(IBoolean (*) (Element const&, void*)) iterationFunction)
(((Node*)ivNodes) [index].ivElement, env);
}
template < class Element, class ElementOps >
IBoolean IGTabularSequence < Element, ElementOps >::Operations::
functionIteration (void *iterationFunction, void* env, INumber index)
{ return (*(IBoolean (*) (Element&, void*)) iterationFunction)
(((Node*)ivNodes) [index].ivElement, env);
}
template < class Element, class ElementOps >
IBoolean IGTabularSequence < Element, ElementOps >::Operations::
constantIteratorIteration (void* iterator, INumber index) const
{ return ((IConstantIterator < Element >*)iterator)->
applyTo (((Node*)ivNodes) [index].ivElement);
}
template < class Element, class ElementOps >
IBoolean 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];
from.incMod (fromIndex);
}
ivNumberOfElements += from.ivNumberOfElements;
ivLast = toIndex;
}
template < class Element, class ElementOps >
void IGTabularSequence < Element, ElementOps >::Operations::
expand (INumber n)
{ n += ivNumberOfElements;
INumber newAllocatedElements = ivAllocatedElements;
while (newAllocatedElements < n)
newAllocatedElements *= 2;
Node* newNodes = new Node [newAllocatedElements];
ICHECK (newNodes != 0, IOutOfMemory, IOutOfMemoryText)
ITabularSequenceImpl::Table tab = *this;
(Node*&)ivNodes = newNodes;
ivAllocatedElements = newAllocatedElements;
ivFirst = 0;
ivLast = ivAllocatedElements - 1;
ivNumberOfElements = 0;
copy (tab);
delete[] (Node*)tab.ivNodes;
}