//========= Copyright (C) 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:	CValObject is used for tracking individual objects that report
//			in to CValidator.  Whenever a new object reports in (via CValidator::Push),
//			we create a new CValObject to aggregate stats for it.
//
// $NoKeywords: $
//=============================================================================//

#ifndef VALOBJECT_H
#define VALOBJECT_H
#ifdef _WIN32
#pragma once
#endif


#ifdef DBGFLAG_VALIDATE
class CValObject
{
public:
	// Constructors & destructors
	CValObject( void ) { };
	~CValObject( void );

	void Init( tchar *pchType, void *pvObj, tchar *pchName, CValObject *pValObjectParent,
		CValObject *pValObjectPrev );

	// Our object has claimed ownership of a memory block
	void ClaimMemoryBlock( void *pvMem );

	// A child of ours has claimed ownership of a memory block
	void ClaimChildMemoryBlock( int cubUser );

	// Accessors
	tchar *PchType( void ) { return m_rgchType; };
	void *PvObj( void ) { return m_pvObj; };
	tchar *PchName( void ) { return m_rgchName; };
	CValObject *PValObjectParent( void ) { return m_pValObjectParent; };
	int NLevel( void ) { return m_nLevel; };
	CValObject *PValObjectNext( void ) { return m_pValObjectNext; };
	int CpubMemSelf( void ) { return m_cpubMemSelf; };
	int CubMemSelf( void ) { return m_cubMemSelf; };
	int CpubMemTree( void ) { return m_cpubMemTree; };
	int CubMemTree( void ) { return m_cubMemTree; };
	int NUser( void ) { return m_nUser; };
	void SetNUser( int nUser ) { m_nUser = nUser; };
	void SetBNewSinceSnapshot( bool bNewSinceSnapshot ) { m_bNewSinceSnapshot = bNewSinceSnapshot; }
	bool BNewSinceSnapshot( void ) { return m_bNewSinceSnapshot; }

private:
	bool  m_bNewSinceSnapshot;				// If this block is new since the snapshot.
	tchar m_rgchType[64];					// Type of the object we represent
	tchar m_rgchName[64];					// Name of this particular object
	void *m_pvObj;							// Pointer to the object we represent

	CValObject *m_pValObjectParent;			// Our parent object in the tree.
	int m_nLevel;							// Our depth in the tree

	CValObject *m_pValObjectNext;			// Next ValObject in the linked list

	int m_cpubMemSelf;						// # of memory blocks we own directly
	int m_cubMemSelf;						// Total size of the memory blocks we own directly

	int m_cpubMemTree;						// # of memory blocks owned by us and our children
	int m_cubMemTree;						// Total size of the memory blocks owned by us and our children

	int m_nUser;							// Field provided for use by our users
};
#endif // DBGFLAG_VALIDATE


#endif // VALOBJECT_H
