/*****************************************************************/
/**				  Microsoft Windows for Workgroups				**/
/**		      Copyright (C) Microsoft Corp., 1991-1992			**/
/*****************************************************************/ 

/* BUFFER.H -- Definition of BUFFER class.
 *
 * History:
 *	03/22/93	gregj	Created
 *	03/24/93	gregj	Created base class, GLOBAL_BUFFER
 *	10/06/93	gregj	Removed LOCAL_BUFFER and GLOBAL_BUFFER because
 *						they're incompatible with Win32.
 */

#ifndef _INC_BUFFER
#define _INC_BUFFER

/*************************************************************************

    NAME:		BUFFER_BASE

    SYNOPSIS:	Base class for transient buffer classes

    INTERFACE:	BUFFER_BASE()
					Construct with optional size of buffer to allocate.

				Resize()
					Resize buffer to specified size.  Returns TRUE if
					successful.

				QuerySize()
					Return the current size of the buffer in bytes.

				QueryPtr()
					Return a pointer to the buffer.

    PARENT:		None

    USES:		None

    CAVEATS:	This is an abstract class, which unifies the interface
				of BUFFER, GLOBAL_BUFFER, etc.

    NOTES:		In standard OOP fashion, the buffer is deallocated in
				the destructor.

    HISTORY:
		03/24/93	gregj	Created base class

**************************************************************************/

class BUFFER_BASE
{
protected:
	UINT _cb;

	virtual BOOL Alloc( UINT cbBuffer ) = 0;
	virtual BOOL Realloc( UINT cbBuffer ) = 0;

public:
	BUFFER_BASE()
		{ _cb = 0; }	// buffer not allocated yet
	~BUFFER_BASE()
		{ _cb = 0; }	// buffer size no longer valid
	BOOL Resize( UINT cbNew );
	UINT QuerySize() const { return _cb; };
};

#define GLOBAL_BUFFER	BUFFER

/*************************************************************************

    NAME:		BUFFER

    SYNOPSIS:	Wrapper class for new and delete

    INTERFACE:	BUFFER()
					Construct with optional size of buffer to allocate.

				Resize()
					Resize buffer to specified size.  Only works if the
					buffer hasn't been allocated yet.

				QuerySize()
					Return the current size of the buffer in bytes.

				QueryPtr()
					Return a pointer to the buffer.

    PARENT:		BUFFER_BASE

    CAVEATS:

    NOTES:		In standard OOP fashion, the buffer is deallocated in
				the destructor.

    HISTORY:
		03/24/93	gregj	Created

**************************************************************************/

class BUFFER : public BUFFER_BASE
{
protected:
	CHAR *_lpBuffer;

	virtual BOOL Alloc( UINT cbBuffer );
	virtual BOOL Realloc( UINT cbBuffer );

public:
	BUFFER( UINT cbInitial=0 );
	~BUFFER();
	LPVOID QueryPtr() const { return (LPVOID)_lpBuffer; }
	operator void*() const { return (void *)_lpBuffer; }
};

#define LOCAL_BUFFER	BUFFER

#endif	/* _INC_BUFFER */
