diff --git a/apps/openmw/mwlua/animationbindings.cpp b/apps/openmw/mwlua/animationbindings.cpp index 2f6f60ea3e..ee096a5a35 100644 --- a/apps/openmw/mwlua/animationbindings.cpp +++ b/apps/openmw/mwlua/animationbindings.cpp @@ -100,7 +100,7 @@ namespace MWLua sol::table initAnimationPackage(const Context& context) { - using FiniteFloat = Misc::FiniteFloat; + using Misc::FiniteFloat; auto view = context.sol(); auto mechanics = MWBase::Environment::get().getMechanicsManager(); diff --git a/apps/openmw/mwlua/camerabindings.cpp b/apps/openmw/mwlua/camerabindings.cpp index 345ca9af65..c6461209c5 100644 --- a/apps/openmw/mwlua/camerabindings.cpp +++ b/apps/openmw/mwlua/camerabindings.cpp @@ -16,7 +16,7 @@ namespace MWLua sol::table initCameraPackage(sol::state_view lua) { - using FiniteFloat = Misc::FiniteFloat; + using Misc::FiniteFloat; MWRender::Camera* camera = MWBase::Environment::get().getWorld()->getCamera(); MWRender::RenderingManager* renderingManager = MWBase::Environment::get().getWorld()->getRenderingManager(); diff --git a/apps/openmw/mwlua/worldbindings.cpp b/apps/openmw/mwlua/worldbindings.cpp index c960c4e9e4..c02bad3bd3 100644 --- a/apps/openmw/mwlua/worldbindings.cpp +++ b/apps/openmw/mwlua/worldbindings.cpp @@ -57,7 +57,7 @@ namespace MWLua static void addWorldTimeBindings(sol::table& api, const Context& context) { - using FiniteFloat = Misc::FiniteFloat; + using Misc::FiniteFloat; MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager(); diff --git a/components/misc/finitenumbers.hpp b/components/misc/finitenumbers.hpp index 7d27987c5f..1670791349 100644 --- a/components/misc/finitenumbers.hpp +++ b/components/misc/finitenumbers.hpp @@ -5,69 +5,48 @@ #include #include +#include namespace Misc { - struct FiniteDouble + template + struct FiniteNumber { - double mValue; - FiniteDouble(double v) + T mValue; + + FiniteNumber(T v) { if (!std::isfinite(v)) throw std::invalid_argument("Value must be a finite number"); mValue = v; } - operator double() const { return mValue; } + + operator T() const { return mValue; } }; - struct FiniteFloat - { - float mValue; - FiniteFloat(float v) - { - if (!std::isfinite(v)) - throw std::invalid_argument("Value must be a finite number"); - mValue = v; - } - operator float() const { return mValue; } - }; + using FiniteDouble = FiniteNumber; + + using FiniteFloat = FiniteNumber; } namespace sol { - using FiniteDouble = Misc::FiniteDouble; - using FiniteFloat = Misc::FiniteFloat; - - template + template bool sol_lua_check( - sol::types, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking) + types>, lua_State* state, int index, Handler&& handler, stack::record& tracking) { - bool success = sol::stack::check(L, lua_absindex(L, index), handler); + bool success = stack::check(state, lua_absindex(state, index), std::forward(handler)); tracking.use(1); return success; } - static FiniteDouble sol_lua_get(sol::types, lua_State* L, int index, sol::stack::record& tracking) + template + static Misc::FiniteNumber sol_lua_get( + types>, lua_State* state, int index, stack::record& tracking) { - double val = sol::stack::get(L, lua_absindex(L, index)); + T value = stack::get(state, lua_absindex(state, index)); tracking.use(1); - return FiniteDouble(val); - } - - template - bool sol_lua_check( - sol::types, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking) - { - bool success = sol::stack::check(L, lua_absindex(L, index), handler); - tracking.use(1); - return success; - } - - static FiniteFloat sol_lua_get(sol::types, lua_State* L, int index, sol::stack::record& tracking) - { - float val = sol::stack::get(L, lua_absindex(L, index)); - tracking.use(1); - return FiniteFloat(val); + return value; } }