diff --git a/src/openvic-simulation/country/CountryInstance.cpp b/src/openvic-simulation/country/CountryInstance.cpp index bc9efe00..a9513a6a 100644 --- a/src/openvic-simulation/country/CountryInstance.cpp +++ b/src/openvic-simulation/country/CountryInstance.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -1839,7 +1840,8 @@ void CountryInstance::update_gamestate(const Date today, MapInstance& map_instan } if (occupied_provinces_proportion != 0) { - occupied_provinces_proportion /= owned_provinces.size(); + assert(owned_provinces.size() <= std::numeric_limits::max()); + occupied_provinces_proportion /= static_cast(owned_provinces.size()); } if (capital != nullptr) { diff --git a/src/openvic-simulation/economy/BuildingInstance.cpp b/src/openvic-simulation/economy/BuildingInstance.cpp index 88df5779..b4740aed 100644 --- a/src/openvic-simulation/economy/BuildingInstance.cpp +++ b/src/openvic-simulation/economy/BuildingInstance.cpp @@ -32,7 +32,8 @@ void BuildingInstance::update_gamestate(Date today) { end_date = start_date + building_type.get_build_time(); break; case ExpansionState::Expanding: - expansion_progress = fixed_point_t { static_cast((today - start_date).to_int()) } / (end_date - start_date).to_int(); + expansion_progress = fixed_point_t { static_cast((today - start_date).to_int()) } + / static_cast((end_date - start_date).to_int()); break; default: expansion_state = _can_expand() ? ExpansionState::CanExpand : ExpansionState::CannotExpand; } diff --git a/src/openvic-simulation/economy/production/ArtisanalProducer.cpp b/src/openvic-simulation/economy/production/ArtisanalProducer.cpp index de599c41..8b7aaf6b 100644 --- a/src/openvic-simulation/economy/production/ArtisanalProducer.cpp +++ b/src/openvic-simulation/economy/production/ArtisanalProducer.cpp @@ -2,6 +2,7 @@ #include "ArtisanalProducerDeps.hpp" #include +#include #include @@ -521,6 +522,7 @@ ProductionType const* ArtisanalProducer::pick_production_type( ); fixed_point_t relative_score = ranked_artisanal_production_types.empty() ? fixed_point_t::_1 : fixed_point_t::_0; + assert(ranked_artisanal_production_types.size() < std::numeric_limits::max()); for (auto it = ranked_artisanal_production_types.begin(); it < ranked_artisanal_production_types.end(); ++it) { auto const& [production_type, score_estimate] = *it; size_t i = it - ranked_artisanal_production_types.begin(); @@ -532,14 +534,15 @@ ProductionType const* ArtisanalProducer::pick_production_type( relative_score = ( (current_score - score_estimate) / (previous_score_estimate - score_estimate) - + ranked_artisanal_production_types.size() - i - ) / (1 + ranked_artisanal_production_types.size()); + + static_cast(ranked_artisanal_production_types.size() - i) + ) / static_cast(1 + ranked_artisanal_production_types.size()); } break; } if (current_score == score_estimate) { - relative_score = fixed_point_t::parse(ranked_artisanal_production_types.size() - i) / (1 + ranked_artisanal_production_types.size()); + relative_score = fixed_point_t::parse(ranked_artisanal_production_types.size() - i) + / static_cast(1 + ranked_artisanal_production_types.size()); } } diff --git a/src/openvic-simulation/economy/production/ArtisanalProducer.hpp b/src/openvic-simulation/economy/production/ArtisanalProducer.hpp index a62c66a7..9c0078cf 100644 --- a/src/openvic-simulation/economy/production/ArtisanalProducer.hpp +++ b/src/openvic-simulation/economy/production/ArtisanalProducer.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include "openvic-simulation/types/IndexedFlatMap.hpp" @@ -91,7 +92,7 @@ namespace OpenVic { private: CountryInstance* const country_to_report_economy_nullable; memory::vector& demand_per_input; - size_t distinct_goods_to_buy = 0; + int32_t distinct_goods_to_buy = 0; Fraction inputs_bought_fraction; MarketInstance const& market_instance; memory::vector& max_price_per_input; diff --git a/src/openvic-simulation/types/fixed_point/FixedPoint.hpp b/src/openvic-simulation/types/fixed_point/FixedPoint.hpp index cdcdb1f3..14c0f0ad 100644 --- a/src/openvic-simulation/types/fixed_point/FixedPoint.hpp +++ b/src/openvic-simulation/types/fixed_point/FixedPoint.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -78,7 +77,8 @@ namespace OpenVic { public: OV_ALWAYS_INLINE constexpr fixed_point_t() : value { 0 } {} - OV_ALWAYS_INLINE constexpr fixed_point_t(int32_t new_value) : value { static_cast(new_value) << PRECISION } {} + template + OV_ALWAYS_INLINE constexpr fixed_point_t(T new_value) : value { static_cast(new_value) << PRECISION } {} static const fixed_point_t max; static const fixed_point_t min; @@ -238,7 +238,7 @@ namespace OpenVic { return truncate(); } - return floor(); + return floor(); } template @@ -255,7 +255,7 @@ namespace OpenVic { return truncate(); } - return ceil(); + return ceil(); } OV_SPEED_INLINE constexpr fixed_point_t round() const { diff --git a/tests/src/core/random/WeightedSampling.cpp b/tests/src/core/random/WeightedSampling.cpp index 7ec5f4d0..6d233615 100644 --- a/tests/src/core/random/WeightedSampling.cpp +++ b/tests/src/core/random/WeightedSampling.cpp @@ -18,8 +18,9 @@ TEST_CASE("WeightedSampling limits", "[WeightedSampling]") { const fixed_point_t weights_sum = fixed_point_t::usable_max; constexpr size_t perfect_divisor = 257; //4294967295 is perfectly divisible by 257 std::array weights {}; + assert(weights.size() < std::numeric_limits::max()); constexpr uint32_t step_size = max_random_value / weights.size(); - weights.fill(weights_sum / weights.size()); + weights.fill(weights_sum / static_cast(weights.size())); for (size_t i = 0; i < weights.size(); ++i) { CHECK(sample_weighted_index( i * step_size, @@ -33,8 +34,9 @@ TEST_CASE("WeightedSampling weights", "[WeightedSampling]") { std::array weights {}; fixed_point_t weights_sum = 0; + assert(weights.size() < std::numeric_limits::max()); for (size_t i = 0; i < weights.size(); ++i) { - const fixed_point_t weight = 1+i; + const fixed_point_t weight = static_cast(1+i); weights_sum += weight; weights[i] = weight; }