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/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
{
@ -170,9 +157,12 @@ CTerrain* CObjectManager::GetTerrain()
void CObjectManager::DeleteObject(CObjectEntry* entry)
{
std::map<ObjectKey, CObjectEntry*>::iterator it;
while (m_Objects.end() != (it = find_if(m_Objects.begin(), m_Objects.end(), second_equals<CObjectEntry*>(entry))))
m_Objects.erase(it);
std::function<bool(const std::pair<ObjectKey, CObjectEntry*>&)> second_equals =
[&entry](const std::pair<ObjectKey, CObjectEntry*>& a) { return a.second == entry; };
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;
}
@ -180,18 +170,12 @@ void CObjectManager::DeleteObject(CObjectEntry* entry)
void CObjectManager::UnloadObjects()
{
std::for_each(
m_Objects.begin(),
m_Objects.end(),
delete_pair_2nd<ObjectKey, CObjectEntry*>
);
for (const std::pair<ObjectKey, CObjectEntry*>& p : m_Objects)
delete p.second;
m_Objects.clear();
std::for_each(
m_ObjectBases.begin(),
m_ObjectBases.end(),
delete_pair_2nd<CStrW, CObjectBase*>
);
for (const std::pair<CStrW, CObjectBase*>& p : m_ObjectBases)
delete p.second;
m_ObjectBases.clear();
}

View File

@ -37,14 +37,6 @@
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()
{
#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
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;

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
{
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
{
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())
return it->second;
else
@ -83,7 +77,8 @@ std::vector<CStr> CmdLineArgs::GetMultiple(const char* name) const
ArgsT::const_iterator it = m_Args.begin();
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())
break;
values.push_back(it->second);

View File

@ -33,32 +33,6 @@
#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:
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
// be noticeable if they have the same priority and overlap).
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()
{
std::vector<std::pair<ITerrainOverlay*, int> >::iterator newEnd =
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());
}

View File

@ -31,12 +31,6 @@
#include "ps/CLogger.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)
{
PROFILE2("PickEntityAtPoint");
@ -64,7 +58,10 @@ entity_id_t EntitySelection::PickEntityAtPoint(CSimulation2& simulation, const C
}
// 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);
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()
: m_SpeedMultiplier(0.f), m_IsTesting(false)
{
@ -179,7 +173,8 @@ 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()