From bf7ba07e1fdffb779e76bba88c96689051401260 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 29 Jan 2023 20:42:03 +0000 Subject: [PATCH] Use smallest viable size in valptridx::array_base_count_type --- common/include/valptridx.h | 13 ++++++++++--- similar/editor/medwall.cpp | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/common/include/valptridx.h b/common/include/valptridx.h index 6f17bef9c..d3e255895 100644 --- a/common/include/valptridx.h +++ b/common/include/valptridx.h @@ -37,8 +37,15 @@ template class valptridx::array_base_count_type { protected: + /* Use the smallest size that will store all legal values. Currently, + * no user has a maximum size that needs more than uint16_t, so reject + * attempts to use that size. This protects against silently getting + * the wrong result if a future change raises the maximum size above + * uint16_t. + */ + using count_type = typename std::conditional<(array_size <= UINT8_MAX), uint8_t, typename std::conditional<(array_size <= UINT16_MAX), uint16_t, void>::type>::type; union { - unsigned count; + count_type count; /* * Use DXX_VALPTRIDX_FOR_EACH_PPI_TYPE to generate empty union * members based on basic_{i,v}val_member_factory @@ -55,11 +62,11 @@ protected: { } public: - unsigned get_count() const + count_type get_count() const { return count; } - void set_count(const unsigned c) + void set_count(const count_type c) { count = c; } diff --git a/similar/editor/medwall.cpp b/similar/editor/medwall.cpp index df6d31a2b..53f489d1d 100644 --- a/similar/editor/medwall.cpp +++ b/similar/editor/medwall.cpp @@ -775,7 +775,7 @@ int wall_remove_side(const vmsegptridx_t seg, const sidenum_t side) } { - const auto num_walls = Walls.get_count(); + const std::size_t num_walls{Walls.get_count()}; auto &&sr = partial_const_range(Walls, static_cast(lower_wallnum) + 2, num_walls); std::move(sr.begin(), sr.end(), partial_range(Walls, static_cast(lower_wallnum), num_walls - 2).begin()); Walls.set_count(num_walls - 2);