Replace some functor structs with lambdas, closures or range-based fors.

This was SVN commit r16923.
This commit is contained in:
leper 2015-08-19 03:33:04 +00:00
parent 36c6b50944
commit 558d43bac5
6 changed files with 30 additions and 88 deletions

View File

@ -30,19 +30,6 @@
#include "simulation2/components/ICmpTerrain.h" #include "simulation2/components/ICmpTerrain.h"
#include "simulation2/components/ICmpVisual.h" #include "simulation2/components/ICmpVisual.h"
template<typename T, typename S>
static void delete_pair_2nd(std::pair<T,S> v)
{
delete v.second;
}
template<typename T>
struct second_equals
{
T x;
second_equals(const T& x) : x(x) {}
template<typename S> bool operator()(const S& v) { return v.second == x; }
};
bool CObjectManager::ObjectKey::operator< (const CObjectManager::ObjectKey& a) const bool CObjectManager::ObjectKey::operator< (const CObjectManager::ObjectKey& a) const
{ {
@ -170,9 +157,12 @@ CTerrain* CObjectManager::GetTerrain()
void CObjectManager::DeleteObject(CObjectEntry* entry) void CObjectManager::DeleteObject(CObjectEntry* entry)
{ {
std::map<ObjectKey, CObjectEntry*>::iterator it; std::function<bool(const std::pair<ObjectKey, CObjectEntry*>&)> second_equals =
while (m_Objects.end() != (it = find_if(m_Objects.begin(), m_Objects.end(), second_equals<CObjectEntry*>(entry)))) [&entry](const std::pair<ObjectKey, CObjectEntry*>& a) { return a.second == entry; };
m_Objects.erase(it);
std::map<ObjectKey, CObjectEntry*>::iterator it = m_Objects.begin();
while (m_Objects.end() != (it = find_if(it, m_Objects.end(), second_equals)))
it = m_Objects.erase(it);
delete entry; delete entry;
} }
@ -180,18 +170,12 @@ void CObjectManager::DeleteObject(CObjectEntry* entry)
void CObjectManager::UnloadObjects() void CObjectManager::UnloadObjects()
{ {
std::for_each( for (const std::pair<ObjectKey, CObjectEntry*>& p : m_Objects)
m_Objects.begin(), delete p.second;
m_Objects.end(),
delete_pair_2nd<ObjectKey, CObjectEntry*>
);
m_Objects.clear(); m_Objects.clear();
std::for_each( for (const std::pair<CStrW, CObjectBase*>& p : m_ObjectBases)
m_ObjectBases.begin(), delete p.second;
m_ObjectBases.end(),
delete_pair_2nd<CStrW, CObjectBase*>
);
m_ObjectBases.clear(); m_ObjectBases.clear();
} }

View File

@ -37,14 +37,6 @@
TIMER_ADD_CLIENT(tc_ShaderValidation); TIMER_ADD_CLIENT(tc_ShaderValidation);
struct revcompare2nd
{
template<typename S, typename T> bool operator()(const std::pair<S, T>& a, const std::pair<S, T>& b) const
{
return b.second < a.second;
}
};
CShaderManager::CShaderManager() CShaderManager::CShaderManager()
{ {
#if USE_SHADER_XML_VALIDATION #if USE_SHADER_XML_VALIDATION
@ -498,7 +490,10 @@ bool CShaderManager::NewEffect(const char* name, const CShaderDefines& baseDefin
} }
// Sort by preference, tie-break on order of specification // Sort by preference, tie-break on order of specification
std::stable_sort(usableTechs.begin(), usableTechs.end(), revcompare2nd()); std::stable_sort(usableTechs.begin(), usableTechs.end(),
[](const std::pair<XMBElement, int>& a, const std::pair<XMBElement, int>& b) {
return b.second < a.second;
});
CShaderDefines techDefines = baseDefines; CShaderDefines techDefines = baseDefines;

View File

@ -55,22 +55,16 @@ CmdLineArgs::CmdLineArgs(int argc, const char* argv[])
} }
} }
template<typename T>
struct first_equals
{
T x;
first_equals(const T& x) : x(x) {}
template<typename S> bool operator()(const S& v) { return v.first == x; }
};
bool CmdLineArgs::Has(const char* name) const bool CmdLineArgs::Has(const char* name) const
{ {
return find_if(m_Args.begin(), m_Args.end(), first_equals<CStr>(name)) != m_Args.end(); return m_Args.end() != find_if(m_Args.begin(), m_Args.end(),
[&name](const std::pair<CStr, CStr>& a) { return a.first == name; });
} }
CStr CmdLineArgs::Get(const char* name) const CStr CmdLineArgs::Get(const char* name) const
{ {
ArgsT::const_iterator it = find_if(m_Args.begin(), m_Args.end(), first_equals<CStr>(name)); ArgsT::const_iterator it = find_if(m_Args.begin(), m_Args.end(),
[&name](const std::pair<CStr, CStr>& a) { return a.first == name; });
if (it != m_Args.end()) if (it != m_Args.end())
return it->second; return it->second;
else else
@ -83,7 +77,8 @@ std::vector<CStr> CmdLineArgs::GetMultiple(const char* name) const
ArgsT::const_iterator it = m_Args.begin(); ArgsT::const_iterator it = m_Args.begin();
while (1) while (1)
{ {
it = find_if(it, m_Args.end(), first_equals<CStr>(name)); it = find_if(it, m_Args.end(),
[&name](const std::pair<CStr, CStr>& a) { return a.first == name; });
if (it == m_Args.end()) if (it == m_Args.end())
break; break;
values.push_back(it->second); values.push_back(it->second);

View File

@ -33,32 +33,6 @@
#include <algorithm> #include <algorithm>
// Handy things for STL:
/// Functor for sorting pairs, using the &lt;-ordering of their second values.
struct compare2nd
{
template<typename S, typename T> bool operator()(const std::pair<S, T>& a, const std::pair<S, T>& b) const
{
return a.second < b.second;
}
};
/// Functor for comparing the firsts of pairs to a specified value.
template<typename S> struct equal1st
{
const S& val;
equal1st(const S& val) : val(val) {}
template <typename T> bool operator()(const std::pair<S, T>& a) const
{
return a.first == val;
}
private:
const equal1st& operator=(const equal1st& rhs);
};
//////////////////////////////////////////////////////////////////////////
// Global overlay list management: // Global overlay list management:
static std::vector<std::pair<ITerrainOverlay*, int> > g_TerrainOverlayList; static std::vector<std::pair<ITerrainOverlay*, int> > g_TerrainOverlayList;
@ -71,14 +45,16 @@ ITerrainOverlay::ITerrainOverlay(int priority)
// overlays doesn't randomly disturb all the existing ones (which would // overlays doesn't randomly disturb all the existing ones (which would
// be noticeable if they have the same priority and overlap). // be noticeable if they have the same priority and overlap).
std::stable_sort(g_TerrainOverlayList.begin(), g_TerrainOverlayList.end(), std::stable_sort(g_TerrainOverlayList.begin(), g_TerrainOverlayList.end(),
compare2nd()); [](const std::pair<ITerrainOverlay*, int>& a, const std::pair<ITerrainOverlay*, int>& b) {
return a.second < b.second;
});
} }
ITerrainOverlay::~ITerrainOverlay() ITerrainOverlay::~ITerrainOverlay()
{ {
std::vector<std::pair<ITerrainOverlay*, int> >::iterator newEnd = std::vector<std::pair<ITerrainOverlay*, int> >::iterator newEnd =
std::remove_if(g_TerrainOverlayList.begin(), g_TerrainOverlayList.end(), std::remove_if(g_TerrainOverlayList.begin(), g_TerrainOverlayList.end(),
equal1st<ITerrainOverlay*>(this)); [this](const std::pair<ITerrainOverlay*, int>& a) { return a.first == this; });
g_TerrainOverlayList.erase(newEnd, g_TerrainOverlayList.end()); g_TerrainOverlayList.erase(newEnd, g_TerrainOverlayList.end());
} }

View File

@ -31,12 +31,6 @@
#include "ps/CLogger.h" #include "ps/CLogger.h"
#include "ps/Profiler2.h" #include "ps/Profiler2.h"
namespace {
struct SortFun {
bool operator() (std::pair<float, CEntityHandle> i, std::pair<float, CEntityHandle> j) { return (i.first<j.first);}
} sortFun;
}
entity_id_t EntitySelection::PickEntityAtPoint(CSimulation2& simulation, const CCamera& camera, int screenX, int screenY, player_id_t player, bool allowEditorSelectables) entity_id_t EntitySelection::PickEntityAtPoint(CSimulation2& simulation, const CCamera& camera, int screenX, int screenY, player_id_t player, bool allowEditorSelectables)
{ {
PROFILE2("PickEntityAtPoint"); PROFILE2("PickEntityAtPoint");
@ -64,7 +58,10 @@ entity_id_t EntitySelection::PickEntityAtPoint(CSimulation2& simulation, const C
} }
// Sort hits by distance // Sort hits by distance
std::sort(hits.begin(), hits.end(), sortFun); std::sort(hits.begin(), hits.end(),
[](const std::pair<float, CEntityHandle>& a, const std::pair<float, CEntityHandle>& b) {
return a.first < b.first;
});
CmpPtr<ICmpRangeManager> cmpRangeManager(simulation, SYSTEM_ENTITY); CmpPtr<ICmpRangeManager> cmpRangeManager(simulation, SYSTEM_ENTITY);
ENSURE(cmpRangeManager); ENSURE(cmpRangeManager);

View File

@ -165,12 +165,6 @@ void AtlasViewActor::SetParam(const std::wstring& name, const AtlasMessage::Colo
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
template<typename T, typename S>
static void delete_pair_2nd(std::pair<T,S> v)
{
delete v.second;
}
AtlasViewGame::AtlasViewGame() AtlasViewGame::AtlasViewGame()
: m_SpeedMultiplier(0.f), m_IsTesting(false) : m_SpeedMultiplier(0.f), m_IsTesting(false)
{ {
@ -179,7 +173,8 @@ AtlasViewGame::AtlasViewGame()
AtlasViewGame::~AtlasViewGame() AtlasViewGame::~AtlasViewGame()
{ {
std::for_each(m_SavedStates.begin(), m_SavedStates.end(), delete_pair_2nd<std::wstring, SimState*>); for (const std::pair<std::wstring, SimState*>& p : m_SavedStates)
delete p.second;
} }
CSimulation2* AtlasViewGame::GetSimulation2() CSimulation2* AtlasViewGame::GetSimulation2()