}
int isFull() const
{
return array.isFull();
}
void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args )
{
array.forEach( f, args );
}
Object _FAR &firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return ptrToRef(array.firstThat( f, args ));
}
Object _FAR &lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return ptrToRef(array.lastThat( f, args ));
}
int getItemsInContainer() const
{
return array.getItemsInContainer();
}
virtual classType isA() const
{
return arrayClass;
}
virtual char _FAR *nameOf() const
{
return "BI_TCArrayAsVector";
}
int ownsElements()
{
return array.ownsElements();
}
void ownsElements( int del )
{
array.ownsElements( del );
}
ContainerIterator _FAR &initIterator() const;
private:
BI_OArrayAsVector array;
};
class _CLASSTYPE BI_TCArrayAsVectorIterator : public ContainerIterator
{
public:
BI_TCArrayAsVectorIterator( const BI_TCArrayAsVector _FAR &a ) :
iter(a.array)
{
}
virtual operator int()
{
return int(iter);
}
virtual Object _FAR & current()
{
return Object::ptrToRef(iter.current());
}
virtual Object _FAR & operator ++ ( int )
{
return Object::ptrToRef(iter++);
}
virtual Object _FAR & operator ++ ()
{
return Object::ptrToRef(++iter);
}
virtual void restart()
{
iter.restart();
}
private:
BI_OArrayAsVectorIterator iter;
};
inline ContainerIterator _FAR & BI_TCArrayAsVector::initIterator() const
{ return *new BI_TCArrayAsVectorIterator( *this ); }
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_SArrayAsVector */
/* */
/* Implements a sorted array of objects of type T, using a vector as */
/* the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_SArrayAsVector :
public BI_ArrayAsVectorImp<BI_SVectorImp<T>,T>
{
public:
friend class _CLASSTYPE BI_SArrayAsVectorIterator<T>;
BI_SArrayAsVector( int upper, int lower = 0, int delta = 0 ) :
BI_ArrayAsVectorImp<BI_SVectorImp<T>,T>( upper, lower, delta )
{
}
T& operator []( int loc )
{
grow( loc );
return data[zeroBase(loc)];
}
T& operator []( int loc ) const
{
PRECONDITION( loc >= lowerbound && loc < data.count() );
return data[zeroBase(loc)];
}
void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args )
{
if( !isEmpty() )
data.forEach( f, args );
}
T _FAR *firstThat( int (_FAR *f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
if( isEmpty() )
return 0;
return data.firstThat( f, args );
}
T _FAR *lastThat( int (_FAR * f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
if( isEmpty() )
return 0;
return data.lastThat( f, args );
}
};
template <class T> class _CLASSTYPE BI_SArrayAsVectorIterator :
int isFull() const
{
return array.isFull();
}
void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args )
{
array.forEach( f, args );
}
Object _FAR &firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return ptrToRef(array.firstThat( f, args ));
}
Object _FAR &lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return ptrToRef(array.lastThat( f, args ));
}
int getItemsInContainer() const
{
return array.getItemsInContainer();
}
virtual classType isA() const
{
return arrayClass;
}
virtual char _FAR *nameOf() const
{
return "BI_TCArrayAsVector";
}
int ownsElements()
{
return array.ownsElements();
}
void ownsElements( int del )
{
array.ownsElements( del );
}
ContainerIterator _FAR &initIterator() const;
private:
BI_OArrayAsVector array;
};
class _CLASSTYPE BI_TCArrayAsVectorIterator : public ContainerIterator
{
public:
BI_TCArrayAsVectorIterator( const BI_TCArrayAsVector _FAR &a ) :
iter(a.array)
{
}
virtual operator int()
{
return int(iter);
}
virtual Object _FAR & current()
{
return Object::ptrToRef(iter.current());
}
virtual Object _FAR & operator ++ ( int )
{
return Object::ptrToRef(iter++);
}
virtual Object _FAR & operator ++ ()
{
return Object::ptrToRef(++iter);
}
virtual void restart()
{
iter.restart();
}
private:
BI_OArrayAsVectorIterator iter;
};
inline ContainerIterator _FAR & BI_TCArrayAsVector::initIterator() const
{ return *new BI_TCArrayAsVectorIterator( *this ); }
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_SArrayAsVector */
/* */
/* Implements a sorted array of objects of type T, using a vector as */
/* the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_SArrayAsVector :
public BI_ArrayAsVectorImp<BI_SVectorImp<T>,T>
{
public:
friend class _CLASSTYPE BI_SArrayAsVectorIterator<T>;
BI_SArrayAsVector( int upper, int lower = 0, int delta = 0 ) :
BI_ArrayAsVectorImp<BI_SVectorImp<T>,T>( upper, lower, delta )
{
}
T& operator []( int loc )
{
grow( loc );
return data[zeroBase(loc)];
}
T& operator []( int loc ) const
{
PRECONDITION( loc >= lowerbound && loc < data.count() );
return data[zeroBase(loc)];
}
void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args )
{
if( !isEmpty() )
data.forEach( f, args );
}
T _FAR *firstThat( int (_FAR *f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
if( isEmpty() )
return 0;
return data.firstThat( f, args );
}
T _FAR *lastThat( int (_FAR * f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
if( isEmpty() )
return 0;
return data.lastThat( f, args );
}
};
template <class T> class _CLASSTYPE BI_SArrayAsVectorIterator :

