Skip to content

Commit cd38133

Browse files
committed
Refactor building_level_t to be type-safe
1 parent 298ff10 commit cd38133

8 files changed

Lines changed: 37 additions & 18 deletions

File tree

src/openvic-simulation/economy/BuildingInstance.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "openvic-simulation/types/BuildingLevel.hpp"
3+
#include "openvic-simulation/economy/BuildingLevel.hpp"
44
#include "openvic-simulation/types/Date.hpp"
55
#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
66
#include "openvic-simulation/types/HasIdentifier.hpp"
@@ -23,7 +23,7 @@ namespace OpenVic {
2323
public:
2424
BuildingType const& building_type;
2525

26-
BuildingInstance(BuildingType const& new_building_type, building_level_t new_level = 0);
26+
BuildingInstance(BuildingType const& new_building_type, building_level_t new_level = building_level_t { 0 });
2727
BuildingInstance(BuildingInstance&&) = default;
2828

2929
bool expand();
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
5+
#include <fmt/base.h>
6+
#include <fmt/format.h>
7+
8+
#include <type_safe/strong_typedef.hpp>
9+
10+
namespace OpenVic {
11+
struct building_level_t : type_safe::strong_typedef<building_level_t, std::int16_t>,
12+
type_safe::strong_typedef_op::equality_comparison<building_level_t>,
13+
type_safe::strong_typedef_op::relational_comparison<building_level_t>,
14+
type_safe::strong_typedef_op::integer_arithmetic<building_level_t>,
15+
type_safe::strong_typedef_op::mixed_addition<building_level_t, std::uint16_t>,
16+
type_safe::strong_typedef_op::mixed_subtraction<building_level_t, std::uint16_t> {
17+
using strong_typedef::strong_typedef;
18+
};
19+
}
20+
21+
template<>
22+
struct fmt::formatter<OpenVic::building_level_t> : fmt::formatter<std::int16_t> {
23+
fmt::format_context::iterator format(OpenVic::building_level_t const& value, fmt::format_context& ctx) const {
24+
return fmt::formatter<std::int16_t>::format(type_safe::get(value), ctx);
25+
}
26+
};

src/openvic-simulation/economy/BuildingType.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ bool BuildingTypeManager::load_buildings_file(
7878
"on_completion", ZERO_OR_ONE, expect_identifier(assign_variable_callback(building_type_args.on_completion)),
7979
"completion_size", ZERO_OR_ONE,
8080
expect_fixed_point(assign_variable_callback(building_type_args.completion_size)),
81-
"max_level", ONE_EXACTLY, expect_uint(assign_variable_callback(building_type_args.max_level)),
81+
"max_level", ONE_EXACTLY, expect_strong_typedef<building_level_t>(assign_variable_callback(building_type_args.max_level)),
8282
"goods_cost", ONE_EXACTLY, good_definition_manager.expect_good_definition_decimal_map(
8383
move_variable_callback(building_type_args.goods_cost)
8484
),
@@ -101,7 +101,7 @@ bool BuildingTypeManager::load_buildings_file(
101101
"pop_build_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(building_type_args.pop_build_factory)),
102102
"strategic_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(building_type_args.strategic_factory)),
103103
"advanced_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(building_type_args.advanced_factory)),
104-
"fort_level", ZERO_OR_ONE, expect_uint(assign_variable_callback(building_type_args.fort_level)),
104+
"fort_level", ZERO_OR_ONE, expect_strong_typedef<building_level_t>(assign_variable_callback(building_type_args.fort_level)),
105105
"naval_capacity", ZERO_OR_ONE, expect_uint(assign_variable_callback(building_type_args.naval_capacity)),
106106
"colonial_points", ZERO_OR_ONE,
107107
expect_list(expect_fixed_point(vector_callback(building_type_args.colonial_points))),

src/openvic-simulation/economy/BuildingType.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

33
#include "openvic-simulation/modifier/Modifier.hpp"
4-
#include "openvic-simulation/types/BuildingLevel.hpp"
4+
#include "openvic-simulation/economy/BuildingLevel.hpp"
55
#include "openvic-simulation/types/Date.hpp"
66
#include "openvic-simulation/types/HasIndex.hpp"
77
#include "openvic-simulation/types/IdentifierRegistry.hpp"
@@ -27,7 +27,7 @@ namespace OpenVic {
2727
std::string_view type, on_completion;
2828
ModifierValue modifier;
2929
fixed_point_t completion_size = 0, cost = 0, colonial_range = 0, infrastructure = 0;
30-
building_level_t max_level = 0, fort_level = 0;
30+
building_level_t max_level = building_level_t { 0 }, fort_level = building_level_t { 0 };
3131
fixed_point_map_t<GoodDefinition const*> goods_cost;
3232
Timespan build_time;
3333
bool on_map = false, default_enabled = false, pop_build_factory = false, strategic_factory = false,

src/openvic-simulation/history/ProvinceHistory.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ bool ProvinceHistoryMap::_load_history_entry(
8282
BuildingType const* building_type = building_type_manager.get_building_type_by_identifier(key);
8383
if (building_type != nullptr) {
8484
if (building_type->is_in_province()) {
85-
return expect_uint<building_level_t>(
85+
return expect_strong_typedef<building_level_t>(
8686
/* This is set to warn to prevent vanilla from always having errors because
8787
* of a duplicate railroad entry in the 1861.1.1 history of Manchester (278). */
8888
map_callback(entry.province_buildings, building_type, true)
@@ -156,10 +156,10 @@ bool ProvinceHistoryMap::_load_history_entry(
156156
},
157157
"state_building", ZERO_OR_MORE, [&building_type_manager, &entry](ast::NodeCPtr node) -> bool {
158158
BuildingType const* building_type = nullptr;
159-
uint8_t level = 0;
159+
building_level_t level = building_level_t { 0 };
160160

161161
bool ret = expect_dictionary_keys(
162-
"level", ONE_EXACTLY, expect_uint(assign_variable_callback(level)),
162+
"level", ONE_EXACTLY, expect_strong_typedef<building_level_t>(assign_variable_callback(level)),
163163
"building", ONE_EXACTLY, building_type_manager.expect_building_type_identifier(
164164
assign_variable_callback_pointer(building_type)
165165
),

src/openvic-simulation/history/ProvinceHistory.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include "openvic-simulation/economy/BuildingType.hpp"
66
#include "openvic-simulation/history/HistoryMap.hpp"
77
#include "openvic-simulation/population/Pop.hpp"
8-
#include "openvic-simulation/types/BuildingLevel.hpp"
8+
#include "openvic-simulation/economy/BuildingLevel.hpp"
99
#include "openvic-simulation/types/ColonyStatus.hpp"
1010
#include "openvic-simulation/types/Date.hpp"
1111
#include "openvic-simulation/types/OrderedContainers.hpp"

src/openvic-simulation/map/Mapmode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ bool MapmodeManager::setup_mapmodes(MapDefinition const& map_definition) {
234234
BuildingInstance const* railroad = province.get_building_by_identifier("railroad");
235235
if (railroad != nullptr) {
236236
const colour_argb_t::value_type val = colour_argb_t::colour_traits::component_from_fraction(
237-
railroad->get_level(), railroad->building_type.get_max_level() + 1, 0.5f, 1.0f
237+
type_safe::get(railroad->get_level()), type_safe::get(railroad->building_type.get_max_level()) + 1, 0.5f, 1.0f
238238
);
239239
switch (railroad->get_expansion_state()) {
240240
case BuildingInstance::ExpansionState::CannotExpand:

src/openvic-simulation/types/BuildingLevel.hpp

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)