/*------------------------------------------------------------------------*/ /* */ /* ARRAYS.H */ /* */ /* Copyright Borland International 1991 */ /* All Rights Reserved */ /* */ /*------------------------------------------------------------------------*/ #if !defined( __ARRAYS_H ) #define __ARRAYS_H #define TEMPLATES #if !defined( ___DEFS_H ) #include <_defs.h> #endif // ___DEFS_H #if !defined( __RESOURCE_H ) #include #endif // __RESOURCE_H #if !defined( __COLLECT_H ) #include #endif // __COLLECT_H #if !defined( __MEM_H ) #include #endif // __MEM_H #if !defined( __VECTIMP_H ) #include #endif // __VECTIMP_H #if !defined( __SORTABLE_H ) #include #endif // __SORTABLE_H #if !defined( __ABSTARRY_H ) #include #endif // __ABSTARRY_H #pragma warn -ncf /*------------------------------------------------------------------------*/ /* */ /* template class BI_ArrayAsVectorImp */ /* */ /* Implements the fundamental array operations, using a vector */ /* as the underlying implementation. The type Vect specifies the */ /* form of the vector, either a BI_CVectorImp or a */ /* BI_ICVectorImp. The type T specifies the type of the */ /* objects to be put in the array. When using BI_CVectorImp, */ /* T should be the same as T0. When using BI_ICVectorImp, T */ /* should be of type pointer to T0. See BI_ArrayAsVector and */ /* BI_IArrayAsVector for examples. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_ArrayAsVectorImp { public: BI_ArrayAsVectorImp( int upper, int lower, int delta ) : data( upper-lower+1,delta), lowerbound(lower) { } int lowerBound() const { return lowerbound; } int upperBound() const { return boundBase(data.limit())-1; } sizeType arraySize() const { return data.limit(); } void add( T t ) { data.add( t ); } void addAt( T t, int loc ) { data.addAt( t, zeroBase(loc) ); } void detach( T t, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { data.detach( t, dt ); } void detach( int loc, TShouldDelete::DeleteType dt =TShouldDelete::NoDelete ) { data.detach( zeroBase(loc), dt ); } void destroy( int i ) { detach( i, TShouldDelete::Delete ); } void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete ) { data.flush( dt ); } int isFull() const { return data.getDelta() == 0 && data.count() >= data.limit(); } int hasMember( T t ) const { return data.find(t) != UINT_MAX; } int isEmpty() const { return data.count() == 0; } countType getItemsInContainer() const { return data.count(); } protected: T itemAt( int i ) const { return data[ zeroBase(i) ]; } int find( const T t ) const { return boundBase(data.find( t )); } void reallocate( sizeType sz, sizeType offset = 0 ) { data.resize( sz, offset ); } void setData( int loc, T t ) { PRECONDITION( loc >= lowerbound && loc <= upperBound() ); data[ zeroBase(loc) ] = t; } void insertEntry( int loc ) { PRECONDITION( loc >= lowerbound && loc <= upperBound() ); T t; data.addAt( t, zeroBase(loc) ); } void removeEntry( int loc ) { squeezeEntry( zeroBase(loc) ); } void squeezeEntry( unsigned loc ) { PRECONDITION( loc < data.count() ); data.detach( loc ); } unsigned zeroBase( int loc ) const { return loc - lowerbound; } int boundBase( unsigned loc ) const { return loc == UINT_MAX ? INT_MAX : loc + lowerbound; } void grow( int loc ) { if( loc < lowerBound() ) reallocate( arraySize() + (loc - lowerbound) ); else if( loc >= boundBase(data.limit()) ) reallocate( zeroBase(loc) ); } int lowerbound; Vect data; }; /*------------------------------------------------------------------------*/ /* */ /* template class BI_ArrayAsVector */ /* */ /* Implements an array of objects of type T, using a vector as */ /* the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_ArrayAsVector : public BI_ArrayAsVectorImp,T> { public: friend class _CLASSTYPE BI_ArrayAsVectorIterator; BI_ArrayAsVector( int upper, int lower = 0, int delta = 0 ) : BI_ArrayAsVectorImp,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 _CLASSTYPE BI_ArrayAsVectorIterator : BI_VectorIteratorImp { public: BI_ArrayAsVectorIterator( const BI_ArrayAsVector _FAR & a ) : BI_VectorIteratorImp(a.data) {} }; /*------------------------------------------------------------------------*/ /* */ /* template class BI_IArrayAsVector */ /* */ /* Implements an indirect array of objects of type T, using a vector as */ /* the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_IArrayAsVector : public BI_ArrayAsVectorImp,T _FAR *>, public virtual TShouldDelete { public: friend class _CLASSTYPE BI_IArrayAsVectorIterator; BI_IArrayAsVector( int upper, int lower = 0, int delta = 0 ) : BI_ArrayAsVectorImp,T _FAR *>( upper, lower, delta ) { } ~BI_IArrayAsVector() { flush(); } T _FAR * _FAR & operator []( int loc ) { grow( loc+1 ); return data[zeroBase(loc)]; } T _FAR * _FAR & operator []( int loc ) const { PRECONDITION( loc >= lowerbound && zeroBase(loc) < data.limit() ); return data[zeroBase(loc)]; } void add( T _FAR *t ) { BI_ArrayAsVectorImp,T _FAR *>::add(t); } void addAt( T _FAR *t, int loc ) { BI_ArrayAsVectorImp,T _FAR *>::addAt(t,loc); } void detach( int loc, DeleteType dt = NoDelete ) { data.detach( zeroBase(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 boundBase(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 _CLASSTYPE BI_IArrayAsVectorIterator : public BI_IVectorIteratorImp { public: BI_IArrayAsVectorIterator( const BI_IArrayAsVector _FAR &a ) : BI_IVectorIteratorImp(a.data) {} }; /*------------------------------------------------------------------------*/ /* */ /* class BI_OArrayAsVector */ /* */ /* Implements an array of pointers to Object, */ /* using a vector as the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_OArrayAsVector { public: friend class _CLASSTYPE BI_OArrayAsVectorIterator; BI_OArrayAsVector() : oarray( DEFAULT_ARRAY_SIZE ) { } BI_OArrayAsVector( int upr, int lwr = 0, unsigned delta = 0 ) : oarray( upr, lwr, delta ) { } Object *operator [] (int loc) { return oarray[loc]; } Object *operator [] (int loc) const { return oarray[loc]; } int lowerBound() const { return oarray.lowerBound(); } int upperBound() const { return oarray.upperBound(); } sizeType arraySize() const { return oarray.arraySize(); } void add( Object _FAR *o ) { oarray.add(o); } void addAt( Object _FAR *o, int loc ) { oarray.addAt(o,loc); } void detach( int loc, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { oarray.detach( loc, dt ); } void detach( Object _FAR *o, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { oarray.detach( o, dt ); } void destroy( int i ) { oarray.destroy( i ); } void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete ) { oarray.flush( dt ); } int hasMember( Object _FAR *o ) const { return oarray.hasMember(o); } Object _FAR *findMember( Object _FAR *o ) const { int loc = oarray.find(o); return loc != INT_MAX ? oarray[loc] : 0; } int isEmpty() const { return oarray.isEmpty(); } int isFull() const { return oarray.isFull(); } void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args ) { oarray.forEach( f, args ); } Object _FAR *firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return oarray.firstThat( f, args ); } Object _FAR *lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return oarray.lastThat( f, args ); } int getItemsInContainer() const { return oarray.getItemsInContainer(); } int ownsElements() { return oarray.ownsElements(); } void ownsElements( int del ) { oarray.ownsElements( del ); } protected: BI_IArrayAsVector oarray; }; class _CLASSTYPE BI_OArrayAsVectorIterator : public BI_IArrayAsVectorIterator { public: BI_OArrayAsVectorIterator( const BI_OArrayAsVector _FAR &a ) : BI_IArrayAsVectorIterator(a.oarray) { restart(); } void restart() { BI_IArrayAsVectorIterator::restart(); if( current() == 0 ) (*this)++; } }; /*------------------------------------------------------------------------*/ /* */ /* class BI_TCArrayAsVector */ /* */ /* Implements an Object array, with the full semantics of */ /* the BC 2.0 style array, using a vector as the underlying */ /* implementation. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_TCArrayAsVector : public AbstractArray { public: friend class _CLASSTYPE BI_TCArrayAsVectorIterator; BI_TCArrayAsVector( int upper, int lower = 0, sizeType delta = 0 ) : array( upper, lower, delta ) { } virtual Object& operator []( int loc ) { return ptrToRef(array[loc]); } virtual Object& operator []( int loc ) const { return ptrToRef(array[loc]); } virtual int lowerBound() const { return array.lowerBound(); } virtual int upperBound() const { return array.upperBound(); } virtual sizeType arraySize() const { return array.arraySize(); } void add( Object _FAR &o ) { array.add(&o); } void addAt( Object _FAR &o, int loc ) { array.addAt(&o,loc); } virtual void detach( int loc, DeleteType dt = NoDelete ) { array.detach( loc, dt ); } void detach( Object _FAR &o, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { array.detach( &o, dt ); } void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete ) { array.flush( dt ); } int hasMember( Object _FAR &o ) const { return array.hasMember(&o); } Object _FAR &findMember( Object _FAR &o ) const { return ptrToRef(array.findMember(&o)); } int isEmpty() const { return array.isEmpty(); } 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 BI_SArrayAsVector */ /* */ /* Implements a sorted array of objects of type T, using a vector as */ /* the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_SArrayAsVector : public BI_ArrayAsVectorImp,T> { public: friend class _CLASSTYPE BI_SArrayAsVectorIterator; BI_SArrayAsVector( int upper, int lower = 0, int delta = 0 ) : BI_ArrayAsVectorImp,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 _CLASSTYPE BI_SArrayAsVectorIterator : BI_VectorIteratorImp { public: BI_SArrayAsVectorIterator( const BI_SArrayAsVector _FAR & a ) : BI_VectorIteratorImp(a.data) {} }; /*------------------------------------------------------------------------*/ /* */ /* template class BI_ISArrayAsVector */ /* */ /* Implements an indirect sorted array of objects of type T, using a */ /* vector as the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_ISArrayAsVector : public BI_ArrayAsVectorImp,T _FAR *>, public virtual TShouldDelete { public: friend class _CLASSTYPE BI_ISArrayAsVectorIterator; BI_ISArrayAsVector( int upper, int lower = 0, int delta = 0 ) : BI_ArrayAsVectorImp,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,T _FAR *>::add(t); } void addAt( T _FAR *t, int loc ) { BI_ArrayAsVectorImp,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 _CLASSTYPE BI_ISArrayAsVectorIterator : public BI_IVectorIteratorImp { public: BI_ISArrayAsVectorIterator( const BI_ISArrayAsVector _FAR &a ) : BI_IVectorIteratorImp(a.data) {} }; /*------------------------------------------------------------------------*/ /* */ /* class BI_ISObjectVector */ /* */ /* Implements a sorted vector of pointers to Object. */ /* This is implemented through the template BI_ISVectorImp. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_ISObjectVector : public BI_InternalICVectorImp > { public: BI_ISObjectVector( unsigned sz, unsigned d = 0 ) : BI_InternalICVectorImp >(sz) { delta = d; } ~BI_ISObjectVector() { flush(); } void add( Object _FAR *o ); void addAt( Object _FAR *t, unsigned loc ) { BI_InternalICVectorImp >::addAt(t,loc); } void detach( unsigned loc, int del = 0 ) { BI_InternalICVectorImp >::detach( loc, del ); } void detach( Object _FAR *t, int del = 0 ) { unsigned loc = find( t ); if( loc == UINT_MAX ) return; BI_InternalICVectorImp >::detach( loc, del ); } void flush( int del = 0 ) { BI_InternalICVectorImp >::flush( del ); } unsigned find( Object _FAR *t ) const { return find( (void _FAR *)t ); } protected: unsigned find( void _FAR *t ) const; }; class _CLASSTYPE BI_ISObjectVectorIterator : public BI_IVectorIteratorImp { public: BI_ISObjectVectorIterator( const BI_ISObjectVector _FAR &a ) : BI_IVectorIteratorImp(a) {} }; /*------------------------------------------------------------------------*/ /* */ /* class BI_ISObjectArray */ /* */ /* Implements an indirect sorted array of pointers to Object, using a */ /* vector as the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_ISObjectArray : public BI_ArrayAsVectorImp, public virtual TShouldDelete { public: friend class _CLASSTYPE BI_ISObjectArrayIterator; BI_ISObjectArray( int upr, int lwr = 0, int delta = 0 ) : BI_ArrayAsVectorImp( upr, lwr, delta ) { } ~BI_ISObjectArray() { flush(); } Object _FAR * _FAR & operator []( int loc ) { grow( loc ); return data[zeroBase(loc)]; } Object _FAR * _FAR & operator []( int loc ) const { PRECONDITION( loc >= lowerbound && zeroBase(loc) < data.count() ); return data[zeroBase(loc)]; } void add( Object _FAR *t ) { BI_ArrayAsVectorImp::add(t); } void addAt( Object _FAR *t, int loc ) { BI_ArrayAsVectorImp::addAt(t,loc); } void detach( int loc, DeleteType dt = NoDelete ) { data.detach( zeroBase(loc), delObj(dt) ); } void detach( Object _FAR *t, DeleteType dt = NoDelete ) { data.detach( t, delObj(dt) ); } void flush( DeleteType dt = DefDelete ) { data.flush( delObj(dt) ); } int find( const Object *t ) const { return boundBase(data.find( (Object *)t )); } void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args ) { if( !isEmpty() ) data.forEach( f, args ); } Object _FAR *firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { if( isEmpty() ) return 0; return data.firstThat( f, args ); } Object _FAR *lastThat( int (_FAR * f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { if( isEmpty() ) return 0; return data.lastThat( f, args ); } }; class _CLASSTYPE BI_ISObjectArrayIterator : public BI_ISObjectVectorIterator { public: BI_ISObjectArrayIterator( const BI_ISObjectArray _FAR &a ) : BI_ISObjectVectorIterator(a.data) {} }; /*------------------------------------------------------------------------*/ /* */ /* class BI_OSArrayAsVector */ /* */ /* Implements a sorted array of pointers to Object, */ /* using a vector as the underlying implementation. */ /* */ /* Although the interface is written to take pointers to Object, in */ /* fact, pointers to Sortable are required. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_OSArrayAsVector { public: friend class _CLASSTYPE BI_OSArrayAsVectorIterator; BI_OSArrayAsVector() : oarray( DEFAULT_ARRAY_SIZE, 0, 0 ) { } BI_OSArrayAsVector( int upr, int lwr = 0, unsigned delta = 0 ) : oarray( upr, lwr, delta ) { } Object *operator [] (int loc) { return oarray[loc]; } Object *operator [] (int loc) const { return oarray[loc]; } int lowerBound() const { return oarray.lowerBound(); } int upperBound() const { return oarray.upperBound(); } sizeType arraySize() const { return oarray.arraySize(); } void add( Object _FAR *o ) { PRECONDITION( o->isSortable() ); oarray.add(o); } void addAt( Object _FAR *o, int loc ) { PRECONDITION( o->isSortable() ); oarray.addAt(o,loc); } void detach( int loc, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { oarray.detach( loc, dt ); } void detach( Object _FAR *o, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { PRECONDITION( o->isSortable() ); oarray.detach( o, dt ); } void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete ) { oarray.flush( dt ); } int hasMember( Object _FAR *o ) const { PRECONDITION( o->isSortable() ); return oarray.hasMember(o); } Object _FAR *findMember( Object _FAR *o ) const { PRECONDITION( o->isSortable() ); int loc = oarray.find(o); return loc != INT_MAX ? oarray[loc] : 0; } int isEmpty() const { return oarray.isEmpty(); } int isFull() const { return oarray.isFull(); } void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args ) { oarray.forEach( f, args ); } Object _FAR *firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return oarray.firstThat( f, args ); } Object _FAR *lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return oarray.lastThat( f, args ); } int getItemsInContainer() const { return oarray.getItemsInContainer(); } int ownsElements() { return oarray.ownsElements(); } void ownsElements( int del ) { oarray.ownsElements( del ); } protected: BI_ISObjectArray oarray; }; class _CLASSTYPE BI_OSArrayAsVectorIterator : public BI_ISObjectArrayIterator { public: BI_OSArrayAsVectorIterator( const BI_OSArrayAsVector _FAR &a ) : BI_ISObjectArrayIterator(a.oarray) { } }; /*------------------------------------------------------------------------*/ /* */ /* class BI_TCSArrayAsVector */ /* */ /* Implements a sorted Object array, with the full semantics of */ /* the BC 2.0 style sorted array, using a vector as the underlying */ /* implementation. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_TCSArrayAsVector : public AbstractArray { public: friend class _CLASSTYPE BI_TCSArrayAsVectorIterator; BI_TCSArrayAsVector( int upper = DEFAULT_ARRAY_SIZE, int lower = 0, sizeType delta = 0 ) : array( upper, lower, delta ) { } virtual Object& operator []( int loc ) { return ptrToRef(array[loc]); } virtual Object& operator []( int loc ) const { return ptrToRef(array[loc]); } virtual int lowerBound() const { return array.lowerBound(); } virtual int upperBound() const { return array.upperBound(); } virtual sizeType arraySize() const { return array.arraySize(); } void add( Object _FAR &o ) { array.add(&o); } void addAt( Object _FAR &o, int loc ) { array.addAt(&o,loc); } virtual void detach( int loc, DeleteType dt = NoDelete ) { array.detach( loc, dt ); } void detach( Object _FAR &o, DeleteType dt = NoDelete ) { array.detach( &o, dt ); } void flush( TShouldDelete::DeleteType dt = DefDelete ) { array.flush( dt ); } int hasMember( Object _FAR &o ) const { return array.hasMember(&o); } Object _FAR &findMember( Object _FAR &o ) const { return ptrToRef(array.findMember(&o)); } int isEmpty() const { return array.isEmpty(); } 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 sortedArrayClass; } virtual char _FAR *nameOf() const { return "BI_TCSArrayAsVector"; } int ownsElements() { return array.ownsElements(); } void ownsElements( int del ) { array.ownsElements( del ); } ContainerIterator _FAR & initIterator() const; private: BI_OSArrayAsVector array; }; class _CLASSTYPE BI_TCSArrayAsVectorIterator : public ContainerIterator { public: BI_TCSArrayAsVectorIterator( const BI_TCSArrayAsVector _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_OSArrayAsVectorIterator iter; }; inline ContainerIterator _FAR & BI_TCSArrayAsVector::initIterator() const { return *new BI_TCSArrayAsVectorIterator( *this ); } #pragma warn .ncf #endif // __ARRAYS_H