22 #include "../config.h"
25 #include <type_traits>
27 #include "abi/RMonoABI.h"
28 #include "RMonoAPIBackend_Def.h"
44 template <
typename ABI>
63 static auto genABIEntryTupleDummy()
65 return std::apply([](
auto... ts) {
66 return std::tuple<
ABIEntry<decltype(ts)>...>();
67 }, RMonoSupportedABITuple());
80 typedef decltype(RMonoAPIDispatcherBase::genABIEntryTupleDummy()) ABIEntryTuple;
86 ABIEntryTuple& getABIEntries() {
return abis; }
94 return selectedABIIdx < std::tuple_size_v<ABIEntryTuple>;
100 template <
typename ABI>
103 selectedABIIdx = abiIndexOf<ABI>();
110 template <
typename FuncT,
size_t idx = 0>
111 typename std::enable_if_t<idx < std::tuple_size_v<ABIEntryTuple>,
void>
foreach(FuncT f)
113 f(std::get<idx>(abis));
114 foreach<FuncT, idx+1>(f);
120 template <
typename FuncT,
size_t idx = 0>
121 typename std::enable_if_t<idx == std::tuple_size_v<ABIEntryTuple>,
void>
foreach(FuncT f) {}
129 template <
typename FuncT>
130 auto apply(FuncT f) -> decltype(applyInternal<FuncT, 0>(f))
132 return applyInternal<FuncT, 0>(f);
136 template<
typename ABI,
size_t idx = 0>
137 constexpr std::enable_if_t<idx < std::tuple_size_v<ABIEntryTuple>,
size_t> abiIndexOf()
139 if constexpr(std::is_same_v<
typename std::tuple_element_t<idx, ABIEntryTuple>::ABIType, ABI>) {
142 return abiIndexOf<ABI, idx+1>();
146 template<
typename ABI,
size_t idx = 0>
147 constexpr std::enable_if_t<idx == std::tuple_size_v<ABIEntryTuple>,
size_t> abiIndexOf() { static_assert(
false);
return 0; }
149 template <
typename FuncT,
size_t idx>
150 auto applyInternal(FuncT f) -> decltype(f(std::get<0>(abis)))
152 if constexpr(idx < std::tuple_size_v<ABIEntryTuple>) {
153 if (idx == selectedABIIdx) {
154 return f(std::get<idx>(abis));
156 return applyInternal<FuncT, idx+1>(f);
160 return f(std::get<0>(abis));
167 size_t selectedABIIdx;