Define all VariantData's member functions inline

This commit is contained in:
Benoit Blanchon
2023-05-23 18:04:47 +02:00
parent 636c8c36eb
commit 78a30496be
2 changed files with 76 additions and 88 deletions

View File

@ -14,6 +14,9 @@
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
template <typename T>
T parseNumber(const char* s);
class VariantData {
VariantContent content_; // must be first to allow cast from array to variant
uint8_t flags_;
@ -69,15 +72,83 @@ class VariantData {
}
template <typename T>
T asIntegral() const;
T asIntegral() const {
static_assert(is_integral<T>::value, "T must be an integral type");
switch (type()) {
case VALUE_IS_BOOLEAN:
return content_.asBoolean;
case VALUE_IS_UNSIGNED_INTEGER:
return convertNumber<T>(content_.asUnsignedInteger);
case VALUE_IS_SIGNED_INTEGER:
return convertNumber<T>(content_.asSignedInteger);
case VALUE_IS_LINKED_STRING:
return parseNumber<T>(content_.asLinkedString);
case VALUE_IS_OWNED_STRING:
return parseNumber<T>(content_.asOwnedString->data);
case VALUE_IS_FLOAT:
return convertNumber<T>(content_.asFloat);
default:
return 0;
}
}
template <typename T>
T asFloat() const;
T asFloat() const {
static_assert(is_floating_point<T>::value, "T must be a floating point");
switch (type()) {
case VALUE_IS_BOOLEAN:
return static_cast<T>(content_.asBoolean);
case VALUE_IS_UNSIGNED_INTEGER:
return static_cast<T>(content_.asUnsignedInteger);
case VALUE_IS_SIGNED_INTEGER:
return static_cast<T>(content_.asSignedInteger);
case VALUE_IS_LINKED_STRING:
case VALUE_IS_OWNED_STRING:
return parseNumber<T>(content_.asOwnedString->data);
case VALUE_IS_FLOAT:
return static_cast<T>(content_.asFloat);
default:
return 0;
}
}
JsonString asString() const;
JsonString asRawString() const;
JsonString asString() const {
switch (type()) {
case VALUE_IS_LINKED_STRING:
return JsonString(content_.asLinkedString, JsonString::Linked);
case VALUE_IS_OWNED_STRING:
return JsonString(content_.asOwnedString->data,
content_.asOwnedString->length, JsonString::Copied);
default:
return JsonString();
}
}
bool asBoolean() const;
JsonString asRawString() const {
switch (type()) {
case VALUE_IS_RAW_STRING:
return JsonString(content_.asOwnedString->data,
content_.asOwnedString->length, JsonString::Copied);
default:
return JsonString();
}
}
bool asBoolean() const {
switch (type()) {
case VALUE_IS_BOOLEAN:
return content_.asBoolean;
case VALUE_IS_SIGNED_INTEGER:
case VALUE_IS_UNSIGNED_INTEGER:
return content_.asUnsignedInteger != 0;
case VALUE_IS_FLOAT:
return content_.asFloat != 0;
case VALUE_IS_NULL:
return false;
default:
return true;
}
}
const char* getOwnedString() const {
if (flags_ & OWNED_VALUE_BIT)

View File

@ -5,94 +5,11 @@
#pragma once
#include <ArduinoJson/Array/JsonArray.hpp>
#include <ArduinoJson/Configuration.hpp>
#include <ArduinoJson/Numbers/convertNumber.hpp>
#include <ArduinoJson/Numbers/parseNumber.hpp>
#include <ArduinoJson/Object/JsonObject.hpp>
#include <ArduinoJson/Variant/JsonVariant.hpp>
#include <string.h> // for strcmp
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
template <typename T>
inline T VariantData::asIntegral() const {
switch (type()) {
case VALUE_IS_BOOLEAN:
return content_.asBoolean;
case VALUE_IS_UNSIGNED_INTEGER:
return convertNumber<T>(content_.asUnsignedInteger);
case VALUE_IS_SIGNED_INTEGER:
return convertNumber<T>(content_.asSignedInteger);
case VALUE_IS_LINKED_STRING:
return parseNumber<T>(content_.asLinkedString);
case VALUE_IS_OWNED_STRING:
return parseNumber<T>(content_.asOwnedString->data);
case VALUE_IS_FLOAT:
return convertNumber<T>(content_.asFloat);
default:
return 0;
}
}
inline bool VariantData::asBoolean() const {
switch (type()) {
case VALUE_IS_BOOLEAN:
return content_.asBoolean;
case VALUE_IS_SIGNED_INTEGER:
case VALUE_IS_UNSIGNED_INTEGER:
return content_.asUnsignedInteger != 0;
case VALUE_IS_FLOAT:
return content_.asFloat != 0;
case VALUE_IS_NULL:
return false;
default:
return true;
}
}
// T = float/double
template <typename T>
inline T VariantData::asFloat() const {
switch (type()) {
case VALUE_IS_BOOLEAN:
return static_cast<T>(content_.asBoolean);
case VALUE_IS_UNSIGNED_INTEGER:
return static_cast<T>(content_.asUnsignedInteger);
case VALUE_IS_SIGNED_INTEGER:
return static_cast<T>(content_.asSignedInteger);
case VALUE_IS_LINKED_STRING:
case VALUE_IS_OWNED_STRING:
return parseNumber<T>(content_.asOwnedString->data);
case VALUE_IS_FLOAT:
return static_cast<T>(content_.asFloat);
default:
return 0;
}
}
inline JsonString VariantData::asString() const {
switch (type()) {
case VALUE_IS_LINKED_STRING:
return JsonString(content_.asLinkedString, JsonString::Linked);
case VALUE_IS_OWNED_STRING:
return JsonString(content_.asOwnedString->data,
content_.asOwnedString->length, JsonString::Copied);
default:
return JsonString();
}
}
inline JsonString VariantData::asRawString() const {
switch (type()) {
case VALUE_IS_RAW_STRING:
return JsonString(content_.asOwnedString->data,
content_.asOwnedString->length, JsonString::Copied);
default:
return JsonString();
}
}
template <typename TDerived>
inline JsonVariant VariantRefBase<TDerived>::add() const {
return JsonVariant(getPool(),