Skip to content

Commit 307d3a6

Browse files
committed
Refactor technology_unlock_level_t to be type-safe
1 parent 0cd24a8 commit 307d3a6

File tree

6 files changed

+59
-37
lines changed

6 files changed

+59
-37
lines changed

src/openvic-simulation/country/CountryInstance.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -784,8 +784,8 @@ bool CountryInstance::modify_unit_type_unlock(UnitTypeBranched<Branch> const& un
784784
if (unlock_level + unlock_level_change < 0) {
785785
spdlog::error_s(
786786
"Attempted to change unlock level for unit type {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
787-
unit_type, *this, static_cast<int64_t>(unlock_level),
788-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
787+
unit_type, *this, unlock_level,
788+
unlock_level_change, unlock_level + unlock_level_change
789789
);
790790
return false;
791791
}
@@ -844,7 +844,7 @@ bool CountryInstance::modify_unit_type_unlock(UnitType const& unit_type, technol
844844
}
845845

846846
bool CountryInstance::unlock_unit_type(UnitType const& unit_type) {
847-
return modify_unit_type_unlock(unit_type, 1);
847+
return modify_unit_type_unlock(unit_type, technology_unlock_level_t { 1 });
848848
}
849849

850850
bool CountryInstance::is_unit_type_unlocked(UnitType const& unit_type) const {
@@ -873,8 +873,8 @@ bool CountryInstance::modify_building_type_unlock(
873873
if (unlock_level + unlock_level_change < 0) {
874874
spdlog::error_s(
875875
"Attempted to change unlock level for building type {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
876-
building_type, *this, static_cast<int64_t>(unlock_level), static_cast<int64_t>(unlock_level_change),
877-
static_cast<int64_t>(unlock_level + unlock_level_change)
876+
building_type, *this, unlock_level, unlock_level_change,
877+
unlock_level + unlock_level_change
878878
);
879879
return false;
880880
}
@@ -889,7 +889,7 @@ bool CountryInstance::modify_building_type_unlock(
889889
}
890890

891891
bool CountryInstance::unlock_building_type(BuildingType const& building_type) {
892-
return modify_building_type_unlock(building_type, 1);
892+
return modify_building_type_unlock(building_type, technology_unlock_level_t { 1 });
893893
}
894894

895895
bool CountryInstance::is_building_type_unlocked(BuildingType const& building_type) const {
@@ -903,8 +903,8 @@ bool CountryInstance::modify_crime_unlock(Crime const& crime, technology_unlock_
903903
if (unlock_level + unlock_level_change < 0) {
904904
spdlog::error_s(
905905
"Attempted to change unlock level for crime {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
906-
crime, *this, static_cast<int64_t>(unlock_level),
907-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
906+
crime, *this, unlock_level,
907+
unlock_level_change, unlock_level + unlock_level_change
908908
);
909909
return false;
910910
}
@@ -915,7 +915,7 @@ bool CountryInstance::modify_crime_unlock(Crime const& crime, technology_unlock_
915915
}
916916

917917
bool CountryInstance::unlock_crime(Crime const& crime) {
918-
return modify_crime_unlock(crime, 1);
918+
return modify_crime_unlock(crime, technology_unlock_level_t { 1 });
919919
}
920920

921921
bool CountryInstance::is_crime_unlocked(Crime const& crime) const {
@@ -927,8 +927,8 @@ bool CountryInstance::modify_gas_attack_unlock(technology_unlock_level_t unlock_
927927
if (gas_attack_unlock_level + unlock_level_change < 0) {
928928
spdlog::error_s(
929929
"Attempted to change unlock level for gas attack in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
930-
*this, static_cast<int64_t>(gas_attack_unlock_level),
931-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(gas_attack_unlock_level + unlock_level_change)
930+
*this, gas_attack_unlock_level,
931+
unlock_level_change, gas_attack_unlock_level + unlock_level_change
932932
);
933933
return false;
934934
}
@@ -939,7 +939,7 @@ bool CountryInstance::modify_gas_attack_unlock(technology_unlock_level_t unlock_
939939
}
940940

941941
bool CountryInstance::unlock_gas_attack() {
942-
return modify_gas_attack_unlock(1);
942+
return modify_gas_attack_unlock(technology_unlock_level_t { 1 });
943943
}
944944

945945
bool CountryInstance::is_gas_attack_unlocked() const {
@@ -951,8 +951,8 @@ bool CountryInstance::modify_gas_defence_unlock(technology_unlock_level_t unlock
951951
if (gas_defence_unlock_level + unlock_level_change < 0) {
952952
spdlog::error_s(
953953
"Attempted to change unlock level for gas defence in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
954-
*this, static_cast<int64_t>(gas_defence_unlock_level),
955-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(gas_defence_unlock_level + unlock_level_change)
954+
*this, gas_defence_unlock_level,
955+
unlock_level_change, gas_defence_unlock_level + unlock_level_change
956956
);
957957
return false;
958958
}
@@ -963,7 +963,7 @@ bool CountryInstance::modify_gas_defence_unlock(technology_unlock_level_t unlock
963963
}
964964

965965
bool CountryInstance::unlock_gas_defence() {
966-
return modify_gas_defence_unlock(1);
966+
return modify_gas_defence_unlock(technology_unlock_level_t { 1 });
967967
}
968968

969969
bool CountryInstance::is_gas_defence_unlocked() const {
@@ -988,8 +988,8 @@ bool CountryInstance::modify_unit_variant_unlock(unit_variant_t unit_variant, te
988988
if (unlock_level + unlock_level_change < 0) {
989989
spdlog::error_s(
990990
"Attempted to change unlock level for unit variant {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
991-
static_cast<uint64_t>(unit_variant), *this, static_cast<int64_t>(unlock_level),
992-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
991+
static_cast<uint64_t>(unit_variant), *this, unlock_level,
992+
unlock_level_change, unlock_level + unlock_level_change
993993
);
994994
ret = false;
995995
} else {
@@ -1004,7 +1004,7 @@ bool CountryInstance::modify_unit_variant_unlock(unit_variant_t unit_variant, te
10041004
}
10051005

10061006
bool CountryInstance::unlock_unit_variant(unit_variant_t unit_variant) {
1007-
return modify_unit_variant_unlock(unit_variant, 1);
1007+
return modify_unit_variant_unlock(unit_variant, technology_unlock_level_t { 1 });
10081008
}
10091009

10101010
unit_variant_t CountryInstance::get_max_unlocked_unit_variant() const {
@@ -1020,8 +1020,8 @@ bool CountryInstance::modify_technology_unlock(
10201020
if (unlock_level + unlock_level_change < 0) {
10211021
spdlog::error_s(
10221022
"Attempted to change unlock level for technology {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
1023-
technology, *this, static_cast<int64_t>(unlock_level),
1024-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
1023+
technology, *this, unlock_level,
1024+
unlock_level_change, unlock_level + unlock_level_change
10251025
);
10261026
return false;
10271027
}
@@ -1053,7 +1053,7 @@ bool CountryInstance::set_technology_unlock_level(
10531053
}
10541054

10551055
bool CountryInstance::unlock_technology(Technology const& technology) {
1056-
return modify_technology_unlock(technology, 1);
1056+
return modify_technology_unlock(technology, technology_unlock_level_t { 1 });
10571057
}
10581058

10591059
bool CountryInstance::is_technology_unlocked(Technology const& technology) const {
@@ -1069,8 +1069,8 @@ bool CountryInstance::modify_invention_unlock(
10691069
if (unlock_level + unlock_level_change < 0) {
10701070
spdlog::error_s(
10711071
"Attempted to change unlock level for invention {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
1072-
invention, *this, static_cast<int64_t>(unlock_level),
1073-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
1072+
invention, *this, unlock_level,
1073+
unlock_level_change, unlock_level + unlock_level_change
10741074
);
10751075
return false;
10761076
}
@@ -1116,7 +1116,7 @@ bool CountryInstance::set_invention_unlock_level(
11161116
}
11171117

11181118
bool CountryInstance::unlock_invention(Invention const& invention) {
1119-
return modify_invention_unlock(invention, 1);
1119+
return modify_invention_unlock(invention, technology_unlock_level_t { 1 });
11201120
}
11211121

11221122
bool CountryInstance::is_invention_unlocked(Invention const& invention) const {
@@ -1239,7 +1239,7 @@ bool CountryInstance::apply_history_to_country(
12391239
ret &= set_technology_unlock_level(*technology, level);
12401240
}
12411241
for (auto const& [invention, activated] : entry.get_inventions()) {
1242-
ret &= set_invention_unlock_level(*invention, activated ? 1 : 0);
1242+
ret &= set_invention_unlock_level(*invention, technology_unlock_level_t { static_cast<int8_t>(activated ? 1 : 0) });
12431243
}
12441244

12451245
apply_foreign_investments(entry.get_foreign_investment(), country_instance_manager);

src/openvic-simulation/country/CountryInstance.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include "openvic-simulation/types/HasIndex.hpp"
1919
#include "openvic-simulation/types/IndexedFlatMap.hpp"
2020
#include "openvic-simulation/types/OrderedContainers.hpp"
21-
#include "openvic-simulation/types/TechnologyUnlockLevel.hpp"
21+
#include "openvic-simulation/research/TechnologyUnlockLevel.hpp"
2222
#include "openvic-simulation/types/TypedIndices.hpp"
2323
#include "openvic-simulation/types/UnitBranchType.hpp"
2424
#include "openvic-simulation/types/UnitVariant.hpp"
@@ -389,8 +389,8 @@ namespace OpenVic {
389389
OV_IFLATMAP_PROPERTY(RegimentType, technology_unlock_level_t, regiment_type_unlock_levels);
390390
regiment_allowed_cultures_t PROPERTY(allowed_regiment_cultures, regiment_allowed_cultures_t::NO_CULTURES);
391391
OV_IFLATMAP_PROPERTY(ShipType, technology_unlock_level_t, ship_type_unlock_levels);
392-
technology_unlock_level_t PROPERTY(gas_attack_unlock_level, 0);
393-
technology_unlock_level_t PROPERTY(gas_defence_unlock_level, 0);
392+
technology_unlock_level_t PROPERTY(gas_attack_unlock_level, technology_unlock_level_t { 0 });
393+
technology_unlock_level_t PROPERTY(gas_defence_unlock_level, technology_unlock_level_t { 0 });
394394
memory::vector<technology_unlock_level_t> SPAN_PROPERTY(unit_variant_unlock_levels);
395395

396396
public:

src/openvic-simulation/history/CountryHistory.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ bool CountryHistoryMap::_load_history_entry(
112112
{
113113
Technology const* technology = technology_manager.get_technology_by_identifier(key);
114114
if (technology != nullptr) {
115-
return expect_uint<decltype(entry.technologies)::mapped_type>(
115+
return expect_strong_typedef<decltype(entry.technologies)::mapped_type>(
116116
[&entry, technology](decltype(entry.technologies)::mapped_type value) -> bool {
117117
if (value > 1) {
118118
spdlog::warn_s(

src/openvic-simulation/history/CountryHistory.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include "openvic-simulation/types/IndexedFlatMap.hpp"
88
#include "openvic-simulation/types/OrderedContainers.hpp"
99
#include "openvic-simulation/types/fixed_point/FixedPointMap.hpp"
10-
#include "openvic-simulation/types/TechnologyUnlockLevel.hpp"
10+
#include "openvic-simulation/research/TechnologyUnlockLevel.hpp"
1111
#include "openvic-simulation/utility/Containers.hpp"
1212

1313
namespace OpenVic {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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 technology_unlock_level_t
12+
: type_safe::strong_typedef<technology_unlock_level_t, std::int8_t>,
13+
type_safe::strong_typedef_op::equality_comparison<technology_unlock_level_t>,
14+
type_safe::strong_typedef_op::relational_comparison<technology_unlock_level_t>,
15+
type_safe::strong_typedef_op::integer_arithmetic<technology_unlock_level_t>,
16+
type_safe::strong_typedef_op::mixed_addition<technology_unlock_level_t, std::uint8_t>,
17+
type_safe::strong_typedef_op::mixed_subtraction<technology_unlock_level_t, std::uint8_t>,
18+
type_safe::strong_typedef_op::mixed_relational_comparison<technology_unlock_level_t, std::int32_t>,
19+
type_safe::strong_typedef_op::mixed_equality_comparison<technology_unlock_level_t, std::int32_t> {
20+
using strong_typedef::strong_typedef;
21+
};
22+
}
23+
24+
template<>
25+
struct fmt::formatter<OpenVic::technology_unlock_level_t> : fmt::formatter<std::int32_t> {
26+
fmt::format_context::iterator format(OpenVic::technology_unlock_level_t const& value, fmt::format_context& ctx) const {
27+
return fmt::formatter<std::int32_t>::format(type_safe::get(value), ctx);
28+
}
29+
};

src/openvic-simulation/types/TechnologyUnlockLevel.hpp

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

0 commit comments

Comments
 (0)