This commit is contained in:
MihailRis 2024-03-31 23:05:38 +03:00
parent 48982e3478
commit 8950f4ecd5
9 changed files with 40 additions and 46 deletions

View File

@ -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;
}

View File

@ -5,11 +5,6 @@
#include <stdexcept>
#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_
#endif // CODERS_COMMONS_H_

View File

@ -190,10 +190,10 @@ Value* Parser::parseValue() {
number_u num;
valtype type;
if (parseNumber(next == '-' ? -1 : 1, num)) {
val = num.ival;
val = std::get<integer_t>(num);
type = valtype::integer;
} else {
val = num.fval;
val = std::get<number_t>(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<integer_t>(num);
type = valtype::integer;
} else {
val = num.fval;
val = std::get<number_t>(num);
type = valtype::number;
}
return new Value(type, val);

View File

@ -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<integer_t>(num));
} else {
if (section)
section->set(name, num.fval);
section->set(name, std::get<number_t>(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<integer_t>(num));
} else {
if (section)
section->set(name, num.fval);
section->set(name, std::get<number_t>(num));
}
} else if (is_identifier_start(c)) {
string identifier = parseName();

View File

@ -352,3 +352,11 @@ Value::~Value() {
break;
}
}
Value Value::of(number_u value) {
if (std::holds_alternative<integer_t>(value)) {
return Value(valtype::integer, std::get<integer_t>(value));
} else {
return Value(valtype::number, std::get<number_t>(value));
}
}

View File

@ -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 {

View File

@ -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<NumberSetting<float>*>(setting)) {
return dynamic::Value(valtype::number, number->get());
} else if (auto number = dynamic_cast<NumberSetting<double>*>(setting)) {
return dynamic::Value(valtype::number, number->get());
}
return dynamic::Value(valtype::none, 0);
}
toml::Wrapper* create_wrapper(EngineSettings& settings) {
std::unique_ptr<toml::Wrapper> wrapper (new toml::Wrapper());
auto wrapper = std::make_unique<toml::Wrapper>();
toml::Section& audio = wrapper->add("audio");
audio.add("enabled", &settings.audio.enabled);

View File

@ -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();

View File

@ -3,10 +3,19 @@
#include <stdlib.h>
#include <stdint.h>
#include <variant>
/// @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<integer_t, number_t>;
using uint = unsigned int;
// use for bytes arrays
/// @brief use for bytes arrays
using ubyte = uint8_t;
// content indices