Windows2000/private/windbg64/langapi/include/simparray.h
2020-09-30 17:12:32 +02:00

89 lines
1.8 KiB
C++

#pragma once
#include "crefobj.h"
template <class T>
class SimpleArray : public CRefCountedObj {
protected:
unsigned _cT;
T * _rgT;
public:
SimpleArray ( unsigned cT ) {
if ( cT ) {
_rgT = new T[cT];
if ( _rgT ) {
_cT = cT;
}
}
else {
_cT = 0;
_rgT = 0;
}
}
~SimpleArray() {
if ( _rgT ) {
delete [] _rgT;
}
_cT = 0;
_rgT = 0;
}
unsigned Count() const {
return _cT;
}
const T * Base() const {
return _rgT;
}
T * Base() {
return _rgT;
}
T & operator[] ( unsigned it ) {
return _rgT[it];
}
const T & operator[] ( unsigned it ) const {
return _rgT[it];
}
};
class SimpleString: public SimpleArray<char>
{
public:
unsigned Length() const { return strlen( _rgT ); } // # non-nulls
const char* operator=( const char *str ) {
return Set( str, strlen( str ) );
}
void Clear() {
assert( Count() > 0 );
Set( "", 0 );
}
const char* Set( const char* str, unsigned len ) {
Grow( len+1 );
strncpy( _rgT, str, len );
_rgT[ len ] = '\0';
return Base();
}
SimpleString( const SimpleString& str )
: SimpleArray<char>( str.Length()+1 ) {
Set( str.Base(), str.Length()+1 );
}
SimpleString( unsigned len = 256 ) : SimpleArray<char>( max( len, 1 ) ) {
Set( "", 0 );
}
private:
bool Grow( unsigned cb ) {
if ( Count() < cb ) {
delete [] _rgT;
_rgT = new char[cb];
_cT = cb;
}
return _rgT != 0;
}
};