diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index b88dcd97..43ee4d80 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -43,14 +43,18 @@ class VariantData { template typename TVisitor::result_type accept( TVisitor& visit, const ResourceManager* resources) const { +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else (void)resources; // silence warning +#endif switch (type_) { case VariantType::Float: return visit.visit(content_.asFloat); #if ARDUINOJSON_USE_DOUBLE case VariantType::Double: - return visit.visit(getExtension(resources)->asDouble); + return visit.visit(extension->asDouble); #endif case VariantType::Array: @@ -79,10 +83,10 @@ class VariantData { #if ARDUINOJSON_USE_LONG_LONG case VariantType::Int64: - return visit.visit(getExtension(resources)->asInt64); + return visit.visit(extension->asInt64); case VariantType::Uint64: - return visit.visit(getExtension(resources)->asUint64); + return visit.visit(extension->asUint64); #endif case VariantType::Boolean: @@ -130,7 +134,11 @@ class VariantData { } bool asBoolean(const ResourceManager* resources) const { +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else (void)resources; // silence warning +#endif switch (type_) { case VariantType::Boolean: return content_.asBoolean; @@ -141,14 +149,14 @@ class VariantData { return content_.asFloat != 0; #if ARDUINOJSON_USE_DOUBLE case VariantType::Double: - return getExtension(resources)->asDouble != 0; + return extension->asDouble != 0; #endif case VariantType::Null: return false; #if ARDUINOJSON_USE_LONG_LONG case VariantType::Uint64: case VariantType::Int64: - return getExtension(resources)->asUint64 != 0; + return extension->asUint64 != 0; #endif default: return true; @@ -174,7 +182,11 @@ class VariantData { template T asFloat(const ResourceManager* resources) const { static_assert(is_floating_point::value, "T must be a floating point"); +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else (void)resources; // silence warning +#endif switch (type_) { case VariantType::Boolean: return static_cast(content_.asBoolean); @@ -184,9 +196,9 @@ class VariantData { return static_cast(content_.asInt32); #if ARDUINOJSON_USE_LONG_LONG case VariantType::Uint64: - return static_cast(getExtension(resources)->asUint64); + return static_cast(extension->asUint64); case VariantType::Int64: - return static_cast(getExtension(resources)->asInt64); + return static_cast(extension->asInt64); #endif case VariantType::LinkedString: case VariantType::OwnedString: @@ -195,7 +207,7 @@ class VariantData { return static_cast(content_.asFloat); #if ARDUINOJSON_USE_DOUBLE case VariantType::Double: - return static_cast(getExtension(resources)->asDouble); + return static_cast(extension->asDouble); #endif default: return 0; @@ -205,7 +217,11 @@ class VariantData { template T asIntegral(const ResourceManager* resources) const { static_assert(is_integral::value, "T must be an integral type"); +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else (void)resources; // silence warning +#endif switch (type_) { case VariantType::Boolean: return content_.asBoolean; @@ -215,9 +231,9 @@ class VariantData { return convertNumber(content_.asInt32); #if ARDUINOJSON_USE_LONG_LONG case VariantType::Uint64: - return convertNumber(getExtension(resources)->asUint64); + return convertNumber(extension->asUint64); case VariantType::Int64: - return convertNumber(getExtension(resources)->asInt64); + return convertNumber(extension->asInt64); #endif case VariantType::LinkedString: return parseNumber(content_.asLinkedString); @@ -227,7 +243,7 @@ class VariantData { return convertNumber(content_.asFloat); #if ARDUINOJSON_USE_DOUBLE case VariantType::Double: - return convertNumber(getExtension(resources)->asDouble); + return convertNumber(extension->asDouble); #endif default: return 0; @@ -327,7 +343,11 @@ class VariantData { template bool isInteger(const ResourceManager* resources) const { +#if ARDUINOJSON_USE_LONG_LONG + auto extension = getExtension(resources); +#else (void)resources; // silence warning +#endif switch (type_) { case VariantType::Uint32: return canConvertNumber(content_.asUint32); @@ -337,10 +357,10 @@ class VariantData { #if ARDUINOJSON_USE_LONG_LONG case VariantType::Uint64: - return canConvertNumber(getExtension(resources)->asUint64); + return canConvertNumber(extension->asUint64); case VariantType::Int64: - return canConvertNumber(getExtension(resources)->asInt64); + return canConvertNumber(extension->asInt64); #endif default: diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 32513de3..f6217d77 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -59,8 +59,9 @@ inline void VariantData::clear(ResourceManager* resources) { #if ARDUINOJSON_USE_EXTENSIONS inline const VariantExtension* VariantData::getExtension( const ResourceManager* resources) const { - ARDUINOJSON_ASSERT(type_ & VariantTypeBits::ExtensionBit); - return resources->getExtension(content_.asSlotId); + return type_ & VariantTypeBits::ExtensionBit + ? resources->getExtension(content_.asSlotId) + : nullptr; } #endif