From 8ec722ac9211577a27c9e544ded0f7929efcb266 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Mon, 13 May 2013 04:08:36 -0700 Subject: [PATCH] Use std::find_if instead of ugly for loops --- apps/openmw/mwmechanics/character.cpp | 72 +++++++++++++++------------ 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 6e52190d3..ebc9f33a2 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -37,7 +37,7 @@ namespace MWMechanics { -static const struct { +static const struct StateInfo { CharacterState state; const char groupname[32]; Priority priority; @@ -91,9 +91,20 @@ static const struct { { CharState_Death4, "death4", Priority_Death, false }, { CharState_Death5, "death5", Priority_Death, false }, }; -static const size_t sStateListSize = sizeof(sStateList)/sizeof(sStateList[0]); +static const StateInfo *sStateListEnd = &sStateList[sizeof(sStateList)/sizeof(sStateList[0])]; -static const struct { +class FindCharState { + CharacterState state; + +public: + FindCharState(CharacterState _state) : state(_state) { } + + bool operator()(const StateInfo &info) const + { return info.state == state; } +}; + + +static const struct WeaponInfo { WeaponType type; const char idlegroup[16]; const char movementgroup[16]; @@ -108,37 +119,39 @@ static const struct { { WeapType_ThowWeapon, "1h", "1h", "throwweapon" }, { WeapType_Spell, "spell", "", "spellcast" }, }; -static const size_t sWeaponTypeListSize = sizeof(sWeaponTypeList)/sizeof(sWeaponTypeList[0]); +static const WeaponInfo *sWeaponTypeListEnd = &sWeaponTypeList[sizeof(sWeaponTypeList)/sizeof(sWeaponTypeList[0])]; + +class FindWeaponType { + WeaponType type; + +public: + FindWeaponType(WeaponType _type) : type(_type) { } + + bool operator()(const WeaponInfo &weap) const + { return weap.type == type; } +}; void CharacterController::getCurrentGroup(std::string &group, Priority &priority, bool &loops) const { std::string name; - for(size_t i = 0;i < sStateListSize;i++) - { - if(sStateList[i].state == mCharState) - { - name = sStateList[i].groupname; - priority = sStateList[i].priority; - loops = sStateList[i].loops; - break; - } - } - if(name.empty()) + const StateInfo *state = std::find_if(sStateList, sStateListEnd, FindCharState(mCharState)); + if(state == sStateListEnd) throw std::runtime_error("Failed to find character state "+Ogre::StringConverter::toString(mCharState)); + name = state->groupname; + priority = state->priority; + loops = state->loops; + if(!(mCharState >= CharState_Death1) && mWeaponType != WeapType_None) { - for(size_t i = 0;i < sWeaponTypeListSize;i++) + const WeaponInfo *weap = std::find_if(sWeaponTypeList, sWeaponTypeListEnd, FindWeaponType(mWeaponType)); + if(weap != sWeaponTypeListEnd) { - if(sWeaponTypeList[i].type == mWeaponType) - { - if(mCharState == CharState_Idle) - (group=name) += sWeaponTypeList[i].idlegroup; - else - (group=name) += sWeaponTypeList[i].movementgroup; - break; - } + if(mCharState == CharState_Idle) + (group=name) += weap->idlegroup; + else + (group=name) += weap->movementgroup; } } @@ -149,14 +162,9 @@ void CharacterController::getCurrentGroup(std::string &group, Priority &priority void CharacterController::getWeaponGroup(WeaponType weaptype, std::string &group) { - for(size_t i = 0;i < sWeaponTypeListSize;i++) - { - if(sWeaponTypeList[i].type == weaptype) - { - group = sWeaponTypeList[i].actiongroup; - break; - } - } + const WeaponInfo *info = std::find_if(sWeaponTypeList, sWeaponTypeListEnd, FindWeaponType(weaptype)); + if(info != sWeaponTypeListEnd) + group = info->actiongroup; }