Improve ranges::find
to support projection.
This commit is contained in:
parent
7ff1df4999
commit
9a12d44e82
4 changed files with 18 additions and 8 deletions
|
@ -165,6 +165,17 @@ fs::path GetExecutablePath();
|
||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
-- Ranges
|
-- Ranges
|
||||||
----------------------------------------------------------------------------*/
|
----------------------------------------------------------------------------*/
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
struct identity
|
||||||
|
{
|
||||||
|
template <typename T>
|
||||||
|
T &&operator()(T &&arg) const
|
||||||
|
{
|
||||||
|
return std::forward<T>(arg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
namespace ranges
|
namespace ranges
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -180,10 +191,11 @@ namespace ranges
|
||||||
std::iota(begin(range), end(range), startValue);
|
std::iota(begin(range), end(range), startValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Range, typename Value>
|
template<typename Range, typename Value, typename Proj = identity>
|
||||||
auto find(Range& range, const Value& value)
|
auto find(Range& range, const Value& value, Proj proj = {})
|
||||||
{
|
{
|
||||||
return std::find(begin(range), end(range), value);
|
return std::find_if(
|
||||||
|
begin(range), end(range), [&](const auto &elem) { return std::invoke(proj, elem) == value; });
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Range, typename Predicate>
|
template <typename Range, typename Predicate>
|
||||||
|
|
|
@ -307,8 +307,7 @@ static int CclDefineSpell(lua_State *l)
|
||||||
const int args = lua_gettop(l);
|
const int args = lua_gettop(l);
|
||||||
std::string_view identname = LuaToString(l, 1);
|
std::string_view identname = LuaToString(l, 1);
|
||||||
|
|
||||||
const auto it = ranges::find_if(SpellTypeTable,
|
const auto it = ranges::find(SpellTypeTable, identname, &SpellType::Ident);
|
||||||
[&](const SpellType *spell) { return spell->Ident == identname; });
|
|
||||||
SpellType *spell = nullptr;
|
SpellType *spell = nullptr;
|
||||||
if (it != SpellTypeTable.end()) {
|
if (it != SpellTypeTable.end()) {
|
||||||
spell = *it;
|
spell = *it;
|
||||||
|
|
|
@ -416,7 +416,7 @@ void InitSpells()
|
||||||
*/
|
*/
|
||||||
SpellType &SpellTypeByIdent(const std::string_view &ident)
|
SpellType &SpellTypeByIdent(const std::string_view &ident)
|
||||||
{
|
{
|
||||||
auto it = ranges::find_if(SpellTypeTable, [&](const SpellType* spell) { return spell->Ident == ident; });
|
auto it = ranges::find(SpellTypeTable, ident, &SpellType::Ident);
|
||||||
if (it != SpellTypeTable.end()) {
|
if (it != SpellTypeTable.end()) {
|
||||||
return **it;
|
return **it;
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,8 +188,7 @@ CUserInterface::CUserInterface() :
|
||||||
*/
|
*/
|
||||||
CPopup &PopupByIdent(std::string_view ident)
|
CPopup &PopupByIdent(std::string_view ident)
|
||||||
{
|
{
|
||||||
const auto it =
|
const auto it = ranges::find(UI.ButtonPopups, ident, &CPopup::Ident);
|
||||||
ranges::find_if(UI.ButtonPopups, [&](CPopup *popup) { return popup->Ident == ident; });
|
|
||||||
if (it != UI.ButtonPopups.end()) {
|
if (it != UI.ButtonPopups.end()) {
|
||||||
return **it;
|
return **it;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue