/*++

Copyright (c) 1991 Microsoft Corporation

Module Name:

    cache.hxx

Abstract:

    This class models a cache of equal sized blocks.

--*/


#if !defined(_CACHE_DEFN_)

#define _CACHE_DEFN_


#include "bigint.hxx"


DECLARE_CLASS(CACHE);


class CACHE : public OBJECT {

    public:

                DECLARE_CONSTRUCTOR( CACHE );

        VIRTUAL
        ~CACHE(
            );

        NONVIRTUAL
        BOOLEAN
        Initialize(
            IN  ULONG   BlockSize,
            IN  ULONG   MaximumNumberOfBlocks
            );

        NONVIRTUAL
        BOOLEAN
        Read(
            IN  BIG_INT BlockNumber,
            OUT PVOID   Buffer
            ) CONST;

        NONVIRTUAL
        VOID
        AddBlock(
            IN  BIG_INT BlockNumber,
            IN  PCVOID  Buffer
            );

        NONVIRTUAL
        VOID
        Empty(
            );

        NONVIRTUAL
        ULONG
        QueryMaxNumBlocks(
            ) CONST;

        NONVIRTUAL
        ULONG
        QueryBlockSize(
            ) CONST;

    private:

        NONVIRTUAL
        VOID
        Construct(
            );

        NONVIRTUAL
        VOID
        Destroy(
            );

        PVOID*          _buffer;
        PBIG_INT        _block_number;
        PLONG           _inuse;
        ULONG           _num_blocks;
        ULONG           _block_size;
        ULONG           _next_add;
        LONG            _next_add_inuse;
        LARGE_INTEGER   _timeout;

};


INLINE
ULONG
CACHE::QueryMaxNumBlocks(
    ) CONST
/*++

Routine Description:

    This routine returns the number of cache blocks used by this object.

Arguments:

    None.

Return Value:

    The maximum number of cache blocks.

--*/
{
    return _num_blocks;
}


INLINE
ULONG
CACHE::QueryBlockSize(
    ) CONST
/*++

Routine Description:

    This routine returns the number of bytes per block.

Arguments:

    None.

Return Value:

    The number of bytes per block.

--*/
{
    return _block_size;
}


#endif // _CACHE_DEFN_