Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/openvic-simulation/country/CountryInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 2 additions & 0 deletions src/openvic-simulation/country/CountryInstance.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
4 changes: 4 additions & 0 deletions src/openvic-simulation/map/MapInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
6 changes: 6 additions & 0 deletions src/openvic-simulation/map/ProvinceInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
1 change: 1 addition & 0 deletions src/openvic-simulation/map/ProvinceInstance.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
13 changes: 4 additions & 9 deletions src/openvic-simulation/modifier/ModifierSum.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#include "ModifierSum.hpp"

#include "openvic-simulation/modifier/Modifier.hpp"
#include <variant>

#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;

Expand All @@ -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);
}
Expand All @@ -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) {
Expand Down
16 changes: 14 additions & 2 deletions src/openvic-simulation/modifier/ModifierSum.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.
Expand Down
Loading