diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index ad96212fe..e56d723e5 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -22,6 +22,7 @@ namespace Nz constexpr Flags(E enumVal); explicit constexpr operator bool() const; + explicit constexpr operator UInt32() const; constexpr Flags operator~() const; constexpr Flags operator&(Flags rhs) const; diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index fa8dd4950..7a23861a2 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -33,6 +33,12 @@ namespace Nz return m_value != 0; } + template + constexpr Flags::operator UInt32() const + { + return m_value; + } + template constexpr Flags Flags::operator~() const { diff --git a/include/Nazara/Lua/LuaInstance.inl b/include/Nazara/Lua/LuaInstance.inl index 9bc20c73a..db5c1e225 100644 --- a/include/Nazara/Lua/LuaInstance.inl +++ b/include/Nazara/Lua/LuaInstance.inl @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -99,19 +100,40 @@ namespace Nz } template - std::enable_if_t::value, unsigned int> LuaImplQueryArg(const LuaInstance& instance, int index, T* arg, TypeTag) + std::enable_if_t::value && !EnableFlagsOperators::value, unsigned int> LuaImplQueryArg(const LuaInstance& instance, int index, T* arg, TypeTag) { using UnderlyingT = std::underlying_type_t; return LuaImplQueryArg(instance, index, reinterpret_cast(arg), TypeTag()); } template - std::enable_if_t::value, unsigned int> LuaImplQueryArg(const LuaInstance& instance, int index, T* arg, T defValue, TypeTag) + std::enable_if_t::value && !EnableFlagsOperators::value, unsigned int> LuaImplQueryArg(const LuaInstance& instance, int index, T* arg, T defValue, TypeTag) { using UnderlyingT = std::underlying_type_t; return LuaImplQueryArg(instance, index, reinterpret_cast(arg), static_cast(defValue), TypeTag()); } + template + std::enable_if_t::value && EnableFlagsOperators::value, unsigned int> LuaImplQueryArg(const LuaInstance& instance, int index, T* arg, TypeTag) + { + Flags flags; + return LuaImplQueryArg(instance, index, &flags, TypeTag()); + } + + template + std::enable_if_t::value && EnableFlagsOperators::value, unsigned int> LuaImplQueryArg(const LuaInstance& instance, int index, T* arg, T defValue, TypeTag) + { + Flags flags; + return LuaImplQueryArg(instance, index, &flags, Flags(defValue), TypeTag()); + } + + template + unsigned int LuaImplQueryArg(const LuaInstance& instance, int index, Flags* arg, TypeTag>) + { + *arg = Flags(instance.CheckBoundInteger(index)); + return 1; + } + template std::enable_if_t::value, unsigned int> LuaImplQueryArg(const LuaInstance& instance, int index, T* arg, TypeTag) { @@ -184,12 +206,26 @@ namespace Nz } template - std::enable_if_t::value, int> LuaImplReplyVal(const LuaInstance& instance, T val, TypeTag) + std::enable_if_t::value && !EnableFlagsOperators::value, int> LuaImplReplyVal(const LuaInstance& instance, T val, TypeTag) { using EnumT = typename std::underlying_type::type; return LuaImplReplyVal(instance, static_cast(val), TypeTag()); } + template + std::enable_if_t::value && EnableFlagsOperators::value, int> LuaImplReplyVal(const LuaInstance& instance, T val, TypeTag) + { + Flags flags(val); + return LuaImplReplyVal(instance, flags, TypeTag()); + } + + template + int LuaImplReplyVal(const LuaInstance& instance, Flags val, TypeTag>) + { + UInt32 bitField(val); + return LuaImplReplyVal(instance, bitField, TypeTag()); + } + template std::enable_if_t::value, int> LuaImplReplyVal(const LuaInstance& instance, T val, TypeTag) {