Skip to content

Commit 4f2fffd

Browse files
committed
Refactor technology_unlock_level_t to be type-safe
1 parent 55c064f commit 4f2fffd

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
@@ -782,8 +782,8 @@ bool CountryInstance::modify_unit_type_unlock(UnitTypeBranched<Branch> const& un
782782
if (unlock_level + unlock_level_change < 0) {
783783
spdlog::error_s(
784784
"Attempted to change unlock level for unit type {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
785-
unit_type, *this, static_cast<int64_t>(unlock_level),
786-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
785+
unit_type, *this, unlock_level,
786+
unlock_level_change, unlock_level + unlock_level_change
787787
);
788788
return false;
789789
}
@@ -842,7 +842,7 @@ bool CountryInstance::modify_unit_type_unlock(UnitType const& unit_type, technol
842842
}
843843

844844
bool CountryInstance::unlock_unit_type(UnitType const& unit_type) {
845-
return modify_unit_type_unlock(unit_type, 1);
845+
return modify_unit_type_unlock(unit_type, technology_unlock_level_t { 1 });
846846
}
847847

848848
bool CountryInstance::is_unit_type_unlocked(UnitType const& unit_type) const {
@@ -871,8 +871,8 @@ bool CountryInstance::modify_building_type_unlock(
871871
if (unlock_level + unlock_level_change < 0) {
872872
spdlog::error_s(
873873
"Attempted to change unlock level for building type {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
874-
building_type, *this, static_cast<int64_t>(unlock_level), static_cast<int64_t>(unlock_level_change),
875-
static_cast<int64_t>(unlock_level + unlock_level_change)
874+
building_type, *this, unlock_level, unlock_level_change,
875+
unlock_level + unlock_level_change
876876
);
877877
return false;
878878
}
@@ -887,7 +887,7 @@ bool CountryInstance::modify_building_type_unlock(
887887
}
888888

889889
bool CountryInstance::unlock_building_type(BuildingType const& building_type) {
890-
return modify_building_type_unlock(building_type, 1);
890+
return modify_building_type_unlock(building_type, technology_unlock_level_t { 1 });
891891
}
892892

893893
bool CountryInstance::is_building_type_unlocked(BuildingType const& building_type) const {
@@ -901,8 +901,8 @@ bool CountryInstance::modify_crime_unlock(Crime const& crime, technology_unlock_
901901
if (unlock_level + unlock_level_change < 0) {
902902
spdlog::error_s(
903903
"Attempted to change unlock level for crime {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
904-
crime, *this, static_cast<int64_t>(unlock_level),
905-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
904+
crime, *this, unlock_level,
905+
unlock_level_change, unlock_level + unlock_level_change
906906
);
907907
return false;
908908
}
@@ -913,7 +913,7 @@ bool CountryInstance::modify_crime_unlock(Crime const& crime, technology_unlock_
913913
}
914914

915915
bool CountryInstance::unlock_crime(Crime const& crime) {
916-
return modify_crime_unlock(crime, 1);
916+
return modify_crime_unlock(crime, technology_unlock_level_t { 1 });
917917
}
918918

919919
bool CountryInstance::is_crime_unlocked(Crime const& crime) const {
@@ -925,8 +925,8 @@ bool CountryInstance::modify_gas_attack_unlock(technology_unlock_level_t unlock_
925925
if (gas_attack_unlock_level + unlock_level_change < 0) {
926926
spdlog::error_s(
927927
"Attempted to change unlock level for gas attack in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
928-
*this, static_cast<int64_t>(gas_attack_unlock_level),
929-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(gas_attack_unlock_level + unlock_level_change)
928+
*this, gas_attack_unlock_level,
929+
unlock_level_change, gas_attack_unlock_level + unlock_level_change
930930
);
931931
return false;
932932
}
@@ -937,7 +937,7 @@ bool CountryInstance::modify_gas_attack_unlock(technology_unlock_level_t unlock_
937937
}
938938

939939
bool CountryInstance::unlock_gas_attack() {
940-
return modify_gas_attack_unlock(1);
940+
return modify_gas_attack_unlock(technology_unlock_level_t { 1 });
941941
}
942942

943943
bool CountryInstance::is_gas_attack_unlocked() const {
@@ -949,8 +949,8 @@ bool CountryInstance::modify_gas_defence_unlock(technology_unlock_level_t unlock
949949
if (gas_defence_unlock_level + unlock_level_change < 0) {
950950
spdlog::error_s(
951951
"Attempted to change unlock level for gas defence in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
952-
*this, static_cast<int64_t>(gas_defence_unlock_level),
953-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(gas_defence_unlock_level + unlock_level_change)
952+
*this, gas_defence_unlock_level,
953+
unlock_level_change, gas_defence_unlock_level + unlock_level_change
954954
);
955955
return false;
956956
}
@@ -961,7 +961,7 @@ bool CountryInstance::modify_gas_defence_unlock(technology_unlock_level_t unlock
961961
}
962962

963963
bool CountryInstance::unlock_gas_defence() {
964-
return modify_gas_defence_unlock(1);
964+
return modify_gas_defence_unlock(technology_unlock_level_t { 1 });
965965
}
966966

967967
bool CountryInstance::is_gas_defence_unlocked() const {
@@ -986,8 +986,8 @@ bool CountryInstance::modify_unit_variant_unlock(unit_variant_t unit_variant, te
986986
if (unlock_level + unlock_level_change < 0) {
987987
spdlog::error_s(
988988
"Attempted to change unlock level for unit variant {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
989-
static_cast<uint64_t>(unit_variant), *this, static_cast<int64_t>(unlock_level),
990-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
989+
static_cast<uint64_t>(unit_variant), *this, unlock_level,
990+
unlock_level_change, unlock_level + unlock_level_change
991991
);
992992
ret = false;
993993
} else {
@@ -1002,7 +1002,7 @@ bool CountryInstance::modify_unit_variant_unlock(unit_variant_t unit_variant, te
10021002
}
10031003

10041004
bool CountryInstance::unlock_unit_variant(unit_variant_t unit_variant) {
1005-
return modify_unit_variant_unlock(unit_variant, 1);
1005+
return modify_unit_variant_unlock(unit_variant, technology_unlock_level_t { 1 });
10061006
}
10071007

10081008
unit_variant_t CountryInstance::get_max_unlocked_unit_variant() const {
@@ -1018,8 +1018,8 @@ bool CountryInstance::modify_technology_unlock(
10181018
if (unlock_level + unlock_level_change < 0) {
10191019
spdlog::error_s(
10201020
"Attempted to change unlock level for technology {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
1021-
technology, *this, static_cast<int64_t>(unlock_level),
1022-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
1021+
technology, *this, unlock_level,
1022+
unlock_level_change, unlock_level + unlock_level_change
10231023
);
10241024
return false;
10251025
}
@@ -1051,7 +1051,7 @@ bool CountryInstance::set_technology_unlock_level(
10511051
}
10521052

10531053
bool CountryInstance::unlock_technology(Technology const& technology) {
1054-
return modify_technology_unlock(technology, 1);
1054+
return modify_technology_unlock(technology, technology_unlock_level_t { 1 });
10551055
}
10561056

10571057
bool CountryInstance::is_technology_unlocked(Technology const& technology) const {
@@ -1067,8 +1067,8 @@ bool CountryInstance::modify_invention_unlock(
10671067
if (unlock_level + unlock_level_change < 0) {
10681068
spdlog::error_s(
10691069
"Attempted to change unlock level for invention {} in country {} to invalid value: current level = {}, change = {}, invalid new value = {}",
1070-
invention, *this, static_cast<int64_t>(unlock_level),
1071-
static_cast<int64_t>(unlock_level_change), static_cast<int64_t>(unlock_level + unlock_level_change)
1070+
invention, *this, unlock_level,
1071+
unlock_level_change, unlock_level + unlock_level_change
10721072
);
10731073
return false;
10741074
}
@@ -1114,7 +1114,7 @@ bool CountryInstance::set_invention_unlock_level(
11141114
}
11151115

11161116
bool CountryInstance::unlock_invention(Invention const& invention) {
1117-
return modify_invention_unlock(invention, 1);
1117+
return modify_invention_unlock(invention, technology_unlock_level_t { 1 });
11181118
}
11191119

11201120
bool CountryInstance::is_invention_unlocked(Invention const& invention) const {
@@ -1237,7 +1237,7 @@ bool CountryInstance::apply_history_to_country(
12371237
ret &= set_technology_unlock_level(*technology, level);
12381238
}
12391239
for (auto const& [invention, activated] : entry.get_inventions()) {
1240-
ret &= set_invention_unlock_level(*invention, activated ? 1 : 0);
1240+
ret &= set_invention_unlock_level(*invention, technology_unlock_level_t { static_cast<int8_t>(activated ? 1 : 0) });
12411241
}
12421242

12431243
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
@@ -17,7 +17,7 @@
1717
#include "openvic-simulation/types/HasIndex.hpp"
1818
#include "openvic-simulation/types/IndexedFlatMap.hpp"
1919
#include "openvic-simulation/types/OrderedContainers.hpp"
20-
#include "openvic-simulation/types/TechnologyUnlockLevel.hpp"
20+
#include "openvic-simulation/research/TechnologyUnlockLevel.hpp"
2121
#include "openvic-simulation/types/TypedIndices.hpp"
2222
#include "openvic-simulation/types/UnitBranchType.hpp"
2323
#include "openvic-simulation/types/UnitVariant.hpp"
@@ -388,8 +388,8 @@ namespace OpenVic {
388388
OV_IFLATMAP_PROPERTY(RegimentType, technology_unlock_level_t, regiment_type_unlock_levels);
389389
regiment_allowed_cultures_t PROPERTY(allowed_regiment_cultures, regiment_allowed_cultures_t::NO_CULTURES);
390390
OV_IFLATMAP_PROPERTY(ShipType, technology_unlock_level_t, ship_type_unlock_levels);
391-
technology_unlock_level_t PROPERTY(gas_attack_unlock_level, 0);
392-
technology_unlock_level_t PROPERTY(gas_defence_unlock_level, 0);
391+
technology_unlock_level_t PROPERTY(gas_attack_unlock_level, technology_unlock_level_t { 0 });
392+
technology_unlock_level_t PROPERTY(gas_defence_unlock_level, technology_unlock_level_t { 0 });
393393
memory::vector<technology_unlock_level_t> SPAN_PROPERTY(unit_variant_unlock_levels);
394394

395395
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)