BI_VectorIteratorImp<T>
{
public:
BI_SArrayAsVectorIterator( const BI_SArrayAsVector<T> _FAR & a ) :
BI_VectorIteratorImp<T>(a.data) {}
};
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_ISArrayAsVector */
/* */
/* Implements an indirect sorted array of objects of type T, using a */
/* vector as the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_ISArrayAsVector :
public BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR *>,
public virtual TShouldDelete
{
public:
friend class _CLASSTYPE BI_ISArrayAsVectorIterator<T>;
BI_ISArrayAsVector( int upper, int lower = 0, int delta = 0 ) :
BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR*>( upper, lower, delta )
{
}
~BI_ISArrayAsVector()
{
flush();
}
T _FAR * _FAR & operator []( int loc )
{
grow( loc );
return data[zeroBase(loc)];
}
T _FAR * _FAR & operator []( int loc ) const
{
PRECONDITION( loc >= lowerbound && loc < data.count() );
return data[zeroBase(loc)];
}
void add( T _FAR *t )
{
BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR *>::add(t);
}
void addAt( T _FAR *t, int loc )
{
BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR *>::addAt(t,loc);
}
void detach( int loc, DeleteType dt = NoDelete )
{
data.detach( loc, delObj(dt) );
}
void detach( T _FAR *t, DeleteType dt = NoDelete )
{
unsigned loc = data.find( t );
if( loc == UINT_MAX )
return;
data.detach( loc, delObj(dt) );
}
void flush( DeleteType dt = DefDelete )
{
data.flush( delObj(dt), data.limit(), 0 );
}
int find( const T *t ) const
{
return data.find( (T *)t );
}
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_ISArrayAsVectorIterator :
public BI_IVectorIteratorImp<T>
{
public:
BI_ISArrayAsVectorIterator( const BI_ISArrayAsVector<T> _FAR &a ) :
BI_IVectorIteratorImp<T>(a.data) {}
};
/*------------------------------------------------------------------------*/
/* */
/* class BI_ISObjectVector */
/* */
/* Implements a sorted vector of pointers to Object. */
/* This is implemented through the template BI_ISVectorImp<Object>. */
/* */
/*------------------------------------------------------------------------*/
class _CLASSTYPE BI_ISObjectVector :
public BI_InternalICVectorImp<Object, BI_SVectorImp<void _FAR *> >
{
public:
BI_ISObjectVector( unsigned sz, unsigned d = 0 ) :
BI_InternalICVectorImp<Object, BI_SVectorImp<void _FAR *> >(sz)
{
public:
BI_SArrayAsVectorIterator( const BI_SArrayAsVector<T> _FAR & a ) :
BI_VectorIteratorImp<T>(a.data) {}
};
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_ISArrayAsVector */
/* */
/* Implements an indirect sorted array of objects of type T, using a */
/* vector as the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_ISArrayAsVector :
public BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR *>,
public virtual TShouldDelete
{
public:
friend class _CLASSTYPE BI_ISArrayAsVectorIterator<T>;
BI_ISArrayAsVector( int upper, int lower = 0, int delta = 0 ) :
BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR*>( upper, lower, delta )
{
}
~BI_ISArrayAsVector()
{
flush();
}
T _FAR * _FAR & operator []( int loc )
{
grow( loc );
return data[zeroBase(loc)];
}
T _FAR * _FAR & operator []( int loc ) const
{
PRECONDITION( loc >= lowerbound && loc < data.count() );
return data[zeroBase(loc)];
}
void add( T _FAR *t )
{
BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR *>::add(t);
}
void addAt( T _FAR *t, int loc )
{
BI_ArrayAsVectorImp<BI_ISVectorImp<T>,T _FAR *>::addAt(t,loc);
}
void detach( int loc, DeleteType dt = NoDelete )
{
data.detach( loc, delObj(dt) );
}
void detach( T _FAR *t, DeleteType dt = NoDelete )
{
unsigned loc = data.find( t );
if( loc == UINT_MAX )
return;
data.detach( loc, delObj(dt) );
}
void flush( DeleteType dt = DefDelete )
{
data.flush( delObj(dt), data.limit(), 0 );
}
int find( const T *t ) const
{
return data.find( (T *)t );
}
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_ISArrayAsVectorIterator :
public BI_IVectorIteratorImp<T>
{
public:
BI_ISArrayAsVectorIterator( const BI_ISArrayAsVector<T> _FAR &a ) :
BI_IVectorIteratorImp<T>(a.data) {}
};
/*------------------------------------------------------------------------*/
/* */
/* class BI_ISObjectVector */
/* */
/* Implements a sorted vector of pointers to Object. */
/* This is implemented through the template BI_ISVectorImp<Object>. */
/* */
/*------------------------------------------------------------------------*/
class _CLASSTYPE BI_ISObjectVector :
public BI_InternalICVectorImp<Object, BI_SVectorImp<void _FAR *> >
{
public:
BI_ISObjectVector( unsigned sz, unsigned d = 0 ) :
BI_InternalICVectorImp<Object, BI_SVectorImp<void _FAR *> >(sz)

