From e22ec2e95b566717aff87557bf55f57b9b4f9bb3 Mon Sep 17 00:00:00 2001 From: Spartan322 Date: Wed, 31 Dec 2025 05:32:28 -0500 Subject: [PATCH] Refactor building_level_t to be type-safe --- .../economy/BuildingInstance.hpp | 4 +-- .../economy/BuildingLevel.hpp | 26 +++++++++++++++++++ .../economy/BuildingType.cpp | 4 +-- .../economy/BuildingType.hpp | 4 +-- .../history/ProvinceHistory.cpp | 6 ++--- .../history/ProvinceHistory.hpp | 2 +- src/openvic-simulation/map/Mapmode.cpp | 2 +- .../types/BuildingLevel.hpp | 7 ----- 8 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 src/openvic-simulation/economy/BuildingLevel.hpp delete mode 100644 src/openvic-simulation/types/BuildingLevel.hpp diff --git a/src/openvic-simulation/economy/BuildingInstance.hpp b/src/openvic-simulation/economy/BuildingInstance.hpp index 92271f395..1351f1ce4 100644 --- a/src/openvic-simulation/economy/BuildingInstance.hpp +++ b/src/openvic-simulation/economy/BuildingInstance.hpp @@ -1,6 +1,6 @@ #pragma once -#include "openvic-simulation/types/BuildingLevel.hpp" +#include "openvic-simulation/economy/BuildingLevel.hpp" #include "openvic-simulation/types/Date.hpp" #include "openvic-simulation/types/fixed_point/FixedPoint.hpp" #include "openvic-simulation/types/HasIdentifier.hpp" @@ -23,7 +23,7 @@ namespace OpenVic { public: BuildingType const& building_type; - BuildingInstance(BuildingType const& new_building_type, building_level_t new_level = 0); + BuildingInstance(BuildingType const& new_building_type, building_level_t new_level = building_level_t { 0 }); BuildingInstance(BuildingInstance&&) = default; bool expand(); diff --git a/src/openvic-simulation/economy/BuildingLevel.hpp b/src/openvic-simulation/economy/BuildingLevel.hpp new file mode 100644 index 000000000..ddbd2aa02 --- /dev/null +++ b/src/openvic-simulation/economy/BuildingLevel.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include +#include + +#include + +namespace OpenVic { + struct building_level_t : type_safe::strong_typedef, + type_safe::strong_typedef_op::equality_comparison, + type_safe::strong_typedef_op::relational_comparison, + type_safe::strong_typedef_op::integer_arithmetic, + type_safe::strong_typedef_op::mixed_addition, + type_safe::strong_typedef_op::mixed_subtraction { + using strong_typedef::strong_typedef; + }; +} + +template<> +struct fmt::formatter : fmt::formatter { + fmt::format_context::iterator format(OpenVic::building_level_t const& value, fmt::format_context& ctx) const { + return fmt::formatter::format(type_safe::get(value), ctx); + } +}; diff --git a/src/openvic-simulation/economy/BuildingType.cpp b/src/openvic-simulation/economy/BuildingType.cpp index 6a16e668f..998fe35f6 100644 --- a/src/openvic-simulation/economy/BuildingType.cpp +++ b/src/openvic-simulation/economy/BuildingType.cpp @@ -78,7 +78,7 @@ bool BuildingTypeManager::load_buildings_file( "on_completion", ZERO_OR_ONE, expect_identifier(assign_variable_callback(building_type_args.on_completion)), "completion_size", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(building_type_args.completion_size)), - "max_level", ONE_EXACTLY, expect_uint(assign_variable_callback(building_type_args.max_level)), + "max_level", ONE_EXACTLY, expect_strong_typedef(assign_variable_callback(building_type_args.max_level)), "goods_cost", ONE_EXACTLY, good_definition_manager.expect_good_definition_decimal_map( move_variable_callback(building_type_args.goods_cost) ), @@ -101,7 +101,7 @@ bool BuildingTypeManager::load_buildings_file( "pop_build_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(building_type_args.pop_build_factory)), "strategic_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(building_type_args.strategic_factory)), "advanced_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(building_type_args.advanced_factory)), - "fort_level", ZERO_OR_ONE, expect_uint(assign_variable_callback(building_type_args.fort_level)), + "fort_level", ZERO_OR_ONE, expect_strong_typedef(assign_variable_callback(building_type_args.fort_level)), "naval_capacity", ZERO_OR_ONE, expect_uint(assign_variable_callback(building_type_args.naval_capacity)), "colonial_points", ZERO_OR_ONE, expect_list(expect_fixed_point(vector_callback(building_type_args.colonial_points))), diff --git a/src/openvic-simulation/economy/BuildingType.hpp b/src/openvic-simulation/economy/BuildingType.hpp index ac9bc547f..e55ad4799 100644 --- a/src/openvic-simulation/economy/BuildingType.hpp +++ b/src/openvic-simulation/economy/BuildingType.hpp @@ -1,7 +1,7 @@ #pragma once #include "openvic-simulation/modifier/Modifier.hpp" -#include "openvic-simulation/types/BuildingLevel.hpp" +#include "openvic-simulation/economy/BuildingLevel.hpp" #include "openvic-simulation/types/Date.hpp" #include "openvic-simulation/types/HasIndex.hpp" #include "openvic-simulation/types/IdentifierRegistry.hpp" @@ -27,7 +27,7 @@ namespace OpenVic { std::string_view type, on_completion; ModifierValue modifier; fixed_point_t completion_size = 0, cost = 0, colonial_range = 0, infrastructure = 0; - building_level_t max_level = 0, fort_level = 0; + building_level_t max_level = building_level_t { 0 }, fort_level = building_level_t { 0 }; fixed_point_map_t goods_cost; Timespan build_time; bool on_map = false, default_enabled = false, pop_build_factory = false, strategic_factory = false, diff --git a/src/openvic-simulation/history/ProvinceHistory.cpp b/src/openvic-simulation/history/ProvinceHistory.cpp index f788cf329..35e59b14f 100644 --- a/src/openvic-simulation/history/ProvinceHistory.cpp +++ b/src/openvic-simulation/history/ProvinceHistory.cpp @@ -82,7 +82,7 @@ bool ProvinceHistoryMap::_load_history_entry( BuildingType const* building_type = building_type_manager.get_building_type_by_identifier(key); if (building_type != nullptr) { if (building_type->is_in_province()) { - return expect_uint( + return expect_strong_typedef( /* This is set to warn to prevent vanilla from always having errors because * of a duplicate railroad entry in the 1861.1.1 history of Manchester (278). */ map_callback(entry.province_buildings, building_type, true) @@ -156,10 +156,10 @@ bool ProvinceHistoryMap::_load_history_entry( }, "state_building", ZERO_OR_MORE, [&building_type_manager, &entry](ast::NodeCPtr node) -> bool { BuildingType const* building_type = nullptr; - uint8_t level = 0; + building_level_t level = building_level_t { 0 }; bool ret = expect_dictionary_keys( - "level", ONE_EXACTLY, expect_uint(assign_variable_callback(level)), + "level", ONE_EXACTLY, expect_strong_typedef(assign_variable_callback(level)), "building", ONE_EXACTLY, building_type_manager.expect_building_type_identifier( assign_variable_callback_pointer(building_type) ), diff --git a/src/openvic-simulation/history/ProvinceHistory.hpp b/src/openvic-simulation/history/ProvinceHistory.hpp index 1f434235a..4006dd953 100644 --- a/src/openvic-simulation/history/ProvinceHistory.hpp +++ b/src/openvic-simulation/history/ProvinceHistory.hpp @@ -5,7 +5,7 @@ #include "openvic-simulation/economy/BuildingType.hpp" #include "openvic-simulation/history/HistoryMap.hpp" #include "openvic-simulation/population/Pop.hpp" -#include "openvic-simulation/types/BuildingLevel.hpp" +#include "openvic-simulation/economy/BuildingLevel.hpp" #include "openvic-simulation/types/ColonyStatus.hpp" #include "openvic-simulation/types/Date.hpp" #include "openvic-simulation/types/OrderedContainers.hpp" diff --git a/src/openvic-simulation/map/Mapmode.cpp b/src/openvic-simulation/map/Mapmode.cpp index c6d5f29cd..1b2a75ef4 100644 --- a/src/openvic-simulation/map/Mapmode.cpp +++ b/src/openvic-simulation/map/Mapmode.cpp @@ -235,7 +235,7 @@ bool MapmodeManager::setup_mapmodes(MapDefinition const& map_definition) { BuildingInstance const* railroad = province.get_building_by_identifier("railroad"); if (railroad != nullptr) { const colour_argb_t::value_type val = colour_argb_t::colour_traits::component_from_fraction( - railroad->get_level(), railroad->building_type.get_max_level() + 1, 0.5f, 1.0f + type_safe::get(railroad->get_level()), type_safe::get(railroad->building_type.get_max_level()) + 1, 0.5f, 1.0f ); switch (railroad->get_expansion_state()) { case BuildingInstance::ExpansionState::CannotExpand: diff --git a/src/openvic-simulation/types/BuildingLevel.hpp b/src/openvic-simulation/types/BuildingLevel.hpp deleted file mode 100644 index 14f1cdd5e..000000000 --- a/src/openvic-simulation/types/BuildingLevel.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include - -namespace OpenVic { - using building_level_t = int16_t; -} \ No newline at end of file