diff --git a/src/coders/commons.cpp b/src/coders/commons.cpp index ad4a8677..35e78221 100644 --- a/src/coders/commons.cpp +++ b/src/coders/commons.cpp @@ -231,20 +231,20 @@ bool BasicParser::parseNumber(int sign, number_u& out) { if (c == '0' && pos + 1 < source.length() && (base = is_box(source[pos+1])) != 10) { pos += 2; - out.ival = parseSimpleInt(base); + out = parseSimpleInt(base); return true; } else if (c == 'i' && pos + 2 < source.length() && source[pos+1] == 'n' && source[pos+2] == 'f') { pos += 3; - out.fval = INFINITY * sign; + out = INFINITY * sign; return false; } else if (c == 'n' && pos + 2 < source.length() && source[pos+1] == 'a' && source[pos+2] == 'n') { pos += 3; - out.fval = NAN * sign; + out = NAN * sign; return false; } int64_t value = parseSimpleInt(base); if (!hasNext()) { - out.ival = value * sign; + out = value * sign; return true; } c = source[pos]; @@ -257,7 +257,7 @@ bool BasicParser::parseNumber(int sign, number_u& out) { } else if (peek() == '+'){ pos++; } - out.fval = sign * value * power(10.0, s * parseSimpleInt(10)); + out = sign * value * power(10.0, s * parseSimpleInt(10)); return false; } if (c == '.') { @@ -284,13 +284,13 @@ bool BasicParser::parseNumber(int sign, number_u& out) { } else if (peek() == '+'){ pos++; } - out.fval = sign * dvalue * power(10.0, s * parseSimpleInt(10)); + out = sign * dvalue * power(10.0, s * parseSimpleInt(10)); return false; } - out.fval = sign * dvalue; + out = sign * dvalue; return false; } - out.ival = sign * value; + out = sign * value; return true; } diff --git a/src/coders/commons.h b/src/coders/commons.h index 509ff0d6..ee844d06 100644 --- a/src/coders/commons.h +++ b/src/coders/commons.h @@ -5,11 +5,6 @@ #include #include "../typedefs.h" -union number_u { - double fval; - int64_t ival; -}; - inline int is_box(int c) { switch (c) { case 'B': @@ -105,4 +100,4 @@ protected: BasicParser(std::string filename, std::string source); }; -#endif // CODERS_COMMONS_H_ \ No newline at end of file +#endif // CODERS_COMMONS_H_ diff --git a/src/coders/json.cpp b/src/coders/json.cpp index 315e103e..74b6dc15 100644 --- a/src/coders/json.cpp +++ b/src/coders/json.cpp @@ -190,10 +190,10 @@ Value* Parser::parseValue() { number_u num; valtype type; if (parseNumber(next == '-' ? -1 : 1, num)) { - val = num.ival; + val = std::get(num); type = valtype::integer; } else { - val = num.fval; + val = std::get(num); type = valtype::number; } return new Value(type, val); @@ -227,10 +227,10 @@ Value* Parser::parseValue() { number_u num; valtype type; if (parseNumber(1, num)) { - val = num.ival; + val = std::get(num); type = valtype::integer; } else { - val = num.fval; + val = std::get(num); type = valtype::number; } return new Value(type, val); diff --git a/src/coders/toml.cpp b/src/coders/toml.cpp index eb294f74..bca14d38 100644 --- a/src/coders/toml.cpp +++ b/src/coders/toml.cpp @@ -206,10 +206,10 @@ void Reader::readSection(Section* section /*nullable*/) { number_u num; if (parseNumber(1, num)) { if (section) - section->set(name, (double)num.ival); + section->set(name, (double)std::get(num)); } else { if (section) - section->set(name, num.fval); + section->set(name, std::get(num)); } } else if (c == '-' || c == '+') { int sign = c == '-' ? -1 : 1; @@ -217,10 +217,10 @@ void Reader::readSection(Section* section /*nullable*/) { number_u num; if (parseNumber(sign, num)) { if (section) - section->set(name, (double)num.ival); + section->set(name, (double)std::get(num)); } else { if (section) - section->set(name, num.fval); + section->set(name, std::get(num)); } } else if (is_identifier_start(c)) { string identifier = parseName(); diff --git a/src/data/dynamic.cpp b/src/data/dynamic.cpp index a6329da0..2702ada0 100644 --- a/src/data/dynamic.cpp +++ b/src/data/dynamic.cpp @@ -352,3 +352,11 @@ Value::~Value() { break; } } + +Value Value::of(number_u value) { + if (std::holds_alternative(value)) { + return Value(valtype::integer, std::get(value)); + } else { + return Value(valtype::number, std::get(value)); + } +} diff --git a/src/data/dynamic.h b/src/data/dynamic.h index 513d812f..5031174c 100644 --- a/src/data/dynamic.h +++ b/src/data/dynamic.h @@ -13,9 +13,6 @@ namespace dynamic { class List; class Value; - using number_t = double; - using integer_t = int64_t; - enum class valtype { none, map, list, number, integer, string, boolean }; @@ -35,6 +32,8 @@ namespace dynamic { valvalue value; Value(valtype type, valvalue value); ~Value(); + + static Value of(number_u value); }; class List { diff --git a/src/files/settings_io.cpp b/src/files/settings_io.cpp index 79d5472c..7ed660ce 100644 --- a/src/files/settings_io.cpp +++ b/src/files/settings_io.cpp @@ -19,26 +19,8 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { map.emplace("camera.sensitivity", &settings.camera.sensitivity); } -dynamic::Value SettingsHandler::getValue(std::string name) const { - using dynamic::valtype; - - auto found = map.find(name); - if (found == map.end()) { - return dynamic::Value(valtype::none, 0); - } - auto setting = found->second; - if (auto number = dynamic_cast*>(setting)) { - return dynamic::Value(valtype::number, number->get()); - } else if (auto number = dynamic_cast*>(setting)) { - return dynamic::Value(valtype::number, number->get()); - } - - return dynamic::Value(valtype::none, 0); -} - - toml::Wrapper* create_wrapper(EngineSettings& settings) { - std::unique_ptr wrapper (new toml::Wrapper()); + auto wrapper = std::make_unique(); toml::Section& audio = wrapper->add("audio"); audio.add("enabled", &settings.audio.enabled); diff --git a/src/files/settings_io.h b/src/files/settings_io.h index 5fd2d648..b46f6396 100644 --- a/src/files/settings_io.h +++ b/src/files/settings_io.h @@ -15,7 +15,8 @@ class SettingsHandler { public: SettingsHandler(EngineSettings& settings); - dynamic::Value getValue(std::string name) const; + dynamic::Value getValue(const std::string& name) const; + void setValue(const std::string& name, dynamic::Value value); }; extern std::string write_controls(); diff --git a/src/typedefs.h b/src/typedefs.h index d04d4504..2e015666 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -3,10 +3,19 @@ #include #include +#include + + +/// @brief dynamic integer type (64 bit signed integer) +using integer_t = int64_t; +/// @brief dynamic floating-point type (64 bit floating point) +using number_t = double; +/// @brief dynamic numeric types union (integer and floating-point) +using number_u = std::variant; using uint = unsigned int; -// use for bytes arrays +/// @brief use for bytes arrays using ubyte = uint8_t; // content indices