//  --------------------------------------------------------------------------
//  Module Name: DynamicArray.h
//
//  Copyright (c) 1999-2000, Microsoft Corporation
//
//  This file contains related classes to manage dynamic arrays. The array is
//  grown as required but never shrunk. The base class handles struct arrays.
//  Subclasses handle special cases of these arrays (such as pointer or
//  CCountedObject arrays).
//
//  History:    1999-11-16  vtan        created
//              2000-02-01  vtan        moved from Neptune to Whistler
//  --------------------------------------------------------------------------

#ifndef     _DynamicArray_
#define     _DynamicArray_

#include "CountedObject.h"

//  --------------------------------------------------------------------------
//  CDynamicArrayCallback
//
//  Purpose:    Abstract class definition providing a callback mechanism for
//              iterating the dynamic array.
//
//  History:    1999-11-16  vtan        created
//              2000-02-01  vtan        moved from Neptune to Whistler
//  --------------------------------------------------------------------------

class   CDynamicArrayCallback
{
    public:
        virtual NTSTATUS    Callback (const void *pvData, int iElementIndex) = 0;
};

//  --------------------------------------------------------------------------
//  CDynamicArray
//
//  Purpose:    Base class that handles dynamic struct arrays. Allocates
//              memory for the array in 16 block chunks. The memory usage of
//              the array is never reduced.
//
//  History:    1999-11-16  vtan        created
//              2000-02-01  vtan        moved from Neptune to Whistler
//  --------------------------------------------------------------------------

class   CDynamicArray
{
    private:
                                    CDynamicArray (void);
    public:
                                    CDynamicArray (int iElementSize);
        virtual                     ~CDynamicArray (void);

        virtual NTSTATUS            Add (const void *pvData);
        virtual NTSTATUS            Remove (int iElementIndex);

                int                 GetCount (void)                             const;
                NTSTATUS            Get (void *pvData, int iElementIndex);
                NTSTATUS            Set (const void* pvData, int iElementIndex);

                NTSTATUS            Iterate (CDynamicArrayCallback *pDynamicArrayCallback);
    protected:
                int                 _iElementSize,
                                    _iArraySize,
                                    _iArrayAllocatedSize;
                void*               _pvArray;
};

//  --------------------------------------------------------------------------
//  CDynamicPointerArray
//
//  Purpose:    Class that subclasses CDynamicArray to implement dynamic
//              pointer arrays. Removing elements automatically frees the
//              memory block used (assuming it was allocated with LocalAlloc).
//
//  History:    1999-11-16  vtan        created
//              2000-02-01  vtan        moved from Neptune to Whistler
//  --------------------------------------------------------------------------

class   CDynamicPointerArray : public CDynamicArray
{
    public:
                                    CDynamicPointerArray (void);
        virtual                     ~CDynamicPointerArray (void);

        virtual NTSTATUS            Add (const void *pvData);
        virtual NTSTATUS            Remove (int iElementIndex);

                void*               Get (int iElementIndex);
};

//  --------------------------------------------------------------------------
//  CDynamicCountedObjectArray
//
//  Purpose:    Class that subclasses CDynamicArray to implement dynamic
//              CCountedObject arrays. Removing elements automatically
//              releases the reference held on the dynamic object.
//
//  History:    1999-11-16  vtan        created
//              2000-02-01  vtan        moved from Neptune to Whistler
//  --------------------------------------------------------------------------

class   CDynamicCountedObjectArray : public CDynamicArray
{
    public:
                                    CDynamicCountedObjectArray (void);
        virtual                     ~CDynamicCountedObjectArray (void);

                NTSTATUS            Add (CCountedObject *pData);
        virtual NTSTATUS            Remove (int iElementIndex);

                CCountedObject*     Get (int iElementIndex);
};

#endif  /*  _DynamicArray_  */