From bad982dbdd68ca395da45202772b63689db5e560 Mon Sep 17 00:00:00 2001 From: Proddy Date: Tue, 27 Dec 2022 21:48:03 +0100 Subject: [PATCH] update ArduinoJson to latest v6.20.0 (saves 1600 bytes in flash. whoot!) --- lib/ArduinoJson/CHANGELOG.md | 35 ++ lib/ArduinoJson/README.md | 82 ++- lib/ArduinoJson/src/ArduinoJson.hpp | 34 +- .../src/ArduinoJson/Array/ArrayFunctions.hpp | 31 - .../src/ArduinoJson/Array/ArrayImpl.hpp | 28 - .../src/ArduinoJson/Array/ArrayIterator.hpp | 121 ---- .../src/ArduinoJson/Array/ArrayRef.hpp | 213 ------- .../src/ArduinoJson/Array/ArrayShortcuts.hpp | 49 -- .../src/ArduinoJson/Array/ElementProxy.hpp | 191 +----- .../src/ArduinoJson/Array/JsonArray.hpp | 210 +++++++ .../src/ArduinoJson/Array/JsonArrayConst.hpp | 134 +++++ .../src/ArduinoJson/Array/JsonArrayImpl.hpp | 32 + .../ArduinoJson/Array/JsonArrayIterator.hpp | 117 ++++ .../src/ArduinoJson/Array/Utilities.hpp | 58 +- .../ArduinoJson/Collection/CollectionData.hpp | 53 +- .../ArduinoJson/Collection/CollectionImpl.hpp | 62 +- .../ArduinoJson/Deserialization/Filter.hpp | 10 +- .../Readers/IteratorReader.hpp | 3 +- .../Deserialization/Readers/RamReader.hpp | 3 +- .../Deserialization/Readers/VariantReader.hpp | 25 +- .../Deserialization/deserialize.hpp | 38 +- .../Document/BasicJsonDocument.hpp | 18 +- .../Document/DynamicJsonDocument.hpp | 3 + .../src/ArduinoJson/Document/JsonDocument.hpp | 284 +++++---- .../Document/StaticJsonDocument.hpp | 10 +- .../src/ArduinoJson/Json/EscapeSequence.hpp | 6 +- .../src/ArduinoJson/Json/JsonDeserializer.hpp | 552 ++++++++++-------- .../src/ArduinoJson/Json/JsonSerializer.hpp | 45 +- .../ArduinoJson/Json/PrettyJsonSerializer.hpp | 29 +- .../src/ArduinoJson/Json/TextFormatter.hpp | 36 +- .../src/ArduinoJson/Memory/Alignment.hpp | 12 +- .../src/ArduinoJson/Memory/MemoryPool.hpp | 44 +- .../src/ArduinoJson/Misc/Visitable.hpp | 21 - .../MsgPack/MsgPackDeserializer.hpp | 403 +++++++------ .../ArduinoJson/MsgPack/MsgPackSerializer.hpp | 30 +- .../src/ArduinoJson/MsgPack/endianess.hpp | 16 +- .../src/ArduinoJson/Numbers/FloatTraits.hpp | 49 ++ .../Numbers/{Float.hpp => JsonFloat.hpp} | 4 +- .../Numbers/{Integer.hpp => JsonInteger.hpp} | 10 +- .../ArduinoJson/Numbers/arithmeticCompare.hpp | 42 +- .../src/ArduinoJson/Numbers/convertNumber.hpp | 28 +- .../src/ArduinoJson/Numbers/parseNumber.hpp | 18 +- .../src/ArduinoJson/Object/JsonObject.hpp | 246 ++++++++ .../ArduinoJson/Object/JsonObjectConst.hpp | 156 +++++ .../src/ArduinoJson/Object/JsonObjectImpl.hpp | 81 +++ .../ArduinoJson/Object/JsonObjectIterator.hpp | 119 ++++ .../src/ArduinoJson/Object/JsonPair.hpp | 67 +++ .../src/ArduinoJson/Object/MemberProxy.hpp | 204 +------ .../ArduinoJson/Object/ObjectFunctions.hpp | 52 -- .../src/ArduinoJson/Object/ObjectImpl.hpp | 69 --- .../src/ArduinoJson/Object/ObjectIterator.hpp | 123 ---- .../src/ArduinoJson/Object/ObjectRef.hpp | 282 --------- .../ArduinoJson/Object/ObjectShortcuts.hpp | 73 --- .../src/ArduinoJson/Object/Pair.hpp | 57 -- .../src/ArduinoJson/Polyfills/attributes.hpp | 16 - .../src/ArduinoJson/Polyfills/pgmspace.hpp | 3 +- .../Polyfills/type_traits/is_base_of.hpp | 9 +- .../Polyfills/type_traits/is_class.hpp | 9 +- .../Polyfills/type_traits/is_convertible.hpp | 9 +- .../Writers/ArduinoStringWriter.hpp | 6 +- .../Writers/StaticStringWriter.hpp | 10 +- .../Serialization/Writers/StdStringWriter.hpp | 8 +- .../src/ArduinoJson/Serialization/measure.hpp | 7 +- .../ArduinoJson/Serialization/serialize.hpp | 38 +- .../StringStorage/StringCopier.hpp | 17 +- .../ArduinoJson/StringStorage/StringMover.hpp | 10 +- .../StringStorage/StringStorage.hpp | 5 +- .../Strings/Adapters/ArduinoString.hpp | 19 +- .../Strings/Adapters/FlashString.hpp | 27 +- .../Strings/Adapters/JsonString.hpp | 28 +- .../Strings/Adapters/RamString.hpp | 78 ++- .../Strings/Adapters/StdString.hpp | 12 +- .../Strings/Adapters/StringView.hpp | 12 +- .../src/ArduinoJson/Strings/IsString.hpp | 7 +- .../Strings/{String.hpp => JsonString.hpp} | 23 +- .../src/ArduinoJson/Strings/StoragePolicy.hpp | 50 +- .../src/ArduinoJson/Strings/StringAdapter.hpp | 31 + .../src/ArduinoJson/Variant/Converter.hpp | 5 + .../src/ArduinoJson/Variant/ConverterImpl.hpp | 143 ++--- .../src/ArduinoJson/Variant/JsonVariant.hpp | 80 +++ .../ArduinoJson/Variant/JsonVariantConst.hpp | 141 +++++ .../src/ArduinoJson/Variant/SlotFunctions.hpp | 7 +- .../ArduinoJson/Variant/VariantAttorney.hpp | 48 ++ .../ArduinoJson/Variant/VariantCompare.hpp | 85 +-- .../ArduinoJson/Variant/VariantContent.hpp | 14 +- .../src/ArduinoJson/Variant/VariantData.hpp | 81 +-- .../ArduinoJson/Variant/VariantFunctions.hpp | 88 +-- .../src/ArduinoJson/Variant/VariantImpl.hpp | 117 ++-- .../ArduinoJson/Variant/VariantOperators.hpp | 94 +-- .../src/ArduinoJson/Variant/VariantRef.hpp | 381 ------------ .../ArduinoJson/Variant/VariantRefBase.hpp | 299 ++++++++++ .../ArduinoJson/Variant/VariantShortcuts.hpp | 23 - .../src/ArduinoJson/Variant/VariantSlot.hpp | 2 +- .../src/ArduinoJson/Variant/VariantTo.hpp | 20 +- .../src/ArduinoJson/Variant/Visitor.hpp | 18 +- lib/ArduinoJson/src/ArduinoJson/version.hpp | 6 +- 96 files changed, 3497 insertions(+), 3307 deletions(-) delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayConst.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayImpl.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayIterator.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Misc/Visitable.hpp rename lib/ArduinoJson/src/ArduinoJson/Numbers/{Float.hpp => JsonFloat.hpp} (85%) rename lib/ArduinoJson/src/ArduinoJson/Numbers/{Integer.hpp => JsonInteger.hpp} (80%) create mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/JsonObject.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/JsonObjectConst.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/JsonObjectImpl.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/JsonObjectIterator.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/JsonPair.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/ObjectFunctions.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/ObjectImpl.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/ObjectIterator.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/ObjectRef.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/ObjectShortcuts.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Object/Pair.hpp rename lib/ArduinoJson/src/ArduinoJson/Strings/{String.hpp => JsonString.hpp} (61%) create mode 100644 lib/ArduinoJson/src/ArduinoJson/Strings/StringAdapter.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Variant/JsonVariant.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Variant/JsonVariantConst.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Variant/VariantAttorney.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Variant/VariantRef.hpp create mode 100644 lib/ArduinoJson/src/ArduinoJson/Variant/VariantRefBase.hpp delete mode 100644 lib/ArduinoJson/src/ArduinoJson/Variant/VariantShortcuts.hpp diff --git a/lib/ArduinoJson/CHANGELOG.md b/lib/ArduinoJson/CHANGELOG.md index 78cd12ac3..a0125a958 100644 --- a/lib/ArduinoJson/CHANGELOG.md +++ b/lib/ArduinoJson/CHANGELOG.md @@ -1,6 +1,41 @@ ArduinoJson: change log ======================= +v6.20.0 (2022-12-26) +------- + +* Add `JsonVariant::shallowCopy()` (issue #1343) +* Fix `9.22337e+18 is outside the range of representable values of type 'long'` +* Fix comparison operators for `JsonArray`, `JsonArrayConst`, `JsonObject`, and `JsonObjectConst` +* Fix lax parsing of `true`, `false`, and `null` (issue #1781) +* Remove undocumented `accept()` functions +* Rename `addElement()` to `add()` +* Remove `getElement()`, `getOrAddElement()`, `getMember()`, and `getOrAddMember()` +* Remove undocumented `JsonDocument::data()` and `JsonDocument::memoryPool()` +* Remove undocumented `JsonArrayIterator::internal()` and `JsonObjectIterator::internal()` +* Rename things in `ARDUINOJSON_NAMESPACE` to match the public names +* Add documentation to most public symbols +* Remove support for naked `char` (was deprecated since 6.18.0) + +> ### BREAKING CHANGES +> +> This release hides `JsonVariant`'s functions that were only intended for internal use. +> If you were using them in your programs, you must replace with `operator[]` and `to()`, like so: +> +> ```c++ +> // before +> JsonVariant a = variant.getElement(idx); +> JsonVariant b = variant.getOrAddElement(idx); +> JsonVariant c = variant.getMember(key); +> JsonVariant d = variant.getOrAddMember(key); +> +> // after +> JsonVariant a = variant[idx]; +> JsonVariant b = idx < variant.size() ? variant[idx] : variant[idx].to(); +> JsonVariant c = variant[key]; +> JsonVariant d = variant.containsKey(key) ? variant[key] : variant[key].to(); +> ``` + v6.19.4 (2022-04-05) ------- diff --git a/lib/ArduinoJson/README.md b/lib/ArduinoJson/README.md index ddf35475a..1e843d80b 100644 --- a/lib/ArduinoJson/README.md +++ b/lib/ArduinoJson/README.md @@ -1,14 +1,15 @@ -![ArduinoJson](banner.svg) +

+ ArduinoJson +

--- -[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/bblanchon/ArduinoJson/Continuous%20Integration?logo=github)](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A6.x) +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/bblanchon/ArduinoJson/ci.yml?branch=6.x)](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A6.x) [![Continuous Integration](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/6.x?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/6.x) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/arduinojson.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson) -[![LGTM Grade](https://img.shields.io/lgtm/grade/cpp/github/bblanchon/ArduinoJson?label=quality&logo=lgtm)](https://lgtm.com/projects/g/bblanchon/ArduinoJson/) [![Coveralls branch](https://img.shields.io/coveralls/github/bblanchon/ArduinoJson/6.x?logo=coveralls)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x) -[![Arduino Library Manager](https://img.shields.io/static/v1?label=Arduino&message=v6.19.4&logo=arduino&logoColor=white&color=blue)](https://www.ardu-badge.com/ArduinoJson/6.19.4) -[![PlatformIO Registry](https://badges.registry.platformio.org/packages/bblanchon/library/ArduinoJson.svg?version=6.19.4)](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.19.4) +[![Arduino Library Manager](https://img.shields.io/static/v1?label=Arduino&message=v6.20.0&logo=arduino&logoColor=white&color=blue)](https://www.ardu-badge.com/ArduinoJson/6.20.0) +[![PlatformIO Registry](https://badges.registry.platformio.org/packages/bblanchon/library/ArduinoJson.svg?version=6.20.0)](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.20.0) [![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat&logo=github)](https://github.com/bblanchon/ArduinoJson/stargazers) [![GitHub Sponsors](https://img.shields.io/github/sponsors/bblanchon?logo=github)](https://github.com/sponsors/bblanchon) @@ -16,32 +17,32 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). ## Features -* [JSON deserialization](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme) - * [Optionally decodes UTF-16 escape sequences to UTF-8](https://arduinojson.org/v6/api/config/decode_unicode/?utm_source=github&utm_medium=readme) - * [Optionally stores links to the input buffer (zero-copy)](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme) - * [Optionally supports comments in the input](https://arduinojson.org/v6/api/config/enable_comments/?utm_source=github&utm_medium=readme) - * [Optionally filters the input to keep only desired values](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme#filtering) +* [JSON deserialization](https://arduinojson.org/v6/api/json/deserializejson/) + * [Optionally decodes UTF-16 escape sequences to UTF-8](https://arduinojson.org/v6/api/config/decode_unicode/) + * [Optionally stores links to the input buffer (zero-copy)](https://arduinojson.org/v6/api/json/deserializejson/) + * [Optionally supports comments in the input](https://arduinojson.org/v6/api/config/enable_comments/) + * [Optionally filters the input to keep only desired values](https://arduinojson.org/v6/api/json/deserializejson/#filtering) * Supports single quotes as a string delimiter * Compatible with [NDJSON](http://ndjson.org/) and [JSON Lines](https://jsonlines.org/) -* [JSON serialization](https://arduinojson.org/v6/api/json/serializejson/?utm_source=github&utm_medium=readme) - * [Can write to a buffer or a stream](https://arduinojson.org/v6/api/json/serializejson/?utm_source=github&utm_medium=readme) - * [Optionally indents the document (prettified JSON)](https://arduinojson.org/v6/api/json/serializejsonpretty/?utm_source=github&utm_medium=readme) -* [MessagePack serialization](https://arduinojson.org/v6/api/msgpack/serializemsgpack/?utm_source=github&utm_medium=readme) -* [MessagePack deserialization](https://arduinojson.org/v6/api/msgpack/deserializemsgpack/?utm_source=github&utm_medium=readme) +* [JSON serialization](https://arduinojson.org/v6/api/json/serializejson/) + * [Can write to a buffer or a stream](https://arduinojson.org/v6/api/json/serializejson/) + * [Optionally indents the document (prettified JSON)](https://arduinojson.org/v6/api/json/serializejsonpretty/) +* [MessagePack serialization](https://arduinojson.org/v6/api/msgpack/serializemsgpack/) +* [MessagePack deserialization](https://arduinojson.org/v6/api/msgpack/deserializemsgpack/) * Efficient - * [Twice smaller than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/?utm_source=github&utm_medium=readme) - * [Almost 10% faster than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/?utm_source=github&utm_medium=readme) - * [Consumes roughly 10% less RAM than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/?utm_source=github&utm_medium=readme) - * [Fixed memory allocation, no heap fragmentation](https://arduinojson.org/v6/api/jsondocument/?utm_source=github&utm_medium=readme) - * [Optionally works without heap memory (zero malloc)](https://arduinojson.org/v6/api/staticjsondocument/?utm_source=github&utm_medium=readme) - * [Deduplicates strings](https://arduinojson.org/news/2020/08/01/version-6-16-0/?utm_source=github&utm_medium=readme) + * [Twice smaller than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/) + * [Almost 10% faster than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/) + * [Consumes roughly 10% less RAM than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/) + * [Fixed memory allocation, no heap fragmentation](https://arduinojson.org/v6/api/jsondocument/) + * [Optionally works without heap memory (zero malloc)](https://arduinojson.org/v6/api/staticjsondocument/) + * [Deduplicates strings](https://arduinojson.org/news/2020/08/01/version-6-16-0/) * Versatile - * Supports [custom allocators (to use external RAM chip, for example)](https://arduinojson.org/v6/how-to/use-external-ram-on-esp32/?utm_source=github&utm_medium=readme) - * Supports [`String`](https://arduinojson.org/v6/api/config/enable_arduino_string/?utm_source=github&utm_medium=readme), [`std::string`](https://arduinojson.org/v6/api/config/enable_std_string/?utm_source=github&utm_medium=readme), and [`std::string_view`](https://arduinojson.org/v6/api/config/enable_string_view/?utm_source=github&utm_medium=readme) - * Supports [`Stream`](https://arduinojson.org/v6/api/config/enable_arduino_stream/?utm_source=github&utm_medium=readme) and [`std::istream`/`std::ostream`](https://arduinojson.org/v6/api/config/enable_std_stream/?utm_source=github&utm_medium=readme) - * Supports [Flash strings](https://arduinojson.org/v6/api/config/enable_progmem/?utm_source=github&utm_medium=readme) - * Supports [custom readers](https://arduinojson.org/v6/api/json/deserializejson/?utm_source=github&utm_medium=readme#custom-reader) and [custom writers](https://arduinojson.org/v6/api/json/serializejson/?utm_source=github&utm_medium=readme#custom-writer) - * Supports [custom converters](https://arduinojson.org/news/2021/05/04/version-6-18-0/?utm_source=github&utm_medium=readme) + * Supports [custom allocators (to use external RAM chip, for example)](https://arduinojson.org/v6/how-to/use-external-ram-on-esp32/) + * Supports [`String`](https://arduinojson.org/v6/api/config/enable_arduino_string/), [`std::string`](https://arduinojson.org/v6/api/config/enable_std_string/), and [`std::string_view`](https://arduinojson.org/v6/api/config/enable_string_view/) + * Supports [`Stream`](https://arduinojson.org/v6/api/config/enable_arduino_stream/) and [`std::istream`/`std::ostream`](https://arduinojson.org/v6/api/config/enable_std_stream/) + * Supports [Flash strings](https://arduinojson.org/v6/api/config/enable_progmem/) + * Supports [custom readers](https://arduinojson.org/v6/api/json/deserializejson/#custom-reader) and [custom writers](https://arduinojson.org/v6/api/json/serializejson/#custom-writer) + * Supports [custom converters](https://arduinojson.org/news/2021/05/04/version-6-18-0/) * Portable * Usable on any C++ project (not limited to Arduino) * Compatible with C++98, C++11, C++14 and C++17 @@ -69,15 +70,15 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). * [Visual Micro](http://www.visualmicro.com/) * [Visual Studio](https://www.visualstudio.com/) * [Even works with online compilers like wandbox.org](https://wandbox.org/permlink/RlZSKy17DjJ6HcdN) - * [CMake friendly](https://arduinojson.org/v6/how-to/use-arduinojson-with-cmake/?utm_source=github&utm_medium=readme) + * [CMake friendly](https://arduinojson.org/v6/how-to/use-arduinojson-with-cmake/) * Well designed - * [Elegant API](http://arduinojson.org/v6/example/?utm_source=github&utm_medium=readme) + * [Elegant API](http://arduinojson.org/v6/example/) * [Thread-safe](https://en.wikipedia.org/wiki/Thread_safety) * Self-contained (no external dependency) * `const` friendly - * [`for` friendly](https://arduinojson.org/v6/api/jsonobject/begin_end/?utm_source=github&utm_medium=readme) + * [`for` friendly](https://arduinojson.org/v6/api/jsonobject/begin_end/) * [TMP friendly](https://en.wikipedia.org/wiki/Template_metaprogramming) - * Handles [integer overflows](https://arduinojson.org/v6/api/jsonvariant/as/?utm_source=github&utm_medium=readme#integer-overflows) + * Handles [integer overflows](https://arduinojson.org/v6/api/jsonvariant/as/#integer-overflows) * Well tested * [Unit test coverage close to 100%](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x) * Continuously tested on @@ -87,12 +88,12 @@ ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). * [Continuously fuzzed with Google OSS Fuzz](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson) * Passes all default checks of [clang-tidy](https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/clang-tidy/) * Well documented - * [Tutorials](https://arduinojson.org/v6/doc/deserialization/?utm_source=github&utm_medium=readme) - * [Examples](https://arduinojson.org/v6/example/?utm_source=github&utm_medium=readme) - * [How-tos](https://arduinojson.org/v6/example/?utm_source=github&utm_medium=readme) - * [FAQ](https://arduinojson.org/v6/faq/?utm_source=github&utm_medium=readme) - * [Troubleshooter](https://arduinojson.org/v6/troubleshooter/?utm_source=github&utm_medium=readme) - * [Book](https://arduinojson.org/book/?utm_source=github&utm_medium=readme) + * [Tutorials](https://arduinojson.org/v6/doc/deserialization/) + * [Examples](https://arduinojson.org/v6/example/) + * [How-tos](https://arduinojson.org/v6/example/) + * [FAQ](https://arduinojson.org/v6/faq/) + * [Troubleshooter](https://arduinojson.org/v6/troubleshooter/) + * [Book](https://arduinojson.org/book/) * [Changelog](CHANGELOG.md) * Vibrant user community * Most popular of all Arduino libraries on [GitHub](https://github.com/search?o=desc&q=arduino+library&s=stars&type=Repositories) @@ -118,7 +119,7 @@ double latitude = doc["data"][0]; double longitude = doc["data"][1]; ``` -See the [tutorial on arduinojson.org](https://arduinojson.org/doc/decoding/?utm_source=github&utm_medium=readme) +See the [tutorial on arduinojson.org](https://arduinojson.org/v6/doc/deserialization/) ### Serialization @@ -137,16 +138,13 @@ serializeJson(doc, Serial); // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} ``` -See the [tutorial on arduinojson.org](https://arduinojson.org/doc/encoding/?utm_source=github&utm_medium=readme) +See the [tutorial on arduinojson.org](https://arduinojson.org/v6/doc/serialization/) ## Sponsors ArduinoJson is thankful to its sponsors. Please give them a visit; they deserve it!

- - Tech Explorations - Programming Electronics Academy diff --git a/lib/ArduinoJson/src/ArduinoJson.hpp b/lib/ArduinoJson/src/ArduinoJson.hpp index abb8dd1fa..3a490f33e 100644 --- a/lib/ArduinoJson/src/ArduinoJson.hpp +++ b/lib/ArduinoJson/src/ArduinoJson.hpp @@ -21,19 +21,19 @@ # endif #endif -#include "ArduinoJson/Array/ArrayRef.hpp" -#include "ArduinoJson/Object/ObjectRef.hpp" -#include "ArduinoJson/Variant/VariantRef.hpp" +#include "ArduinoJson/Array/JsonArray.hpp" +#include "ArduinoJson/Object/JsonObject.hpp" +#include "ArduinoJson/Variant/JsonVariantConst.hpp" #include "ArduinoJson/Document/DynamicJsonDocument.hpp" #include "ArduinoJson/Document/StaticJsonDocument.hpp" -#include "ArduinoJson/Array/ArrayImpl.hpp" #include "ArduinoJson/Array/ElementProxy.hpp" +#include "ArduinoJson/Array/JsonArrayImpl.hpp" #include "ArduinoJson/Array/Utilities.hpp" #include "ArduinoJson/Collection/CollectionImpl.hpp" +#include "ArduinoJson/Object/JsonObjectImpl.hpp" #include "ArduinoJson/Object/MemberProxy.hpp" -#include "ArduinoJson/Object/ObjectImpl.hpp" #include "ArduinoJson/Variant/ConverterImpl.hpp" #include "ArduinoJson/Variant/VariantCompare.hpp" #include "ArduinoJson/Variant/VariantImpl.hpp" @@ -47,25 +47,25 @@ #include "ArduinoJson/compatibility.hpp" namespace ArduinoJson { -typedef ARDUINOJSON_NAMESPACE::ArrayConstRef JsonArrayConst; -typedef ARDUINOJSON_NAMESPACE::ArrayRef JsonArray; -typedef ARDUINOJSON_NAMESPACE::Float JsonFloat; -typedef ARDUINOJSON_NAMESPACE::Integer JsonInteger; -typedef ARDUINOJSON_NAMESPACE::ObjectConstRef JsonObjectConst; -typedef ARDUINOJSON_NAMESPACE::ObjectRef JsonObject; -typedef ARDUINOJSON_NAMESPACE::Pair JsonPair; -typedef ARDUINOJSON_NAMESPACE::PairConst JsonPairConst; -typedef ARDUINOJSON_NAMESPACE::String JsonString; -typedef ARDUINOJSON_NAMESPACE::UInt JsonUInt; -typedef ARDUINOJSON_NAMESPACE::VariantConstRef JsonVariantConst; -typedef ARDUINOJSON_NAMESPACE::VariantRef JsonVariant; using ARDUINOJSON_NAMESPACE::BasicJsonDocument; using ARDUINOJSON_NAMESPACE::copyArray; using ARDUINOJSON_NAMESPACE::DeserializationError; using ARDUINOJSON_NAMESPACE::deserializeJson; using ARDUINOJSON_NAMESPACE::deserializeMsgPack; using ARDUINOJSON_NAMESPACE::DynamicJsonDocument; +using ARDUINOJSON_NAMESPACE::JsonArray; +using ARDUINOJSON_NAMESPACE::JsonArrayConst; using ARDUINOJSON_NAMESPACE::JsonDocument; +using ARDUINOJSON_NAMESPACE::JsonFloat; +using ARDUINOJSON_NAMESPACE::JsonInteger; +using ARDUINOJSON_NAMESPACE::JsonObject; +using ARDUINOJSON_NAMESPACE::JsonObjectConst; +using ARDUINOJSON_NAMESPACE::JsonPair; +using ARDUINOJSON_NAMESPACE::JsonPairConst; +using ARDUINOJSON_NAMESPACE::JsonString; +using ARDUINOJSON_NAMESPACE::JsonUInt; +using ARDUINOJSON_NAMESPACE::JsonVariant; +using ARDUINOJSON_NAMESPACE::JsonVariantConst; using ARDUINOJSON_NAMESPACE::measureJson; using ARDUINOJSON_NAMESPACE::serialized; using ARDUINOJSON_NAMESPACE::serializeJson; diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp deleted file mode 100644 index 0b4d342f2..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayFunctions.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include - -namespace ARDUINOJSON_NAMESPACE { - -inline VariantData *arrayAdd(CollectionData *arr, MemoryPool *pool) { - return arr ? arr->addElement(pool) : 0; -} - -template -inline typename TVisitor::result_type arrayAccept(const CollectionData *arr, - TVisitor &visitor) { - if (arr) - return visitor.visitArray(*arr); - else - return visitor.visitNull(); -} - -inline bool arrayEquals(const CollectionData *lhs, const CollectionData *rhs) { - if (lhs == rhs) - return true; - if (!lhs || !rhs) - return false; - return lhs->equalsArray(*rhs); -} -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp deleted file mode 100644 index dcb4ff0b3..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayImpl.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template -inline ArrayRef ArrayShortcuts::createNestedArray() const { - return impl()->addElement().template to(); -} - -template -inline ObjectRef ArrayShortcuts::createNestedObject() const { - return impl()->addElement().template to(); -} - -template -inline ElementProxy ArrayShortcuts::operator[]( - size_t index) const { - return ElementProxy(*impl(), index); -} - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp deleted file mode 100644 index cde9a246d..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayIterator.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -class VariantPtr { - public: - VariantPtr(MemoryPool *pool, VariantData *data) : _variant(pool, data) {} - - VariantRef *operator->() { - return &_variant; - } - - VariantRef &operator*() { - return _variant; - } - - private: - VariantRef _variant; -}; - -class ArrayIterator { - public: - ArrayIterator() : _slot(0) {} - explicit ArrayIterator(MemoryPool *pool, VariantSlot *slot) - : _pool(pool), _slot(slot) {} - - VariantRef operator*() const { - return VariantRef(_pool, _slot->data()); - } - VariantPtr operator->() { - return VariantPtr(_pool, _slot->data()); - } - - bool operator==(const ArrayIterator &other) const { - return _slot == other._slot; - } - - bool operator!=(const ArrayIterator &other) const { - return _slot != other._slot; - } - - ArrayIterator &operator++() { - _slot = _slot->next(); - return *this; - } - - ArrayIterator &operator+=(size_t distance) { - _slot = _slot->next(distance); - return *this; - } - - VariantSlot *internal() { - return _slot; - } - - private: - MemoryPool *_pool; - VariantSlot *_slot; -}; - -class VariantConstPtr { - public: - VariantConstPtr(const VariantData *data) : _variant(data) {} - - VariantConstRef *operator->() { - return &_variant; - } - - VariantConstRef &operator*() { - return _variant; - } - - private: - VariantConstRef _variant; -}; - -class ArrayConstRefIterator { - public: - ArrayConstRefIterator() : _slot(0) {} - explicit ArrayConstRefIterator(const VariantSlot *slot) : _slot(slot) {} - - VariantConstRef operator*() const { - return VariantConstRef(_slot->data()); - } - VariantConstPtr operator->() { - return VariantConstPtr(_slot->data()); - } - - bool operator==(const ArrayConstRefIterator &other) const { - return _slot == other._slot; - } - - bool operator!=(const ArrayConstRefIterator &other) const { - return _slot != other._slot; - } - - ArrayConstRefIterator &operator++() { - _slot = _slot->next(); - return *this; - } - - ArrayConstRefIterator &operator+=(size_t distance) { - _slot = _slot->next(distance); - return *this; - } - - const VariantSlot *internal() { - return _slot; - } - - private: - const VariantSlot *_slot; -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp deleted file mode 100644 index a5df7abcd..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayRef.hpp +++ /dev/null @@ -1,213 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include -#include -#include - -// Returns the size (in bytes) of an array with n elements. -// Can be very handy to determine the size of a StaticMemoryPool. -#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \ - ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::VariantSlot)) - -namespace ARDUINOJSON_NAMESPACE { - -class ObjectRef; -template -class ElementProxy; - -template -class ArrayRefBase { - public: - operator VariantConstRef() const { - const void* data = _data; // prevent warning cast-align - return VariantConstRef(reinterpret_cast(data)); - } - - template - FORCE_INLINE typename TVisitor::result_type accept(TVisitor& visitor) const { - return arrayAccept(_data, visitor); - } - - FORCE_INLINE bool isNull() const { - return _data == 0; - } - - FORCE_INLINE operator bool() const { - return _data != 0; - } - - FORCE_INLINE size_t memoryUsage() const { - return _data ? _data->memoryUsage() : 0; - } - - FORCE_INLINE size_t nesting() const { - return _data ? _data->nesting() : 0; - } - - FORCE_INLINE size_t size() const { - return _data ? _data->size() : 0; - } - - protected: - ArrayRefBase(TData* data) : _data(data) {} - TData* _data; -}; - -class ArrayConstRef : public ArrayRefBase, - public Visitable { - friend class ArrayRef; - typedef ArrayRefBase base_type; - - public: - typedef ArrayConstRefIterator iterator; - - FORCE_INLINE iterator begin() const { - if (!_data) - return iterator(); - return iterator(_data->head()); - } - - FORCE_INLINE iterator end() const { - return iterator(); - } - - FORCE_INLINE ArrayConstRef() : base_type(0) {} - FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {} - - FORCE_INLINE bool operator==(ArrayConstRef rhs) const { - return arrayEquals(_data, rhs._data); - } - - FORCE_INLINE VariantConstRef operator[](size_t index) const { - return getElement(index); - } - - FORCE_INLINE VariantConstRef getElement(size_t index) const { - return VariantConstRef(_data ? _data->getElement(index) : 0); - } -}; - -class ArrayRef : public ArrayRefBase, - public ArrayShortcuts, - public Visitable { - typedef ArrayRefBase base_type; - - public: - typedef ArrayIterator iterator; - - FORCE_INLINE ArrayRef() : base_type(0), _pool(0) {} - FORCE_INLINE ArrayRef(MemoryPool* pool, CollectionData* data) - : base_type(data), _pool(pool) {} - - operator VariantRef() { - void* data = _data; // prevent warning cast-align - return VariantRef(_pool, reinterpret_cast(data)); - } - - operator ArrayConstRef() const { - return ArrayConstRef(_data); - } - - VariantRef addElement() const { - return VariantRef(_pool, arrayAdd(_data, _pool)); - } - - FORCE_INLINE iterator begin() const { - if (!_data) - return iterator(); - return iterator(_pool, _data->head()); - } - - FORCE_INLINE iterator end() const { - return iterator(); - } - - // Copy a ArrayRef - FORCE_INLINE bool set(ArrayConstRef src) const { - if (!_data || !src._data) - return false; - return _data->copyFrom(*src._data, _pool); - } - - FORCE_INLINE bool operator==(ArrayRef rhs) const { - return arrayEquals(_data, rhs._data); - } - - // Internal use - FORCE_INLINE VariantRef getOrAddElement(size_t index) const { - return VariantRef(_pool, _data ? _data->getOrAddElement(index, _pool) : 0); - } - - // Gets the value at the specified index. - FORCE_INLINE VariantRef getElement(size_t index) const { - return VariantRef(_pool, _data ? _data->getElement(index) : 0); - } - - // Removes element at specified position. - FORCE_INLINE void remove(iterator it) const { - if (!_data) - return; - _data->removeSlot(it.internal()); - } - - // Removes element at specified index. - FORCE_INLINE void remove(size_t index) const { - if (!_data) - return; - _data->removeElement(index); - } - - void clear() const { - if (!_data) - return; - _data->clear(); - } - - private: - MemoryPool* _pool; -}; - -template <> -struct Converter { - static void toJson(VariantConstRef src, VariantRef dst) { - variantCopyFrom(getData(dst), getData(src), getPool(dst)); - } - - static ArrayConstRef fromJson(VariantConstRef src) { - return ArrayConstRef(variantAsArray(getData(src))); - } - - static bool checkJson(VariantConstRef src) { - const VariantData* data = getData(src); - return data && data->isArray(); - } -}; - -template <> -struct Converter { - static void toJson(VariantConstRef src, VariantRef dst) { - variantCopyFrom(getData(dst), getData(src), getPool(dst)); - } - - static ArrayRef fromJson(VariantRef src) { - VariantData* data = getData(src); - MemoryPool* pool = getPool(src); - return ArrayRef(pool, data != 0 ? data->asArray() : 0); - } - - static InvalidConversion fromJson(VariantConstRef); - - static bool checkJson(VariantConstRef) { - return false; - } - - static bool checkJson(VariantRef src) { - VariantData* data = getData(src); - return data && data->isArray(); - } -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp deleted file mode 100644 index 1854a8c38..000000000 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ArrayShortcuts.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include -#include - -namespace ARDUINOJSON_NAMESPACE { -// Forward declarations. -class ArrayRef; -class ObjectRef; -template -class ElementProxy; - -template -class ArrayShortcuts { - public: - // Returns the element at specified index if the variant is an array. - FORCE_INLINE ElementProxy operator[](size_t index) const; - - FORCE_INLINE ObjectRef createNestedObject() const; - - FORCE_INLINE ArrayRef createNestedArray() const; - - // Adds the specified value at the end of the array. - // - // bool add(TValue); - // TValue = bool, long, int, short, float, double, serialized, VariantRef, - // std::string, String, ObjectRef - template - FORCE_INLINE bool add(const T &value) const { - return impl()->addElement().set(value); - } - // - // bool add(TValue); - // TValue = char*, const char*, const __FlashStringHelper* - template - FORCE_INLINE bool add(T *value) const { - return impl()->addElement().set(value); - } - - private: - const TArray *impl() const { - return static_cast(this); - } -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp index 821cfba3c..b3e00a2c0 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp @@ -4,194 +4,57 @@ #pragma once -#include -#include -#include -#include - -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable : 4522) -#endif +#include namespace ARDUINOJSON_NAMESPACE { -template -class ElementProxy : public VariantOperators >, - public VariantShortcuts >, - public Visitable, - public VariantTag { - typedef ElementProxy this_type; +// A proxy class to get or set an element of an array. +// https://arduinojson.org/v6/api/jsonarray/subscript/ +template +class ElementProxy : public VariantRefBase >, + public VariantOperators > { + friend class VariantAttorney; public: - typedef VariantRef variant_type; - - FORCE_INLINE ElementProxy(TArray array, size_t index) - : _array(array), _index(index) {} + ElementProxy(TUpstream upstream, size_t index) + : _upstream(upstream), _index(index) {} - FORCE_INLINE ElementProxy(const ElementProxy& src) - : _array(src._array), _index(src._index) {} + ElementProxy(const ElementProxy& src) + : _upstream(src._upstream), _index(src._index) {} - FORCE_INLINE this_type& operator=(const this_type& src) { - getOrAddUpstreamElement().set(src.as()); + FORCE_INLINE ElementProxy& operator=(const ElementProxy& src) { + this->set(src); return *this; } - // Replaces the value - // - // operator=(const TValue&) - // TValue = bool, long, int, short, float, double, serialized, VariantRef, - // std::string, String, ArrayRef, ObjectRef template - FORCE_INLINE this_type& operator=(const T& src) { - getOrAddUpstreamElement().set(src); + FORCE_INLINE ElementProxy& operator=(const T& src) { + this->set(src); return *this; } - // - // operator=(TValue) - // TValue = char*, const char*, const __FlashStringHelper* - template - FORCE_INLINE this_type& operator=(T* src) { - getOrAddUpstreamElement().set(src); - return *this; - } - - FORCE_INLINE void clear() const { - getUpstreamElement().clear(); - } - - FORCE_INLINE bool isNull() const { - return getUpstreamElement().isNull(); - } - - template - FORCE_INLINE typename enable_if::value, T>::type as() - const { - return getUpstreamElement().template as(); - } template - FORCE_INLINE typename enable_if::value, const char*>::type - ARDUINOJSON_DEPRECATED("Replace as() with as()") - as() const { - return as(); - } - - template - FORCE_INLINE operator T() const { - return getUpstreamElement(); - } - - template - FORCE_INLINE bool is() const { - return getUpstreamElement().template is(); - } - - template - FORCE_INLINE typename VariantTo::type to() const { - return getOrAddUpstreamElement().template to(); - } - - // Replaces the value - // - // bool set(const TValue&) - // TValue = bool, long, int, short, float, double, serialized, VariantRef, - // std::string, String, ArrayRef, ObjectRef - template - FORCE_INLINE bool set(const TValue& value) const { - return getOrAddUpstreamElement().set(value); - } - // - // bool set(TValue) - // TValue = char*, const char*, const __FlashStringHelper* - template - FORCE_INLINE bool set(TValue* value) const { - return getOrAddUpstreamElement().set(value); - } - - template - typename TVisitor::result_type accept(TVisitor& visitor) const { - return getUpstreamElement().accept(visitor); - } - - FORCE_INLINE size_t size() const { - return getUpstreamElement().size(); - } - - FORCE_INLINE size_t memoryUsage() const { - return getUpstreamElement().memoryUsage(); - } - - template - VariantRef getMember(TNestedKey* key) const { - return getUpstreamElement().getMember(key); - } - - template - VariantRef getMember(const TNestedKey& key) const { - return getUpstreamElement().getMember(key); - } - - template - VariantRef getOrAddMember(TNestedKey* key) const { - return getOrAddUpstreamElement().getOrAddMember(key); - } - - template - VariantRef getOrAddMember(const TNestedKey& key) const { - return getOrAddUpstreamElement().getOrAddMember(key); - } - - VariantRef addElement() const { - return getOrAddUpstreamElement().addElement(); - } - - VariantRef getElement(size_t index) const { - return getOrAddUpstreamElement().getElement(index); - } - - VariantRef getOrAddElement(size_t index) const { - return getOrAddUpstreamElement().getOrAddElement(index); - } - - FORCE_INLINE void remove(size_t index) const { - getUpstreamElement().remove(index); - } - // remove(char*) const - // remove(const char*) const - // remove(const __FlashStringHelper*) const - template - FORCE_INLINE typename enable_if::value>::type remove( - TChar* key) const { - getUpstreamElement().remove(key); - } - // remove(const std::string&) const - // remove(const String&) const - template - FORCE_INLINE typename enable_if::value>::type remove( - const TString& key) const { - getUpstreamElement().remove(key); + FORCE_INLINE ElementProxy& operator=(T* src) { + this->set(src); + return *this; } private: - FORCE_INLINE VariantRef getUpstreamElement() const { - return _array.getElement(_index); + FORCE_INLINE MemoryPool* getPool() const { + return VariantAttorney::getPool(_upstream); } - FORCE_INLINE VariantRef getOrAddUpstreamElement() const { - return _array.getOrAddElement(_index); + FORCE_INLINE VariantData* getData() const { + return variantGetElement(VariantAttorney::getData(_upstream), _index); } - friend void convertToJson(const this_type& src, VariantRef dst) { - dst.set(src.getUpstreamElement()); + FORCE_INLINE VariantData* getOrCreateData() const { + return variantGetOrAddElement(VariantAttorney::getOrCreateData(_upstream), + _index, VariantAttorney::getPool(_upstream)); } - TArray _array; - const size_t _index; + TUpstream _upstream; + size_t _index; }; } // namespace ARDUINOJSON_NAMESPACE - -#ifdef _MSC_VER -# pragma warning(pop) -#endif diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp new file mode 100644 index 000000000..a26b1f1f1 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp @@ -0,0 +1,210 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +class JsonObject; + +// A reference to an array in a JsonDocument +// https://arduinojson.org/v6/api/jsonarray/ +class JsonArray : public VariantOperators { + friend class VariantAttorney; + + public: + typedef JsonArrayIterator iterator; + + // Constructs an unbound reference. + FORCE_INLINE JsonArray() : _data(0), _pool(0) {} + + // INTERNAL USE ONLY + FORCE_INLINE JsonArray(MemoryPool* pool, CollectionData* data) + : _data(data), _pool(pool) {} + + // Returns a JsonVariant pointing to the array. + // https://arduinojson.org/v6/api/jsonvariant/ + operator JsonVariant() { + void* data = _data; // prevent warning cast-align + return JsonVariant(_pool, reinterpret_cast(data)); + } + + // Returns a read-only reference to the array. + // https://arduinojson.org/v6/api/jsonarrayconst/ + operator JsonArrayConst() const { + return JsonArrayConst(_data); + } + + // Appends a new (null) element to the array. + // Returns a reference to the new element. + // https://arduinojson.org/v6/api/jsonarray/add/ + JsonVariant add() const { + if (!_data) + return JsonVariant(); + return JsonVariant(_pool, _data->addElement(_pool)); + } + + // Appends a value to the array. + // https://arduinojson.org/v6/api/jsonarray/add/ + template + FORCE_INLINE bool add(const T& value) const { + return add().set(value); + } + + // Appends a value to the array. + // https://arduinojson.org/v6/api/jsonarray/add/ + template + FORCE_INLINE bool add(T* value) const { + return add().set(value); + } + + // Returns an iterator to the first element of the array. + // https://arduinojson.org/v6/api/jsonarray/begin/ + FORCE_INLINE iterator begin() const { + if (!_data) + return iterator(); + return iterator(_pool, _data->head()); + } + + // Returns an iterator following the last element of the array. + // https://arduinojson.org/v6/api/jsonarray/end/ + FORCE_INLINE iterator end() const { + return iterator(); + } + + // Copies an array. + // https://arduinojson.org/v6/api/jsonarray/set/ + FORCE_INLINE bool set(JsonArrayConst src) const { + if (!_data || !src._data) + return false; + return _data->copyFrom(*src._data, _pool); + } + + // Compares the content of two arrays. + FORCE_INLINE bool operator==(JsonArray rhs) const { + return JsonArrayConst(_data) == JsonArrayConst(rhs._data); + } + + // Removes the element at the specified iterator. + // ⚠️ Doesn't release the memory associated with the removed element. + // https://arduinojson.org/v6/api/jsonarray/remove/ + FORCE_INLINE void remove(iterator it) const { + if (!_data) + return; + _data->removeSlot(it._slot); + } + + // Removes the element at the specified index. + // ⚠️ Doesn't release the memory associated with the removed element. + // https://arduinojson.org/v6/api/jsonarray/remove/ + FORCE_INLINE void remove(size_t index) const { + if (!_data) + return; + _data->removeElement(index); + } + + // Removes all the elements of the array. + // ⚠️ Doesn't release the memory associated with the removed elements. + // https://arduinojson.org/v6/api/jsonarray/clear/ + void clear() const { + if (!_data) + return; + _data->clear(); + } + + // Gets or sets the element at the specified index. + // https://arduinojson.org/v6/api/jsonarray/subscript/ + FORCE_INLINE ElementProxy operator[](size_t index) const { + return ElementProxy(*this, index); + } + + // Creates an object and appends it to the array. + // https://arduinojson.org/v6/api/jsonarray/createnestedobject/ + FORCE_INLINE JsonObject createNestedObject() const; + + // Creates an array and appends it to the array. + // https://arduinojson.org/v6/api/jsonarray/createnestedarray/ + FORCE_INLINE JsonArray createNestedArray() const { + return add().to(); + } + + operator JsonVariantConst() const { + return JsonVariantConst(collectionToVariant(_data)); + } + + // Returns true if the reference is unbound. + // https://arduinojson.org/v6/api/jsonarray/isnull/ + FORCE_INLINE bool isNull() const { + return _data == 0; + } + + // Returns true if the reference is bound. + // https://arduinojson.org/v6/api/jsonarray/isnull/ + FORCE_INLINE operator bool() const { + return _data != 0; + } + + // Returns the number of bytes occupied by the array. + // https://arduinojson.org/v6/api/jsonarray/memoryusage/ + FORCE_INLINE size_t memoryUsage() const { + return _data ? _data->memoryUsage() : 0; + } + + // Returns the depth (nesting level) of the array. + // https://arduinojson.org/v6/api/jsonarray/nesting/ + FORCE_INLINE size_t nesting() const { + return variantNesting(collectionToVariant(_data)); + } + + // Returns the number of elements in the array. + // https://arduinojson.org/v6/api/jsonarray/size/ + FORCE_INLINE size_t size() const { + return _data ? _data->size() : 0; + } + + private: + MemoryPool* getPool() const { + return _pool; + } + + VariantData* getData() const { + return collectionToVariant(_data); + } + + VariantData* getOrCreateData() const { + return collectionToVariant(_data); + } + + CollectionData* _data; + MemoryPool* _pool; +}; + +template <> +struct Converter : private VariantAttorney { + static void toJson(JsonVariantConst src, JsonVariant dst) { + variantCopyFrom(getData(dst), getData(src), getPool(dst)); + } + + static JsonArray fromJson(JsonVariant src) { + VariantData* data = getData(src); + MemoryPool* pool = getPool(src); + return JsonArray(pool, data != 0 ? data->asArray() : 0); + } + + static InvalidConversion fromJson( + JsonVariantConst); + + static bool checkJson(JsonVariantConst) { + return false; + } + + static bool checkJson(JsonVariant src) { + VariantData* data = getData(src); + return data && data->isArray(); + } +}; +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayConst.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayConst.hpp new file mode 100644 index 000000000..17e65a4bb --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -0,0 +1,134 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +class JsonObject; + +// A read-only reference to an array in a JsonDocument +// https://arduinojson.org/v6/api/jsonarrayconst/ +class JsonArrayConst : public VariantOperators { + friend class JsonArray; + friend class VariantAttorney; + + public: + typedef JsonArrayConstIterator iterator; + + // Returns an iterator to the first element of the array. + // https://arduinojson.org/v6/api/jsonarrayconst/begin/ + FORCE_INLINE iterator begin() const { + if (!_data) + return iterator(); + return iterator(_data->head()); + } + + // Returns an iterator to the element following the last element of the array. + // https://arduinojson.org/v6/api/jsonarrayconst/end/ + FORCE_INLINE iterator end() const { + return iterator(); + } + + // Creates an unbound reference. + FORCE_INLINE JsonArrayConst() : _data(0) {} + + // INTERNAL USE ONLY + FORCE_INLINE JsonArrayConst(const CollectionData* data) : _data(data) {} + + // Compares the content of two arrays. + // Returns true if the two arrays are equal. + FORCE_INLINE bool operator==(JsonArrayConst rhs) const { + if (_data == rhs._data) + return true; + if (!_data || !rhs._data) + return false; + + iterator it1 = begin(); + iterator it2 = rhs.begin(); + + for (;;) { + bool end1 = it1 == end(); + bool end2 = it2 == rhs.end(); + if (end1 && end2) + return true; + if (end1 || end2) + return false; + if (*it1 != *it2) + return false; + ++it1; + ++it2; + } + } + + // Returns the element at the specified index. + // https://arduinojson.org/v6/api/jsonarrayconst/subscript/ + FORCE_INLINE JsonVariantConst operator[](size_t index) const { + return JsonVariantConst(_data ? _data->getElement(index) : 0); + } + + operator JsonVariantConst() const { + return JsonVariantConst(collectionToVariant(_data)); + } + + // Returns true if the reference is unbound. + // https://arduinojson.org/v6/api/jsonarrayconst/isnull/ + FORCE_INLINE bool isNull() const { + return _data == 0; + } + + // Returns true if the reference is bound. + // https://arduinojson.org/v6/api/jsonarrayconst/isnull/ + FORCE_INLINE operator bool() const { + return _data != 0; + } + + // Returns the number of bytes occupied by the array. + // https://arduinojson.org/v6/api/jsonarrayconst/memoryusage/ + FORCE_INLINE size_t memoryUsage() const { + return _data ? _data->memoryUsage() : 0; + } + + // Returns the depth (nesting level) of the array. + // https://arduinojson.org/v6/api/jsonarrayconst/nesting/ + FORCE_INLINE size_t nesting() const { + return variantNesting(collectionToVariant(_data)); + } + + // Returns the number of elements in the array. + // https://arduinojson.org/v6/api/jsonarrayconst/size/ + FORCE_INLINE size_t size() const { + return _data ? _data->size() : 0; + } + + private: + const VariantData* getData() const { + return collectionToVariant(_data); + } + + const CollectionData* _data; +}; + +template <> +struct Converter : private VariantAttorney { + static void toJson(JsonVariantConst src, JsonVariant dst) { + variantCopyFrom(getData(dst), getData(src), getPool(dst)); + } + + static JsonArrayConst fromJson(JsonVariantConst src) { + const VariantData* data = getData(src); + return data ? data->asArray() : 0; + } + + static bool checkJson(JsonVariantConst src) { + const VariantData* data = getData(src); + return data && data->isArray(); + } +}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayImpl.hpp new file mode 100644 index 000000000..45a520f49 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayImpl.hpp @@ -0,0 +1,32 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +inline JsonObject JsonArray::createNestedObject() const { + return add().to(); +} + +template +inline JsonArray VariantRefBase::createNestedArray() const { + return add().template to(); +} + +template +inline JsonObject VariantRefBase::createNestedObject() const { + return add().template to(); +} + +template +inline ElementProxy VariantRefBase::operator[]( + size_t index) const { + return ElementProxy(derived(), index); +} + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayIterator.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayIterator.hpp new file mode 100644 index 000000000..382d11775 --- /dev/null +++ b/lib/ArduinoJson/src/ArduinoJson/Array/JsonArrayIterator.hpp @@ -0,0 +1,117 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +class VariantPtr { + public: + VariantPtr(MemoryPool* pool, VariantData* data) : _variant(pool, data) {} + + JsonVariant* operator->() { + return &_variant; + } + + JsonVariant& operator*() { + return _variant; + } + + private: + JsonVariant _variant; +}; + +class JsonArrayIterator { + friend class JsonArray; + + public: + JsonArrayIterator() : _slot(0) {} + explicit JsonArrayIterator(MemoryPool* pool, VariantSlot* slot) + : _pool(pool), _slot(slot) {} + + JsonVariant operator*() const { + return JsonVariant(_pool, _slot->data()); + } + VariantPtr operator->() { + return VariantPtr(_pool, _slot->data()); + } + + bool operator==(const JsonArrayIterator& other) const { + return _slot == other._slot; + } + + bool operator!=(const JsonArrayIterator& other) const { + return _slot != other._slot; + } + + JsonArrayIterator& operator++() { + _slot = _slot->next(); + return *this; + } + + JsonArrayIterator& operator+=(size_t distance) { + _slot = _slot->next(distance); + return *this; + } + + private: + MemoryPool* _pool; + VariantSlot* _slot; +}; + +class VariantConstPtr { + public: + VariantConstPtr(const VariantData* data) : _variant(data) {} + + JsonVariantConst* operator->() { + return &_variant; + } + + JsonVariantConst& operator*() { + return _variant; + } + + private: + JsonVariantConst _variant; +}; + +class JsonArrayConstIterator { + friend class JsonArray; + + public: + JsonArrayConstIterator() : _slot(0) {} + explicit JsonArrayConstIterator(const VariantSlot* slot) : _slot(slot) {} + + JsonVariantConst operator*() const { + return JsonVariantConst(_slot->data()); + } + VariantConstPtr operator->() { + return VariantConstPtr(_slot->data()); + } + + bool operator==(const JsonArrayConstIterator& other) const { + return _slot == other._slot; + } + + bool operator!=(const JsonArrayConstIterator& other) const { + return _slot != other._slot; + } + + JsonArrayConstIterator& operator++() { + _slot = _slot->next(); + return *this; + } + + JsonArrayConstIterator& operator+=(size_t distance) { + _slot = _slot->next(distance); + return *this; + } + + private: + const VariantSlot* _slot; +}; +} // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp b/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp index b8e87f218..1bff6830c 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Array/Utilities.hpp @@ -4,19 +4,21 @@ #pragma once -#include +#include #include namespace ARDUINOJSON_NAMESPACE { -// Trivial form to stop the recursion +// Copies a value to a JsonVariant. +// This is a degenerated form of copyArray() to stop the recursion. template inline typename enable_if::value, bool>::type copyArray( - const T& src, VariantRef dst) { + const T& src, JsonVariant dst) { return dst.set(src); } -// Copy array to a JsonArray/JsonVariant/MemberProxy/ElementProxy +// Copies values from an array to a JsonArray or a JsonVariant. +// https://arduinojson.org/v6/api/misc/copyarray/ template inline typename enable_if::value, bool>::type @@ -24,64 +26,72 @@ copyArray(T (&src)[N], const TDestination& dst) { return copyArray(src, N, dst); } -// Copy ptr+size to a JsonArray/JsonVariant/MemberProxy/ElementProxy +// Copies values from an array to a JsonArray or a JsonVariant. +// https://arduinojson.org/v6/api/misc/copyarray/ template inline typename enable_if::value, bool>::type copyArray(const T* src, size_t len, const TDestination& dst) { bool ok = true; for (size_t i = 0; i < len; i++) { - ok &= copyArray(src[i], dst.addElement()); + ok &= copyArray(src[i], dst.add()); } return ok; } -// Special case for char[] which much be treated as const char* +// Copies a string to a JsonVariant. +// This is a degenerated form of copyArray() to handle strings. template inline bool copyArray(const char* src, size_t, const TDestination& dst) { return dst.set(src); } -// Copy array to a JsonDocument +// Copies values from an array to a JsonDocument. +// https://arduinojson.org/v6/api/misc/copyarray/ template inline bool copyArray(const T& src, JsonDocument& dst) { - return copyArray(src, dst.to()); + return copyArray(src, dst.to()); } -// Copy a ptr+size array to a JsonDocument +// Copies an array to a JsonDocument. +// https://arduinojson.org/v6/api/misc/copyarray/ template inline bool copyArray(const T* src, size_t len, JsonDocument& dst) { - return copyArray(src, len, dst.to()); + return copyArray(src, len, dst.to()); } -// Trivial case form to stop the recursion +// Copies a value from a JsonVariant. +// This is a degenerated form of copyArray() to stop the recursion. template inline typename enable_if::value, size_t>::type copyArray( - VariantConstRef src, T& dst) { + JsonVariantConst src, T& dst) { dst = src.as(); return 1; } -// Copy a JsonArray to array +// Copies values from a JsonArray or JsonVariant to an array. +// https://arduinojson.org/v6/api/misc/copyarray/ template -inline size_t copyArray(ArrayConstRef src, T (&dst)[N]) { +inline size_t copyArray(JsonArrayConst src, T (&dst)[N]) { return copyArray(src, dst, N); } -// Copy a JsonArray to ptr+size +// Copies values from a JsonArray or JsonVariant to an array. +// https://arduinojson.org/v6/api/misc/copyarray/ template -inline size_t copyArray(ArrayConstRef src, T* dst, size_t len) { +inline size_t copyArray(JsonArrayConst src, T* dst, size_t len) { size_t i = 0; - for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < len; + for (JsonArrayConst::iterator it = src.begin(); it != src.end() && i < len; ++it) copyArray(*it, dst[i++]); return i; } -// Special case for char[] which must be treated as a string +// Copies a string from a JsonVariant. +// This is a degenerated form of copyArray() to handle strings. template -inline size_t copyArray(VariantConstRef src, char (&dst)[N]) { - String s = src; +inline size_t copyArray(JsonVariantConst src, char (&dst)[N]) { + JsonString s = src; size_t len = N - 1; if (len > s.size()) len = s.size(); @@ -90,14 +100,14 @@ inline size_t copyArray(VariantConstRef src, char (&dst)[N]) { return 1; } -// Copy a JsonDocument to an array -// (JsonDocument doesn't implicitly convert to JsonArrayConst) +// Copies values from a JsonDocument to an array. +// https://arduinojson.org/v6/api/misc/copyarray/ template inline typename enable_if::value && is_base_of::value, size_t>::type copyArray(const TSource& src, T& dst) { - return copyArray(src.template as(), dst); + return copyArray(src.template as(), dst); } } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp index 74b605466..560e7e336 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionData.hpp @@ -16,8 +16,8 @@ class VariantData; class VariantSlot; class CollectionData { - VariantSlot *_head; - VariantSlot *_tail; + VariantSlot* _head; + VariantSlot* _tail; public: // Must be a POD! @@ -28,27 +28,24 @@ class CollectionData { // Array only - VariantData *addElement(MemoryPool *pool); + VariantData* addElement(MemoryPool* pool); - VariantData *getElement(size_t index) const; + VariantData* getElement(size_t index) const; - VariantData *getOrAddElement(size_t index, MemoryPool *pool); + VariantData* getOrAddElement(size_t index, MemoryPool* pool); void removeElement(size_t index); - bool equalsArray(const CollectionData &other) const; - // Object only - template - VariantData *addMember(TAdaptedString key, MemoryPool *pool, TStoragePolicy); + template + VariantData* addMember(TAdaptedString key, MemoryPool* pool); template - VariantData *getMember(TAdaptedString key) const; + VariantData* getMember(TAdaptedString key) const; - template - VariantData *getOrAddMember(TAdaptedString key, MemoryPool *pool, - TStoragePolicy); + template + VariantData* getOrAddMember(TAdaptedString key, MemoryPool* pool); template void removeMember(TAdaptedString key) { @@ -56,34 +53,42 @@ class CollectionData { } template - bool containsKey(const TAdaptedString &key) const; - - bool equalsObject(const CollectionData &other) const; + bool containsKey(const TAdaptedString& key) const; // Generic void clear(); size_t memoryUsage() const; - size_t nesting() const; size_t size() const; - VariantSlot *addSlot(MemoryPool *); - void removeSlot(VariantSlot *slot); + VariantSlot* addSlot(MemoryPool*); + void removeSlot(VariantSlot* slot); - bool copyFrom(const CollectionData &src, MemoryPool *pool); + bool copyFrom(const CollectionData& src, MemoryPool* pool); - VariantSlot *head() const { + VariantSlot* head() const { return _head; } void movePointers(ptrdiff_t stringDistance, ptrdiff_t variantDistance); private: - VariantSlot *getSlot(size_t index) const; + VariantSlot* getSlot(size_t index) const; template - VariantSlot *getSlot(TAdaptedString key) const; + VariantSlot* getSlot(TAdaptedString key) const; - VariantSlot *getPreviousSlot(VariantSlot *) const; + VariantSlot* getPreviousSlot(VariantSlot*) const; }; + +inline const VariantData* collectionToVariant( + const CollectionData* collection) { + const void* data = collection; // prevent warning cast-align + return reinterpret_cast(data); +} + +inline VariantData* collectionToVariant(CollectionData* collection) { + void* data = collection; // prevent warning cast-align + return reinterpret_cast(data); +} } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp index 35678eebf..f933f527e 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -11,16 +11,13 @@ namespace ARDUINOJSON_NAMESPACE { -inline bool variantEquals(const VariantData* a, const VariantData* b) { - return variantCompare(a, b) == COMPARE_RESULT_EQUAL; -} - inline VariantSlot* CollectionData::addSlot(MemoryPool* pool) { VariantSlot* slot = pool->allocVariant(); if (!slot) return 0; if (_tail) { + ARDUINOJSON_ASSERT(pool->owns(_tail)); // Can't alter a linked array/object _tail->setNextNotNull(slot); _tail = slot; } else { @@ -36,12 +33,11 @@ inline VariantData* CollectionData::addElement(MemoryPool* pool) { return slotData(addSlot(pool)); } -template +template inline VariantData* CollectionData::addMember(TAdaptedString key, - MemoryPool* pool, - TStoragePolicy storage) { + MemoryPool* pool) { VariantSlot* slot = addSlot(pool); - if (!slotSetKey(slot, key, pool, storage)) { + if (!slotSetKey(slot, key, pool)) { removeSlot(slot); return 0; } @@ -64,8 +60,9 @@ inline bool CollectionData::copyFrom(const CollectionData& src, for (VariantSlot* s = src._head; s; s = s->next()) { VariantData* var; if (s->key() != 0) { - String key(s->key(), s->ownsKey() ? String::Copied : String::Linked); - var = addMember(adaptString(key), pool, getStringStoragePolicy(key)); + JsonString key(s->key(), + s->ownsKey() ? JsonString::Copied : JsonString::Linked); + var = addMember(adaptString(key), pool); } else { var = addElement(pool); } @@ -77,33 +74,6 @@ inline bool CollectionData::copyFrom(const CollectionData& src, return true; } -inline bool CollectionData::equalsObject(const CollectionData& other) const { - size_t count = 0; - for (VariantSlot* slot = _head; slot; slot = slot->next()) { - VariantData* v1 = slot->data(); - VariantData* v2 = other.getMember(adaptString(slot->key())); - if (!variantEquals(v1, v2)) - return false; - count++; - } - return count == other.size(); -} - -inline bool CollectionData::equalsArray(const CollectionData& other) const { - VariantSlot* s1 = _head; - VariantSlot* s2 = other._head; - for (;;) { - if (s1 == s2) - return true; - if (!s1 || !s2) - return false; - if (!variantEquals(s1->data(), s2->data())) - return false; - s1 = s1->next(); - s2 = s2->next(); - } -} - template inline VariantSlot* CollectionData::getSlot(TAdaptedString key) const { if (key.isNull()) @@ -140,9 +110,9 @@ inline VariantData* CollectionData::getMember(TAdaptedString key) const { return slot ? slot->data() : 0; } -template -inline VariantData* CollectionData::getOrAddMember( - TAdaptedString key, MemoryPool* pool, TStoragePolicy storage_policy) { +template +inline VariantData* CollectionData::getOrAddMember(TAdaptedString key, + MemoryPool* pool) { // ignore null key if (key.isNull()) return 0; @@ -152,7 +122,7 @@ inline VariantData* CollectionData::getOrAddMember( if (slot) return slot->data(); - return addMember(key, pool, storage_policy); + return addMember(key, pool); } inline VariantData* CollectionData::getElement(size_t index) const { @@ -203,16 +173,6 @@ inline size_t CollectionData::memoryUsage() const { return total; } -inline size_t CollectionData::nesting() const { - size_t maxChildNesting = 0; - for (VariantSlot* s = _head; s; s = s->next()) { - size_t childNesting = s->data()->nesting(); - if (childNesting > maxChildNesting) - maxChildNesting = childNesting; - } - return maxChildNesting + 1; -} - inline size_t CollectionData::size() const { return slotSize(_head); } diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp index 8a091bb1f..501acf3e4 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Filter.hpp @@ -10,18 +10,18 @@ namespace ARDUINOJSON_NAMESPACE { class Filter { public: - explicit Filter(VariantConstRef v) : _variant(v) {} + explicit Filter(JsonVariantConst v) : _variant(v) {} bool allow() const { return _variant; } bool allowArray() const { - return _variant == true || _variant.is(); + return _variant == true || _variant.is(); } bool allowObject() const { - return _variant == true || _variant.is(); + return _variant == true || _variant.is(); } bool allowValue() const { @@ -32,12 +32,12 @@ class Filter { Filter operator[](const TKey& key) const { if (_variant == true) // "true" means "allow recursively" return *this; - VariantConstRef member = _variant[key]; + JsonVariantConst member = _variant[key]; return Filter(member.isNull() ? _variant["*"] : member); } private: - VariantConstRef _variant; + JsonVariantConst _variant; }; struct AllowAllFilter { diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp index 1c470c048..96494df01 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp @@ -23,7 +23,8 @@ class IteratorReader { size_t readBytes(char* buffer, size_t length) { size_t i = 0; - while (i < length && _ptr < _end) buffer[i++] = *_ptr++; + while (i < length && _ptr < _end) + buffer[i++] = *_ptr++; return i; } }; diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp index 1181297ed..120ce8a80 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Readers/RamReader.hpp @@ -32,7 +32,8 @@ struct Reader -#include +#include namespace ARDUINOJSON_NAMESPACE { -template -struct Reader, void> : Reader { - explicit Reader(const ElementProxy& x) +template +struct Reader::value>::type> + : Reader { + explicit Reader(const TVariant& x) : Reader(x.template as()) {} }; -template -struct Reader, void> : Reader { - explicit Reader(const MemberProxy& x) - : Reader(x.template as()) {} -}; - -template <> -struct Reader : Reader { - explicit Reader(VariantRef x) : Reader(x.as()) {} -}; - -template <> -struct Reader : Reader { - explicit Reader(VariantConstRef x) - : Reader(x.as()) {} -}; } // namespace ARDUINOJSON_NAMESPACE diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp index 805cbb04c..062b10921 100644 --- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp +++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/deserialize.hpp @@ -14,9 +14,10 @@ namespace ARDUINOJSON_NAMESPACE { template