//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1993.
//
//  File:	genenum.h
//
//  Contents: 	Declaration of a generic enum object and test object.
//
//  Classes:	CGenEnumObject
//
//  Functions:
//
//  History:    dd-mmm-yy Author    Comment
//              23-May-94 kennethm  author! author!
//
//--------------------------------------------------------------------------

#ifndef _GENENUM_H
#define _GENENUM_H

//
// This macro allows the code to use a different outputstring function.
//

#define OutputStr(a) OutputString a

//+-------------------------------------------------------------------------
//
//  Class:	IGenEnum
//
//  Purpose: 	generic enumerator
//
//  Interface: 	Abstract class
//
//  History:    dd-mmm-yy Author    Comment
//              23-May-94 kennethm  author
//
//  Notes:
//
//--------------------------------------------------------------------------

class IGenEnum
{
public:
	STDMETHOD(QueryInterface)(REFIID riid, void **ppvObj) = 0;
	STDMETHOD_(ULONG,AddRef)(void) = 0;
	STDMETHOD_(ULONG,Release)(void) = 0;

	STDMETHOD(Next) (ULONG celt, void *rgelt,
			ULONG *pceltFetched) = 0;
	STDMETHOD(Skip) (ULONG celt) = 0;
	STDMETHOD(Reset) (void) = 0;
	STDMETHOD(Clone) (void **ppenum) = 0;
};

//+-------------------------------------------------------------------------
//
//  Class:	CEnumeratorTest
//
//  Purpose: 	enumerator test class
//
//  Interface: 	
//
//  History:    dd-mmm-yy Author    Comment
//              23-May-94 kennethm  author
//
//  Notes:
//
//--------------------------------------------------------------------------

class CEnumeratorTest
{
public:	
	// Constructor

	CEnumeratorTest(
			void *penum,
			size_t ElementSize,
			LONG ElementCount,
                        HRESULT& rhr);

	// Test for each enumerator object

	HRESULT TestAll(void);
	HRESULT TestNext(void);
// NYI!	HRESULT TestSkip(void);
//	HRESULT TestClone(void);
//	HRESULT TestRelease(void);

        // For derived classes which know what we are enumerating
        virtual BOOL Verify(void *) = 0;
        virtual BOOL VerifyAll(void *, LONG);
        virtual void CleanUp(void *);

private:	

	BOOL GetNext(ULONG celt, ULONG* pceltFetched, HRESULT* phresult);

	IGenEnum *	m_pEnumTest;
	size_t		m_ElementSize;
	LONG		m_ElementCount;
};

#endif // !_GENENUM_H