diff --git a/src/openvic-simulation/map/ProvinceInstance.cpp b/src/openvic-simulation/map/ProvinceInstance.cpp index c28da842..e04c8145 100644 --- a/src/openvic-simulation/map/ProvinceInstance.cpp +++ b/src/openvic-simulation/map/ProvinceInstance.cpp @@ -180,16 +180,6 @@ void ProvinceInstance::_add_pop(Pop&& pop) { pops.insert(std::move(pop)); } -bool ProvinceInstance::add_pop(Pop&& pop) { - if (!province_definition.is_water()) { - _add_pop(std::move(pop)); - return true; - } else { - spdlog::error_s("Trying to add pop to water province {}", *this); - return false; - } -} - bool ProvinceInstance::add_pop_vec( std::span pop_vec, PopDeps const& pop_deps @@ -200,7 +190,8 @@ bool ProvinceInstance::add_pop_vec( _add_pop(Pop { pop, get_supporter_equivalents_by_ideology().get_keys(), - pop_deps + pop_deps, + ++last_pop_id }); } return true; diff --git a/src/openvic-simulation/map/ProvinceInstance.hpp b/src/openvic-simulation/map/ProvinceInstance.hpp index 9d68aaad..e39f0603 100644 --- a/src/openvic-simulation/map/ProvinceInstance.hpp +++ b/src/openvic-simulation/map/ProvinceInstance.hpp @@ -5,16 +5,17 @@ #include "openvic-simulation/core/portable/ForwardableSpan.hpp" #include "openvic-simulation/economy/BuildingInstance.hpp" #include "openvic-simulation/economy/production/ResourceGatheringOperation.hpp" +#include "openvic-simulation/map/LifeRating.hpp" #include "openvic-simulation/military/UnitBranchedGetterMacro.hpp" #include "openvic-simulation/modifier/ModifierSum.hpp" #include "openvic-simulation/population/Pop.hpp" +#include "openvic-simulation/population/PopIdInProvince.hpp" #include "openvic-simulation/population/PopsAggregate.hpp" #include "openvic-simulation/types/ColonyStatus.hpp" #include "openvic-simulation/types/FlagStrings.hpp" #include "openvic-simulation/types/HasIdentifier.hpp" #include "openvic-simulation/types/HasIndex.hpp" #include "openvic-simulation/types/OrderedContainers.hpp" -#include "openvic-simulation/map/LifeRating.hpp" #include "openvic-simulation/types/FixedVector.hpp" #include "openvic-simulation/types/TypedIndices.hpp" #include "openvic-simulation/types/TypedSpan.hpp" @@ -115,6 +116,7 @@ namespace OpenVic { OV_UNIT_BRANCHED_GETTER_CONST(get_unit_instance_groups, armies, navies); private: + pop_id_in_province_t last_pop_id{0}; memory::colony PROPERTY(pops); // TODO - replace with a more easily vectorisable container? void _add_pop(Pop&& pop); void _update_pops(MilitaryDefines const& military_defines); @@ -168,7 +170,6 @@ namespace OpenVic { bool expand_building(const province_building_index_t index); - bool add_pop(Pop&& pop); bool add_pop_vec( std::span pop_vec, PopDeps const& pop_deps diff --git a/src/openvic-simulation/population/Pop.cpp b/src/openvic-simulation/population/Pop.cpp index 99842cd7..aa475e9f 100644 --- a/src/openvic-simulation/population/Pop.cpp +++ b/src/openvic-simulation/population/Pop.cpp @@ -15,7 +15,8 @@ #include "openvic-simulation/country/CountryParty.hpp" #include "openvic-simulation/country/CountryDefinition.hpp" #include "openvic-simulation/country/CountryInstance.hpp" -#include "openvic-simulation/defines/Define.hpp" +#include "openvic-simulation/defines/MilitaryDefines.hpp" +#include "openvic-simulation/defines/PopsDefines.hpp" #include "openvic-simulation/economy/GoodDefinition.hpp" #include "openvic-simulation/economy/GoodInstance.hpp" #include "openvic-simulation/economy/production/ArtisanalProducer.hpp" @@ -54,9 +55,11 @@ PopBase::PopBase( Pop::Pop( PopBase const& pop_base, decltype(supporter_equivalents_by_ideology)::keys_span_type ideology_keys, - PopDeps const& pop_deps + PopDeps const& pop_deps, + const pop_id_in_province_t new_id_in_province ) : PopBase { pop_base }, + id_in_province { new_id_in_province }, market_instance { pop_deps.market_instance }, artisanal_producer_optional { type->is_artisan diff --git a/src/openvic-simulation/population/Pop.hpp b/src/openvic-simulation/population/Pop.hpp index 47391ef1..cc01ebf7 100644 --- a/src/openvic-simulation/population/Pop.hpp +++ b/src/openvic-simulation/population/Pop.hpp @@ -4,12 +4,13 @@ #include "openvic-simulation/core/portable/ForwardableSpan.hpp" #include "openvic-simulation/economy/production/ArtisanalProducer.hpp" +#include "openvic-simulation/population/PopIdInProvince.hpp" #include "openvic-simulation/population/PopNeedsMacro.hpp" +#include "openvic-simulation/population/PopSize.hpp" #include "openvic-simulation/types/fixed_point/Atomic.hpp" #include "openvic-simulation/types/fixed_point/FixedPoint.hpp" #include "openvic-simulation/types/fixed_point/FixedPointMap.hpp" #include "openvic-simulation/types/IndexedFlatMap.hpp" -#include "openvic-simulation/population/PopSize.hpp" #include "openvic-simulation/types/UnitBranchType.hpp" #include "openvic-simulation/utility/Containers.hpp" @@ -89,6 +90,9 @@ namespace OpenVic { static constexpr pop_size_t MAX_SIZE = std::numeric_limits>::max(); + public: + const pop_id_in_province_t id_in_province; + private: MarketInstance& market_instance; std::optional artisanal_producer_optional; @@ -163,7 +167,8 @@ namespace OpenVic { Pop( PopBase const& pop_base, decltype(supporter_equivalents_by_ideology)::keys_span_type ideology_keys, - PopDeps const& pop_deps + PopDeps const& pop_deps, + const pop_id_in_province_t new_id_in_province ); memory::string get_pop_context_text() const; diff --git a/src/openvic-simulation/population/PopIdInProvince.hpp b/src/openvic-simulation/population/PopIdInProvince.hpp new file mode 100644 index 00000000..2759b93d --- /dev/null +++ b/src/openvic-simulation/population/PopIdInProvince.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include + +#include +#include + +#include + +namespace OpenVic { + struct pop_id_in_province_t : type_safe::strong_typedef, + type_safe::strong_typedef_op::equality_comparison, + type_safe::strong_typedef_op::relational_comparison, + type_safe::strong_typedef_op::integer_arithmetic { + using strong_typedef::strong_typedef; + }; +} +namespace std { + template <> + struct hash : type_safe::hashable {}; +} +template<> +struct fmt::formatter : fmt::formatter { + fmt::format_context::iterator format(OpenVic::pop_id_in_province_t const& value, fmt::format_context& ctx) const { + return fmt::formatter::format(type_safe::get(value), ctx); + } +}; \ No newline at end of file