Rework of EffectParameter storage, added float value.
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
a6ab69e043
commit
beb50a60b0
|
@ -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<int64_t>(_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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue