diff --git a/src/openvic-simulation/country/CountryInstance.cpp b/src/openvic-simulation/country/CountryInstance.cpp index 818610c0f..beb8dbdef 100644 --- a/src/openvic-simulation/country/CountryInstance.cpp +++ b/src/openvic-simulation/country/CountryInstance.cpp @@ -1841,7 +1841,15 @@ void CountryInstance::update_modifier_sum(Date today, StaticModifierCache const& // TODO - calculate stats for each unit type (locked and unlocked) } +void CountryInstance::reserve_for_province_modifier_sum(const std::size_t extra_capacity) { + extra_capacity_for_province_modifiers += extra_capacity; +} + void CountryInstance::contribute_province_modifier_sum(ModifierSum const& province_modifier_sum) { + if (extra_capacity_for_province_modifiers > 0) { + reserve_more(modifier_sum, extra_capacity_for_province_modifiers); + extra_capacity_for_province_modifiers = 0; + } modifier_sum.add_modifier_sum(province_modifier_sum); } diff --git a/src/openvic-simulation/country/CountryInstance.hpp b/src/openvic-simulation/country/CountryInstance.hpp index 655e73138..f720d2fde 100644 --- a/src/openvic-simulation/country/CountryInstance.hpp +++ b/src/openvic-simulation/country/CountryInstance.hpp @@ -653,8 +653,10 @@ namespace OpenVic { bool update_rule_set(); + std::size_t extra_capacity_for_province_modifiers = 0; public: void update_modifier_sum(Date today, StaticModifierCache const& static_modifier_cache); + void reserve_for_province_modifier_sum(const std::size_t extra_capacity); void contribute_province_modifier_sum(ModifierSum const& province_modifier_sum); fixed_point_t get_modifier_effect_value(ModifierEffect const& effect) const; constexpr void for_each_contributing_modifier( diff --git a/src/openvic-simulation/map/MapInstance.cpp b/src/openvic-simulation/map/MapInstance.cpp index 4b864e85b..bb126c24d 100644 --- a/src/openvic-simulation/map/MapInstance.cpp +++ b/src/openvic-simulation/map/MapInstance.cpp @@ -143,6 +143,10 @@ void MapInstance::update_modifier_sums(const Date today, StaticModifierCache con for (ProvinceInstance& province : get_province_instances()) { province.update_modifier_sum(today, static_modifier_cache); } + + for (ProvinceInstance& province : get_province_instances()) { + province.update_country_modifier_sum(); + } } void MapInstance::update_gamestate(InstanceManager const& instance_manager) { diff --git a/src/openvic-simulation/map/ProvinceInstance.cpp b/src/openvic-simulation/map/ProvinceInstance.cpp index e7bc0bd60..dce65cb4c 100644 --- a/src/openvic-simulation/map/ProvinceInstance.cpp +++ b/src/openvic-simulation/map/ProvinceInstance.cpp @@ -288,6 +288,12 @@ void ProvinceInstance::update_modifier_sum(Date today, StaticModifierCache const modifier_sum.add_modifier(*crime); } + if (controller != nullptr) { + controller->reserve_for_province_modifier_sum(modifier_sum.get_modifiers().size()); + } +} + +void ProvinceInstance::update_country_modifier_sum() { if (controller != nullptr) { controller->contribute_province_modifier_sum(modifier_sum); } diff --git a/src/openvic-simulation/map/ProvinceInstance.hpp b/src/openvic-simulation/map/ProvinceInstance.hpp index f280155c7..b3ffc3dfa 100644 --- a/src/openvic-simulation/map/ProvinceInstance.hpp +++ b/src/openvic-simulation/map/ProvinceInstance.hpp @@ -184,6 +184,7 @@ namespace OpenVic { size_t get_pop_count() const; void update_modifier_sum(Date today, StaticModifierCache const& static_modifier_cache); + void update_country_modifier_sum(); fixed_point_t get_modifier_effect_value(ModifierEffect const& effect) const; void for_each_contributing_modifier(ModifierEffect const& effect, ContributingModifierCallback auto callback) const { diff --git a/src/openvic-simulation/modifier/ModifierSum.cpp b/src/openvic-simulation/modifier/ModifierSum.cpp index 1c4daba47..9beba54eb 100644 --- a/src/openvic-simulation/modifier/ModifierSum.cpp +++ b/src/openvic-simulation/modifier/ModifierSum.cpp @@ -1,10 +1,11 @@ #include "ModifierSum.hpp" -#include "openvic-simulation/modifier/Modifier.hpp" +#include -#include "openvic-simulation/country/CountryInstance.hpp" -#include "openvic-simulation/map/ProvinceInstance.hpp" #include "openvic-simulation/core/template/Concepts.hpp" +#include "openvic-simulation/country/CountryInstance.hpp" // IWYU pragma: keep for modifier_source_t +#include "openvic-simulation/map/ProvinceInstance.hpp" // IWYU pragma: keep for modifier_source_t +#include "openvic-simulation/modifier/Modifier.hpp" using namespace OpenVic; @@ -30,10 +31,6 @@ void ModifierSum::clear() { value_sum.clear(); } -bool ModifierSum::empty() { - return modifiers.empty(); -} - fixed_point_t ModifierSum::get_modifier_effect_value(ModifierEffect const& effect, bool* effect_found) const { return value_sum.get_effect(effect, effect_found); } @@ -60,8 +57,6 @@ void ModifierSum::add_modifier( } void ModifierSum::add_modifier_sum(ModifierSum const& modifier_sum) { - reserve_more(modifiers, modifier_sum.modifiers.size()); - // We could test that excluded_targets != ALL_TARGETS, but in practice it's always // called with an explcit/hardcoded value and so won't ever exclude everything. for (modifier_entry_t const& modifier_entry : modifier_sum.modifiers) { diff --git a/src/openvic-simulation/modifier/ModifierSum.hpp b/src/openvic-simulation/modifier/ModifierSum.hpp index 5e5c78810..56d680e7a 100644 --- a/src/openvic-simulation/modifier/ModifierSum.hpp +++ b/src/openvic-simulation/modifier/ModifierSum.hpp @@ -105,8 +105,20 @@ namespace OpenVic { ModifierSum& operator=(ModifierSum const&) = default; ModifierSum& operator=(ModifierSum&&) = default; + constexpr std::size_t capacity() const { + return modifiers.capacity(); + } + constexpr std::size_t size() const { + return modifiers.size(); + } + constexpr bool empty() const { + return modifiers.empty(); + } + + constexpr void reserve(const std::size_t new_capacity) { + modifiers.reserve(new_capacity); + } void clear(); - bool empty(); fixed_point_t get_modifier_effect_value(ModifierEffect const& effect, bool* effect_found = nullptr) const; bool has_modifier_effect(ModifierEffect const& effect) const; @@ -117,7 +129,7 @@ namespace OpenVic { modifier_entry_t::modifier_source_t const& source = {}, ModifierEffect::target_t excluded_targets = ModifierEffect::target_t::NO_TARGETS ); - // Reserves space for the number of modifier entries in the given sum and adds each of them using add_modifier + // Loops through modifiers calling add_modifier // with the modifier entries' attributes as arguments. This means non-null sources are preserved (null ones are // replaced with this_source, but in practice the other sum should've set them itself already) and exclusion targets // are combined with this_excluded_targets.