relative values, types check

This commit is contained in:
MihailRis
2024-05-10 16:05:46 +03:00
parent 17426705ae
commit b38128ef39
6 changed files with 185 additions and 19 deletions
+30
View File
@@ -242,6 +242,20 @@ size_t Map::size() const {
return values.size();
}
static const std::string TYPE_NAMES[] {
"none",
"map",
"list",
"string",
"number",
"bool",
"integer",
};
const std::string& dynamic::type_name(const Value& value) {
return TYPE_NAMES[value.index()];
}
List_sptr dynamic::create_list(std::initializer_list<Value> values) {
return std::make_shared<List>(values);
}
@@ -249,3 +263,19 @@ List_sptr dynamic::create_list(std::initializer_list<Value> values) {
Map_sptr dynamic::create_map(std::initializer_list<std::pair<const std::string, Value>> entries) {
return std::make_shared<Map>(entries);
}
number_t dynamic::get_number(const Value& value) {
if (auto num = std::get_if<number_t>(&value)) {
return *num;
} else if (auto num = std::get_if<integer_t>(&value)) {
return *num;
}
throw std::runtime_error("cannot cast "+type_name(value)+" to number");
}
integer_t dynamic::get_integer(const Value& value) {
if (auto num = std::get_if<integer_t>(&value)) {
return *num;
}
throw std::runtime_error("cannot cast "+type_name(value)+" to integer");
}
+8
View File
@@ -35,8 +35,16 @@ namespace dynamic {
integer_t
>;
const std::string& type_name(const Value& value);
List_sptr create_list(std::initializer_list<Value> values={});
Map_sptr create_map(std::initializer_list<std::pair<const std::string, Value>> entries={});
number_t get_number(const Value& value);
integer_t get_integer(const Value& value);
inline bool is_numeric(const Value& value) {
return std::holds_alternative<number_t>(value) ||
std::holds_alternative<integer_t>(value);
}
class List {
public: