This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

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