#ifndef OPENMW_COMPONENTS_MISC_FINITENUMBERS_HPP #define OPENMW_COMPONENTS_MISC_FINITENUMBERS_HPP #include #include #include #include namespace Misc { template struct FiniteNumber { T mValue; FiniteNumber(T v) { if (!std::isfinite(v)) throw std::invalid_argument("Value must be a finite number"); mValue = v; } operator T() const { return mValue; } }; using FiniteDouble = FiniteNumber; using FiniteFloat = FiniteNumber; } namespace sol { template bool sol_lua_check( types>, lua_State* state, int index, Handler&& handler, stack::record& tracking) { bool success = stack::check(state, lua_absindex(state, index), std::forward(handler)); tracking.use(1); return success; } template static Misc::FiniteNumber sol_lua_get( types>, lua_State* state, int index, stack::record& tracking) { T value = stack::get(state, lua_absindex(state, index)); tracking.use(1); return value; } } #endif