66#include < algorithm>
77#include < cstddef>
88#include < cstdint>
9+ #include < limits>
910#include < system_error>
1011#include < vector>
1112
2122#include " openvic-simulation/modifier/ModifierManager.hpp"
2223#include " openvic-simulation/types/Colour.hpp"
2324#include " openvic-simulation/types/OrderedContainersMath.hpp"
25+ #include " openvic-simulation/types/TypedSpan.hpp"
2426#include " openvic-simulation/types/Vector.hpp"
2527#include " openvic-simulation/utility/BMP.hpp"
2628#include " openvic-simulation/utility/FormatValidate.hpp"
@@ -48,11 +50,14 @@ ProvinceDefinition const* MapDefinition::get_province_definition_from_number(
4850RiverSegment::RiverSegment (uint8_t new_size, memory::vector<ivec2_t >&& new_points)
4951 : size { new_size }, points { std::move (new_points) } {}
5052
53+ // 1 entry reserved for null province
54+ static constexpr std::size_t MAX_PROVINCE_COUNT = type_safe::get(std::numeric_limits<province_index_t >().max()) - 1;
55+
5156bool MapDefinition::add_province_definition (std::string_view identifier, colour_t colour) {
5257 if (province_definitions.size () >= type_safe::get (max_provinces)) {
5358 spdlog::error_s (
5459 " The map's province list is full - maximum number of provinces is {} (this can be at most {})" ,
55- max_provinces, ProvinceDefinition::MAX_INDEX
60+ max_provinces, MAX_PROVINCE_COUNT
5661 );
5762 return false ;
5863 }
@@ -71,24 +76,24 @@ bool MapDefinition::add_province_definition(std::string_view identifier, colour_
7176 spdlog::error_s (" Invalid province colour for {} - null! ({})" , identifier, colour);
7277 return false ;
7378 }
74- const ProvinceDefinition:: index_t province_number = get_province_number_from_colour (colour);
75- if (province_number != ProvinceDefinition::NULL_INDEX ) {
79+ const province_number_t province_number = get_province_number_from_colour (colour);
80+ if (province_number != ProvinceDefinition::NULL_PROVINCE_NUMBER ) {
7681 spdlog::error_s (
7782 " Duplicate province colours: {} and {}" ,
78- get_province_definition_from_number (type_safe::get ( province_number) )->to_string (), identifier
83+ get_province_definition_from_number (province_number)->to_string (), identifier
7984 );
8085 return false ;
8186 }
8287
8388 if (!province_definitions.emplace_item (
8489 identifier,
85- identifier, colour, ProvinceDefinition::index_t (get_province_definition_count ())
90+ identifier, colour, province_index_t (get_province_definition_count ())
8691 )) {
8792 return false ;
8893 }
8994
9095 ProvinceDefinition const & new_province = province_definitions.back ();
91- colour_index_map[new_province.get_colour ()] = ProvinceDefinition::index_t (new_province.get_province_number ());
96+ colour_index_map[new_province.get_colour ()] = province_index_t (new_province.get_province_number ());
9297 return true ;
9398}
9499
@@ -468,34 +473,34 @@ bool MapDefinition::add_region(std::string_view identifier, memory::vector<Provi
468473 return ret;
469474}
470475
471- ProvinceDefinition:: index_t MapDefinition::get_province_number_from_colour (colour_t colour) const {
476+ MapDefinition:: province_number_t MapDefinition::get_province_number_from_colour (colour_t colour) const {
472477 const colour_index_map_t ::const_iterator it = colour_index_map.find (colour);
473478 if (it != colour_index_map.end ()) {
474- return it-> second ;
479+ return ProvinceDefinition::get_province_number_from_index (it. value ()) ;
475480 }
476- return ProvinceDefinition::NULL_INDEX ;
481+ return ProvinceDefinition::NULL_PROVINCE_NUMBER ;
477482}
478483
479- ProvinceDefinition:: index_t MapDefinition::get_province_number_at (ivec2_t pos) const {
484+ MapDefinition:: province_number_t MapDefinition::get_province_number_at (ivec2_t pos) const {
480485 if (pos.nonnegative () && pos.is_within_bound (dims)) {
481486 return province_shape_image[get_pixel_index_from_pos (pos)].province_number ;
482487 }
483- return ProvinceDefinition::NULL_INDEX ;
488+ return ProvinceDefinition::NULL_PROVINCE_NUMBER ;
484489}
485490
486491ProvinceDefinition* MapDefinition::get_province_definition_at (ivec2_t pos) {
487- return get_province_definition_from_number (type_safe::get ( get_province_number_at (pos) ));
492+ return get_province_definition_from_number (get_province_number_at (pos));
488493}
489494
490495ProvinceDefinition const * MapDefinition::get_province_definition_at (ivec2_t pos) const {
491- return get_province_definition_from_number (type_safe::get ( get_province_number_at (pos) ));
496+ return get_province_definition_from_number (get_province_number_at (pos));
492497}
493498
494- bool MapDefinition::set_max_provinces (ProvinceDefinition:: index_t new_max_provinces) {
495- if (new_max_provinces <= ProvinceDefinition::NULL_INDEX ) {
499+ bool MapDefinition::set_max_provinces (province_index_t new_max_provinces) {
500+ if (new_max_provinces <= province_index_t ( 0 ) ) {
496501 spdlog::error_s (
497- " Trying to set max province count to an invalid value {} (must be greater than {} )" ,
498- new_max_provinces, ProvinceDefinition::NULL_INDEX
502+ " Trying to set max province count to an invalid value {} (must be greater than 0 )" ,
503+ new_max_provinces
499504 );
500505 return false ;
501506 }
@@ -847,19 +852,22 @@ bool MapDefinition::load_map_images(fs::path const& province_path, fs::path cons
847852 uint8_t const * province_data = province_bmp.get_pixel_data ().data ();
848853 uint8_t const * terrain_data = terrain_bmp.get_pixel_data ().data ();
849854
850- memory::vector<fixed_point_map_t <TerrainType const *>> terrain_type_pixels_list (province_definitions.size ());
855+ memory::FixedVector<fixed_point_map_t <TerrainType const *>> _terrain_type_pixels_list (province_definitions.size ());
856+ TypedSpan<province_index_t , fixed_point_map_t <TerrainType const *>> terrain_type_pixels_list { _terrain_type_pixels_list };
851857
852858 bool ret = true ;
853859 ordered_set<colour_t > unrecognised_province_colours;
854860
855- memory::vector<fixed_point_t > pixels_per_province (province_definitions.size ());
856- memory::vector<fvec2_t > pixel_position_sum_per_province (province_definitions.size ());
861+ memory::FixedVector<fixed_point_t > _pixels_per_province (province_definitions.size ());
862+ TypedSpan<province_index_t , fixed_point_t > pixels_per_province { _pixels_per_province };
863+ memory::FixedVector<fvec2_t > _pixel_position_sum_per_province (province_definitions.size ());
864+ TypedSpan<province_index_t , fvec2_t > pixel_position_sum_per_province { _pixel_position_sum_per_province };
857865
858866 for (ivec2_t pos {}; pos.y < get_height (); ++pos.y ) {
859867 for (pos.x = 0 ; pos.x < get_width (); ++pos.x ) {
860868 const size_t pixel_index = get_pixel_index_from_pos (pos);
861869 const colour_t province_colour = colour_at (province_data, pixel_index);
862- ProvinceDefinition:: index_t province_number = ProvinceDefinition::NULL_INDEX ;
870+ province_number_t province_number = ProvinceDefinition::NULL_PROVINCE_NUMBER ;
863871
864872 if (pos.x > 0 ) {
865873 const size_t jdx = pixel_index - 1 ;
@@ -879,7 +887,7 @@ bool MapDefinition::load_map_images(fs::path const& province_path, fs::path cons
879887
880888 province_number = get_province_number_from_colour (province_colour);
881889
882- if (province_number == ProvinceDefinition::NULL_INDEX && !unrecognised_province_colours.contains (province_colour)) {
890+ if (province_number == ProvinceDefinition::NULL_PROVINCE_NUMBER && !unrecognised_province_colours.contains (province_colour)) {
883891 unrecognised_province_colours.insert (province_colour);
884892 if (detailed_errors) {
885893 spdlog::warn_s (
@@ -892,17 +900,18 @@ bool MapDefinition::load_map_images(fs::path const& province_path, fs::path cons
892900 index_found:
893901 province_shape_image[pixel_index].province_number = province_number;
894902
895- if (province_number != ProvinceDefinition::NULL_INDEX ) {
896- const ProvinceDefinition:: index_t array_index = province_number - 1 ;
897- pixels_per_province[type_safe::get (array_index) ]++;
898- pixel_position_sum_per_province[type_safe::get (array_index) ] += static_cast <fvec2_t >(pos);
903+ if (province_number != ProvinceDefinition::NULL_PROVINCE_NUMBER ) {
904+ const province_index_t province_index = ProvinceDefinition::get_index_from_province_number ( province_number) ;
905+ pixels_per_province[province_index ]++;
906+ pixel_position_sum_per_province[province_index ] += static_cast <fvec2_t >(pos);
899907 }
900908
901909 const TerrainTypeMapping::index_t terrain = terrain_data[pixel_index];
902910 TerrainTypeMapping const * mapping = terrain_type_manager.get_terrain_type_mapping_for (terrain);
903911 if (mapping != nullptr ) {
904- if (province_number != ProvinceDefinition::NULL_INDEX) {
905- terrain_type_pixels_list[type_safe::get (province_number - 1 )][&mapping->type ]++;
912+ if (province_number != ProvinceDefinition::NULL_PROVINCE_NUMBER) {
913+ const province_index_t province_index = ProvinceDefinition::get_index_from_province_number (province_number);
914+ terrain_type_pixels_list[province_index][&mapping->type ]++;
906915 }
907916 if (mapping->has_texture && terrain < terrain_type_manager.get_terrain_texture_limit ()) {
908917 province_shape_image[pixel_index].terrain = terrain + 1 ;
@@ -920,21 +929,20 @@ bool MapDefinition::load_map_images(fs::path const& province_path, fs::path cons
920929 }
921930
922931 size_t missing = 0 ;
923- for (size_t array_index = 0 ; array_index < province_definitions.size (); ++array_index) {
924- ProvinceDefinition* province = province_definitions.get_item_by_index (array_index);
925-
926- fixed_point_map_t <TerrainType const *> const & terrain_type_pixels = terrain_type_pixels_list[array_index];
932+ for (ProvinceDefinition& province : province_definitions.get_items ()) {
933+ const province_index_t province_index = province.index ;
934+ fixed_point_map_t <TerrainType const *> const & terrain_type_pixels = terrain_type_pixels_list[province_index];
927935 const fixed_point_map_const_iterator_t <TerrainType const *> largest = get_largest_item (terrain_type_pixels);
928- province-> default_terrain_type = largest != terrain_type_pixels.end () ? largest->first : nullptr ;
936+ province. default_terrain_type = largest != terrain_type_pixels.end () ? largest->first : nullptr ;
929937
930- const fixed_point_t pixel_count = pixels_per_province[array_index ];
931- province-> on_map = pixel_count > 0 ;
938+ const fixed_point_t pixel_count = pixels_per_province[province_index ];
939+ province. on_map = pixel_count > 0 ;
932940
933- if (province-> on_map ) {
934- province-> centre = pixel_position_sum_per_province[array_index ] / pixel_count;
941+ if (province. on_map ) {
942+ province. centre = pixel_position_sum_per_province[province_index ] / pixel_count;
935943 } else {
936944 if (detailed_errors) {
937- spdlog::warn_s (" Province missing from shape image: {}" , province-> to_string ());
945+ spdlog::warn_s (" Province missing from shape image: {}" , province. to_string ());
938946 }
939947 missing++;
940948 }
0 commit comments