From 955815fbfa0e4d0b47cef6cb746d360185623158 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 7 Dec 2023 15:36:31 +0100 Subject: [PATCH] Fix `function returns incomplete class type` on IAR (issue #2001) Ported from 3e1be980d93e47b2a0073efeeb9a9396fd7a83be --- src/ArduinoJson/Variant/VariantRefBase.hpp | 20 +++---------- .../Variant/VariantRefBaseImpl.hpp | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index d807f293..0effaf02 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/src/ArduinoJson/Variant/VariantRefBase.hpp @@ -56,9 +56,7 @@ class VariantRefBase : public VariantTag { // https://arduinojson.org/v7/api/jsonvariant/as/ template FORCE_INLINE typename enable_if::value, T>::type - as() const { - return Converter::fromJson(getVariant()); - } + as() const; template ::value>::type> @@ -88,9 +86,7 @@ class VariantRefBase : public VariantTag { template FORCE_INLINE typename enable_if::value, bool>::type - is() const { - return Converter::checkJson(getVariant()); - } + is() const; // Returns true if the value is of the specified type. // https://arduinojson.org/v7/api/jsonvariant/is/ @@ -106,20 +102,12 @@ class VariantRefBase : public VariantTag { // Copies the specified value. // https://arduinojson.org/v7/api/jsonvariant/set/ template - FORCE_INLINE bool set(const T& value) const { - Converter::toJson(value, getOrCreateVariant()); - auto resources = getResourceManager(); - return resources && !resources->overflowed(); - } + FORCE_INLINE bool set(const T& value) const; // Copies the specified value. // https://arduinojson.org/v7/api/jsonvariant/set/ template - FORCE_INLINE bool set(T* value) const { - Converter::toJson(value, getOrCreateVariant()); - auto resources = getResourceManager(); - return resources && !resources->overflowed(); - } + FORCE_INLINE bool set(T* value) const; // Returns the size of the array or object. // https://arduinojson.org/v7/api/jsonvariant/size/ diff --git a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp index 7f925746..2db34daa 100644 --- a/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp +++ b/src/ArduinoJson/Variant/VariantRefBaseImpl.hpp @@ -15,6 +15,13 @@ inline JsonVariant VariantRefBase::add() const { return add(); } +template +template +inline typename enable_if::value, T>::type +VariantRefBase::as() const { + return Converter::fromJson(getVariant()); +} + template inline JsonArray VariantRefBase::createNestedArray() const { return add(); @@ -93,6 +100,13 @@ inline JsonVariant VariantRefBase::getOrCreateVariant() const { return JsonVariant(getOrCreateData(), getResourceManager()); } +template +template +inline typename enable_if::value, bool>::type +VariantRefBase::is() const { + return Converter::checkJson(getVariant()); +} + template inline ElementProxy VariantRefBase::operator[]( size_t index) const { @@ -115,6 +129,22 @@ VariantRefBase::operator[](const TString& key) const { return MemberProxy(derived(), key); } +template +template +inline bool VariantRefBase::set(const T& value) const { + Converter::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 template inline typename enable_if::value, JsonArray>::type