From 7dd10c92f48764922fe810eecfc763d0ca68b275 Mon Sep 17 00:00:00 2001 From: Steve Checkoway Date: Sat, 5 Aug 2006 04:46:11 +0000 Subject: [PATCH] =?UTF-8?q?Instead=20of=20using=20the=20MODS=5FGROUP=5FASS?= =?UTF-8?q?IGN=20=C3=BCber-macro,=20add=20members=20for=20assigning,=20bot?= =?UTF-8?q?h=20to=20an=20individual=20field=20and=20for=20the=20entire=20g?= =?UTF-8?q?roup.=20Also=20add=20FromString=20and=20generic=20zero=20argume?= =?UTF-8?q?nt=20Call=20members.=20For=20the=20templated=20Assign,=20Call,?= =?UTF-8?q?=20and=20Toggle[1]=20members,=20use=20the=20macros=20to=20make?= =?UTF-8?q?=20getting=20pointers=20to=20data/function=20members=20easier.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Toggle just toggles a boolean. This would seem to have strange effects that are not consistent with the others. Calling Toggle with ModsLevel_Song and then following that by calling it with ModsLevel_Stage will cause Stage and Song groups to be opposite w.r.t. that bool. This is only used in two places. Perhaps Assign() with the value of the smallest ModsLevel used--that is the level passed to Toggle currently--toggled should be used instead. --- stepmania/src/ModsGroup.h | 59 +++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/stepmania/src/ModsGroup.h b/stepmania/src/ModsGroup.h index bd2826186f..f9162b5044 100644 --- a/stepmania/src/ModsGroup.h +++ b/stepmania/src/ModsGroup.h @@ -3,6 +3,8 @@ #ifndef ModLevel_H #define ModLevel_H +#include "EnumHelper.h" + enum ModsLevel { ModsLevel_Preferred, // user-chosen player options. Does not include any forced mods. @@ -11,25 +13,22 @@ enum ModsLevel NUM_ModsLevel, }; -#define MODS_GROUP_ASSIGN( modsGroup, modsLevel, assignment ) \ - { \ - for( int i=(ModsLevel)(modsLevel); i struct ModsGroup { + typedef T GroupType; T m_[NUM_ModsLevel]; RageTimer m_timer; T m_current; // approaches ModsLevel_Song void Init() { - MODS_GROUP_ASSIGN( *this, (ModsLevel)0, .Init() ); - m_current.Init(); + Call( ModsLevel_Preferred, &T::Init ); } void Update( float fDelta ) @@ -39,6 +38,48 @@ struct ModsGroup fDelta = m_timer.GetDeltaTime(); m_current.Approach( m_[ModsLevel_Song], fDelta ); } + + template + void Assign( ModsLevel level, U T::*member, const U &val ) + { + if( level != ModsLevel_Song ) + m_current.*member = val; + for( ; level < NUM_ModsLevel; enum_add(level, 1) ) + m_[level].*member = val; + } + + void Assign( ModsLevel level, const T &val ) + { + if( level != ModsLevel_Song ) + m_current = val; + for( ; level < NUM_ModsLevel; enum_add(level, 1) ) + m_[level] = val; + } + + void Call( ModsLevel level, void (T::*fun)() ) + { + if( level != ModsLevel_Song ) + (m_current.*fun)(); + for( ; level < NUM_ModsLevel; enum_add(level, 1) ) + (m_[level].*fun)(); + } + + void FromString( ModsLevel level, const RString &str ) + { + if( level != ModsLevel_Song ) + m_current.FromString( str ); + for( ; level < NUM_ModsLevel; enum_add(level, 1) ) + m_[level].FromString( str ); + } + + // This seems like a very strange thing to do. + void Toggle( ModsLevel level, bool T::*member ) + { + if( level != ModsLevel_Song ) + m_current.*member ^= 1; + for( ; level < NUM_ModsLevel; enum_add(level, 1) ) + m_[level].*member ^= 1; + } const T &GetPreferred() const { return m_[ModsLevel_Preferred]; } const T &GetStage() const { return m_[ModsLevel_Stage]; }