mirror of https://github.com/tongzx/nt5src
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.
233 lines
2.8 KiB
233 lines
2.8 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
stack.hxx
|
|
|
|
Abstract:
|
|
|
|
This module contains the declaration for the concrete STACK class.
|
|
STACK is derived from the ORDERED_CONTAINER class. It implements a
|
|
standard FIFO stack data structure with the addition that it has a last
|
|
position which can be queried. STACKs are dynamic in that they will
|
|
grow rather than overflow.
|
|
|
|
Author:
|
|
|
|
David J. Gilman (davegi) 11-Dec-1990
|
|
|
|
Environment:
|
|
|
|
ULIB, User Mode
|
|
|
|
--*/
|
|
|
|
#if ! defined( _STACK_ )
|
|
|
|
#define _STACK_
|
|
|
|
#include "seqcnt.hxx"
|
|
|
|
//
|
|
// Forward references
|
|
//
|
|
|
|
DECLARE_CLASS( ARRAY );
|
|
DECLARE_CLASS( ITERATOR );
|
|
DECLARE_CLASS( STACK );
|
|
|
|
|
|
//
|
|
// Default values for an ARRAY object.
|
|
//
|
|
|
|
CONST ULONG DefaultCapacity = 50;
|
|
CONST ULONG DefaultCapacityIncrement = 25;
|
|
|
|
class STACK : public SEQUENTIAL_CONTAINER {
|
|
|
|
public:
|
|
|
|
DECLARE_CONSTRUCTOR( STACK );
|
|
|
|
DECLARE_CAST_MEMBER_FUNCTION( STACK );
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Clear (
|
|
);
|
|
|
|
VIRTUAL
|
|
PCOBJECT
|
|
GetFirst (
|
|
) CONST PURE;
|
|
|
|
VIRTUAL
|
|
PCOBJECT
|
|
GetLast (
|
|
) CONST PURE;
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
Initialize (
|
|
IN ULONG Capacity DEFAULT DefaultCapacity,
|
|
IN ULONG CapacityIncrement DEFAULT DefaultCapacityIncrement
|
|
);
|
|
|
|
NONVIRTUAL
|
|
PCOBJECT
|
|
Pop (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
Push (
|
|
IN PCOBJECT Object
|
|
);
|
|
|
|
VIRTUAL
|
|
PCOBJECT
|
|
Put (
|
|
IN PCOBJECT Member
|
|
) PURE;
|
|
|
|
VIRTUAL
|
|
PITERATOR
|
|
QueryIterator (
|
|
) CONST PURE;
|
|
|
|
VIRTUAL
|
|
PCOBJECT
|
|
Remove (
|
|
IN PCOBJECT Member
|
|
) PURE;
|
|
|
|
NONVIRTUAL
|
|
PCOBJECT
|
|
Top (
|
|
) CONST;
|
|
|
|
private:
|
|
|
|
PARRAY _Stack;
|
|
ULONG _Top;
|
|
};
|
|
|
|
INLINE
|
|
PCOBJECT
|
|
STACK::GetFirst (
|
|
) CONST
|
|
|
|
{
|
|
return( Top( ));
|
|
}
|
|
|
|
INLINE
|
|
PCOBJECT
|
|
STACK::GetLast (
|
|
) CONST
|
|
|
|
{
|
|
DebugPtrAssert( _Stack );
|
|
if( _Stack != NULL ) {
|
|
return( _Stack->GetLast( ));
|
|
} else {
|
|
return( NULL );
|
|
}
|
|
}
|
|
|
|
INLINE
|
|
VOID
|
|
STACK::Clear (
|
|
)
|
|
|
|
{
|
|
_Top = 0;
|
|
}
|
|
|
|
INLINE
|
|
PCOBJECT
|
|
STACK::Pop (
|
|
)
|
|
|
|
{
|
|
DebugPtrAssert( _Stack );
|
|
if( ( _Stack != NULL ) && ( _Top != 0 )) {
|
|
return( _Stack->GetAt( _Top-- ));
|
|
} else {
|
|
return( NULL );
|
|
}
|
|
}
|
|
|
|
INLINE
|
|
BOOLEAN
|
|
STACK::Push (
|
|
IN PCOBJECT Object
|
|
)
|
|
|
|
{
|
|
DebugPtrAssert( _Stack );
|
|
if( _Stack != NULL ) {
|
|
return( _Stack->PutAt( ++_Top ));
|
|
} else {
|
|
return( NULL );
|
|
}
|
|
}
|
|
|
|
INLINE
|
|
PCOBJECT
|
|
STACK::Put (
|
|
IN PCOBJECT Member
|
|
)
|
|
|
|
{
|
|
DebugPtrAssert( Member );
|
|
return( Push( Member ));
|
|
}
|
|
|
|
INLINE
|
|
PITERATOR
|
|
STACK::QueryIterator (
|
|
) CONST
|
|
|
|
{
|
|
DebugPtrAssert( _Stack );
|
|
if( _Stack != NULL ) {
|
|
return( _Stack->QueryIterator( ));
|
|
} else {
|
|
return( NULL );
|
|
}
|
|
}
|
|
|
|
INLINE
|
|
PCOBJECT
|
|
STACK::Remove (
|
|
IN PCOBJECT Member
|
|
) PURE
|
|
|
|
{
|
|
DebugPtrAssert( Member ).IsEqual( Top( ));
|
|
if( ( Member != NULL ) && Member.IsEqual( Top( )) ) {
|
|
return( Pop( ));
|
|
} else {
|
|
retrun( NULL );
|
|
}
|
|
}
|
|
|
|
INLINE
|
|
PCOBJECT
|
|
STACK::Top (
|
|
) CONST
|
|
|
|
{
|
|
DebugPtrAssert( _Stack );
|
|
if( ( _Stack != NULL ) && ( _Top != 0 )) {
|
|
return( _Stack->GetAt( _Top ));
|
|
} else {
|
|
return( NULL );
|
|
}
|
|
}
|
|
|
|
#endif // _STACK_
|