refactor
This commit is contained in:
@@ -231,20 +231,20 @@ bool BasicParser::parseNumber(int sign, number_u& out) {
|
|||||||
if (c == '0' && pos + 1 < source.length() &&
|
if (c == '0' && pos + 1 < source.length() &&
|
||||||
(base = is_box(source[pos+1])) != 10) {
|
(base = is_box(source[pos+1])) != 10) {
|
||||||
pos += 2;
|
pos += 2;
|
||||||
out.ival = parseSimpleInt(base);
|
out = parseSimpleInt(base);
|
||||||
return true;
|
return true;
|
||||||
} else if (c == 'i' && pos + 2 < source.length() && source[pos+1] == 'n' && source[pos+2] == 'f') {
|
} else if (c == 'i' && pos + 2 < source.length() && source[pos+1] == 'n' && source[pos+2] == 'f') {
|
||||||
pos += 3;
|
pos += 3;
|
||||||
out.fval = INFINITY * sign;
|
out = INFINITY * sign;
|
||||||
return false;
|
return false;
|
||||||
} else if (c == 'n' && pos + 2 < source.length() && source[pos+1] == 'a' && source[pos+2] == 'n') {
|
} else if (c == 'n' && pos + 2 < source.length() && source[pos+1] == 'a' && source[pos+2] == 'n') {
|
||||||
pos += 3;
|
pos += 3;
|
||||||
out.fval = NAN * sign;
|
out = NAN * sign;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int64_t value = parseSimpleInt(base);
|
int64_t value = parseSimpleInt(base);
|
||||||
if (!hasNext()) {
|
if (!hasNext()) {
|
||||||
out.ival = value * sign;
|
out = value * sign;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
c = source[pos];
|
c = source[pos];
|
||||||
@@ -257,7 +257,7 @@ bool BasicParser::parseNumber(int sign, number_u& out) {
|
|||||||
} else if (peek() == '+'){
|
} else if (peek() == '+'){
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
out.fval = sign * value * power(10.0, s * parseSimpleInt(10));
|
out = sign * value * power(10.0, s * parseSimpleInt(10));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (c == '.') {
|
if (c == '.') {
|
||||||
@@ -284,13 +284,13 @@ bool BasicParser::parseNumber(int sign, number_u& out) {
|
|||||||
} else if (peek() == '+'){
|
} else if (peek() == '+'){
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
out.fval = sign * dvalue * power(10.0, s * parseSimpleInt(10));
|
out = sign * dvalue * power(10.0, s * parseSimpleInt(10));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
out.fval = sign * dvalue;
|
out = sign * dvalue;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
out.ival = sign * value;
|
out = sign * value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,11 +5,6 @@
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include "../typedefs.h"
|
#include "../typedefs.h"
|
||||||
|
|
||||||
union number_u {
|
|
||||||
double fval;
|
|
||||||
int64_t ival;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline int is_box(int c) {
|
inline int is_box(int c) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'B':
|
case 'B':
|
||||||
|
|||||||
+4
-4
@@ -190,10 +190,10 @@ Value* Parser::parseValue() {
|
|||||||
number_u num;
|
number_u num;
|
||||||
valtype type;
|
valtype type;
|
||||||
if (parseNumber(next == '-' ? -1 : 1, num)) {
|
if (parseNumber(next == '-' ? -1 : 1, num)) {
|
||||||
val = num.ival;
|
val = std::get<integer_t>(num);
|
||||||
type = valtype::integer;
|
type = valtype::integer;
|
||||||
} else {
|
} else {
|
||||||
val = num.fval;
|
val = std::get<number_t>(num);
|
||||||
type = valtype::number;
|
type = valtype::number;
|
||||||
}
|
}
|
||||||
return new Value(type, val);
|
return new Value(type, val);
|
||||||
@@ -227,10 +227,10 @@ Value* Parser::parseValue() {
|
|||||||
number_u num;
|
number_u num;
|
||||||
valtype type;
|
valtype type;
|
||||||
if (parseNumber(1, num)) {
|
if (parseNumber(1, num)) {
|
||||||
val = num.ival;
|
val = std::get<integer_t>(num);
|
||||||
type = valtype::integer;
|
type = valtype::integer;
|
||||||
} else {
|
} else {
|
||||||
val = num.fval;
|
val = std::get<number_t>(num);
|
||||||
type = valtype::number;
|
type = valtype::number;
|
||||||
}
|
}
|
||||||
return new Value(type, val);
|
return new Value(type, val);
|
||||||
|
|||||||
+4
-4
@@ -206,10 +206,10 @@ void Reader::readSection(Section* section /*nullable*/) {
|
|||||||
number_u num;
|
number_u num;
|
||||||
if (parseNumber(1, num)) {
|
if (parseNumber(1, num)) {
|
||||||
if (section)
|
if (section)
|
||||||
section->set(name, (double)num.ival);
|
section->set(name, (double)std::get<integer_t>(num));
|
||||||
} else {
|
} else {
|
||||||
if (section)
|
if (section)
|
||||||
section->set(name, num.fval);
|
section->set(name, std::get<number_t>(num));
|
||||||
}
|
}
|
||||||
} else if (c == '-' || c == '+') {
|
} else if (c == '-' || c == '+') {
|
||||||
int sign = c == '-' ? -1 : 1;
|
int sign = c == '-' ? -1 : 1;
|
||||||
@@ -217,10 +217,10 @@ void Reader::readSection(Section* section /*nullable*/) {
|
|||||||
number_u num;
|
number_u num;
|
||||||
if (parseNumber(sign, num)) {
|
if (parseNumber(sign, num)) {
|
||||||
if (section)
|
if (section)
|
||||||
section->set(name, (double)num.ival);
|
section->set(name, (double)std::get<integer_t>(num));
|
||||||
} else {
|
} else {
|
||||||
if (section)
|
if (section)
|
||||||
section->set(name, num.fval);
|
section->set(name, std::get<number_t>(num));
|
||||||
}
|
}
|
||||||
} else if (is_identifier_start(c)) {
|
} else if (is_identifier_start(c)) {
|
||||||
string identifier = parseName();
|
string identifier = parseName();
|
||||||
|
|||||||
@@ -352,3 +352,11 @@ Value::~Value() {
|
|||||||
break;
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+2
-3
@@ -13,9 +13,6 @@ namespace dynamic {
|
|||||||
class List;
|
class List;
|
||||||
class Value;
|
class Value;
|
||||||
|
|
||||||
using number_t = double;
|
|
||||||
using integer_t = int64_t;
|
|
||||||
|
|
||||||
enum class valtype {
|
enum class valtype {
|
||||||
none, map, list, number, integer, string, boolean
|
none, map, list, number, integer, string, boolean
|
||||||
};
|
};
|
||||||
@@ -35,6 +32,8 @@ namespace dynamic {
|
|||||||
valvalue value;
|
valvalue value;
|
||||||
Value(valtype type, valvalue value);
|
Value(valtype type, valvalue value);
|
||||||
~Value();
|
~Value();
|
||||||
|
|
||||||
|
static Value of(number_u value);
|
||||||
};
|
};
|
||||||
|
|
||||||
class List {
|
class List {
|
||||||
|
|||||||
@@ -19,26 +19,8 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) {
|
|||||||
map.emplace("camera.sensitivity", &settings.camera.sensitivity);
|
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) {
|
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");
|
toml::Section& audio = wrapper->add("audio");
|
||||||
audio.add("enabled", &settings.audio.enabled);
|
audio.add("enabled", &settings.audio.enabled);
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ class SettingsHandler {
|
|||||||
public:
|
public:
|
||||||
SettingsHandler(EngineSettings& settings);
|
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();
|
extern std::string write_controls();
|
||||||
|
|||||||
+10
-1
@@ -3,10 +3,19 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.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;
|
using uint = unsigned int;
|
||||||
|
|
||||||
// use for bytes arrays
|
/// @brief use for bytes arrays
|
||||||
using ubyte = uint8_t;
|
using ubyte = uint8_t;
|
||||||
|
|
||||||
// content indices
|
// content indices
|
||||||
|
|||||||
Reference in New Issue
Block a user