#ifndef OPENMW_COMPONENTS_ESMLOADER_RECORD_H #define OPENMW_COMPONENTS_ESMLOADER_RECORD_H #include <components/esm3/loadcell.hpp> #include <components/misc/algorithm.hpp> #include <algorithm> #include <utility> #include <vector> namespace EsmLoader { template <class T> struct Record { bool mDeleted; T mValue; template <class... Args> explicit Record(bool deleted, Args&&... args) : mDeleted(deleted) , mValue(std::forward<Args>(args)...) { } }; template <class T> using Records = std::vector<Record<T>>; template <class T, class GetKey> inline std::vector<T> prepareRecords(Records<T>& records, const GetKey& getKey) { const auto greaterByKey = [&](const auto& l, const auto& r) { return getKey(r) < getKey(l); }; const auto equalByKey = [&](const auto& l, const auto& r) { return getKey(l) == getKey(r); }; std::stable_sort(records.begin(), records.end(), greaterByKey); std::vector<T> result; Misc::forEachUnique(records.rbegin(), records.rend(), equalByKey, [&](const auto& v) { if (!v.mDeleted) result.emplace_back(std::move(v.mValue)); }); return result; } } #endif