home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v1.zip
/
IBMCPP
/
IBMCLASS
/
ITBSEQ.IF
< prev
next >
Wrap
Text File
|
1993-09-22
|
14KB
|
424 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 >
inline void IGTabularSequence < Element, ElementOps >::
checkNotEmpty () const
{
#ifndef INO_CHECKS
ICHECK (!isEmpty (), IEmptyException, ICollectionIsEmptyText)
#endif
}
template < class Element, class ElementOps >
inline void IGTabularSequence < Element, ElementOps >::
checkCursorIsForThis (ICursor const& cursor) const
{
#ifndef INO_CHECKS
ICHECK (((Cursor const&)cursor).isFor (*this),
ICursorInvalidException, ICursorNotForThisText)
#endif
}
template < class Element, class ElementOps >
inline void IGTabularSequence < Element, ElementOps >::
checkCursor (ICursor const& cursor) const
{
#ifndef INO_CHECKS
ICHECK (((Cursor const&)cursor).isFor (*this),
ICursorInvalidException, ICursorNotForThisText)
ICHECK (cursor.isValid (), ICursorInvalidException, IInvalidCursorText)
ICHECK (ivImpl.checkIndex (((Cursor const&)cursor).ivImpl.ivIndex),
ICursorInvalidException, ICursorNotContainedText)
#endif
}
template < class Element, class ElementOps >
inline void IGTabularSequence < Element, ElementOps >::
checkPositionExists (IPosition position) const
{
#ifndef INO_CHECKS
ICHECK (1 <= position && position <= numberOfElements(),
IPositionInvalidException, IInvalidPositionText)
#endif
}
template < class Element, class ElementOps >
inline void IGTabularSequence < Element, ElementOps >::
checkPositionForAdd (IPosition position) const
{
#ifndef INO_CHECKS
ICHECK (1 <= position && position <= numberOfElements() + 1,
IPositionInvalidException, IInvalidPositionText)
#endif
}
template <class Element, class ElementOps>
inline IGTabularSequence <Element, ElementOps>::
IGTabularSequence (INumber n)
: ivImpl (&ivOps)
{ if (n == 0) n++;
Node* newNodes = new Node [n];
ICHECK (newNodes != 0, IOutOfMemory, IOutOfMemoryText)
ivOps.ivAllocatedElements = n;
ivOps.ivLast = ivOps.ivAllocatedElements - 1;
ivOps.ivFirst = ivOps.ivNumberOfElements = 0;
(Node*&)ivOps.ivNodes = newNodes;
}
template <class Element, class ElementOps>
inline IGTabularSequence <Element, ElementOps>::
IGTabularSequence (IGTabularSequence < Element, ElementOps > const& sequence)
: ivImpl (&ivOps)
{ Node* newNodes = new Node [sequence.ivOps.ivAllocatedElements];
ICHECK (newNodes != 0, IOutOfMemory, IOutOfMemoryText)
ivOps.ivAllocatedElements = sequence.ivOps.ivAllocatedElements;
ivOps.ivLast = ivOps.ivAllocatedElements - 1;
ivOps.ivFirst = ivOps.ivNumberOfElements = 0;
(Node*&)ivOps.ivNodes = newNodes;
ivOps.copy (sequence.ivOps);
}
template <class Element, class ElementOps>
inline IGTabularSequence <Element, ElementOps>::
~IGTabularSequence ()
{ delete[] (Node*) ivOps.ivNodes;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
add (Element const& element, ICursor& cursor)
{ addAsLast (element, cursor);
return True;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
add (Element const& element)
{ Cursor cursor (*this);
return add (element, cursor);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAllFrom (IGTabularSequence < Element, ElementOps > const& sequence)
{
#ifndef INO_CHECKS
ICHECK (this != &sequence,
IIdenticalCollectionException, IIdenticalCollectionText)
#endif
ivImpl.addAllFrom (sequence.ivImpl);
}
template <class Element, class ElementOps>
inline Element const& IGTabularSequence <Element, ElementOps>::
elementAt (ICursor const& cursor) const
{ checkCursor (cursor);
return ((Node*)ivOps.ivNodes)
[((Cursor const&)cursor).ivImpl.ivIndex].ivElement;
}
template <class Element, class ElementOps>
inline Element& IGTabularSequence <Element, ElementOps>::
elementAt (ICursor const& cursor)
{ checkCursor (cursor);
return ((Node*) ivOps.ivNodes)
[((Cursor const&)cursor).ivImpl.ivIndex].ivElement;
}
template <class Element, class ElementOps>
inline Element const& IGTabularSequence <Element, ElementOps>::
anyElement () const
{ return firstElement ();
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
removeAt (ICursor const& cursor)
{ checkCursor (cursor);
INumber index = ((Cursor&)cursor).ivImpl.ivIndex;
ivImpl.removeAt (index);
}
template < class Element, class ElementOps >
inline INumber IGTabularSequence < Element, ElementOps >::
removeAll (IBoolean (*predicate) (Element const&, void*), void* env)
{ return ivImpl.removeAll (predicate, env);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
replaceAt (ICursor const& cursor, Element const& element)
{ checkCursor (cursor);
elementOps().assign
(((Node*) ivOps.ivNodes)
[((Cursor const&)cursor).ivImpl.ivIndex].ivElement,
element);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
removeAll ()
{ ivOps.ivLast = ivOps.ivAllocatedElements - 1;
ivOps.ivFirst = ivOps.ivNumberOfElements = 0;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
isBounded () const
{ return False;
}
template <class Element, class ElementOps>
inline INumber IGTabularSequence <Element, ElementOps>::
maxNumberOfElements () const
{ ICHECK (False, INotBoundedException,
INotBoundedText)
return 0;
}
template <class Element, class ElementOps>
inline INumber IGTabularSequence <Element, ElementOps>::
numberOfElements () const
{ return ivOps.ivNumberOfElements;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
isEmpty () const
{ return ivOps.ivNumberOfElements == 0;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
isFull () const
{ return False;
}
template <class Element, class ElementOps>
inline ICursor* IGTabularSequence <Element, ElementOps>::
newCursor () const
{ ICursor* result = new Cursor (*this);
ICHECK (result != 0, IOutOfMemory, IOutOfMemoryText)
return result;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
setToFirst (ICursor& cursor) const
{ checkCursorIsForThis (cursor);
return ivImpl.setToFirst (((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
setToNext (ICursor& cursor) const
{ checkCursor (cursor);
return ivImpl.setToNext (((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
allElementsDo (IBoolean (*function) (Element&, void*), void* env)
{ return ivImpl.allElementsDo (function, env);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
allElementsDo (IIterator < Element > & iterator)
{ return ivImpl.allElementsDo (&iterator);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
allElementsDo (IBoolean (*function) (Element const&, void*),
void* env) const
{ return ivImpl.allElementsDo (function, env);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
allElementsDo (IConstantIterator < Element > & iterator) const
{ return ivImpl.allElementsDo (&iterator);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
isConsistent () const
{ return ivImpl.isConsistent ();
}
template <class Element, class ElementOps>
inline IGTabularSequence <Element, ElementOps>&
IGTabularSequence <Element, ElementOps>::
operator = (IGTabularSequence < Element, ElementOps > const& sequence)
{ ivImpl.operator= (sequence.ivImpl);
return *this;
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
removeFirst ()
{ checkNotEmpty ();
INumber index = ivOps.ivFirst;
ivImpl.removeAt (index);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
removeLast ()
{ checkNotEmpty ();
INumber index = ivOps.ivLast;
ivImpl.removeAt (index);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
removeAtPosition (IPosition position)
{ checkPositionExists (position);
ITabularSequenceImpl::Cursor cursor;
ivImpl.setToPosition (position, cursor);
ivImpl.removeAt (cursor.ivIndex);
}
template <class Element, class ElementOps>
inline Element const& IGTabularSequence <Element, ElementOps>::
firstElement () const
{ checkNotEmpty ();
return ((Node*) ivOps.ivNodes) [ivOps.ivFirst].ivElement;
}
template <class Element, class ElementOps>
inline Element const& IGTabularSequence <Element, ElementOps>::
lastElement () const
{ checkNotEmpty ();
return ((Node*) ivOps.ivNodes) [ivOps.ivLast].ivElement;
}
template <class Element, class ElementOps>
inline Element const& IGTabularSequence <Element, ElementOps>::
elementAtPosition (IPosition position) const
{ checkPositionExists (position);
ITabularSequenceImpl::Cursor cursor;
ivImpl.setToPosition (position, cursor);
return ((Node*) ivOps.ivNodes) [cursor.ivIndex].ivElement;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
setToLast (ICursor& cursor) const
{ checkCursorIsForThis (cursor);
return ivImpl.setToLast (((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
setToPrevious (ICursor& cursor) const
{ checkCursor (cursor);
return ivImpl.setToPrevious (((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
setToPosition (IPosition position, ICursor& cursor) const
{ checkPositionExists (position);
checkCursorIsForThis (cursor);
ivImpl.setToPosition (position, ((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
isFirst (ICursor const& cursor) const
{ checkCursor (cursor);
return ((Cursor const&)cursor).ivImpl.ivIndex == ivOps.ivFirst;
}
template <class Element, class ElementOps>
inline IBoolean IGTabularSequence <Element, ElementOps>::
isLast (ICursor const& cursor) const
{ checkCursor (cursor);
return ((Cursor const&)cursor).ivImpl.ivIndex == ivOps.ivLast;
}
template <class Element, class ElementOps>
inline long IGTabularSequence <Element, ElementOps>::
compare (IGTabularSequence < Element, ElementOps > const& sequence,
long (*comparisonFunction) (Element const&, Element const&)) const {
return ivImpl.compare (sequence.ivImpl, comparisonFunction);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAsFirst (Element const& element)
{ Cursor cursor (*this);
addAsFirst (element, cursor);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAsFirst (Element const& element, ICursor& cursor)
{ checkCursorIsForThis (cursor);
ivImpl.addAsFirst (&element, ((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAsLast (Element const& element)
{ Cursor cursor (*this);
addAsLast (element, cursor);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAsLast (Element const& element, ICursor& cursor)
{ checkCursorIsForThis (cursor);
ivImpl.addAsLast (&element, ((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAsNext (Element const& element, ICursor& cursor)
{ checkCursor (cursor);
ivImpl.addAsNext (&element, ((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAsPrevious (Element const& element, ICursor& cursor)
{ checkCursor (cursor);
ivImpl.addAsPrevious (&element, ((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAtPosition (IPosition position, Element const& element)
{ Cursor cursor (*this);
addAtPosition (position, element, cursor);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
addAtPosition (IPosition position,
Element const& element,
ICursor& cursor)
{ checkPositionForAdd (position);
checkCursorIsForThis (cursor);
ivImpl.addAtPosition (position, &element, ((Cursor&)cursor).ivImpl);
}
template <class Element, class ElementOps>
inline void IGTabularSequence <Element, ElementOps>::
sort (long (*comparisonFunction) (Element const&, Element const&))
{ ivImpl.sort (comparisonFunction);
}