aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/misc
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvic-simulation/misc')
-rw-r--r--src/openvic-simulation/misc/Define.cpp121
-rw-r--r--src/openvic-simulation/misc/Define.hpp63
2 files changed, 184 insertions, 0 deletions
diff --git a/src/openvic-simulation/misc/Define.cpp b/src/openvic-simulation/misc/Define.cpp
new file mode 100644
index 0000000..509b0a5
--- /dev/null
+++ b/src/openvic-simulation/misc/Define.cpp
@@ -0,0 +1,121 @@
+
+#include "Define.hpp"
+
+#include <cassert>
+#include <cstdlib>
+#include <memory>
+
+#include <openvic-dataloader/v2script/AbstractSyntaxTree.hpp>
+
+#include "openvic-simulation/dataloader/NodeTools.hpp"
+#include "openvic-simulation/types/Date.hpp"
+#include "openvic-simulation/types/IdentifierRegistry.hpp"
+#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
+
+using namespace OpenVic;
+using namespace OpenVic::NodeTools;
+
+Define::Define(
+ std::string_view new_identifier,
+ std::string&& new_value,
+ Type new_type
+) : HasIdentifier { new_identifier },
+ value { std::move(new_value) },
+ type { new_type } {
+}
+
+fixed_point_t Define::get_value_as_fp() const {
+ return fixed_point_t::parse(value);
+}
+
+int64_t Define::get_value_as_int() const {
+ return std::strtoll(value.data(), nullptr, 10);
+}
+
+uint64_t Define::get_value_as_uint() const {
+ return std::strtoull(value.data(), nullptr, 10);
+}
+
+DefineManager::DefineManager() : defines { "defines" } {
+}
+
+bool DefineManager::add_define(std::string_view name, std::string&& value, Define::Type type) {
+ return defines.add_item({ name, std::move(value), type }, duplicate_warning_callback);
+}
+
+const Date& DefineManager::get_start_date() const {
+ return *start_date;
+}
+
+const Date& DefineManager::get_end_date() const {
+ return *end_date;
+}
+
+bool DefineManager::add_date_define(std::string_view name, Date date) {
+ if (name != "start_date" && name != "end_date") return false;
+
+ bool ret = defines.add_item({ name, date.to_string(), Define::Type::None });
+
+ if (name == "start_date")
+ start_date.reset(new Date(date));
+ else if (name == "end_date")
+ end_date.reset(new Date(date));
+
+ return ret;
+}
+
+bool DefineManager::load_defines_file(ast::NodeCPtr root) {
+ bool ret = expect_dictionary_keys(
+ "defines", ONE_EXACTLY, expect_dictionary([this](std::string_view key, ast::NodeCPtr value) -> bool {
+ if (key == "country" || key == "economy" || key == "military" || key == "diplomacy" || key == "pops" || key == "ai" || key == "graphics") {
+ return expect_dictionary([this, &key](std::string_view inner_key, ast::NodeCPtr value) -> bool {
+ std::string str_val;
+
+ bool ret = expect_identifier_or_string(assign_variable_callback_string(str_val))(value);
+
+ Define::Type type;
+ switch (key[0]) {
+ using enum Define::Type;
+ case 'c': // country
+ type = Country;
+ break;
+ case 'e': // economy
+ type = Economy;
+ break;
+ case 'm': // military
+ type = Military;
+ break;
+ case 'd': // diplomacy
+ type = Diplomacy;
+ break;
+ case 'p': // pops
+ type = Pops;
+ break;
+ case 'a': // ai
+ type = Ai;
+ break;
+ case 'g': // graphics
+ type = Graphics;
+ break;
+ default:
+ Logger::error("Unknown define type ", key, " found in defines!");
+ return false;
+ }
+
+ ret &= add_define(inner_key, std::move(str_val), type);
+ return ret;
+ })(value);
+ } else if (key == "start_date" || key == "end_date") {
+ using namespace std::placeholders;
+
+ return expect_identifier_or_string(expect_date_str([this, &key](Date date) -> bool {
+ return add_date_define(key, date);
+ }))(value);
+ } else {
+ return false;
+ }
+ })
+ )(root);
+ lock_defines();
+ return ret;
+} \ No newline at end of file
diff --git a/src/openvic-simulation/misc/Define.hpp b/src/openvic-simulation/misc/Define.hpp
new file mode 100644
index 0000000..9b768b7
--- /dev/null
+++ b/src/openvic-simulation/misc/Define.hpp
@@ -0,0 +1,63 @@
+#pragma once
+
+#include <concepts>
+#include <memory>
+
+#include "openvic-simulation/types/IdentifierRegistry.hpp"
+#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
+
+namespace OpenVic {
+ struct DefineManager;
+
+ struct Define : HasIdentifier {
+ friend struct DefineManager;
+
+ enum class Type : unsigned char {
+ None,
+ Country,
+ Economy,
+ Military,
+ Diplomacy,
+ Pops,
+ Ai,
+ Graphics
+ };
+
+ private:
+ std::string HASID_PROPERTY(value);
+ Type HASID_PROPERTY(type);
+
+ Define(
+ std::string_view new_identifier,
+ std::string&& new_value,
+ Type new_type
+ );
+
+ public:
+ Define(Define&&) = default;
+
+ fixed_point_t get_value_as_fp() const;
+ int64_t get_value_as_int() const;
+ uint64_t get_value_as_uint() const;
+ };
+
+ struct DefineManager {
+ private:
+ IdentifierRegistry<Define> defines;
+
+ std::unique_ptr<Date> start_date = nullptr;
+ std::unique_ptr<Date> end_date = nullptr;
+
+ public:
+ DefineManager();
+
+ bool add_define(std::string_view name, std::string&& value, Define::Type type);
+ bool add_date_define(std::string_view name, Date date);
+ IDENTIFIER_REGISTRY_ACCESSORS(define);
+
+ const Date& get_start_date() const;
+ const Date& get_end_date() const;
+
+ bool load_defines_file(ast::NodeCPtr root);
+ };
+} \ No newline at end of file