386 lines
10 KiB
C++
386 lines
10 KiB
C++
#include "pch.h"
|
|
#include "StatsSet.h"
|
|
#include "utils/Debugging.h"
|
|
#include "utils/Exception.h"
|
|
#include "l2c_utils.h"
|
|
|
|
StatsSet::StatsSet()
|
|
{
|
|
m_map.clear();
|
|
}
|
|
|
|
StatsSet::~StatsSet()
|
|
{
|
|
m_map.clear();
|
|
}
|
|
|
|
StatsSet::StatsSet( const StatsSet& other )
|
|
{
|
|
this->operator=( other );
|
|
}
|
|
|
|
const StatsSet& StatsSet::operator=( const StatsSet& other )
|
|
{
|
|
if( this == &other ) return (*this);
|
|
m_map = other.m_map;
|
|
return (*this);
|
|
}
|
|
|
|
bool StatsSet::getInt( const char *name, int *val )
|
|
{
|
|
std::wstring value;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent Int var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
value = iter->second;
|
|
int i = 0;
|
|
int r = swscanf( value.c_str(), L"%d", &i );
|
|
if( r == 1 )
|
|
{
|
|
(*val) = i;
|
|
return true;
|
|
}
|
|
throw Exception( "StatsSet.getInt: failed to scanf %%d from [%s]=[%S]", name, value.c_str() );
|
|
}
|
|
|
|
bool StatsSet::getInt( const char *name, int *val, int defVal )
|
|
{
|
|
std::wstring ws;
|
|
std::wstring ws_def(L"0");
|
|
getWString( name, ws, ws_def );
|
|
int v = 0;
|
|
int r = swscanf( ws.c_str(), L"%d", &v );
|
|
if( r <= 0 ) (*val) = defVal; // 0 tokens were read by swscanf or EOL reached unexpectedly
|
|
else (*val) = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getUInt( const char *name, unsigned int *val )
|
|
{
|
|
std::wstring value;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent UInt var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
value = iter->second;
|
|
unsigned int ui = 0;
|
|
int r = swscanf( value.c_str(), L"%u", &ui );
|
|
if( r == 1 )
|
|
{
|
|
(*val) = ui;
|
|
return true;
|
|
}
|
|
throw Exception( "StatsSet.getInt: failed to scanf %%u from [%s]=[%S]", name, value.c_str() );
|
|
}
|
|
|
|
bool StatsSet::getUInt( const char *name, unsigned int *val, unsigned int defVal )
|
|
{
|
|
std::wstring ws;
|
|
std::wstring ws_def(L"0");
|
|
getWString( name, ws, ws_def );
|
|
unsigned int v = 0;
|
|
int r = swscanf( ws.c_str(), L"%u", &v );
|
|
if( r <= 0 ) (*val) = defVal; // 0 tokens were read by swscanf or EOL reached unexpectedly
|
|
else (*val) = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getInt64( const char *name, long long int *val )
|
|
{
|
|
std::wstring value;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent Int64 var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
value = iter->second;
|
|
long long int i64 = 0;
|
|
int r = swscanf( value.c_str(), L"%I64d", &i64 );
|
|
if( r == 1 )
|
|
{
|
|
(*val) = i64;
|
|
return true;
|
|
}
|
|
throw Exception( "StatsSet.getInt: failed to scanf %%I64d from [%s]=[%S]", name, value.c_str() );
|
|
}
|
|
|
|
bool StatsSet::getInt64( const char *name, long long int *val, long long int defVal )
|
|
{
|
|
std::wstring ws;
|
|
std::wstring ws_def(L"0");
|
|
getWString( name, ws, ws_def );
|
|
long long int v = 0;
|
|
int r = swscanf( ws.c_str(), L"%I64d", &v );
|
|
if( r <= 0 ) (*val) = defVal; // 0 tokens were read by swscanf or EOL reached unexpectedly
|
|
else (*val) = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getUInt64( const char *name, unsigned long long int *val )
|
|
{
|
|
std::wstring value;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent UInt64 var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
value = iter->second;
|
|
unsigned long long int ui64 = 0;
|
|
int r = swscanf( value.c_str(), L"%I64u", &ui64 );
|
|
if( r == 1 )
|
|
{
|
|
(*val) = ui64;
|
|
return true;
|
|
}
|
|
throw Exception( "StatsSet.getInt: failed to scanf %%I64u from [%s]=[%S]", name, value.c_str() );
|
|
}
|
|
|
|
bool StatsSet::getUInt64( const char *name, unsigned long long int *val, unsigned long long int defVal )
|
|
{
|
|
std::wstring ws;
|
|
std::wstring ws_def(L"0");
|
|
getWString( name, ws, ws_def );
|
|
unsigned long long int v = 0;
|
|
int r = swscanf( ws.c_str(), L"%I64u", &v );
|
|
if( r <= 0 ) (*val) = defVal; // 0 tokens were read by swscanf or EOL reached unexpectedly
|
|
else (*val) = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getDouble( const char *name, double *val )
|
|
{
|
|
std::wstring value;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent Double var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
value = iter->second;
|
|
double lf = 0;
|
|
int r = swscanf( value.c_str(), L"%lf", &lf );
|
|
if( r == 1 )
|
|
{
|
|
(*val) = lf;
|
|
return true;
|
|
}
|
|
throw Exception( "StatsSet.getInt: failed to scanf %%lf from [%s]=[%S]", name, value.c_str() );
|
|
}
|
|
|
|
bool StatsSet::getDouble( const char *name, double *val, double defVal )
|
|
{
|
|
std::wstring ws;
|
|
std::wstring ws_def(L"0.0");
|
|
getWString( name, ws, ws_def );
|
|
double v = 0.0;
|
|
int r = swscanf( ws.c_str(), L"%lf", &v );
|
|
if( r <= 0 ) (*val) = defVal; // 0 tokens were read by swscanf or EOL reached unexpectedly
|
|
else (*val) = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getString( const char *name, std::string& val )
|
|
{
|
|
std::wstring ws;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent String var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
ws = iter->second;
|
|
const wchar_t *cws = ws.c_str(); // get wchar_t *
|
|
char *c_tmp = (char *)malloc( ws.size() + 16 ); // allocate space for Unicode -> ANSI convert
|
|
if( c_tmp )
|
|
{
|
|
l2c_unicode_to_ansi( cws, c_tmp, ws.size()+1 );
|
|
c_tmp[ws.size()] = 0;
|
|
val.assign( c_tmp, ws.size() );
|
|
free( c_tmp );
|
|
}
|
|
else val.assign( "malloc() failed" );
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getString( const char *name, std::string& val, std::string& defVal )
|
|
{
|
|
std::wstring ws;
|
|
std::wstring ws_def( L"" );
|
|
getWString( name, ws, ws_def ); // always returns true
|
|
const wchar_t *cws = ws.c_str();
|
|
char *c_tmp = (char *)malloc( ws.size() + 16 );
|
|
if( c_tmp )
|
|
{
|
|
l2c_unicode_to_ansi( cws, c_tmp, ws.size()+1 );
|
|
c_tmp[ws.size()] = 0;
|
|
val.assign( c_tmp, ws.size() );
|
|
free( c_tmp );
|
|
}
|
|
else val = defVal;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getWString( const char *name, std::wstring& val )
|
|
{
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent WString var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
val = iter->second;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getWString( const char *name, std::wstring& val, std::wstring& defVal )
|
|
{
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
val = defVal;
|
|
return true;
|
|
}
|
|
val = iter->second;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getBool( const char *name, bool *val )
|
|
{
|
|
std::wstring value;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
throw Exception( "StatsSet: trying to get non-existent Bool var [%s] with no default value!", name );
|
|
//return false; // warning C4702: unreachable code
|
|
}
|
|
value = iter->second;
|
|
int i = 0;
|
|
swscanf( value.c_str(), L"%d", &i );
|
|
(*val) = (bool)(i != 0);
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::getBool( const char *name, bool *val, bool defVal )
|
|
{
|
|
std::wstring value;
|
|
std::string sname( name );
|
|
std::map<std::string, std::wstring>::const_iterator iter = m_map.find( sname );
|
|
if( iter == m_map.end() )
|
|
{
|
|
(*val) = defVal;
|
|
return true;
|
|
}
|
|
value = iter->second;
|
|
int i = 0;
|
|
swscanf( value.c_str(), L"%d", &i );
|
|
(*val) = (bool)(i != 0);
|
|
return true; // defVal funcs never return false and never throw exceptions
|
|
}
|
|
|
|
|
|
|
|
bool StatsSet::setInt( const char *name, int val )
|
|
{
|
|
std::string sname( name );
|
|
wchar_t wval[32];
|
|
swprintf( wval, 31, L"%d", val );
|
|
std::wstring v( wval );
|
|
m_map[name] = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::setUInt( const char *name, unsigned int val )
|
|
{
|
|
std::string sname( name );
|
|
wchar_t wval[32];
|
|
swprintf( wval, 31, L"%u", val );
|
|
std::wstring v( wval );
|
|
m_map[name] = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::setInt64( const char *name, long long int val )
|
|
{
|
|
std::string sname( name );
|
|
wchar_t wval[32];
|
|
swprintf( wval, 31, L"%I64d", val );
|
|
std::wstring v( wval );
|
|
m_map[name] = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::setUInt64( const char *name, unsigned long long int val )
|
|
{
|
|
std::string sname( name );
|
|
wchar_t wval[32];
|
|
swprintf( wval, 31, L"%I64u", val );
|
|
std::wstring v( wval );
|
|
m_map[name] = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::setDouble( const char *name, double val )
|
|
{
|
|
std::string sname( name );
|
|
wchar_t wval[32];
|
|
swprintf( wval, 31, L"%0.20f", val );
|
|
std::wstring v( wval );
|
|
m_map[name] = v;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::setString( const char *name, std::string& val )
|
|
{
|
|
std::string sname( name );
|
|
wchar_t *wval = (wchar_t *)malloc( (val.size()+16) * sizeof(wchar_t) );
|
|
if( wval )
|
|
{
|
|
swprintf( wval, val.size()+1, L"%S", val.c_str() );
|
|
std::wstring v( wval );
|
|
m_map[sname] = v;
|
|
free( wval );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool StatsSet::setString( const char *name, const char *val )
|
|
{
|
|
std::string sval( val );
|
|
return setString( name, sval );
|
|
}
|
|
|
|
bool StatsSet::setWString( const char *name, const wchar_t *val )
|
|
{
|
|
std::wstring sval( val );
|
|
return setWString( name, sval );
|
|
}
|
|
|
|
bool StatsSet::setWString( const char *name, std::wstring& val )
|
|
{
|
|
std::string sname( name );
|
|
m_map[sname] = val;
|
|
return true;
|
|
}
|
|
|
|
bool StatsSet::setBool( const char *name, bool val )
|
|
{
|
|
return setInt( name, (int)val );
|
|
}
|