#pragma once #include "accel-classic.hpp" #include "accel-jump.hpp" #include "accel-lookup.hpp" #include "accel-motivity.hpp" #include "accel-natural.hpp" #include "accel-noaccel.hpp" #include "accel-power.hpp" namespace rawaccel { union accel_union { accel_noaccel noaccel; lookup lut; classic classic_g; classic classic_l; jump jump_g; jump jump_l; natural natural_g; natural natural_l; power power_g; power power_l; loglog_sigmoid loglog_sigmoid_g; loglog_sigmoid loglog_sigmoid_l; void init(const accel_args& args) { visit([&](auto& impl) { impl = { args }; }, args); } template auto visit(Visitor vis, const accel_args& args) { switch (args.mode) { case accel_mode::classic: return visit_helper(vis, args.gain); case accel_mode::jump: return visit_helper(vis, args.gain); case accel_mode::natural: return visit_helper(vis, args.gain); case accel_mode::motivity: return visit_helper(vis, args.gain); case accel_mode::power: return visit_helper(vis, args.gain); case accel_mode::lookup: return vis(lut); default: return vis(noaccel); } } private: template