lut_from_list: Reduce number of required template arguments

This commit is contained in:
MerryMage
2020-04-04 09:52:06 +01:00
parent 8658afd8c5
commit fe583aa076
3 changed files with 32 additions and 28 deletions

View File

@@ -6,17 +6,33 @@
#pragma once
#include <array>
#include <initializer_list>
#include <map>
#include <type_traits>
#include <mp/metafunction/apply.h>
#include <mp/traits/is_instance_of_template.h>
#include <mp/typelist/list.h>
#ifdef _MSC_VER
#include <mp/typelist/head.h>
#endif
namespace Dynarmic::Common {
template <typename KeyT, typename ValueT, typename Function, typename ...Values>
template <typename Function, typename ...Values>
inline auto GenerateLookupTableFromList(Function f, mp::list<Values...>) {
static const std::array<std::pair<KeyT, ValueT>, sizeof...(Values)> pair_array{f(Values{})...};
return std::map<KeyT, ValueT>(pair_array.begin(), pair_array.end());
#ifdef _MSC_VER
using PairT = std::invoke_result_t<Function, mp::head<mp::list<Values...>>>;
#else
using PairT = std::common_type_t<std::invoke_result_t<Function, Values>...>;
#endif
using MapT = mp::apply<std::map, PairT>;
static_assert(mp::is_instance_of_template_v<std::pair, PairT>);
const std::initializer_list<PairT> pair_array{f(Values{})...};
return MapT(pair_array.begin(), pair_array.end());
}
} // namespace Dynarmic::Common