diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index 788fa240..a8a2b83b 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -59,11 +59,13 @@ struct Converter< !detail::is_same::value && !detail::is_same::value>::type> : private detail::VariantAttorney { - static void toJson(T src, JsonVariant dst) { + static bool toJson(T src, JsonVariant dst) { ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED(T); auto data = getData(dst); - if (data) - data->setInteger(src, getResourceManager(dst)); + if (!data) + return false; + data->setInteger(src, getResourceManager(dst)); + return true; } static T fromJson(JsonVariantConst src) { @@ -81,8 +83,8 @@ struct Converter< template struct Converter::value>::type> : private detail::VariantAttorney { - static void toJson(T src, JsonVariant dst) { - dst.set(static_cast(src)); + static bool toJson(T src, JsonVariant dst) { + return dst.set(static_cast(src)); } static T fromJson(JsonVariantConst src) { @@ -98,10 +100,12 @@ struct Converter::value>::type> template <> struct Converter : private detail::VariantAttorney { - static void toJson(bool src, JsonVariant dst) { + static bool toJson(bool src, JsonVariant dst) { auto data = getData(dst); - if (data) - data->setBoolean(src, getResourceManager(dst)); + if (!data) + return false; + data->setBoolean(src, getResourceManager(dst)); + return true; } static bool fromJson(JsonVariantConst src) { @@ -119,10 +123,12 @@ template struct Converter< T, typename detail::enable_if::value>::type> : private detail::VariantAttorney { - static void toJson(T src, JsonVariant dst) { + static bool toJson(T src, JsonVariant dst) { auto data = getData(dst); - if (data) - data->setFloat(static_cast(src), getResourceManager(dst)); + if (!data) + return false; + data->setFloat(static_cast(src), getResourceManager(dst)); + return true; } static T fromJson(JsonVariantConst src) { diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index 62271a08..bf6b9d0e 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/src/ArduinoJson/Variant/VariantRefBase.hpp @@ -79,12 +79,16 @@ class VariantRefBase : public VariantTag { // Copies the specified value. // https://arduinojson.org/v7/api/jsonvariant/set/ template - bool set(const T& value) const; + bool set(const T& value) const { + return doSet::type>>(value); + } // Copies the specified value. // https://arduinojson.org/v7/api/jsonvariant/set/ template - bool set(T* value) const; + bool set(T* value) const { + return doSet>(value); + } // Returns the size of the array or object. // https://arduinojson.org/v7/api/jsonvariant/size/ @@ -290,6 +294,21 @@ class VariantRefBase : public VariantTag { return getVariant(); } + template + bool doSet(T&& value) const { + return doSet( + detail::forward(value), + is_same::return_type, + bool>{}); + } + + template + bool doSet(T&& value, false_type) const; + + template + bool doSet(T&& value, true_type) const; + ArduinoJson::JsonVariant getOrCreateVariant() const; }; diff --git a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp index 299cd13f..461868f4 100644 --- a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp +++ b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp @@ -139,20 +139,17 @@ VariantRefBase::operator[](const TString& key) const { } template -template -inline bool VariantRefBase::set(const T& value) const { - Converter::type>::toJson(value, - getOrCreateVariant()); +template +inline bool VariantRefBase::doSet(T&& value, false_type) const { + TConverter::toJson(value, getOrCreateVariant()); auto resources = getResourceManager(); return resources && !resources->overflowed(); } template -template -inline bool VariantRefBase::set(T* value) const { - Converter::toJson(value, getOrCreateVariant()); - auto resources = getResourceManager(); - return resources && !resources->overflowed(); +template +inline bool VariantRefBase::doSet(T&& value, true_type) const { + return TConverter::toJson(value, getOrCreateVariant()); } template