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;