source-engine/public/gcsdk/gcreportprinter.h

130 lines
3.8 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright (c), Valve LLC, All rights reserved. ============
//
// Purpose: A utility for printing out reports on the GC in an ordered manner
//
//=============================================================================
#ifndef GCREPORTPRINTER_H
#define GCREPORTPRINTER_H
#pragma once
#include "gclogger.h"
namespace GCSDK
{
//-----------------------------------------------------------------------------------------------------
// CGCReportPrinter - A class that will handle formatting a report for outputting to a console or other
// data sources. Just create an instance of the class, add the columns, then add the fields, and print. Below is an example:
//
// CGCReportPrinter rp;
// rp.AddStringColumn( "Names" );
// rp.AddFloatColumn( "SomeValue", 2, CGCReportPrinter::eSummary_Total );
// FOR_EACH_VALUE( v )
// rp.StrValue( v.Name );
// rp.FloatValue( v.Float );
// rp.CommitRow();
// rp.SortReport( "SomeValue" );
// rp.PrintReport( SPEW_CONSOLE );
//
//-----------------------------------------------------------------------------------------------------
class CGCReportPrinter
{
public:
CGCReportPrinter();
~CGCReportPrinter();
//what type of summary to report at the end of the report for the column (not used for string columns)
enum ESummaryType
{
eSummary_None,
eSummary_Total,
eSummary_Max
};
//how to format memory values
enum EIntDisplayType
{
eIntDisplay_Normal,
eIntDisplay_Memory_MB,
};
//called to handle inserting columns into the report of various data types. These must be called before any data has been added
//to the report, and will fail if there is outstanding data
bool AddStringColumn( const char* pszColumn );
bool AddSteamIDColumn( const char* pszColumn );
bool AddIntColumn( const char* pszColumn, ESummaryType eSummary, EIntDisplayType eIntDisplay = eIntDisplay_Normal );
bool AddFloatColumn( const char* pszColumn, ESummaryType eSummary, uint32 unNumDecimal = 2 );
//called to reset all report data
void ClearData();
//called to reset the entire report
void Clear();
//called to add the various data to the report, the order of this must match the columns that were added originally
bool StrValue( const char* pszStr, const char* pszLink = NULL );
bool IntValue( int64 nValue, const char* pszLink = NULL );
bool FloatValue( double fValue, const char* pszLink = NULL );
bool SteamIDValue( CSteamID id, const char* pszLink = NULL );
//called to commit the values that have been added as a new row
bool CommitRow();
//sorts the report based upon the specified column name
void SortReport( const char* pszColumn, bool bDescending = true );
//same as the above, but sorts based upon the specified column index
void SortReport( uint32 nColIndex, bool bDescending = true );
//called to print out the provided report
void PrintReport( CGCEmitGroup& eg, uint32 nTop = 0 );
private:
friend class CReportRowSorter;
//the type of each column
enum EColumnType
{
eCol_String,
eCol_Int,
eCol_Float,
eCol_SteamID,
};
//our list of columns
struct Column_t
{
CUtlString m_sName;
EColumnType m_eType;
ESummaryType m_eSummary;
uint8 m_nNumDecimals; //for floats only
EIntDisplayType m_eIntDisplay; // for ints only
};
CUtlVector< Column_t > m_Columns;
//a variant that holds onto the column field data
struct Variant_t
{
Variant_t();
CUtlString m_sStr;
CUtlString m_sLink; //optional link to put around the value
int64 m_nInt;
double m_fFloat;
CSteamID m_SteamID;
};
//our data block
typedef CCopyableUtlVector< Variant_t > TRow;
CUtlVector< TRow* > m_Rows;
//a row that isn't quite in the table, but consists of the row being built to
//avoid issues with partial rows
TRow m_RowBuilder;
};
} // namespace GCSDK
#endif // GCLOGGER_H