home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
ITDSEQ.C
< prev
next >
Wrap
Text File
|
1993-09-22
|
9KB
|
261 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 IGDilutedSequence <Element, ElementOps>::Cursor::setToFirst ()
{ return ivCollection->setToFirst (*this);
}
template <class Element, class ElementOps>
IBoolean IGDilutedSequence <Element, ElementOps>::Cursor::setToNext ()
{ return ivCollection->setToNext (*this);
}
template <class Element, class ElementOps>
IBoolean IGDilutedSequence <Element, ElementOps>::Cursor::isValid () const
{ return ivImpl.ivIsValid;
}
template <class Element, class ElementOps>
void IGDilutedSequence <Element, ElementOps>::Cursor::invalidate ()
{ ivImpl.ivIsValid = False;
}
template < class Element, class ElementOps >
void IGDilutedSequence < Element, ElementOps >::Operations::
copyFrom (INumber index, void const* element) const
{ elementOps().assign
(((Node*)ivNodes) [index].ivElement, *(Element const*)element);
((Node*)ivNodes) [index].ivIsRemoved = False;
}
template < class Element, class ElementOps >
void const* IGDilutedSequence < Element, ElementOps >::Operations::
elementAt (INumber index) const
{ return &((Node*)ivNodes) [index].ivElement;
}
template < class Element, class ElementOps >
IBoolean IGDilutedSequence < Element, ElementOps >::Operations::
isRemoved (INumber index) const
{ return ((Node*)ivNodes) [index].ivIsRemoved;
}
template < class Element, class ElementOps >
void IGDilutedSequence < Element, ElementOps >::Operations::
remove (INumber index)
{ ((Node*)ivNodes) [index].ivIsRemoved = True;
if (--ivNumberOfElements > 0) {
if (index == ivFirst)
setToNext (ivFirst);
else if (index == ivLast)
setToPrevious (ivLast);
}
else
decMod (ivLast);
}
template < class Element, class ElementOps >
IBoolean IGDilutedSequence < Element, ElementOps >::Operations::
setToNext (INumber& index) const
{ if (index == ivLast)
return False;
do
incMod (index);
while (((Node*)ivNodes) [index].ivIsRemoved);
return True;
}
template < class Element, class ElementOps >
IBoolean IGDilutedSequence < Element, ElementOps >::Operations::
setToPrevious (INumber& index) const
{ if (index == ivFirst)
return False;
do
decMod (index);
while (((Node*)ivNodes) [index].ivIsRemoved);
return True;
}
template < class Element, class ElementOps >
void IGDilutedSequence < 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 IGDilutedSequence < 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 IGDilutedSequence < 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 IGDilutedSequence < Element, ElementOps >::Operations::
constantIteratorIteration (void* iterator, INumber index) const
{ return ((IConstantIterator < Element >*)iterator)->
applyTo (((Node*)ivNodes) [index].ivElement);
}
template < class Element, class ElementOps >
IBoolean IGDilutedSequence < Element, ElementOps >::Operations::
iteratorIteration (void* iterator, INumber index)
{ return ((IIterator < Element >*)iterator)->
applyTo (((Node*)ivNodes) [index].ivElement);
}
template < class Element, class ElementOps >
long IGDilutedSequence < 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 IGDilutedSequence < 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 IGDilutedSequence < 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 IGDilutedSequence < 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 IGDilutedSequence < Element, ElementOps >::Operations::
compress ()
{ INumber from = ivFirst, to = ivFirst;
for (;;) {
if (from != to)
((Node*)ivNodes) [to] = ((Node*)ivNodes) [from];
if (! setToNext (from))
break;
incMod (to);
}
ivLast = to;
}
template < class Element, class ElementOps >
void IGDilutedSequence < Element, ElementOps >::Operations::
copy (IDilutedSequenceImpl::Table const& from)
{ if (from.ivNumberOfElements == 0)
return;
if (ivNumberOfElements > 0 &&
(ivFirst > ivLast ?
(ivFirst - ivLast - 1) :
(ivFirst + ivAllocatedElements - ivLast - 1))
< from.ivNumberOfElements)
compress ();
INumber toIndex = ivLast;
INumber fromIndex = from.ivFirst;
for (;;) {
incMod (toIndex);
((Node*)ivNodes) [toIndex] = ((Node*)from.ivNodes) [fromIndex];
if (fromIndex == from.ivLast)
break;
do
from.incMod (fromIndex);
while (((Node*)from.ivNodes) [fromIndex].ivIsRemoved);
}
ivNumberOfElements += from.ivNumberOfElements;
ivLast = toIndex;
}
template < class Element, class ElementOps >
void IGDilutedSequence < 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)
IDilutedSequenceImpl::Table tab = *this;
(Node*&)ivNodes = newNodes;
ivAllocatedElements = newAllocatedElements;
ivFirst = 0;
ivLast = ivAllocatedElements - 1;
ivNumberOfElements = 0;
copy (tab);
delete[] (Node*)tab.ivNodes;
}
template < class Element, class ElementOps >
void IGDilutedSequence < Element, ElementOps >::Operations::
makeFree (INumber& index)
{ INumber leftFree = index;
while (leftFree > 0 && ! ((Node*)ivNodes) [leftFree].ivIsRemoved) {
if (leftFree == ivFirst && leftFree - 1 != ivLast)
((Node*)ivNodes) [leftFree - 1].ivIsRemoved = True;
leftFree--;
}
if (index - leftFree <= 1 && ((Node*)ivNodes) [leftFree].ivIsRemoved) {
index = leftFree;
return;
}
INumber rightFree = index;
while (rightFree < ivAllocatedElements - 1 &&
! ((Node*)ivNodes) [rightFree].ivIsRemoved) {
if (rightFree == ivLast && rightFree + 1 != ivFirst)
((Node*)ivNodes) [rightFree + 1].ivIsRemoved = True;
rightFree++;
}
if (! ((Node*)ivNodes) [leftFree].ivIsRemoved ||
(index - leftFree > rightFree - index &&
((Node*)ivNodes) [rightFree].ivIsRemoved)) {
blockRight (index + 1, rightFree - (index + 1) + 1);
if (index <= ivFirst && ivFirst < rightFree) ivFirst++;
if (index <= ivLast && ivLast < rightFree) ivLast++;
}
else {
blockLeft (leftFree, (index - 1) - (leftFree + 1) + 1);
if (leftFree < ivFirst && ivFirst < index) ivFirst--;
if (leftFree < ivLast && ivLast < index) ivLast--;
index--;
}
}