Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
1.6 KiB

//
// Stack.h
//
// define a stack template class
//
#if !defined(_stack_h)
#define _stack_h 1
template <class El, unsigned size>
class Stack {
enum { cElementGrow = 64 };
unsigned _cEl;
unsigned _cElSpill;
El * _rgElSpill;
El _rgEl[ size ];
int
FEnsureSpill ( unsigned cEl ) {
if ( cEl >= size && cEl - size >= _cElSpill ) {
El * pEl = new El[ _cElSpill + cElementGrow ];
if ( pEl ) {
if ( _cElSpill ) {
for ( unsigned iel = 0; iel < cEl - size; iel++ ) {
pEl[ iel ] = _rgElSpill [ iel ];
}
delete [] _rgElSpill;
}
_rgElSpill = pEl;
_cElSpill += cElementGrow;
return fTrue;
}
}
else {
return fTrue;
}
return fFalse;
}
public:
Stack() {
_cEl = _cElSpill = 0;
_rgElSpill = 0;
}
~Stack() {
if ( _rgElSpill ) {
delete [] _rgElSpill;
_rgElSpill = 0;
_cElSpill = 0;
}
}
unsigned
Count() const {
return _cEl;
}
int
FPush ( El el ) {
if ( _cEl >= size ) {
if ( FEnsureSpill ( _cEl + 1 ) ) {
_rgElSpill [ _cEl - size ] = el;
}
else {
return fFalse;
}
}
else {
_rgEl[ _cEl ] = el;
}
_cEl++;
return fTrue;
}
El
Pop() {
if ( _cEl ) {
if ( _cEl > size ) {
return _rgElSpill[ (--_cEl) - size ];
}
else {
return _rgEl[ --_cEl ];
}
}
else {
assert ( fFalse );
return El(0);
}
}
El
Top() const {
if ( _cEl ) {
if ( _cEl > size ) {
return _rgElSpill[ _cEl - 1 - size ];
}
else {
return _rgEl[ _cEl - 1 ];
}
}
else {
assert ( fFalse );
return El(0);
}
}
};
#endif // _stack_h