//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1996 - 1999
//
//  File:       Stack.hxx
//
//  History:    25-Mar-1997 pberkman   created
//
//--------------------------------------------------------------------------

#ifndef STACK_HXX
#define STACK_HXX

typedef struct StackStruct_
{
    DWORD           cbData;
    void            *pvData;
    StackStruct_    *psNext;
} StackStruct_;

#define     STACK_SORTTYPE_BINARY       0x01
#define     STACK_SORTTYPE_PWSZ         0x02
#define     STACK_SORTTYPE_PSZ          0x03
#define     STACK_SORTTYPE_PWSZ_I	0x04
#define     STACK_SORTTYPE_PSZ_I	0x05

class Stack_
{
    public:
        Stack_(CRITICAL_SECTION *pCriticalSection);
        virtual ~Stack_(void);

        BOOL    Add(DWORD cbData, void *pvData);
        void    *Add(DWORD cbData);

        //              position starts @ zero!
        void    *Get(DWORD dwPosition, DWORD *cbData = NULL);
        //              this one assumes this->Sort() has been called!
        void    *Get(DWORD cbStartIn_pvData, DWORD cbLengthIn_pvData, BYTE fbType, void *pvMemberOf_pvData);

        DWORD   Count(void) { return(dwStackCount); }

        void    Sort(DWORD cbStartIn_pvData, DWORD cbLengthIn_pvData, BYTE fbTypeIn);


    protected:
        StackStruct_    *psBottom;      // this will point to ppsSorted[0] if sorted.
        StackStruct_    **ppsSorted;    // this will be null if no sort
        StackStruct_    **ppsGet;

    private:
        DWORD           dwStackCount;

        CRITICAL_SECTION    *pSortCriticalSection;

        BOOL InitGetStackIfNecessary ();

        VOID FlushGetStack ();

};

#endif // STACK_HXX