Group calls to getExtension()

This slightly reduces the code size.
This commit is contained in:
Benoit Blanchon
2024-09-05 12:15:10 +02:00
parent 3b64197869
commit dd1d96e28f
2 changed files with 36 additions and 15 deletions

View File

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

View File

@ -59,8 +59,9 @@ inline void VariantData::clear(ResourceManager* resources) {
#if ARDUINOJSON_USE_EXTENSIONS #if ARDUINOJSON_USE_EXTENSIONS
inline const VariantExtension* VariantData::getExtension( inline const VariantExtension* VariantData::getExtension(
const ResourceManager* resources) const { const ResourceManager* resources) const {
ARDUINOJSON_ASSERT(type_ & VariantTypeBits::ExtensionBit); return type_ & VariantTypeBits::ExtensionBit
return resources->getExtension(content_.asSlotId); ? resources->getExtension(content_.asSlotId)
: nullptr;
} }
#endif #endif