//-----------------------------------------------------------------------------
// Microsoft OLE DB TABLECOPY Sample
// Copyright (C) 1996 By Microsoft Corporation.
//
// @doc
//
// @module SPY.HXX
//
//-----------------------------------------------------------------------------

#pragma once

static const ALLOC_SIGNATURE = 'A';
static const FREE_SIGNATURE = 'F';


//ROUNDUP on all platforms pointers must be aligned properly
#define ROUNDUP_AMOUNT  8
#define ROUNDUP_(size,amount)       (((ULONG)(size)+((amount)-1))&~((amount)-1))
#define ROUNDUP(size)               ROUNDUP_(size, ROUNDUP_AMOUNT)

/////////////////////////////////////////////////////////////////////////////
// CMallocSpy
//
/////////////////////////////////////////////////////////////////////////////
class CMallocSpy : public IMallocSpy
{

public:

    CMallocSpy(void);
    virtual ~CMallocSpy(void);

    //Interface
    virtual BOOL Add(void* pv);
    virtual BOOL Remove(void* pv);
    virtual BOOL DumpLeaks();

    // IUnknown methods
    virtual STDMETHODIMP QueryInterface(REFIID riid, void** ppIUnknown);
    virtual STDMETHODIMP_(ULONG) AddRef();
    virtual STDMETHODIMP_(ULONG) Release();

    // IMallocSpy methods

    //Alloc
    virtual STDMETHODIMP_(SIZE_T) PreAlloc(SIZE_T cbRequest);
    virtual STDMETHODIMP_(void*) PostAlloc(void *pActual);

    //Free
    virtual STDMETHODIMP_(void*) PreFree(void *pRequest, BOOL fSpyed);
    virtual STDMETHODIMP_(void ) PostFree(BOOL fSpyed);

    //Realloc
    virtual STDMETHODIMP_(SIZE_T) PreRealloc(void *pRequest, SIZE_T cbRequest, void **ppNewRequest, BOOL fSpyed);
    virtual STDMETHODIMP_(void*) PostRealloc(void *pActual, BOOL fSpyed);

    //GetSize
    virtual STDMETHODIMP_(void*) PreGetSize(void *pRequest, BOOL fSpyed);
    virtual STDMETHODIMP_(SIZE_T) PostGetSize(SIZE_T cbActual, BOOL fSpyed);

    //DidAlloc
    virtual STDMETHODIMP_(void*) PreDidAlloc(void *pRequest, BOOL fSpyed);
    virtual STDMETHODIMP_(BOOL)  PostDidAlloc(void *pRequest, BOOL fSpyed, BOOL fActual);

    //HeapMinimize
    virtual STDMETHODIMP_(void ) PreHeapMinimize();
    virtual STDMETHODIMP_(void ) PostHeapMinimize();


private:

    ULONG    m_cRef;            //Reference count
    SIZE_T    m_cbRequest;       //Bytes requested
};

/////////////////////////////////////////////////////////////////////////////
// Registration
//
/////////////////////////////////////////////////////////////////////////////
void MallocSpyRegister(CMallocSpy** ppCMallocSpy);
void MallocSpyUnRegister(CMallocSpy* pCMallocSpy);
void MallocSpyDump(CMallocSpy* pCMallocSpy);