home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Devil's Doorknob BBS Capture (1996-2003)
/
devilsdoorknobbbscapture1996-2003.iso
/
Dloads
/
OTHERUTI
/
TCPP30-1.ZIP
/
CLASSINC.ZIP
/
BAGS.H
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-18
|
14KB
|
517 lines
/*------------------------------------------------------------------------*/
/* */
/* BAGS.H */
/* */
/* Copyright Borland International 1991 */
/* All Rights Reserved */
/* */
/*------------------------------------------------------------------------*/
#if !defined( __BAGS_H )
#define __BAGS_H
#if !defined( __CHECKS_H )
#include <Checks.h>
#endif // __CHECKS_H
#if !defined( __SHDDEL_H )
#include <ShdDel.h>
#endif // __SHDDEL_H
#if !defined( __VECTIMP_H )
#include <VectImp.h>
#endif // __VECTIMP_H
#if !defined( __RESOURCE_H )
#include <Resource.h>
#endif // __RESOURCE_H
#if !defined( __COLLECT_H )
#include <Collect.h>
#endif // __COLLECT_H
/*------------------------------------------------------------------------*/
/* */
/* template <class Vect, class T> 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<T0> or a BI_ICVectorImp<T0>. The type T specifies the */
/* type of the objects to be put in the bag. When using */
/* BI_VectorImp<T0>, T should be the same as T0. When using */
/* BI_IVectorImp<T0>, T should be of type pointer to T0. See */
/* BI_BagAsVector and BI_IBagAsVector for examples. */
/* */
/*------------------------------------------------------------------------*/
template <class Vect, class T> 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 T> class BI_BagAsVector */
/* */
/* Implements a bag of objects of type T, using a vector as */
/* the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_BagAsVector :
public BI_BagAsVectorImp<BI_CVectorImp<T>,T>
{
public:
friend class _CLASSTYPE BI_BagAsVectorIterator<T>;
BI_BagAsVector( unsigned sz = DEFAULT_BAG_SIZE ) :
BI_BagAsVectorImp<BI_CVectorImp<T>,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 <class T> T _FAR *BI_BagAsVector<T>::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 T> class _CLASSTYPE BI_BagAsVectorIterator :
public BI_VectorIteratorImp<T>
{
public:
BI_BagAsVectorIterator( const BI_BagAsVector<T> _FAR & b ) :
BI_VectorIteratorImp<T>(b.data,0,b.data.top()) {}
};
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_IBagAsVector */
/* */
/* Implements a bag of pointers to objects of type T, */
/* using a vector as the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_IBagAsVector :
public BI_BagAsVectorImp<BI_ICVectorImp<T>,T _FAR *>,
public virtual TShouldDelete
{
public:
friend class _CLASSTYPE BI_IBagAsVectorIterator<T>;
BI_IBagAsVector( unsigned sz = DEFAULT_BAG_SIZE ) :
BI_BagAsVectorImp<BI_ICVectorImp<T>,T _FAR *>(sz)
{
}
~BI_IBagAsVector()
{
flush();
}
void add( T _FAR *t )
{
BI_BagAsVectorImp<BI_ICVectorImp<T>,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 T> class _CLASSTYPE BI_IBagAsVectorIterator :
public BI_IVectorIteratorImp<T>
{
public:
BI_IBagAsVectorIterator( const BI_IBagAsVector<T> _FAR & s ) :
BI_IVectorIteratorImp<T>(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<Object> obag;
};
class _CLASSTYPE BI_OBagAsVectorIterator :
public BI_IBagAsVectorIterator<Object>
{
public:
BI_OBagAsVectorIterator( const BI_OBagAsVector _FAR & b ) :
BI_IBagAsVectorIterator<Object>(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