/*------------------------------------------------------------------------*/ /* */ /* BAGS.H */ /* */ /* Copyright Borland International 1991 */ /* All Rights Reserved */ /* */ /*------------------------------------------------------------------------*/ #if !defined( __BAGS_H ) #define __BAGS_H #if !defined( __CHECKS_H ) #include #endif // __CHECKS_H #if !defined( __SHDDEL_H ) #include #endif // __SHDDEL_H #if !defined( __VECTIMP_H ) #include #endif // __VECTIMP_H #if !defined( __RESOURCE_H ) #include #endif // __RESOURCE_H #if !defined( __COLLECT_H ) #include #endif // __COLLECT_H /*------------------------------------------------------------------------*/ /* */ /* template class BI_BagAsVectorImp */ /* */ /* Implements a bag, 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 bag. When using */ /* BI_VectorImp, T should be the same as T0. When using */ /* BI_IVectorImp, T should be of type pointer to T0. See */ /* BI_BagAsVector and BI_IBagAsVector for examples. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_BagAsVectorImp { public: BI_BagAsVectorImp( unsigned sz = DEFAULT_BAG_SIZE ) : data(sz,1) { } void add( T t ) { data.add( t ); } void detach( T t, TShouldDelete::DeleteType = TShouldDelete::NoDelete ) { data.detach( t ); } void flush( TShouldDelete::DeleteType = TShouldDelete::DefDelete ) { data.flush(); } int hasMember( T t ) const { return data.find(t) != UINT_MAX; } T findMember( T t ) const { PRECONDITION( hasMember(t) ); return data[data.find(t)]; } int isEmpty() const { return data.isEmpty(); } int isFull() const { return 0; } int getItemsInContainer() const { return data.top(); } protected: Vect data; }; /*------------------------------------------------------------------------*/ /* */ /* template class BI_BagAsVector */ /* */ /* Implements a bag of objects of type T, using a vector as */ /* the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_BagAsVector : public BI_BagAsVectorImp,T> { public: friend class _CLASSTYPE BI_BagAsVectorIterator; BI_BagAsVector( unsigned sz = DEFAULT_BAG_SIZE ) : BI_BagAsVectorImp,T>( sz ) { } void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args ) { data.forEach( f, args, 0, data.top() ); } T _FAR *firstThat( int (_FAR *f)(const T _FAR &, void _FAR *), void _FAR *args ) const { return data.firstThat( f, args, 0, data.top() ); } T _FAR *lastThat( int (_FAR *f)(const T _FAR &, void _FAR *), void _FAR *args ) const { return data.lastThat( f, args, 0, data.top() ); } protected: virtual T _FAR *find( T ) const; }; template T _FAR *BI_BagAsVector::find( T t ) const { if( isEmpty() ) return 0; for( int index = 0; index < data.top(); index++ ) if( data[index] == t ) return &(data[index]); return 0; } template class _CLASSTYPE BI_BagAsVectorIterator : public BI_VectorIteratorImp { public: BI_BagAsVectorIterator( const BI_BagAsVector _FAR & b ) : BI_VectorIteratorImp(b.data,0,b.data.top()) {} }; /*------------------------------------------------------------------------*/ /* */ /* template class BI_IBagAsVector */ /* */ /* Implements a bag of pointers to objects of type T, */ /* using a vector as the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ template class _CLASSTYPE BI_IBagAsVector : public BI_BagAsVectorImp,T _FAR *>, public virtual TShouldDelete { public: friend class _CLASSTYPE BI_IBagAsVectorIterator; BI_IBagAsVector( unsigned sz = DEFAULT_BAG_SIZE ) : BI_BagAsVectorImp,T _FAR *>(sz) { } ~BI_IBagAsVector() { flush(); } void add( T _FAR *t ) { BI_BagAsVectorImp,T _FAR *>::add(t); } void detach( T _FAR *t, DeleteType dt = NoDelete ) { data.detach( t, delObj(dt) ); } void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete ) { data.flush( delObj(dt), data.top(), 0 ); } T _FAR *findMember( T _FAR *t ) const { unsigned loc = data.find(t); return (T _FAR *)( loc == UINT_MAX ? 0 : data[loc] ); } void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args ) { data.forEach( f, args, 0, data.top() ); } T _FAR *firstThat( int (_FAR *f)(const T _FAR &, void _FAR *), void _FAR *args ) const { return data.firstThat( f, args, 0, data.top() ); } T _FAR *lastThat( int (_FAR *f)(const T _FAR &, void _FAR *), void _FAR *args ) const { return data.lastThat( f, args, 0, data.top() ); } }; template class _CLASSTYPE BI_IBagAsVectorIterator : public BI_IVectorIteratorImp { public: BI_IBagAsVectorIterator( const BI_IBagAsVector _FAR & s ) : BI_IVectorIteratorImp(s.data,0,s.data.top()) {} }; /*------------------------------------------------------------------------*/ /* */ /* class BI_OBagAsVector */ /* */ /* Implements a bag of pointers to Object, */ /* using a vector as the underlying implementation. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_OBagAsVector { public: friend class _CLASSTYPE BI_OBagAsVectorIterator; BI_OBagAsVector( unsigned sz = DEFAULT_BAG_SIZE ) : obag( sz ) { } void add( Object _FAR *o ) { obag.add(o); } void detach( Object _FAR *o, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { obag.detach( o, dt ); } void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete ) { obag.flush( dt ); } int hasMember( Object _FAR *o ) const { return obag.hasMember(o); } Object _FAR *findMember( Object _FAR *o ) const { Object _FAR *obj = obag.findMember( o ); return obj != 0 ? obj : 0; } int isEmpty() const { return obag.isEmpty(); } int isFull() const { return obag.isFull(); } void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args ) { obag.forEach( f, args ); } Object _FAR *firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return obag.firstThat( f, args ); } Object _FAR *lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return obag.lastThat( f, args ); } int getItemsInContainer() const { return obag.getItemsInContainer(); } int ownsElements() { return obag.ownsElements(); } void ownsElements( int del ) { obag.ownsElements( del ); } protected: BI_IBagAsVector obag; }; class _CLASSTYPE BI_OBagAsVectorIterator : public BI_IBagAsVectorIterator { public: BI_OBagAsVectorIterator( const BI_OBagAsVector _FAR & b ) : BI_IBagAsVectorIterator(b.obag) { } }; /*------------------------------------------------------------------------*/ /* */ /* class BI_TCBagAsVector */ /* */ /* Implements an Object bag, with the full semantics of */ /* the BC 2.0 style Bag, using a vector as the underlying */ /* implementation. */ /* */ /*------------------------------------------------------------------------*/ class _CLASSTYPE BI_TCBagAsVector : public Collection { public: friend class _CLASSTYPE BI_TCBagAsVectorIterator; BI_TCBagAsVector( int sz = DEFAULT_BAG_SIZE ) : bag(sz) { } virtual void add( Object _FAR & o ) { bag.add( &o ); } virtual void detach( Object _FAR & o, TShouldDelete::DeleteType dt = TShouldDelete::NoDelete ) { bag.detach( &o, dt ); } virtual void flush(TShouldDelete::DeleteType dt=TShouldDelete::DefDelete ) { bag.flush( dt ); } virtual int isEmpty() const { return bag.isEmpty(); } virtual countType getItemsInContainer() const { return bag.getItemsInContainer(); } void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args ) { bag.forEach( f, args ); } Object _FAR & firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return ptrToRef(bag.firstThat( f, args )); } Object _FAR & lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *), void _FAR *args ) const { return ptrToRef(bag.lastThat( f, args )); } virtual int hasMember( Object _FAR & o ) const { return bag.hasMember( &o ); } virtual Object _FAR & findMember( Object _FAR & o ) const { return ptrToRef(bag.findMember(&o)); } virtual ContainerIterator _FAR & initIterator() const; virtual classType isA() const { return bagClass; } virtual char _FAR *nameOf() const { return "BI_TCBagAsVector"; } int ownsElements() { return bag.ownsElements(); } void ownsElements( int del ) { bag.ownsElements( del ); } protected: BI_OBagAsVector bag; }; class _CLASSTYPE BI_TCBagAsVectorIterator : public ContainerIterator { public: BI_TCBagAsVectorIterator( const BI_TCBagAsVector _FAR &b ) : iter(b.bag) { } 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_OBagAsVectorIterator iter; }; inline ContainerIterator _FAR & BI_TCBagAsVector::initIterator() const { return *new BI_TCBagAsVectorIterator( *this ); } #endif // __BAGS_H