mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Allow ConvertibleThroughBase types to be used as settings. (#13466)
parent
adc79aca09
commit
603630c1ae
|
@ -21,4 +21,12 @@ concept ConvertibleThroughBase = requires(T const a) {
|
||||||
{ a.base() } noexcept -> std::convertible_to<int64_t>;
|
{ a.base() } noexcept -> std::convertible_to<int64_t>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type is convertible to TTo, either directly or through ConvertibleThroughBase.
|
||||||
|
* @tparam T The type under consideration.
|
||||||
|
* @tparam TTo The type to convert to.
|
||||||
|
*/
|
||||||
|
template <typename T, typename TTo>
|
||||||
|
concept ConvertibleThroughBaseOrTo = std::is_convertible_v<T, TTo> || ConvertibleThroughBase<T>;
|
||||||
|
|
||||||
#endif /* CONVERTIBLE_THROUGH_BASE_HPP */
|
#endif /* CONVERTIBLE_THROUGH_BASE_HPP */
|
||||||
|
|
|
@ -12,9 +12,6 @@
|
||||||
|
|
||||||
#include "../3rdparty/fmt/format.h"
|
#include "../3rdparty/fmt/format.h"
|
||||||
|
|
||||||
/** Non-templated base for #StrongType::Typedef for use with type trait queries. */
|
|
||||||
struct StrongTypedefBase {};
|
|
||||||
|
|
||||||
namespace StrongType {
|
namespace StrongType {
|
||||||
/**
|
/**
|
||||||
* Mix-in which makes the new Typedef comparable with itself and its base type.
|
* Mix-in which makes the new Typedef comparable with itself and its base type.
|
||||||
|
@ -147,7 +144,7 @@ namespace StrongType {
|
||||||
* @tparam TProperties A list of mixins to add to the class.
|
* @tparam TProperties A list of mixins to add to the class.
|
||||||
*/
|
*/
|
||||||
template <typename TBaseType, typename TTag, typename... TProperties>
|
template <typename TBaseType, typename TTag, typename... TProperties>
|
||||||
struct EMPTY_BASES Typedef : public StrongTypedefBase, public TProperties::template mixin<Typedef<TBaseType, TTag, TProperties...>, TBaseType>... {
|
struct EMPTY_BASES Typedef : public TProperties::template mixin<Typedef<TBaseType, TTag, TProperties...>, TBaseType>... {
|
||||||
using BaseType = TBaseType;
|
using BaseType = TBaseType;
|
||||||
|
|
||||||
constexpr Typedef() = default;
|
constexpr Typedef() = default;
|
||||||
|
|
|
@ -167,16 +167,7 @@ struct IntSettingDesc : SettingDesc {
|
||||||
*/
|
*/
|
||||||
typedef void PostChangeCallback(int32_t value);
|
typedef void PostChangeCallback(int32_t value);
|
||||||
|
|
||||||
template <
|
template <ConvertibleThroughBaseOrTo<int32_t> Tdef, ConvertibleThroughBaseOrTo<int32_t> Tmin, ConvertibleThroughBaseOrTo<uint32_t> Tmax, ConvertibleThroughBaseOrTo<int32_t> Tinterval>
|
||||||
typename Tdef,
|
|
||||||
typename Tmin,
|
|
||||||
typename Tmax,
|
|
||||||
typename Tinterval,
|
|
||||||
std::enable_if_t<std::disjunction_v<std::is_convertible<Tdef, int32_t>, std::is_base_of<StrongTypedefBase, Tdef>>, int> = 0,
|
|
||||||
std::enable_if_t<std::disjunction_v<std::is_convertible<Tmin, int32_t>, std::is_base_of<StrongTypedefBase, Tmin>>, int> = 0,
|
|
||||||
std::enable_if_t<std::disjunction_v<std::is_convertible<Tmax, uint32_t>, std::is_base_of<StrongTypedefBase, Tmax>>, int> = 0,
|
|
||||||
std::enable_if_t<std::disjunction_v<std::is_convertible<Tinterval, int32_t>, std::is_base_of<StrongTypedefBase, Tinterval>>, int> = 0
|
|
||||||
>
|
|
||||||
IntSettingDesc(const SaveLoad &save, SettingFlags flags, bool startup, Tdef def,
|
IntSettingDesc(const SaveLoad &save, SettingFlags flags, bool startup, Tdef def,
|
||||||
Tmin min, Tmax max, Tinterval interval, StringID str, StringID str_help, StringID str_val,
|
Tmin min, Tmax max, Tinterval interval, StringID str, StringID str_help, StringID str_val,
|
||||||
SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback,
|
SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback,
|
||||||
|
@ -187,25 +178,25 @@ struct IntSettingDesc : SettingDesc {
|
||||||
post_callback(post_callback),
|
post_callback(post_callback),
|
||||||
get_title_cb(get_title_cb), get_help_cb(get_help_cb), set_value_dparams_cb(set_value_dparams_cb),
|
get_title_cb(get_title_cb), get_help_cb(get_help_cb), set_value_dparams_cb(set_value_dparams_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 (std::is_base_of_v<StrongTypedefBase, Tdef>) {
|
if constexpr (ConvertibleThroughBase<Tdef>) {
|
||||||
this->def = def.base();
|
this->def = def.base();
|
||||||
} else {
|
} else {
|
||||||
this->def = def;
|
this->def = def;
|
||||||
}
|
}
|
||||||
|
|
||||||
if constexpr (std::is_base_of_v<StrongTypedefBase, Tmin>) {
|
if constexpr (ConvertibleThroughBase<Tmin>) {
|
||||||
this->min = min.base();
|
this->min = min.base();
|
||||||
} else {
|
} else {
|
||||||
this->min = min;
|
this->min = min;
|
||||||
}
|
}
|
||||||
|
|
||||||
if constexpr (std::is_base_of_v<StrongTypedefBase, Tmax>) {
|
if constexpr (ConvertibleThroughBase<Tmax>) {
|
||||||
this->max = max.base();
|
this->max = max.base();
|
||||||
} else {
|
} else {
|
||||||
this->max = max;
|
this->max = max;
|
||||||
}
|
}
|
||||||
|
|
||||||
if constexpr (std::is_base_of_v<StrongTypedefBase, Tinterval>) {
|
if constexpr (ConvertibleThroughBase<Tinterval>) {
|
||||||
this->interval = interval.base();
|
this->interval = interval.base();
|
||||||
} else {
|
} else {
|
||||||
this->interval = interval;
|
this->interval = interval;
|
||||||
|
|
Loading…
Reference in New Issue