From db7a89b183c3467f0b4bdce3348ed62bee09b118 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 19 Mar 2024 14:47:32 +0100 Subject: [PATCH] Revert "Disable nil_value() for enum and remove NilValue." This reverts commit 58e32e173b76450ead43f095aee1f8650aae2fad. --- src/libslic3r/Config.hpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index c3e4ac2c8f..24bbe7a5b1 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -324,6 +324,7 @@ typedef const ConfigOption* ConfigOptionConstPtr; template struct NilValueTempl { using NilType = T; + static_assert(always_false::value, "Type has no well defined nil value"); }; template struct NilValueTempl, void>> { @@ -333,6 +334,14 @@ template struct NilValueTempl template<> struct NilValueTempl : public NilValueTempl{}; +// For enums the nil is the max value of the underlying type. +template +struct NilValueTempl, void>> +{ + using NilType = T; + static constexpr auto value = static_cast(std::numeric_limits>::max()); +}; + template struct NilValueTempl, void>> { using NilType = T; static constexpr auto value = std::numeric_limits::quiet_NaN(); @@ -366,7 +375,7 @@ public: T value; explicit ConfigOptionSingle(T value) : value(std::move(value)) {} operator T() const { return this->value; } - + void set(const ConfigOption *rhs) override { if (rhs->type() != this->type()) @@ -431,8 +440,7 @@ public: bool nullable() const override { return NULLABLE; } - template = true> - static constexpr NilType nil_value() { return NilType(); } + static constexpr NilType nil_value() { return NilValue(); } // A scalar is nil, or all values of a vector are nil. bool is_nil() const override @@ -709,7 +717,7 @@ public: std::istringstream iss(str); if (str == "nil") { - if constexpr (NULLABLE) + if (NULLABLE) this->value = this->nil_value(); else throw ConfigurationError("Deserializing nil into a non-nullable object"); @@ -882,8 +890,7 @@ public: std::string serialize() const override { std::ostringstream ss; - - if (this->value == std::numeric_limits::max()) { + if (this->value == this->nil_value()) { if (NULLABLE) ss << "nil"; else @@ -900,7 +907,7 @@ public: std::istringstream iss(str); if (str == "nil") { - if constexpr (NULLABLE) + if (NULLABLE) this->value = this->nil_value(); else throw ConfigurationError("Deserializing nil into a non-nullable object");