Explorar o código

JsonDocument: fix double clear in `to<T>()`

Benoit Blanchon hai 3 meses
pai
achega
04823fd304

+ 25 - 5
src/ArduinoJson/Document/JsonDocument.hpp

@@ -11,7 +11,6 @@
 #include <ArduinoJson/Object/MemberProxy.hpp>
 #include <ArduinoJson/Polyfills/utility.hpp>
 #include <ArduinoJson/Variant/JsonVariantConst.hpp>
-#include <ArduinoJson/Variant/VariantTo.hpp>
 
 ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
 
@@ -152,12 +151,33 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
     return to<JsonVariant>().set(src);
   }
 
-  // Clears the document and converts it to the specified type.
+  // Sets the document to an empty array.
   // https://arduinojson.org/v7/api/jsondocument/to/
-  template <typename T>
-  typename detail::VariantTo<T>::type to() {
+  template <typename T,
+            detail::enable_if_t<detail::is_same<T, JsonArray>::value, int> = 0>
+  JsonArray to() {
+    clear();
+    data_.toArray();
+    return JsonArray(&data_, &resources_);
+  }
+
+  // Sets the document to an empty object.
+  // https://arduinojson.org/v7/api/jsondocument/to/
+  template <typename T,
+            detail::enable_if_t<detail::is_same<T, JsonObject>::value, int> = 0>
+  JsonObject to() {
     clear();
-    return getVariant().template to<T>();
+    data_.toObject();
+    return JsonObject(&data_, &resources_);
+  }
+
+  // Sets the document to null.
+  // https://arduinojson.org/v7/api/jsondocument/to/
+  template <typename T, detail::enable_if_t<
+                            detail::is_same<T, JsonVariant>::value, int> = 0>
+  JsonVariant to() {
+    clear();
+    return JsonVariant(&data_, &resources_);
   }
 
   // DEPRECATED: use obj["key"].is<T>() instead

+ 0 - 1
src/ArduinoJson/Variant/VariantAttorney.hpp

@@ -7,7 +7,6 @@
 #include <ArduinoJson/Polyfills/attributes.hpp>
 #include <ArduinoJson/Polyfills/type_traits.hpp>
 #include <ArduinoJson/Variant/VariantImpl.hpp>
-#include <ArduinoJson/Variant/VariantTo.hpp>
 #include "JsonVariantConst.hpp"
 
 ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE

+ 0 - 1
src/ArduinoJson/Variant/VariantRefBase.hpp

@@ -8,7 +8,6 @@
 #include <ArduinoJson/Variant/Converter.hpp>
 #include <ArduinoJson/Variant/JsonVariantConst.hpp>
 #include <ArduinoJson/Variant/VariantOperators.hpp>
-#include <ArduinoJson/Variant/VariantTo.hpp>
 
 ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
 class JsonVariant;

+ 0 - 34
src/ArduinoJson/Variant/VariantTo.hpp

@@ -1,34 +0,0 @@
-// ArduinoJson - https://arduinojson.org
-// Copyright © 2014-2025, Benoit BLANCHON
-// MIT License
-
-#pragma once
-
-#include <ArduinoJson/Namespace.hpp>
-
-ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
-class JsonArray;
-class JsonObject;
-class JsonVariant;
-ARDUINOJSON_END_PUBLIC_NAMESPACE
-
-ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
-// A metafunction that returns the type of the value returned by
-// JsonVariant::to<T>()
-template <typename T>
-struct VariantTo {};
-
-template <>
-struct VariantTo<JsonArray> {
-  using type = JsonArray;
-};
-template <>
-struct VariantTo<JsonObject> {
-  using type = JsonObject;
-};
-template <>
-struct VariantTo<JsonVariant> {
-  using type = JsonVariant;
-};
-
-ARDUINOJSON_END_PRIVATE_NAMESPACE