144 lines
3.6 KiB
C++
144 lines
3.6 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#ifndef TEXTSTATSMGR_H
|
|
#define TEXTSTATSMGR_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "filesystem.h"
|
|
#include "utllinkedlist.h"
|
|
|
|
// Text stats get to print their stuff by implementing this type of function.
|
|
typedef void (*TextStatPrintFn)(IFileSystem *pFileSys, FileHandle_t hFile,
|
|
void *pUserData);
|
|
typedef void (*TextStatFileFn)();
|
|
|
|
// The CTextStatsMgr is just a collection of CTextStat's that go into the same
|
|
// file.
|
|
class CTextStatsMgr {
|
|
public:
|
|
CTextStatsMgr(void);
|
|
|
|
// Write a file with all the registered stats.
|
|
bool WriteFile(IFileSystem *pFileSystem, const char *pFilename = NULL);
|
|
|
|
// Get the preset filename to write stats to, if none is specified when
|
|
// writing
|
|
char *GetStatsFilename(void);
|
|
|
|
// Set the filename to write stats to, if none is specified when writing
|
|
void SetStatsFilename(char *sFilename);
|
|
|
|
private:
|
|
char m_szStatFilename[MAX_PATH];
|
|
};
|
|
|
|
// This is the default CTextStatsMgr, but there can be any number of them.
|
|
extern CTextStatsMgr g_TextStatsMgr;
|
|
|
|
// Make these to register text stat functions.
|
|
class CTextStat {
|
|
friend class CTextStatsMgr;
|
|
|
|
public:
|
|
CTextStat();
|
|
CTextStat(TextStatPrintFn fn, void *pUserData,
|
|
CTextStatsMgr *pMgr = &g_TextStatsMgr);
|
|
~CTextStat();
|
|
|
|
// This can be called if you don't want to pass parameters into the
|
|
// constructor.
|
|
void Init(TextStatPrintFn printFn, void *pUserData,
|
|
CTextStatsMgr *pMgr = &g_TextStatsMgr);
|
|
void Term();
|
|
|
|
private:
|
|
// Special constructor to just tie off the linked list.
|
|
CTextStat(bool bGlobalListHead);
|
|
|
|
// The global list of CTextStats.
|
|
static CTextStat *GetTextStatsList();
|
|
|
|
static void RemoveFn(void *pUserData);
|
|
|
|
// Link it into the global list.
|
|
CTextStat *m_pPrev;
|
|
CTextStat *m_pNext;
|
|
|
|
CTextStatsMgr *m_pMgr;
|
|
|
|
TextStatPrintFn m_PrintFn;
|
|
void *m_pUserData;
|
|
};
|
|
|
|
// This class registers like a ConVar and acts like an int. When the game is
|
|
// shutdown, its value will be saved in the stats file along with its name.s
|
|
class CTextStatInt {
|
|
public:
|
|
CTextStatInt(const char *pName, int initialValue = 0,
|
|
CTextStatsMgr *pMgr = &g_TextStatsMgr);
|
|
|
|
operator int() const { return m_Value; }
|
|
int operator=(int val) {
|
|
m_Value = val;
|
|
return m_Value;
|
|
}
|
|
|
|
int operator++() {
|
|
m_Value++;
|
|
return m_Value;
|
|
}
|
|
int operator--() {
|
|
m_Value--;
|
|
return m_Value;
|
|
}
|
|
int operator+=(int val) {
|
|
m_Value += val;
|
|
return m_Value;
|
|
}
|
|
int operator-=(int val) {
|
|
m_Value -= val;
|
|
return m_Value;
|
|
}
|
|
int operator*=(int val) {
|
|
m_Value *= val;
|
|
return m_Value;
|
|
}
|
|
int operator/=(int val) {
|
|
m_Value /= val;
|
|
return m_Value;
|
|
}
|
|
|
|
private:
|
|
static void PrintFn(IFileSystem *pFileSys, FileHandle_t hFile,
|
|
void *pUserData);
|
|
|
|
private:
|
|
const char *m_pName;
|
|
int m_Value;
|
|
|
|
CTextStat m_Reg; // Use to register ourselves.
|
|
};
|
|
|
|
// This can be registered to get a callback when the text stats mgr is saving
|
|
// its files. You can write data out to your own file in here.
|
|
class CTextStatFile {
|
|
public:
|
|
CTextStatFile(TextStatFileFn fn);
|
|
|
|
private:
|
|
friend class CTextStatsMgr;
|
|
|
|
static CTextStatFile *s_pHead;
|
|
CTextStatFile *m_pNext;
|
|
TextStatFileFn m_pFn;
|
|
};
|
|
|
|
#endif // TEXTSTATSMGR_H
|