Don't re-parse the ini file multiple times per BGALayer. Yuck.

This commit is contained in:
Chris Danford
2004-12-27 10:24:54 +00:00
parent 3ca2641398
commit a675190a55
7 changed files with 133 additions and 103 deletions
+26 -16
View File
@@ -30,14 +30,24 @@ Actor* LoadFromActorFile( const CString &sIniPath, const CString &sLayer )
if( !ini.GetKey(sLayer) ) if( !ini.GetKey(sLayer) )
RageException::Throw( "The file '%s' doesn't have layer '%s'.", sIniPath.c_str(), sLayer.c_str() ); RageException::Throw( "The file '%s' doesn't have layer '%s'.", sIniPath.c_str(), sLayer.c_str() );
CString sDir = Dirname( sIniPath );
const IniFile::key* k = ini.GetKey( sLayer );
if( k == NULL )
RageException::Throw( "The file '%s' doesn't have layer '%s'.", sIniPath.c_str(), sLayer.c_str() );
return LoadFromActorFile( sDir, *k );
}
Actor* LoadFromActorFile( const CString& sAniDir, const IniKey& layer )
{
Actor* pActor = NULL; // fill this in before we return; Actor* pActor = NULL; // fill this in before we return;
CString sType; CString sType;
ini.GetValue( sLayer, "Type", sType ); layer.GetValue( "Type", sType );
CString sFile; CString sFile;
ini.GetValue( sLayer, "File", sFile ); layer.GetValue( "File", sFile );
FixSlashesInPlace( sFile ); FixSlashesInPlace( sFile );
CString sDir = Dirname( sIniPath );
if( sType == "SongCreditDisplay" ) if( sType == "SongCreditDisplay" )
{ {
@@ -58,18 +68,18 @@ Actor* LoadFromActorFile( const CString &sIniPath, const CString &sLayer )
/* Be careful: if sFile is "", and we don't check it, then we can end up recursively /* Be careful: if sFile is "", and we don't check it, then we can end up recursively
* loading the BGAnimationLayer that we're in. */ * loading the BGAnimationLayer that we're in. */
if( sFile == "" ) if( sFile == "" )
RageException::Throw( "The actor file '%s' layer %s is missing File", RageException::Throw( "The actor file in '%s' is missing the File argument",
sIniPath.c_str(), sLayer.c_str() ); sAniDir.c_str() );
CString text; CString text;
if( ini.GetValue ( sLayer, "Text", text ) ) if( layer.GetValue("Text", text) )
{ {
/* It's a BitmapText. Note that we could do the actual text setting with metrics, /* It's a BitmapText. Note that we could do the actual text setting with metrics,
* by adding "text" and "alttext" commands, but right now metrics can't contain * by adding "text" and "alttext" commands, but right now metrics can't contain
* commas or semicolons. It's useful to be able to refer to fonts in the real * commas or semicolons. It's useful to be able to refer to fonts in the real
* theme font dirs, too. */ * theme font dirs, too. */
CString alttext; CString alttext;
ini.GetValue ( sLayer, "AltText", alttext ); layer.GetValue("AltText", alttext );
text.Replace( "::", "\n" ); text.Replace( "::", "\n" );
alttext.Replace( "::", "\n" ); alttext.Replace( "::", "\n" );
@@ -164,7 +174,7 @@ Actor* LoadFromActorFile( const CString &sIniPath, const CString &sLayer )
retry: retry:
/* XXX: We need to do a theme search, since the file we're loading might /* XXX: We need to do a theme search, since the file we're loading might
* be overridden by the theme. */ * be overridden by the theme. */
CString sNewPath = sDir+sFile; CString sNewPath = sAniDir+sFile;
// If we know this is an exact match, don't bother with the GetDirListing; // If we know this is an exact match, don't bother with the GetDirListing;
// it's causing problems with partial matching BGAnimation directory names. // it's causing problems with partial matching BGAnimation directory names.
@@ -175,7 +185,7 @@ retry:
if( asPaths.empty() ) if( asPaths.empty() )
{ {
CString sError = ssprintf( "The actor file '%s' references a file '%s' which doesn't exist.", sIniPath.c_str(), sFile.c_str() ); CString sError = ssprintf( "The actor file in '%s' references a file '%s' which doesn't exist.", sAniDir.c_str(), sFile.c_str() );
switch( Dialog::AbortRetryIgnore( sError, "BROKEN_ACTOR_REFERENCE" ) ) switch( Dialog::AbortRetryIgnore( sError, "BROKEN_ACTOR_REFERENCE" ) )
{ {
case Dialog::abort: case Dialog::abort:
@@ -195,7 +205,7 @@ retry:
} }
else if( asPaths.size() > 1 ) else if( asPaths.size() > 1 )
{ {
CString sError = ssprintf( "The actor file '%s' references a file '%s' which has multiple matches.", sIniPath.c_str(), sFile.c_str() ); CString sError = ssprintf( "The actor file in '%s' references a file '%s' which has multiple matches.", sAniDir.c_str(), sFile.c_str() );
switch( Dialog::AbortRetryIgnore( sError, "DUPLICATE_ACTOR_REFERENCE" ) ) switch( Dialog::AbortRetryIgnore( sError, "DUPLICATE_ACTOR_REFERENCE" ) )
{ {
case Dialog::abort: case Dialog::abort:
@@ -223,12 +233,12 @@ retry:
} }
float f; float f;
if( ini.GetValue ( sLayer, "BaseRotationXDegrees", f ) ) pActor->SetBaseRotationX( f ); if( layer.GetValue( "BaseRotationXDegrees", f ) ) pActor->SetBaseRotationX( f );
if( ini.GetValue ( sLayer, "BaseRotationYDegrees", f ) ) pActor->SetBaseRotationY( f ); if( layer.GetValue( "BaseRotationYDegrees", f ) ) pActor->SetBaseRotationY( f );
if( ini.GetValue ( sLayer, "BaseRotationZDegrees", f ) ) pActor->SetBaseRotationZ( f ); if( layer.GetValue( "BaseRotationZDegrees", f ) ) pActor->SetBaseRotationZ( f );
if( ini.GetValue ( sLayer, "BaseZoomX", f ) ) pActor->SetBaseZoomX( f ); if( layer.GetValue( "BaseZoomX", f ) ) pActor->SetBaseZoomX( f );
if( ini.GetValue ( sLayer, "BaseZoomY", f ) ) pActor->SetBaseZoomY( f ); if( layer.GetValue( "BaseZoomY", f ) ) pActor->SetBaseZoomY( f );
if( ini.GetValue ( sLayer, "BaseZoomZ", f ) ) pActor->SetBaseZoomZ( f ); if( layer.GetValue( "BaseZoomZ", f ) ) pActor->SetBaseZoomZ( f );
ASSERT( pActor ); // we should have filled this in above ASSERT( pActor ); // we should have filled this in above
return pActor; return pActor;
+2
View File
@@ -4,6 +4,7 @@
#include "Actor.h" #include "Actor.h"
#include "RageTexture.h" #include "RageTexture.h"
class IniKey;
#define SET_XY( actor ) UtilSetXY( actor, m_sName ) #define SET_XY( actor ) UtilSetXY( actor, m_sName )
#define ON_COMMAND( actor ) UtilOnCommand( actor, m_sName ) #define ON_COMMAND( actor ) UtilOnCommand( actor, m_sName )
@@ -33,6 +34,7 @@ inline void UtilSetXYAndOnCommand( Actor* pActor, const CString &sClassName ) {
// Return a Sprite, BitmapText, or Model depending on the file type // Return a Sprite, BitmapText, or Model depending on the file type
Actor* LoadFromActorFile( const CString &sIniPath, const CString &sLayer = "Actor" ); Actor* LoadFromActorFile( const CString &sIniPath, const CString &sLayer = "Actor" );
Actor* LoadFromActorFile( const CString& sAniDir, const IniKey& layer );
Actor* MakeActor( const RageTextureID &ID ); Actor* MakeActor( const RageTextureID &ID );
+1 -1
View File
@@ -112,7 +112,7 @@ void AddLayersFromAniDir( CString sAniDir, vector<Actor*> &layersAddTo, bool Gen
{ {
// import as a single layer // import as a single layer
BGAnimationLayer* pLayer = new BGAnimationLayer( Generic ); BGAnimationLayer* pLayer = new BGAnimationLayer( Generic );
pLayer->LoadFromIni( sAniDir, sLayer ); pLayer->LoadFromIni( sAniDir, *pKey );
layersAddTo.push_back( pLayer ); layersAddTo.push_back( pLayer );
} }
} }
+50 -70
View File
@@ -126,7 +126,7 @@ void BGAnimationLayer::Init()
/* Static background layers are simple, uncomposited background images with nothing /* Static background layers are simple, uncomposited background images with nothing
* behind them. Since they have nothing behind them, they have no need for alpha, * behind them. Since they have nothing behind them, they have no need for alpha,
* so turn that off. */ * so turn that off. */
void BGAnimationLayer::LoadFromStaticGraphic( CString sPath ) void BGAnimationLayer::LoadFromStaticGraphic( const CString& sPath )
{ {
Init(); Init();
Sprite* pSprite = new Sprite; Sprite* pSprite = new Sprite;
@@ -135,7 +135,7 @@ void BGAnimationLayer::LoadFromStaticGraphic( CString sPath )
m_SubActors.push_back( pSprite ); m_SubActors.push_back( pSprite );
} }
void BGAnimationLayer::LoadFromMovie( CString sMoviePath ) void BGAnimationLayer::LoadFromMovie( const CString& sMoviePath )
{ {
Init(); Init();
Sprite* pSprite = new Sprite; Sprite* pSprite = new Sprite;
@@ -145,7 +145,7 @@ void BGAnimationLayer::LoadFromMovie( CString sMoviePath )
m_SubActors.push_back( pSprite ); m_SubActors.push_back( pSprite );
} }
void BGAnimationLayer::LoadFromVisualization( CString sMoviePath ) void BGAnimationLayer::LoadFromVisualization( const CString& sMoviePath )
{ {
Init(); Init();
Sprite* pSprite = new Sprite; Sprite* pSprite = new Sprite;
@@ -156,7 +156,7 @@ void BGAnimationLayer::LoadFromVisualization( CString sMoviePath )
} }
void BGAnimationLayer::LoadFromAniLayerFile( CString sPath ) void BGAnimationLayer::LoadFromAniLayerFile( const CString& sPath )
{ {
/* Generic BGAs are new. Animation directories with no INI are old and obsolete. /* Generic BGAs are new. Animation directories with no INI are old and obsolete.
* Don't combine them. */ * Don't combine them. */
@@ -411,61 +411,43 @@ void BGAnimationLayer::LoadFromAniLayerFile( CString sPath )
m_SubActors[i]->SetBlendMode( BLEND_ADD ); m_SubActors[i]->SetBlendMode( BLEND_ADD );
} }
void BGAnimationLayer::LoadFromIni( const CString& sAniDir_, const IniKey& layer )
void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
{ {
CString sAniDir = sAniDir_;
Init(); Init();
if( sAniDir.Right(1) != "/" ) if( sAniDir.Right(1) != "/" )
sAniDir += "/"; sAniDir += "/";
ASSERT( IsADirectory(sAniDir) ); DEBUG_ASSERT( IsADirectory(sAniDir) );
CHECKPOINT_M( ssprintf( "BGAnimationLayer::LoadFromIni \"%s\"::%s %s", CHECKPOINT_M( ssprintf( "BGAnimationLayer::LoadFromIni \"%s\" %s",
sAniDir.c_str(), sLayer.c_str(), m_bGeneric? "(generic) ":"" ) ); sAniDir.c_str(), m_bGeneric? "(generic) ":"" ) );
CString sPathToIni = sAniDir + "BGAnimation.ini";
IniFile ini;
ini.ReadFile( sPathToIni );
{ {
// CString sPlayer;
// Can we ditch this? It's the same as "Condition=IsPlayerEnabled(p)". -Chris if( layer.GetValue("Player", sPlayer) )
// ASSERT_M( 0, "The BGAnimation parameter 'Player' is deprecated. Please use 'Condition=IsPlayerEnabled(p)'." );
int player;
if( ini.GetValue( sLayer, "Player", player ) )
{
PlayerNumber pn = (PlayerNumber)(player-1);
if( pn>=0 && pn<NUM_PLAYERS )
{
if( !GAMESTATE->IsPlayerEnabled(pn) )
return;
}
else
{
LOG->Warn("BGA \"%s\" %s has an invalid Player field", sAniDir.c_str(), sLayer.c_str() );
}
}
} }
{ {
CString expr; CString expr;
if( ini.GetValue(sLayer,"Cond",expr) || ini.GetValue(sLayer,"Condition",expr) ) if( layer.GetValue("Cond",expr) || layer.GetValue("Condition",expr) )
{ {
if( !Lua::RunExpressionB( expr ) ) if( !Lua::RunExpressionB( expr ) )
return; return;
} }
} }
bool Stretch = false; bool bStretch = false;
{ {
CString type = "sprite"; CString type = "sprite";
ini.GetValue( sLayer, "Type", type ); layer.GetValue( "Type", type );
type.MakeLower(); type.MakeLower();
/* The preferred way of stretching a sprite to fit the screen is "Type=sprite" /* The preferred way of stretching a sprite to fit the screen is "Type=sprite"
* and "stretch=1". "type=1" is for backwards-compatibility. */ * and "stretch=1". "type=1" is for backwards-compatibility. */
ini.GetValue( sLayer, "Stretch", Stretch ); layer.GetValue( "Stretch", bStretch );
// Check for string match first, then do integer match. // Check for string match first, then do integer match.
// "if(atoi(type)==0)" was matching against all string matches. // "if(atoi(type)==0)" was matching against all string matches.
@@ -485,7 +467,7 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
else if( atoi(type) == 1 ) else if( atoi(type) == 1 )
{ {
m_Type = TYPE_SPRITE; m_Type = TYPE_SPRITE;
Stretch = true; bStretch = true;
} }
else if( atoi(type) == 2 ) else if( atoi(type) == 2 )
{ {
@@ -502,10 +484,8 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
} }
{ {
const IniFile::key *key = ini.GetKey( sLayer ); for( IniKey::const_iterator i = layer.begin();
if( key ) i != layer.end(); ++i)
for( IniFile::key::const_iterator i = key->begin();
i != key->end(); ++i)
{ {
CString KeyName = i->first; /* "OnCommand" */ CString KeyName = i->first; /* "OnCommand" */
KeyName.MakeLower(); KeyName.MakeLower();
@@ -525,34 +505,34 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
} }
ini.GetValue( sLayer, "CommandRepeatSeconds", m_fRepeatCommandEverySeconds ); layer.GetValue( "CommandRepeatSeconds", m_fRepeatCommandEverySeconds );
m_fSecondsUntilNextCommand = m_fRepeatCommandEverySeconds; m_fSecondsUntilNextCommand = m_fRepeatCommandEverySeconds;
ini.GetValue( sLayer, "FOV", m_fFOV ); layer.GetValue( "FOV", m_fFOV );
ini.GetValue( sLayer, "Lighting", m_bLighting ); layer.GetValue( "Lighting", m_bLighting );
ini.GetValue( sLayer, "TexCoordVelocityX", m_fTexCoordVelocityX ); layer.GetValue( "TexCoordVelocityX", m_fTexCoordVelocityX );
ini.GetValue( sLayer, "TexCoordVelocityY", m_fTexCoordVelocityY ); layer.GetValue( "TexCoordVelocityY", m_fTexCoordVelocityY );
ini.GetValue( sLayer, "DrawCond", m_sDrawCond ); layer.GetValue( "DrawCond", m_sDrawCond );
// compat: // compat:
ini.GetValue( sLayer, "StretchTexCoordVelocityX", m_fTexCoordVelocityX ); layer.GetValue( "StretchTexCoordVelocityX", m_fTexCoordVelocityX );
ini.GetValue( sLayer, "StretchTexCoordVelocityY", m_fTexCoordVelocityY ); layer.GetValue( "StretchTexCoordVelocityY", m_fTexCoordVelocityY );
ini.GetValue( sLayer, "ZoomMin", m_fZoomMin ); layer.GetValue( "ZoomMin", m_fZoomMin );
ini.GetValue( sLayer, "ZoomMax", m_fZoomMax ); layer.GetValue( "ZoomMax", m_fZoomMax );
ini.GetValue( sLayer, "VelocityXMin", m_fVelocityXMin ); layer.GetValue( "VelocityXMin", m_fVelocityXMin );
ini.GetValue( sLayer, "VelocityXMax", m_fVelocityXMax ); layer.GetValue( "VelocityXMax", m_fVelocityXMax );
ini.GetValue( sLayer, "VelocityYMin", m_fVelocityYMin ); layer.GetValue( "VelocityYMin", m_fVelocityYMin );
ini.GetValue( sLayer, "VelocityYMax", m_fVelocityYMax ); layer.GetValue( "VelocityYMax", m_fVelocityYMax );
ini.GetValue( sLayer, "VelocityZMin", m_fVelocityZMin ); layer.GetValue( "VelocityZMin", m_fVelocityZMin );
ini.GetValue( sLayer, "VelocityZMax", m_fVelocityZMax ); layer.GetValue( "VelocityZMax", m_fVelocityZMax );
ini.GetValue( sLayer, "OverrideSpeed", m_fOverrideSpeed ); layer.GetValue( "OverrideSpeed", m_fOverrideSpeed );
ini.GetValue( sLayer, "NumParticles", m_iNumParticles ); layer.GetValue( "NumParticles", m_iNumParticles );
ini.GetValue( sLayer, "ParticlesBounce", m_bParticlesBounce ); layer.GetValue( "ParticlesBounce", m_bParticlesBounce );
ini.GetValue( sLayer, "TilesStartX", m_fTilesStartX ); layer.GetValue( "TilesStartX", m_fTilesStartX );
ini.GetValue( sLayer, "TilesStartY", m_fTilesStartY ); layer.GetValue( "TilesStartY", m_fTilesStartY );
ini.GetValue( sLayer, "TilesSpacingX", m_fTilesSpacingX ); layer.GetValue( "TilesSpacingX", m_fTilesSpacingX );
ini.GetValue( sLayer, "TilesSpacingY", m_fTilesSpacingY ); layer.GetValue( "TilesSpacingY", m_fTilesSpacingY );
ini.GetValue( sLayer, "TileVelocityX", m_fTileVelocityX ); layer.GetValue( "TileVelocityX", m_fTileVelocityX );
ini.GetValue( sLayer, "TileVelocityY", m_fTileVelocityY ); layer.GetValue( "TileVelocityY", m_fTileVelocityY );
bool NeedTextureStretch = false; bool NeedTextureStretch = false;
@@ -564,11 +544,11 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
{ {
case TYPE_SPRITE: case TYPE_SPRITE:
{ {
Actor* pActor = LoadFromActorFile( sPathToIni, sLayer ); Actor* pActor = LoadFromActorFile( sAniDir, layer );
m_SubActors.push_back( pActor ); m_SubActors.push_back( pActor );
if( !m_bGeneric ) if( !m_bGeneric )
{ {
if( Stretch ) if( bStretch )
pActor->StretchTo( FullScreenRectF ); pActor->StretchTo( FullScreenRectF );
else else
pActor->SetXY( SCREEN_CENTER_X, SCREEN_CENTER_Y ); pActor->SetXY( SCREEN_CENTER_X, SCREEN_CENTER_Y );
@@ -578,7 +558,7 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
case TYPE_PARTICLES: case TYPE_PARTICLES:
{ {
CString sFile; CString sFile;
ini.GetValue( sLayer, "File", sFile ); layer.GetValue( "File", sFile );
FixSlashesInPlace( sFile ); FixSlashesInPlace( sFile );
CString sPath = sAniDir+sFile; CString sPath = sAniDir+sFile;
@@ -608,7 +588,7 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
case TYPE_TILES: case TYPE_TILES:
{ {
CString sFile; CString sFile;
ini.GetValue( sLayer, "File", sFile ); layer.GetValue( "File", sFile );
FixSlashesInPlace( sFile ); FixSlashesInPlace( sFile );
CString sPath = sAniDir+sFile; CString sPath = sAniDir+sFile;
@@ -641,7 +621,7 @@ void BGAnimationLayer::LoadFromIni( CString sAniDir, CString sLayer )
} }
bool bStartOnRandomFrame = false; bool bStartOnRandomFrame = false;
ini.GetValue( sLayer, "StartOnRandomFrame", bStartOnRandomFrame ); layer.GetValue( "StartOnRandomFrame", bStartOnRandomFrame );
if( bStartOnRandomFrame ) if( bStartOnRandomFrame )
{ {
for( unsigned i=0; i<m_SubActors.size(); i++ ) for( unsigned i=0; i<m_SubActors.size(); i++ )
+7 -5
View File
@@ -7,6 +7,8 @@
#include "ActorFrame.h" #include "ActorFrame.h"
#include <map> #include <map>
class IniKey;
class BGAnimationLayer : public ActorFrame class BGAnimationLayer : public ActorFrame
{ {
public: public:
@@ -15,11 +17,11 @@ public:
void Init(); void Init();
void Unload(); void Unload();
void LoadFromStaticGraphic( CString sPath ); void LoadFromStaticGraphic( const CString& sPath );
void LoadFromAniLayerFile( CString sPath ); void LoadFromAniLayerFile( const CString& sPath );
void LoadFromMovie( CString sMoviePath ); void LoadFromMovie( const CString& sMoviePath );
void LoadFromVisualization( CString sMoviePath ); void LoadFromVisualization( const CString& sMoviePath );
void LoadFromIni( CString sDir, CString sLayer ); void LoadFromIni( const CString& sAniDir, const IniKey& layer );
void Update( float fDeltaTime ); void Update( float fDeltaTime );
void DrawPrimitives(); void DrawPrimitives();
+30 -9
View File
@@ -119,28 +119,49 @@ int IniFile::GetNumValues( const CString &keyname ) const
return k->second.size(); return k->second.size();
} }
bool IniFile::GetValue( const CString &keyname, const CString &valuename, CString& value ) const bool IniKey::GetValue( const CString &valuename, CString& value ) const
{ {
keymap::const_iterator k = keys.find(keyname); const_iterator i = find(valuename);
if (k == keys.end())
return false;
key::const_iterator i = k->second.find(valuename); if( i == end() )
if( i == k->second.end() )
return false; return false;
value = i->second; value = i->second;
return true; return true;
} }
bool IniKey::SetValue( const CString &valuename, const CString &value )
{
(*this)[valuename] = value;
return true;
}
bool IniFile::GetValue( const CString &keyname, const CString &valuename, CString& value ) const
{
keymap::const_iterator k = keys.find(keyname);
if (k == keys.end())
return false;
return k->second.GetValue( valuename, value );
}
bool IniFile::SetValue( const CString &keyname, const CString &valuename, const CString &value ) bool IniFile::SetValue( const CString &keyname, const CString &valuename, const CString &value )
{ {
keys[keyname][valuename] = value; keys[keyname].SetValue( valuename, value );
return true; return true;
} }
#define TYPE(T) \ #define TYPE(T) \
bool IniKey::GetValue( const CString &valuename, T &value ) const \
{ \
CString sValue; \
if( !GetValue(valuename,sValue) ) \
return false; \
return FromString( sValue, value ); \
} \
bool IniKey::SetValue( const CString &valuename, T value ) \
{ \
return SetValue( valuename, ToString(value) ); \
} \
bool IniFile::GetValue( const CString &keyname, const CString &valuename, T &value ) const \ bool IniFile::GetValue( const CString &keyname, const CString &valuename, T &value ) const \
{ \ { \
CString sValue; \ CString sValue; \
@@ -182,7 +203,7 @@ bool IniFile::DeleteKey(const CString &keyname)
return true; return true;
} }
const IniFile::key *IniFile::GetKey(const CString &keyname) const const IniKey *IniFile::GetKey(const CString &keyname) const
{ {
keymap::const_iterator i = keys.find(keyname); keymap::const_iterator i = keys.find(keyname);
if( i == keys.end() ) if( i == keys.end() )
+17 -2
View File
@@ -8,12 +8,27 @@ using namespace std;
class RageFileBasic; class RageFileBasic;
class IniKey : public map<CString, CString>
{
public:
bool GetValue( const CString &valuename, CString& value ) const;
bool GetValue( const CString &valuename, int& value ) const;
bool GetValue( const CString &valuename, unsigned& value ) const;
bool GetValue( const CString &valuename, float& value ) const;
bool GetValue( const CString &valuename, bool& value ) const;
bool SetValue( const CString &valuename, const CString &value );
bool SetValue( const CString &valuename, int value );
bool SetValue( const CString &valuename, unsigned value );
bool SetValue( const CString &valuename, float value );
bool SetValue( const CString &valuename, bool value );
};
class IniFile class IniFile
{ {
public: public:
// all keys are of this type // all keys are of this type
typedef IniKey key;
typedef map<CString, CString> key;
typedef map<CString, key> keymap; typedef map<CString, key> keymap;
typedef keymap::const_iterator const_iterator; typedef keymap::const_iterator const_iterator;