mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
arduinojson 7.4 and package update
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// ArduinoJson - https://arduinojson.org
|
||||
// Copyright © 2014-2024, Benoit BLANCHON
|
||||
// Copyright © 2014-2025, Benoit BLANCHON
|
||||
// MIT License
|
||||
|
||||
#pragma once
|
||||
@@ -239,11 +239,11 @@
|
||||
#define ARDUINOJSON_BIN2ALPHA_1111() P
|
||||
#define ARDUINOJSON_BIN2ALPHA_(A, B, C, D) ARDUINOJSON_BIN2ALPHA_##A##B##C##D()
|
||||
#define ARDUINOJSON_BIN2ALPHA(A, B, C, D) ARDUINOJSON_BIN2ALPHA_(A, B, C, D)
|
||||
#define ARDUINOJSON_VERSION "7.3.0"
|
||||
#define ARDUINOJSON_VERSION "7.4.0"
|
||||
#define ARDUINOJSON_VERSION_MAJOR 7
|
||||
#define ARDUINOJSON_VERSION_MINOR 3
|
||||
#define ARDUINOJSON_VERSION_MINOR 4
|
||||
#define ARDUINOJSON_VERSION_REVISION 0
|
||||
#define ARDUINOJSON_VERSION_MACRO V730
|
||||
#define ARDUINOJSON_VERSION_MACRO V740
|
||||
#ifndef ARDUINOJSON_VERSION_NAMESPACE
|
||||
# define ARDUINOJSON_VERSION_NAMESPACE \
|
||||
ARDUINOJSON_CONCAT5( \
|
||||
@@ -1018,6 +1018,14 @@ struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
|
||||
return AdaptedString(str, str ? ::strlen(str) : 0);
|
||||
}
|
||||
};
|
||||
template <typename TChar>
|
||||
struct StringAdapter<TChar[], enable_if_t<IsChar<TChar>::value>> {
|
||||
using AdaptedString = RamString;
|
||||
static AdaptedString adapt(const TChar* p) {
|
||||
auto str = reinterpret_cast<const char*>(p);
|
||||
return AdaptedString(str, str ? ::strlen(str) : 0);
|
||||
}
|
||||
};
|
||||
template <size_t N>
|
||||
struct StringAdapter<const char (&)[N]> {
|
||||
using AdaptedString = RamString;
|
||||
@@ -1029,8 +1037,9 @@ template <typename TChar, size_t N>
|
||||
struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
|
||||
using AdaptedString = RamString;
|
||||
static AdaptedString adapt(const TChar* p) {
|
||||
ARDUINOJSON_ASSERT(p);
|
||||
auto str = reinterpret_cast<const char*>(p);
|
||||
return AdaptedString(str, str ? ::strlen(str) : 0);
|
||||
return AdaptedString(str, ::strlen(str));
|
||||
}
|
||||
};
|
||||
template <typename TChar>
|
||||
@@ -2003,8 +2012,9 @@ ARDUINOJSON_END_PUBLIC_NAMESPACE
|
||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||
class ObjectData : public CollectionData {
|
||||
public:
|
||||
template <typename TAdaptedString> // also works with StringNode*
|
||||
template <typename TAdaptedString>
|
||||
VariantData* addMember(TAdaptedString key, ResourceManager* resources);
|
||||
VariantData* addPair(VariantData** value, ResourceManager* resources);
|
||||
template <typename TAdaptedString>
|
||||
VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources);
|
||||
template <typename TAdaptedString>
|
||||
@@ -2057,6 +2067,7 @@ enum class VariantTypeBits : uint8_t {
|
||||
};
|
||||
enum class VariantType : uint8_t {
|
||||
Null = 0, // 0000 0000
|
||||
TinyString = 0x02, // 0000 0010
|
||||
RawString = 0x03, // 0000 0011
|
||||
LinkedString = 0x04, // 0000 0100
|
||||
OwnedString = 0x05, // 0000 0101
|
||||
@@ -2077,6 +2088,7 @@ enum class VariantType : uint8_t {
|
||||
inline bool operator&(VariantType type, VariantTypeBits bit) {
|
||||
return (uint8_t(type) & uint8_t(bit)) != 0;
|
||||
}
|
||||
const size_t tinyStringMaxLength = 3;
|
||||
union VariantContent {
|
||||
VariantContent() {}
|
||||
float asFloat;
|
||||
@@ -2091,6 +2103,7 @@ union VariantContent {
|
||||
CollectionData asCollection;
|
||||
const char* asLinkedString;
|
||||
struct StringNode* asOwnedString;
|
||||
char asTinyString[tinyStringMaxLength + 1];
|
||||
};
|
||||
#if ARDUINOJSON_USE_EXTENSIONS
|
||||
union VariantExtension {
|
||||
@@ -2105,6 +2118,15 @@ union VariantExtension {
|
||||
#endif
|
||||
template <typename T>
|
||||
T parseNumber(const char* s);
|
||||
template <typename T>
|
||||
static bool isTinyString(const T& s, size_t n) {
|
||||
if (n > tinyStringMaxLength)
|
||||
return false;
|
||||
bool containsNul = false;
|
||||
for (uint8_t i = 0; i < uint8_t(n); i++)
|
||||
containsNul |= !s[i];
|
||||
return !containsNul;
|
||||
}
|
||||
class VariantData {
|
||||
VariantContent content_; // must be first to allow cast from array to variant
|
||||
VariantType type_;
|
||||
@@ -2140,6 +2162,8 @@ class VariantData {
|
||||
return visit.visit(content_.asArray);
|
||||
case VariantType::Object:
|
||||
return visit.visit(content_.asObject);
|
||||
case VariantType::TinyString:
|
||||
return visit.visit(JsonString(content_.asTinyString));
|
||||
case VariantType::LinkedString:
|
||||
return visit.visit(JsonString(content_.asLinkedString, true));
|
||||
case VariantType::OwnedString:
|
||||
@@ -2243,6 +2267,7 @@ class VariantData {
|
||||
#else
|
||||
(void)resources; // silence warning
|
||||
#endif
|
||||
const char* str = nullptr;
|
||||
switch (type_) {
|
||||
case VariantType::Boolean:
|
||||
return static_cast<T>(content_.asBoolean);
|
||||
@@ -2256,9 +2281,15 @@ class VariantData {
|
||||
case VariantType::Int64:
|
||||
return static_cast<T>(extension->asInt64);
|
||||
#endif
|
||||
case VariantType::TinyString:
|
||||
str = content_.asTinyString;
|
||||
break;
|
||||
case VariantType::LinkedString:
|
||||
str = content_.asLinkedString;
|
||||
break;
|
||||
case VariantType::OwnedString:
|
||||
return parseNumber<T>(content_.asOwnedString->data);
|
||||
str = content_.asOwnedString->data;
|
||||
break;
|
||||
case VariantType::Float:
|
||||
return static_cast<T>(content_.asFloat);
|
||||
#if ARDUINOJSON_USE_DOUBLE
|
||||
@@ -2266,8 +2297,10 @@ class VariantData {
|
||||
return static_cast<T>(extension->asDouble);
|
||||
#endif
|
||||
default:
|
||||
return 0;
|
||||
return 0.0;
|
||||
}
|
||||
ARDUINOJSON_ASSERT(str != nullptr);
|
||||
return parseNumber<T>(str);
|
||||
}
|
||||
template <typename T>
|
||||
T asIntegral(const ResourceManager* resources) const {
|
||||
@@ -2277,6 +2310,7 @@ class VariantData {
|
||||
#else
|
||||
(void)resources; // silence warning
|
||||
#endif
|
||||
const char* str = nullptr;
|
||||
switch (type_) {
|
||||
case VariantType::Boolean:
|
||||
return content_.asBoolean;
|
||||
@@ -2290,10 +2324,15 @@ class VariantData {
|
||||
case VariantType::Int64:
|
||||
return convertNumber<T>(extension->asInt64);
|
||||
#endif
|
||||
case VariantType::TinyString:
|
||||
str = content_.asTinyString;
|
||||
break;
|
||||
case VariantType::LinkedString:
|
||||
return parseNumber<T>(content_.asLinkedString);
|
||||
str = content_.asLinkedString;
|
||||
break;
|
||||
case VariantType::OwnedString:
|
||||
return parseNumber<T>(content_.asOwnedString->data);
|
||||
str = content_.asOwnedString->data;
|
||||
break;
|
||||
case VariantType::Float:
|
||||
return convertNumber<T>(content_.asFloat);
|
||||
#if ARDUINOJSON_USE_DOUBLE
|
||||
@@ -2303,6 +2342,8 @@ class VariantData {
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
ARDUINOJSON_ASSERT(str != nullptr);
|
||||
return parseNumber<T>(str);
|
||||
}
|
||||
ObjectData* asObject() {
|
||||
return isObject() ? &content_.asObject : 0;
|
||||
@@ -2321,6 +2362,8 @@ class VariantData {
|
||||
}
|
||||
JsonString asString() const {
|
||||
switch (type_) {
|
||||
case VariantType::TinyString:
|
||||
return JsonString(content_.asTinyString);
|
||||
case VariantType::LinkedString:
|
||||
return JsonString(content_.asLinkedString, true);
|
||||
case VariantType::OwnedString:
|
||||
@@ -2415,7 +2458,8 @@ class VariantData {
|
||||
}
|
||||
bool isString() const {
|
||||
return type_ == VariantType::LinkedString ||
|
||||
type_ == VariantType::OwnedString;
|
||||
type_ == VariantType::OwnedString ||
|
||||
type_ == VariantType::TinyString;
|
||||
}
|
||||
size_t nesting(const ResourceManager* resources) const {
|
||||
auto collection = asCollection();
|
||||
@@ -2450,7 +2494,7 @@ class VariantData {
|
||||
return;
|
||||
var->removeMember(key, resources);
|
||||
}
|
||||
void reset() {
|
||||
void reset() { // TODO: remove
|
||||
type_ = VariantType::Null;
|
||||
}
|
||||
void setBoolean(bool value) {
|
||||
@@ -2491,10 +2535,6 @@ class VariantData {
|
||||
}
|
||||
template <typename TAdaptedString>
|
||||
bool setString(TAdaptedString value, ResourceManager* resources);
|
||||
bool setString(StringNode* s, ResourceManager*) {
|
||||
setOwnedString(s);
|
||||
return true;
|
||||
}
|
||||
template <typename TAdaptedString>
|
||||
static void setString(VariantData* var, TAdaptedString value,
|
||||
ResourceManager* resources) {
|
||||
@@ -2509,6 +2549,14 @@ class VariantData {
|
||||
type_ = VariantType::LinkedString;
|
||||
content_.asLinkedString = s;
|
||||
}
|
||||
void setTinyString(const char* s, uint8_t n) {
|
||||
ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
type_ = VariantType::TinyString;
|
||||
for (uint8_t i = 0; i < n; i++)
|
||||
content_.asTinyString[i] = s[i];
|
||||
content_.asTinyString[n] = 0;
|
||||
}
|
||||
void setOwnedString(StringNode* s) {
|
||||
ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first
|
||||
ARDUINOJSON_ASSERT(s);
|
||||
@@ -4313,7 +4361,7 @@ template <typename T, typename Enable = void>
|
||||
struct Comparer;
|
||||
template <typename T>
|
||||
struct Comparer<T, enable_if_t<IsString<T>::value>> : ComparerBase {
|
||||
T rhs;
|
||||
T rhs; // TODO: store adapted string?
|
||||
explicit Comparer(T value) : rhs(value) {}
|
||||
CompareResult visit(JsonString lhs) {
|
||||
int i = stringCompare(adaptString(rhs), adaptString(lhs));
|
||||
@@ -4812,6 +4860,18 @@ inline VariantData* ObjectData::addMember(TAdaptedString key,
|
||||
CollectionData::appendPair(keySlot, valueSlot, resources);
|
||||
return valueSlot.ptr();
|
||||
}
|
||||
inline VariantData* ObjectData::addPair(VariantData** value,
|
||||
ResourceManager* resources) {
|
||||
auto keySlot = resources->allocVariant();
|
||||
if (!keySlot)
|
||||
return nullptr;
|
||||
auto valueSlot = resources->allocVariant();
|
||||
if (!valueSlot)
|
||||
return nullptr;
|
||||
*value = valueSlot.ptr();
|
||||
CollectionData::appendPair(keySlot, valueSlot, resources);
|
||||
return keySlot.ptr();
|
||||
}
|
||||
constexpr size_t sizeofObject(size_t n) {
|
||||
return 2 * n * ResourceManager::slotSize;
|
||||
}
|
||||
@@ -5358,10 +5418,16 @@ class StringBuilder {
|
||||
if (!node_)
|
||||
node_ = resources_->createString(initialCapacity);
|
||||
}
|
||||
StringNode* save() {
|
||||
void save(VariantData* variant) {
|
||||
ARDUINOJSON_ASSERT(variant != nullptr);
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
node_->data[size_] = 0;
|
||||
StringNode* node = resources_->getString(adaptString(node_->data, size_));
|
||||
char* p = node_->data;
|
||||
if (isTinyString(p, size_)) {
|
||||
variant->setTinyString(p, static_cast<uint8_t>(size_));
|
||||
return;
|
||||
}
|
||||
p[size_] = 0;
|
||||
StringNode* node = resources_->getString(adaptString(p, size_));
|
||||
if (!node) {
|
||||
node = resources_->resizeString(node_, size_);
|
||||
ARDUINOJSON_ASSERT(node != nullptr); // realloc to smaller can't fail
|
||||
@@ -5370,14 +5436,14 @@ class StringBuilder {
|
||||
} else {
|
||||
node->references++;
|
||||
}
|
||||
return node;
|
||||
variant->setOwnedString(node);
|
||||
}
|
||||
void append(const char* s) {
|
||||
while (*s)
|
||||
append(*s++);
|
||||
}
|
||||
void append(const char* s, size_t n) {
|
||||
while (n-- > 0)
|
||||
while (n-- > 0) // TODO: memcpy
|
||||
append(*s++);
|
||||
}
|
||||
void append(char c) {
|
||||
@@ -5583,9 +5649,9 @@ class StringBuilderPrint : public Print {
|
||||
StringBuilderPrint(ResourceManager* resources) : copier_(resources) {
|
||||
copier_.startString();
|
||||
}
|
||||
StringNode* save() {
|
||||
void save(VariantData* data) {
|
||||
ARDUINOJSON_ASSERT(!overflowed());
|
||||
return copier_.save();
|
||||
copier_.save(data);
|
||||
}
|
||||
size_t write(uint8_t c) {
|
||||
copier_.append(char(c));
|
||||
@@ -5616,7 +5682,7 @@ inline void convertToJson(const ::Printable& src, JsonVariant dst) {
|
||||
src.printTo(print);
|
||||
if (print.overflowed())
|
||||
return;
|
||||
data->setOwnedString(print.save());
|
||||
print.save(data);
|
||||
}
|
||||
#endif
|
||||
#if ARDUINOJSON_ENABLE_ARDUINO_STRING
|
||||
@@ -5762,6 +5828,10 @@ inline bool VariantData::setString(TAdaptedString value,
|
||||
setLinkedString(value.data());
|
||||
return true;
|
||||
}
|
||||
if (isTinyString(value, value.size())) {
|
||||
setTinyString(value.data(), uint8_t(value.size()));
|
||||
return true;
|
||||
}
|
||||
auto dup = resources->saveString(value);
|
||||
if (dup) {
|
||||
setOwnedString(dup);
|
||||
@@ -6883,10 +6953,10 @@ class JsonDeserializer {
|
||||
if (memberFilter.allow()) {
|
||||
auto member = object.getMember(adaptString(key), resources_);
|
||||
if (!member) {
|
||||
auto savedKey = stringBuilder_.save();
|
||||
member = object.addMember(savedKey, resources_);
|
||||
if (!member)
|
||||
auto keyVariant = object.addPair(&member, resources_);
|
||||
if (!keyVariant)
|
||||
return DeserializationError::NoMemory;
|
||||
stringBuilder_.save(keyVariant);
|
||||
} else {
|
||||
member->clear(resources_);
|
||||
}
|
||||
@@ -6960,7 +7030,7 @@ class JsonDeserializer {
|
||||
err = parseQuotedString();
|
||||
if (err)
|
||||
return err;
|
||||
variant.setOwnedString(stringBuilder_.save());
|
||||
stringBuilder_.save(&variant);
|
||||
return DeserializationError::Ok;
|
||||
}
|
||||
DeserializationError::Code parseQuotedString() {
|
||||
@@ -7412,7 +7482,23 @@ class StringBuffer {
|
||||
node_->data[capacity] = 0; // null-terminate the string
|
||||
return node_->data;
|
||||
}
|
||||
StringNode* save() {
|
||||
JsonString str() const {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
return JsonString(node_->data, node_->length);
|
||||
}
|
||||
void save(VariantData* data) {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
const char* s = node_->data;
|
||||
if (isTinyString(s, size_))
|
||||
data->setTinyString(s, static_cast<uint8_t>(size_));
|
||||
else
|
||||
data->setOwnedString(commitStringNode());
|
||||
}
|
||||
void saveRaw(VariantData* data) {
|
||||
data->setRawString(commitStringNode());
|
||||
}
|
||||
private:
|
||||
StringNode* commitStringNode() {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
node_->data[size_] = 0;
|
||||
auto node = resources_->getString(adaptString(node_->data, size_));
|
||||
@@ -7430,11 +7516,6 @@ class StringBuffer {
|
||||
resources_->saveString(node);
|
||||
return node;
|
||||
}
|
||||
JsonString str() const {
|
||||
ARDUINOJSON_ASSERT(node_ != nullptr);
|
||||
return JsonString(node_->data, node_->length);
|
||||
}
|
||||
private:
|
||||
ResourceManager* resources_;
|
||||
StringNode* node_ = nullptr;
|
||||
size_t size_ = 0;
|
||||
@@ -7704,7 +7785,7 @@ class MsgPackDeserializer {
|
||||
err = readString(n);
|
||||
if (err)
|
||||
return err;
|
||||
variant->setOwnedString(stringBuffer_.save());
|
||||
stringBuffer_.save(variant);
|
||||
return DeserializationError::Ok;
|
||||
}
|
||||
DeserializationError::Code readString(size_t n) {
|
||||
@@ -7726,7 +7807,7 @@ class MsgPackDeserializer {
|
||||
auto err = readBytes(p + headerSize, n);
|
||||
if (err)
|
||||
return err;
|
||||
variant->setRawString(stringBuffer_.save());
|
||||
stringBuffer_.saveRaw(variant);
|
||||
return DeserializationError::Ok;
|
||||
}
|
||||
template <typename TFilter>
|
||||
@@ -7781,15 +7862,13 @@ class MsgPackDeserializer {
|
||||
return err;
|
||||
JsonString key = stringBuffer_.str();
|
||||
TFilter memberFilter = filter[key.c_str()];
|
||||
VariantData* member;
|
||||
VariantData* member = 0;
|
||||
if (memberFilter.allow()) {
|
||||
ARDUINOJSON_ASSERT(object != 0);
|
||||
auto savedKey = stringBuffer_.save();
|
||||
member = object->addMember(savedKey, resources_);
|
||||
if (!member)
|
||||
auto keyVariant = object->addPair(&member, resources_);
|
||||
if (!keyVariant)
|
||||
return DeserializationError::NoMemory;
|
||||
} else {
|
||||
member = 0;
|
||||
stringBuffer_.save(keyVariant);
|
||||
}
|
||||
err = parseVariant(member, memberFilter, nestingLimit.decrement());
|
||||
if (err)
|
||||
|
||||
Reference in New Issue
Block a user