#pragma once #include "Headers.h" using std::find; using std::make_pair; using std::map; using std::pair; using std::string; using std::vector; // templates are fucking gay typedef boost::any var; class CVar { private: var val; var min; var max; public: CVar::CVar( const var &_min, const var &_max, const var &_value ) { min = _min; max = _max; val = _value; } FORCEINLINE var GetCVarMin() const { return min; } FORCEINLINE var GetCVarMax() const { return max; } FORCEINLINE var GetCVarValue() const { return val; } FORCEINLINE void SetCVar( var _val ) { /* if( _val > this->max ) val = max; else if( _val < this->min ) val = min; */ val = _val; } }; typedef map<string, CVar*>cvarmap_t; typedef cvarmap_t::iterator it_t; class CCVarManager { private: cvarmap_t m_varMap; it_t m_Itr; CVar *GetCVar( string name ); public: bool AddCVar( string _name, var _min, var _max, var _value ); bool GetCVarBool( string name ); float GetCVarFloat( string name ); int GetCVarInt( string name ); void SetCVar( string name, string value ); };
#include "CCvar.h" bool CCVarManager::AddCVar( string _name, var _min, var _max, var _value ) { CVar *pVar = new CVar( _min, _max, _value ); if( !pVar ) return false; m_varMap.insert( make_pair( _name, pVar ) ); return true; } CVar *CCVarManager::GetCVar( string name ) { m_Itr = m_varMap.find( name ); if( m_Itr == m_varMap.end() ) return NULL; return m_Itr->second; } bool CCVarManager::GetCVarBool( string name ) { CVar *pTmp = GetCVar( name ); if( pTmp == NULL || pTmp->GetCVarValue().type() != typeid( bool ) ) return false; return boost::any_cast<bool>( pTmp->GetCVarValue() ); } float CCVarManager::GetCVarFloat( string name ) { CVar *pTmp = GetCVar( name ); if( pTmp == NULL || pTmp->GetCVarValue().type() != typeid( float ) ) return 0.0f; return boost::any_cast<float>( pTmp->GetCVarValue() ); } int CCVarManager::GetCVarInt( string name ) { CVar *pTmp = GetCVar( name ); if( pTmp == NULL || pTmp->GetCVarValue().type() != typeid( int ) ) return 0; return boost::any_cast<int>( pTmp->GetCVarValue() ); } bool CCVarManager::Load( string name ) { ifstream _in; string key, line, val; string path = g_strWorkDir + "\\settings\\"; if( !_in.is_open() ) { path.append( name + ".ini" ); _in.open( path.c_str(), std::ios_base::in ); } while( !_in.eof() ) { getline( _in, line ); if( line.empty() ) continue; string::size_type st = line.find_first_of('='); key = line.substr( 0, st ); val = line.substr( st+1, line.length()-(st+1) ); this->SetCVar( key, val ); } _in.close(); return true; } bool CCVarManager::Save( string name ) { ofstream _out; string path = g_strWorkDir + "\\settings\\"; if( !_out.is_open() ) { path.append( name + ".ini" ); _out.open( path.c_str(), std::ios_base::out ); } for( m_Itr = m_varMap.begin(); m_Itr != m_varMap.end(); ++m_Itr ) { _out << m_Itr->first + "="; if( m_Itr->second ) { if( m_Itr->second->GetCVarValue().type() == typeid( bool )) { if( GetCVarBool( m_Itr->first ) == true ) _out << "true" << std::endl; else _out << "false" << std::endl; } if( m_Itr->second->GetCVarValue().type() == typeid( int )) _out << GetCVarInt( m_Itr->first ) << std::endl; if( m_Itr->second->GetCVarValue().type() == typeid( float )) _out << GetCVarFloat( m_Itr->first ) << std::endl; if( m_Itr->second->GetCVarValue().type() == typeid( DWORD )) _out << GetCVarUlong( m_Itr->first ) << std::hex << std::endl; } } _out.close(); return true; } void CCVarManager::SetCVar( string name, string value ) // hackkkkkk { CVar *pVar = GetCVar( name ); if( pVar == NULL ) return; if( pVar->GetCVarValue().type() == typeid( int ) ) { int iNew = atoi( value.c_str() ); pVar->SetCVar( boost::any_cast<int>( iNew )); } if( pVar->GetCVarValue().type() == typeid( bool )) { bool bValue = false; if( !value.find( "true" ) ) pVar->SetCVar( boost::any_cast<bool>( true ) ); // why this is ok but false ain't? o0 else pVar->SetCVar( boost::any_cast<bool>( bValue ) ); } if( pVar->GetCVarValue().type() == typeid( float ) ) { if( !value.find( "." ) ) // more than likely a floating point { float flNew = atof( value.c_str() ); pVar->SetCVar( boost::any_cast<float>( flNew )); } } }
EDIT: Added Save-function, produces a file like this:
bool=on bool2=off float=1.25 float2=2.692 float3=1.78 int=1 int2=6
Comment