diff --git a/src/Library/EffectParameter.hpp b/src/Library/EffectParameter.hpp index 5093aab..01096a1 100644 --- a/src/Library/EffectParameter.hpp +++ b/src/Library/EffectParameter.hpp @@ -5,29 +5,28 @@ #include "Exceptions/CreatureException.hpp" namespace CreatureLib::Library { - ENUM(EffectParameterType, uint8_t, None, Bool, Int, String); + ENUM(EffectParameterType, uint8_t, None, Bool, Int, Float, String); class EffectParameter { private: EffectParameterType _type = EffectParameterType::None; - void* _val; + union { + bool _b; + int64_t _i; + const std::string _s; + float _f; + }; public: - EffectParameter() : _type(EffectParameterType::None), _val(nullptr){}; - explicit EffectParameter(bool b) : _type(EffectParameterType::Bool), _val((void*)b){}; - explicit EffectParameter(int64_t i) : _type(EffectParameterType::Int), _val((void*)i){}; - explicit EffectParameter(const std::string& s) - : _type(EffectParameterType::String), _val(new char[s.size() + 1]) { - strncpy((char*)_val, s.c_str(), s.size() + 1); - }; + EffectParameter() : _type(EffectParameterType::None){}; + explicit EffectParameter(bool b) : _type(EffectParameterType::Bool), _b(b){}; + explicit EffectParameter(int64_t i) : _type(EffectParameterType::Int), _i(i){}; + explicit EffectParameter(float f) : _type(EffectParameterType::Float), _f(f){}; + explicit EffectParameter(const std::string& s) : _type(EffectParameterType::String), _s(s){}; EffectParameter(const EffectParameter& other) = delete; EffectParameter& operator=(const EffectParameter& other) = delete; - ~EffectParameter() { - if (_type == EffectParameterType::String) { - delete[](char*) _val; - } - } + ~EffectParameter() {} EffectParameterType GetType() const noexcept { return _type; } bool AsBool() const { @@ -36,7 +35,7 @@ namespace CreatureLib::Library { ss << "Cast effect parameter to bool, but was " << EffectParameterTypeHelper::ToString(_type); throw CreatureException(ss.str()); } - return (bool)_val; + return _b; } int64_t AsInt() const { if (_type != EffectParameterType::Int) { @@ -44,15 +43,23 @@ namespace CreatureLib::Library { ss << "Cast effect parameter to int, but was " << EffectParameterTypeHelper::ToString(_type); throw CreatureException(ss.str()); } - return reinterpret_cast(_val); + return _i; } - const char* AsString() const { + float AsFloat() const { + if (_type != EffectParameterType::Float) { + std::stringstream ss; + ss << "Cast effect parameter to float, but was " << EffectParameterTypeHelper::ToString(_type); + throw CreatureException(ss.str()); + } + return _f; + } + const std::string& AsString() const { if (_type != EffectParameterType::String) { std::stringstream ss; ss << "Cast effect parameter to string, but was " << EffectParameterTypeHelper::ToString(_type); throw CreatureException(ss.str()); } - return (char*)_val; + return _s; } }; } diff --git a/tests/LibraryTests/EffectParameterTests.cpp b/tests/LibraryTests/EffectParameterTests.cpp index 843546c..a64a747 100644 --- a/tests/LibraryTests/EffectParameterTests.cpp +++ b/tests/LibraryTests/EffectParameterTests.cpp @@ -17,7 +17,12 @@ TEST_CASE("Int EffectParameter", "[Library]") { TEST_CASE("String EffectParameter", "[Library]") { auto p = EffectParameter(std::string("foobar")); - REQUIRE(strcmp(p.AsString(), "foobar") == 0); + REQUIRE(p.AsString() == "foobar"); +} + +TEST_CASE("Float EffectParameter", "[Library]") { + auto p = EffectParameter(1.5f); + REQUIRE(p.AsFloat() == Approx(1.5f)); } #endif \ No newline at end of file