Browse Source

Use a `const` reference in `is_convertible()`

Benoit Blanchon 1 year ago
parent
commit
48ee4a178b

+ 1 - 0
extras/tests/Misc/CMakeLists.txt

@@ -6,6 +6,7 @@ add_executable(MiscTests
 	arithmeticCompare.cpp
 	conflicts.cpp
 	issue1967.cpp
+	issue2129.cpp
 	JsonString.cpp
 	NoArduinoHeader.cpp
 	printable.cpp

+ 55 - 0
extras/tests/Misc/issue2129.cpp

@@ -0,0 +1,55 @@
+// ArduinoJson - https://arduinojson.org
+// Copyright © 2014-2024, Benoit BLANCHON
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+template <typename T>
+class Nullable {
+ public:
+  Nullable() : value_{} {}
+  Nullable(T value) : value_{value} {}
+
+  operator T() const {
+    return value_;
+  }
+
+  operator T&() {
+    return value_;
+  }
+
+  bool is_valid() const {
+    return value_ != invalid_value_;
+  }
+
+  T value() const {
+    return value_;
+  }
+
+ private:
+  T value_;
+  static T invalid_value_;
+};
+
+template <>
+float Nullable<float>::invalid_value_ = std::numeric_limits<float>::lowest();
+
+template <typename T>
+void convertToJson(const Nullable<T>& src, JsonVariant dst) {
+  if (src.is_valid()) {
+    dst.set(src.value());
+  } else {
+    dst.clear();
+  }
+}
+
+TEST_CASE("Issue #2129") {
+  Nullable<float> nullable_value = Nullable<float>{123.4f};
+
+  JsonDocument doc;
+
+  doc["value"] = nullable_value;
+
+  REQUIRE(doc["value"].as<float>() == Approx(123.4f));
+}

+ 1 - 1
src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp

@@ -27,7 +27,7 @@ struct is_convertible {
   static int probe(To);
   static char probe(...);
 
-  static From& from_;
+  static const From& from_;
 
  public:
   static const bool value = sizeof(probe(from_)) == sizeof(int);