📄 vectimp.h
字号:
/*------------------------------------------------------------------------*/
/* */
/* VECTIMP.H */
/* */
/* Copyright Borland International 1991 */
/* All Rights Reserved */
/* */
/*------------------------------------------------------------------------*/
#if !defined( __VECTIMP_H )
#define __VECTIMP_H
#if !defined( __CONTAIN_H )
#include <Contain.h>
#endif // __CONTAIN_H
#if !defined( __LIMITS_H )
#include <Limits.h>
#endif // __LIMITS_H
#if !defined( __CHECKS_H )
#include <Checks.h>
#endif // __CHECKS_H
#if !defined( __STDTEMPL_H )
#include <StdTempl.h>
#endif // __STDTEMPL_H
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_VectorImp */
/* */
/* Implements a vector of objects of type T. Assumes that */
/* T has meaningful copy semantics and a default constructor. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_VectorImp
{
public:
friend class _CLASSTYPE BI_VectorIteratorImp<T>;
BI_VectorImp() :
data(0),
lim(0)
{
}
BI_VectorImp( unsigned sz, unsigned = 0 ) :
data( new T[sz] ),
lim(sz)
{
}
BI_VectorImp( const BI_VectorImp<T> _FAR & );
const BI_VectorImp<T> _FAR & operator = ( const BI_VectorImp<T> _FAR & );
~BI_VectorImp()
{
delete [] data;
}
T _FAR & operator [] ( unsigned index ) const
{
PRECONDITION( lim > 0 && data != 0 && index < lim );
return data[index];
}
unsigned limit() const
{
return lim;
}
virtual unsigned top() const
{
return lim;
}
void resize( unsigned, unsigned = 0 );
void flush( unsigned = 0, unsigned = UINT_MAX, unsigned = 0 ) {}
void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args )
{
forEach( f, args, 0, lim );
}
void forEach( void (_FAR *)(T _FAR &, void _FAR *),
void _FAR *,
unsigned,
unsigned
);
T _FAR *firstThat( int (_FAR *)(const T _FAR &, void _FAR *),
void _FAR *,
unsigned,
unsigned
) const;
T _FAR *firstThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return firstThat( cond, args, 0, lim );
}
T _FAR *lastThat( int (_FAR *)(const T _FAR &, void _FAR *),
void _FAR *,
unsigned,
unsigned
) const;
T _FAR *lastThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return lastThat( cond, args, 0, lim );
}
virtual unsigned getDelta() const
{
return 0;
}
protected:
T _FAR * data;
unsigned lim;
virtual void zero( unsigned, unsigned )
{
}
};
template <class T>
BI_VectorImp<T>::BI_VectorImp( const BI_VectorImp<T> _FAR & v ) :
data( new T[v.lim] ),
lim(v.lim)
{
PRECONDITION( lim == 0 || (data != 0 && v.data != 0) );
for( unsigned i = 0; i < lim; i++ )
data[i] = v.data[i];
}
template <class T>
const BI_VectorImp<T> _FAR & BI_VectorImp<T>::operator = ( const BI_VectorImp<T> _FAR & v )
{
if( data != v.data )
{
delete [] data;
data = new T[v.lim];
CHECK( data != 0 );
lim = v.lim;
for( unsigned i = 0; i < lim; i++ )
data[i] = v.data[i];
}
return *this;
}
inline unsigned nextDelta( unsigned sz, unsigned delta )
{
return (sz%delta) ? ((sz+delta)/delta)*delta : sz;
}
template <class T>
void BI_VectorImp<T>::resize( unsigned newSz, unsigned offset )
{
if( newSz <= lim || getDelta() == 0 )
return;
unsigned sz = lim + nextDelta( newSz - lim, getDelta() );
T _FAR *temp = new T[sz];
unsigned last = min( sz-offset, lim );
for( unsigned i = 0; i < last; i++ )
temp[i+offset] = data[i];
delete [] data;
data = temp;
lim = sz;
zero( last+offset, sz );
}
template <class T>
void BI_VectorImp<T>::forEach( void (_FAR *f)( T _FAR &, void _FAR * ),
void _FAR *args,
unsigned start,
unsigned stop
)
{
for( unsigned cur = start; cur < stop; cur++ )
f( data[cur], args );
}
template <class T>
T _FAR *BI_VectorImp<T>::firstThat( int (_FAR *cond)( const T _FAR &, void _FAR * ),
void _FAR *args,
unsigned start,
unsigned stop
) const
{
for( unsigned cur = start; cur < stop; cur++ )
if( cond( data[cur], args ) != 0 )
return &data[cur];
return 0;
}
template <class T>
T _FAR *BI_VectorImp<T>::lastThat( int (_FAR *cond)( const T _FAR &, void _FAR * ),
void _FAR *args,
unsigned start,
unsigned stop
) const
{
T _FAR *res = 0;
for( unsigned cur = start; cur < stop; cur++ )
if( cond( data[cur], args ) != 0 )
res = &data[cur];
return res;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_CVectorImp */
/* */
/* Implements a counted vector of objects of type T. Assumes that */
/* T has meaningful copy semantics and a default constructor. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_CVectorImp : public BI_VectorImp<T>
{
public:
BI_CVectorImp() :
count_(0),
delta(0)
{
}
BI_CVectorImp( unsigned sz, unsigned d = 0 ) :
BI_VectorImp<T>( sz ),
count_(0),
delta(d)
{
}
void add( T );
void addAt( T, unsigned );
void detach( T, int = 0 );
void detach( unsigned, int = 0 );
int isEmpty() const
{
return count_ == 0;
}
void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args )
{
forEach( f, args, 0, count_ );
}
void forEach( void (_FAR *func)(T _FAR &, void _FAR *),
void _FAR *args,
unsigned low,
unsigned high
)
{
BI_VectorImp<T>::forEach( func, args, low, high );
}
T _FAR *firstThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return firstThat( cond, args, 0, count_ );
}
T _FAR *firstThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args,
unsigned low,
unsigned high
) const
{
return BI_VectorImp<T>::firstThat( cond, args, low, high );
}
T _FAR *lastThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return lastThat( cond, args, 0, count_ );
}
T _FAR *lastThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args,
unsigned low,
unsigned high
) const
{
return BI_VectorImp<T>::lastThat( cond, args, low, high );
}
void flush( unsigned del = 0,
unsigned stop = UINT_MAX,
unsigned start = 0
)
{
BI_VectorImp<T>::flush( del, stop, start ); count_ = 0;
}
virtual unsigned find( T ) const;
virtual unsigned top() const
{
return count_;
}
unsigned count() const
{
return count_;
}
virtual unsigned getDelta() const
{
return delta;
}
protected:
unsigned count_;
unsigned delta;
private:
virtual void removeData( T )
{
}
};
template <class T> void BI_CVectorImp<T>::add( T t )
{
if( ++count_ > lim )
resize( count_ );
data[count_-1] = t;
}
template <class T> void BI_CVectorImp<T>::addAt( T t, unsigned loc )
{
if( loc >= lim )
resize( loc+1 );
data[loc] = t;
}
template <class T> void BI_CVectorImp<T>::detach( T t, int del )
{
detach( find(t), del );
}
template <class T> void BI_CVectorImp<T>::detach( unsigned loc, int del )
{
if( loc >= lim )
return;
if( del )
removeData( data[loc] );
if( loc >= count_ )
{
zero( loc, loc+1 ); // removing an element that's not
return; // in the counted portion
}
count_--;
for( unsigned cur = loc; cur < count_; cur++ )
data[cur] = data[cur+1];
zero( count_, count_+1 );
}
template <class T> unsigned BI_CVectorImp<T>::find( T t ) const
{
if( count_ != 0 )
{
for( unsigned loc = 0; loc < count_; loc++ )
if( data[loc] == t )
return loc;
}
return UINT_MAX;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_SVectorImp */
/* */
/* Implements a sorted vector of objects of type T. Assumes that */
/* T has meaningful copy semantics, a meaningful < operator, */
/* and a default constructor. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_SVectorImp : public BI_CVectorImp<T>
{
public:
BI_SVectorImp()
{
}
BI_SVectorImp( unsigned sz, unsigned d = 0 ) :
BI_CVectorImp<T>( sz, d )
{
}
void add( T );
virtual unsigned find( T ) const;
};
template <class T> void BI_SVectorImp<T>::add( T t )
{
unsigned loc = count_++;
if( count_ > lim )
resize( count_ );
while( loc > 0 && t < data[loc-1] )
{
data[loc] = data[loc-1];
loc--;
}
data[loc] = t;
}
template <class T> unsigned BI_SVectorImp<T>::find( T t ) const
{
unsigned lower = 0;
unsigned upper = count_-1;
if( count_ != 0 )
{
while( lower < upper )
{
unsigned middle = (lower+upper)/2;
if( data[middle] == t )
return middle;
if( data[middle] < t )
lower = middle+1;
else
upper = middle-1;
}
}
if( lower == upper && data[lower] == t )
return lower;
else
return UINT_MAX;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_VectorIteratorImp */
/* */
/* Implements a vector iterator. This iterator works with any direct */
/* vector. For indirect vectors, see BI_IVectorIteratorImp. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_VectorIteratorImp
{
public:
BI_VectorIteratorImp( const BI_VectorImp<T> _FAR &v )
{
vect = &v;
restart(0,v.limit());
}
BI_VectorIteratorImp( const BI_VectorImp<T> _FAR &v,
unsigned start,
unsigned stop
)
{
vect = &v;
restart( start, stop );
}
operator int()
{
return cur < upper;
}
T current()
{
return (cur < upper) ? (*vect)[cur] : (*vect)[upper-1];
}
T operator ++ ( int )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -