|
|
//========= 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
|