/*++

Copyright (c) 1999-2000 Microsoft Corporation

Module Name:

    membmgr2.hxx

Abstract:

    This module contains the declarations for the MEM_ALLOCATOR
    class, which provides memory block of varialble size from
    a bigger block.  All bigger blocks are then linked together
    thru a pointer at the end of each bigger block.  This class
    is particularly suitable to user who needs a lot of small
    blocks but does not free any of them until there is no need
    to use the object anymore.

Author:

    Daniel Chan (danielch) Oct 18, 1999

--*/

#if !defined( _MEM_ALLOCATOR_DEFN_ )

#define _MEM_ALLOCATOR_DEFN_

//
// This class allocates a big buffer and then give a chunk of
// it away each time Allocate is called.  Each big buffer
// is linked to the next one by having a pointer at the end
// of the big buffer.  The last buffer should have a NULL
// pointer at the end of it.
//
class MEM_ALLOCATOR : public OBJECT {

    public:

        ULIB_EXPORT
        DECLARE_CONSTRUCTOR( MEM_ALLOCATOR );

        VIRTUAL
        ULIB_EXPORT
        ~MEM_ALLOCATOR(
            );

        NONVIRTUAL
        ULIB_EXPORT
        BOOLEAN
        Initialize(
            IN     ULONG64      MaximumMemoryToUse      DEFAULT         -1,
            IN     ULONG        IncrementalBlockSize    DEFAULT         1024*1024
            );

        NONVIRTUAL
        ULIB_EXPORT
        PVOID
        Allocate(
            IN     ULONG        SizeInBytes
            );

    private:

        NONVIRTUAL
        VOID
        Construct(
            );

        NONVIRTUAL
        VOID
        Destroy(
            );

        PVOID           _head_ptr;              // points to the first big buffer
        PVOID           _next_free_ptr;         // points to the free space of the current big buffer
        ULONG           _free_space_in_current_block;   // amount of user space that's free in the
                                                        // current big buffer
        ULONG           _incremental_size;      // how large is each big buffer
        ULONG64         _max_mem_use;
        ULONG64         _mem_use;
};

#endif