diff --git a/src/core/enum_type.hpp b/src/core/enum_type.hpp index b46565435a..26f3933447 100644 --- a/src/core/enum_type.hpp +++ b/src/core/enum_type.hpp @@ -16,6 +16,9 @@ template constexpr std::underlying_type_t to_underlying(enum_type e) { return static_cast>(e); } +/** Implementation of std::is_scoped_enum_v (from C++23) */ +template constexpr bool is_scoped_enum_v = std::conjunction_v, std::negation>>; + /** Trait to enable prefix/postfix incrementing operators. */ template struct is_enum_incrementable { diff --git a/src/settings_internal.h b/src/settings_internal.h index 124470b77f..4f73d2214c 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -12,6 +12,7 @@ #include #include "saveload/saveload.h" +#include "core/enum_type.hpp" enum class SettingFlag : uint8_t { GuiZeroIsSpecial, ///< A value of zero is possible and has a custom string (the one after "strval"). @@ -67,6 +68,14 @@ enum SettingType : uint8_t { struct IniItem; +/** + * Type is convertible to TTo, either directly, through ConvertibleThroughBase or through to_underlying. + * @tparam T The type under consideration. + * @tparam TTo The type to convert to. + */ +template +concept ConvertibleThroughBaseOrUnderlyingOrTo = ConvertibleThroughBaseOrTo || (is_scoped_enum_v && std::is_convertible_v, TTo>); + /** Properties of config file settings. */ struct SettingDesc { SettingDesc(const SaveLoad &save, SettingFlags flags, bool startup) : @@ -167,7 +176,7 @@ struct IntSettingDesc : SettingDesc { */ using PostChangeCallback = void(int32_t value); - template Tdef, ConvertibleThroughBaseOrTo Tmin, ConvertibleThroughBaseOrTo Tmax, ConvertibleThroughBaseOrTo Tinterval> + template Tdef, ConvertibleThroughBaseOrUnderlyingOrTo Tmin, ConvertibleThroughBaseOrUnderlyingOrTo Tmax, ConvertibleThroughBaseOrUnderlyingOrTo Tinterval> IntSettingDesc(const SaveLoad &save, SettingFlags flags, bool startup, Tdef def, Tmin min, Tmax max, Tinterval interval, StringID str, StringID str_help, StringID str_val, SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback, @@ -177,27 +186,36 @@ struct IntSettingDesc : SettingDesc { str(str), str_help(str_help), str_val(str_val), cat(cat), pre_check(pre_check), post_callback(post_callback), get_title_cb(get_title_cb), get_help_cb(get_help_cb), get_value_params_cb(get_value_params_cb), - get_def_cb(get_def_cb), get_range_cb(get_range_cb) { + get_def_cb(get_def_cb), get_range_cb(get_range_cb) + { if constexpr (ConvertibleThroughBase) { this->def = def.base(); + } else if constexpr (is_scoped_enum_v) { + this->def = to_underlying(def); } else { this->def = def; } if constexpr (ConvertibleThroughBase) { this->min = min.base(); + } else if constexpr (is_scoped_enum_v) { + this->min = to_underlying(min); } else { this->min = min; } if constexpr (ConvertibleThroughBase) { this->max = max.base(); + } else if constexpr (is_scoped_enum_v) { + this->max = to_underlying(max); } else { this->max = max; } if constexpr (ConvertibleThroughBase) { this->interval = interval.base(); + } else if constexpr (is_scoped_enum_v) { + this->interval = to_underlying(interval); } else { this->interval = interval; } @@ -269,7 +287,7 @@ struct BoolSettingDesc : IntSettingDesc { struct OneOfManySettingDesc : IntSettingDesc { typedef std::optional OnConvert(std::string_view value); ///< callback prototype for conversion error - template Tdef, ConvertibleThroughBaseOrTo Tmax> + template Tdef, ConvertibleThroughBaseOrUnderlyingOrTo Tmax> OneOfManySettingDesc(const SaveLoad &save, SettingFlags flags, bool startup, Tdef def, Tmax max, StringID str, StringID str_help, StringID str_val, SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback, diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index 969147a029..fa6bd04445 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -21,6 +21,24 @@ static StringID SettingHelpWallclock(const IntSettingDesc &sd); * DO NOT edit this file. This file is automatically generated from the contents of /src/table/ */ +/* Helpers for validation. When deducing template arguments for functions overloads, + * the compiler will create a 'partial ordering of overloaded function templates' by + * preferring more specialized templates over more generic ones. + * For scoped enums the first overload is more specialized and gets chosen. For signed + * integers it is the second overload as we always compare with an unsigned limit. For anything + * else, the concepts reject the specific overloads, leaving only the last overload. */ + +template requires is_scoped_enum_v +constexpr auto ConvertEnumClass(T value) +{ + return to_underlying(value); +} + +template +constexpr auto ConvertEnumClass(T value) { return std::make_unsigned_t(value); } + +template constexpr T ConvertEnumClass(T value) { return value; } + /** * Settings-macro usage: * The list might look daunting at first, but is in general easy to understand. diff --git a/src/table/settings/company_settings.ini b/src/table/settings/company_settings.ini index 5f80a46e96..ffacfb6d2d 100644 --- a/src/table/settings/company_settings.ini +++ b/src/table/settings/company_settings.ini @@ -24,7 +24,7 @@ SDT_BOOL = SDT_BOOL(CompanySettings, $var, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR(CompanySettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CompanySettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for CompanySettings.$var exceeds storage size"); [defaults] flags = SettingFlag::PerCompany diff --git a/src/table/settings/currency_settings.ini b/src/table/settings/currency_settings.ini index ecbfeef458..55367ff00f 100644 --- a/src/table/settings/currency_settings.ini +++ b/src/table/settings/currency_settings.ini @@ -15,7 +15,7 @@ SDT_VAR = SDT_VAR (CurrencySpec, $var, $type, SettingFlags({$flags}), $def, $mi SDT_SSTR = SDT_SSTR(CurrencySpec, $var, $type, SettingFlags({$flags}), $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CurrencySpec.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for CurrencySpec.$var exceeds storage size"); [defaults] flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync diff --git a/src/table/settings/difficulty_settings.ini b/src/table/settings/difficulty_settings.ini index 35a6b90b47..71bed256c1 100644 --- a/src/table/settings/difficulty_settings.ini +++ b/src/table/settings/difficulty_settings.ini @@ -25,8 +25,8 @@ SDT_BOOL = SDT_BOOL(GameSettings, $var, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR (GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDTG_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/economy_settings.ini b/src/table/settings/economy_settings.ini index c0c691bb34..9a8013336c 100644 --- a/src/table/settings/economy_settings.ini +++ b/src/table/settings/economy_settings.ini @@ -23,7 +23,7 @@ SDT_BOOL = SDT_BOOL(GameSettings, $var, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR (GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini index 3c885676ab..291cec4b6d 100644 --- a/src/table/settings/game_settings.ini +++ b/src/table/settings/game_settings.ini @@ -34,9 +34,9 @@ SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR(GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDTG_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDT_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index 698972923e..10e3e383de 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -30,8 +30,8 @@ SDTC_OMANY = SDTC_OMANY( $var, $type, SettingFlags({$flags}), $def, SDTC_VAR = SDTC_VAR( $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDTC_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] flags = @@ -268,9 +268,9 @@ cat = SC_EXPERT var = gui.zoom_min type = SLE_UINT8 flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown -def = to_underlying(ZoomLevel::Min) -min = to_underlying(ZoomLevel::Min) -max = to_underlying(ZoomLevel::Normal) +def = ZoomLevel::Min +min = ZoomLevel::Min +max = ZoomLevel::Normal str = STR_CONFIG_SETTING_ZOOM_MIN strhelp = STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT strval = STR_CONFIG_SETTING_ZOOM_LVL_MIN @@ -281,9 +281,9 @@ startup = true var = gui.zoom_max type = SLE_UINT8 flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown -def = to_underlying(ZoomLevel::Max) -min = to_underlying(ZoomLevel::Out2x) -max = to_underlying(ZoomLevel::Max) +def = ZoomLevel::Max +min = ZoomLevel::Out2x +max = ZoomLevel::Max str = STR_CONFIG_SETTING_ZOOM_MAX strhelp = STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT strval = STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X @@ -294,9 +294,9 @@ startup = true var = gui.sprite_zoom_min type = SLE_UINT8 flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown -def = to_underlying(ZoomLevel::Min) -min = to_underlying(ZoomLevel::Min) -max = to_underlying(ZoomLevel::Normal) +def = ZoomLevel::Min +min = ZoomLevel::Min +max = ZoomLevel::Normal str = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN strhelp = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT strval = STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN diff --git a/src/table/settings/linkgraph_settings.ini b/src/table/settings/linkgraph_settings.ini index a9ed3b689a..a39b626c4d 100644 --- a/src/table/settings/linkgraph_settings.ini +++ b/src/table/settings/linkgraph_settings.ini @@ -15,7 +15,7 @@ static const SettingVariant _linkgraph_settings_table[] = { SDT_VAR = SDT_VAR(GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/locale_settings.ini b/src/table/settings/locale_settings.ini index 11edd5f54a..21061d5c5c 100644 --- a/src/table/settings/locale_settings.ini +++ b/src/table/settings/locale_settings.ini @@ -26,8 +26,8 @@ SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, SettingFlags({$flags}), $def, SDT_SSTR = SDT_SSTR(GameSettings, $var, $type, SettingFlags({$flags}), $def, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTG_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDTG_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDT_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/misc_settings.ini b/src/table/settings/misc_settings.ini index 86b15c378a..ad9e6fb58d 100644 --- a/src/table/settings/misc_settings.ini +++ b/src/table/settings/misc_settings.ini @@ -33,8 +33,8 @@ SDTG_BOOL = SDTG_BOOL($name, SettingFlags({$flags}), $var, $def, SDTG_VAR = SDTG_VAR($name, $type, SettingFlags({$flags}), $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDTG_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTG_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTG_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync diff --git a/src/table/settings/multimedia_settings.ini b/src/table/settings/multimedia_settings.ini index 1e40f749f7..1211fa5eb9 100644 --- a/src/table/settings/multimedia_settings.ini +++ b/src/table/settings/multimedia_settings.ini @@ -17,7 +17,7 @@ SDTC_LIST = SDTC_LIST( $var, $type, SettingFlags({$flags}), $def, SDTC_VAR = SDTC_VAR( $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTC_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/network_private_settings.ini b/src/table/settings/network_private_settings.ini index 63b5163d0a..969bd62010 100644 --- a/src/table/settings/network_private_settings.ini +++ b/src/table/settings/network_private_settings.ini @@ -19,7 +19,7 @@ SDTC_OMANY = SDTC_OMANY( $var, $type, SettingFlags({$flags}), $def, SDTC_SSTR = SDTC_SSTR( $var, $type, SettingFlags({$flags}), $def, $length, $pre_cb, $post_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/network_settings.ini b/src/table/settings/network_settings.ini index e5a6aa17b3..5aa2b0da45 100644 --- a/src/table/settings/network_settings.ini +++ b/src/table/settings/network_settings.ini @@ -21,8 +21,8 @@ SDTC_OMANY = SDTC_OMANY( $var, $type, SettingFlags({$flags}), $def, SDTC_VAR = SDTC_VAR( $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDTC_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/news_display_settings.ini b/src/table/settings/news_display_settings.ini index 4a4c05a6ea..115da969c9 100644 --- a/src/table/settings/news_display_settings.ini +++ b/src/table/settings/news_display_settings.ini @@ -16,7 +16,7 @@ static const SettingVariant _news_display_settings_table[] = { SDTC_OMANY = SDTC_OMANY( $var, $type, SettingFlags({$flags}), $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/old_gameopt_settings.ini b/src/table/settings/old_gameopt_settings.ini index bb6c3cca32..e23d9c91e3 100644 --- a/src/table/settings/old_gameopt_settings.ini +++ b/src/table/settings/old_gameopt_settings.ini @@ -39,11 +39,11 @@ SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, SettingFlags({$flags}), $de SDT_VAR = SDT_VAR(GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDTG_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); -SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDTG_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTG_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTC_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDT_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini index c1e6bb83bf..da613825e7 100644 --- a/src/table/settings/pathfinding_settings.ini +++ b/src/table/settings/pathfinding_settings.ini @@ -16,7 +16,7 @@ SDT_BOOL = SDT_BOOL(GameSettings, $var, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR(GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/script_settings.ini b/src/table/settings/script_settings.ini index 5c6381964c..27532a305c 100644 --- a/src/table/settings/script_settings.ini +++ b/src/table/settings/script_settings.ini @@ -18,8 +18,8 @@ SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR(GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags = diff --git a/src/table/settings/win32_settings.ini b/src/table/settings/win32_settings.ini index c0bfee9b5c..392f03816c 100644 --- a/src/table/settings/win32_settings.ini +++ b/src/table/settings/win32_settings.ini @@ -21,7 +21,7 @@ SDTG_BOOL = SDTG_BOOL($name, SettingFlags({$flags}), $var, $def, SDTG_VAR = SDTG_VAR($name, $type, SettingFlags({$flags}), $var, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size"); +SDTG_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for $var exceeds storage size"); [defaults] flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync diff --git a/src/table/settings/window_settings.ini b/src/table/settings/window_settings.ini index 456f91b4de..221247b5a9 100644 --- a/src/table/settings/window_settings.ini +++ b/src/table/settings/window_settings.ini @@ -17,7 +17,7 @@ SDT_BOOL = SDT_BOOL(WindowDesc, $var, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR(WindowDesc, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for WindowDesc.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for WindowDesc.$var exceeds storage size"); [defaults] flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync diff --git a/src/table/settings/world_settings.ini b/src/table/settings/world_settings.ini index ce62136c3f..30aaec5f6f 100644 --- a/src/table/settings/world_settings.ini +++ b/src/table/settings/world_settings.ini @@ -23,8 +23,8 @@ SDT_OMANY = SDT_OMANY(GameSettings, $var, $type, SettingFlags({$flags}), $def, SDT_VAR = SDT_VAR(GameSettings, $var, $type, SettingFlags({$flags}), $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $str_cb, $help_cb, $val_cb, $def_cb, $range_cb, $from, $to, $cat, $extra, $startup), [validation] -SDT_OMANY = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); -SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_OMANY = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); +SDT_VAR = static_assert(ConvertEnumClass($max) <= MAX_$type, "Maximum value for GameSettings.$var exceeds storage size"); [defaults] flags =