#pragma once #include "accel-union.hpp" namespace rawaccel { class accel_invoker { using callback_t = double (*)(const accel_union&, double, double); callback_t cb = &invoke_impl; template static double invoke_impl(const accel_union& u, double x, double w) { return apply_weighted(reinterpret_cast(u), x, w); } public: accel_invoker(const accel_args& args) { cb = visit_accel([](auto&& arg) { using T = remove_ref_t; if constexpr (is_same_v) { static_assert(sizeof motivity == sizeof binlog_lut); return &invoke_impl; } else { return &invoke_impl; } }, make_mode(args), accel_union{}); } accel_invoker() = default; double invoke(const accel_union& u, double x, double weight = 1) const { return (*cb)(u, x, weight); } }; inline vec2 invokers(const settings& args) { return { accel_invoker(args.argsv.x), accel_invoker(args.argsv.y) }; } }