diff --git a/src/ArduinoJson.hpp b/src/ArduinoJson.hpp index 5f1d0fde..5b7c016c 100644 --- a/src/ArduinoJson.hpp +++ b/src/ArduinoJson.hpp @@ -6,16 +6,13 @@ #include "ArduinoJson/Namespace.hpp" -#include "ArduinoJson/DynamicJsonDocument.hpp" -#include "ArduinoJson/StaticJsonDocument.hpp" - -#include "ArduinoJson/JsonObjectImpl.hpp" - #include "ArduinoJson/JsonArray.hpp" +#include "ArduinoJson/JsonDocument.hpp" #include "ArduinoJson/JsonObject.hpp" #include "ArduinoJson/JsonArrayImpl.hpp" #include "ArduinoJson/JsonArraySubscript.hpp" +#include "ArduinoJson/JsonObjectImpl.hpp" #include "ArduinoJson/JsonObjectSubscript.hpp" #include "ArduinoJson/JsonVariantImpl.hpp" diff --git a/src/ArduinoJson/Data/JsonInteger.hpp b/src/ArduinoJson/Data/JsonInteger.hpp index 650d5854..9848b5b2 100644 --- a/src/ArduinoJson/Data/JsonInteger.hpp +++ b/src/ArduinoJson/Data/JsonInteger.hpp @@ -6,6 +6,8 @@ #include "../Configuration.hpp" +#include // int64_t + namespace ARDUINOJSON_NAMESPACE { #if ARDUINOJSON_USE_LONG_LONG diff --git a/src/ArduinoJson/Data/JsonVariantData.hpp b/src/ArduinoJson/Data/JsonVariantData.hpp index dae37138..d00854c4 100644 --- a/src/ArduinoJson/Data/JsonVariantData.hpp +++ b/src/ArduinoJson/Data/JsonVariantData.hpp @@ -4,7 +4,7 @@ #pragma once -#include // size_t +#include // ptrdiff_t, size_t #include "JsonFloat.hpp" #include "JsonInteger.hpp" diff --git a/src/ArduinoJson/DynamicJsonDocument.hpp b/src/ArduinoJson/DynamicJsonDocument.hpp deleted file mode 100644 index e4e63cf9..00000000 --- a/src/ArduinoJson/DynamicJsonDocument.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2018 -// MIT License - -#pragma once - -#include "Data/JsonVariantTo.hpp" -#include "JsonVariant.hpp" -#include "Memory/DynamicMemoryPool.hpp" - -namespace ARDUINOJSON_NAMESPACE { - -class DynamicJsonDocument { - public: - uint8_t nestingLimit; - - DynamicJsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {} - DynamicJsonDocument(size_t capacity) - : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT), - _memoryPool(capacity) {} - - template - bool is() const { - return getVariant().is(); - } - - template - typename JsonVariantAs::type as() const { - return getVariant().as(); - } - - template - typename JsonVariantTo::type to() { - _memoryPool.clear(); - return getVariant().to(); - } - - void clear() { - _memoryPool.clear(); - _rootData.type = JSON_NULL; - } - - size_t memoryUsage() const { - return _memoryPool.size(); - } - - template - void accept(Visitor& visitor) const { - return getVariant().accept(visitor); - } - - DynamicMemoryPool& memoryPool() { - return _memoryPool; - } - - private: - JsonVariant getVariant() const { - return JsonVariant(&_memoryPool, &_rootData); - } - - mutable DynamicMemoryPool _memoryPool; - mutable JsonVariantData _rootData; -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/StaticJsonDocument.hpp b/src/ArduinoJson/JsonDocument.hpp similarity index 66% rename from src/ArduinoJson/StaticJsonDocument.hpp rename to src/ArduinoJson/JsonDocument.hpp index bc6dc0d1..f7b1c110 100644 --- a/src/ArduinoJson/StaticJsonDocument.hpp +++ b/src/ArduinoJson/JsonDocument.hpp @@ -6,20 +6,17 @@ #include "Data/JsonVariantTo.hpp" #include "JsonVariant.hpp" +#include "Memory/DynamicMemoryPool.hpp" #include "Memory/StaticMemoryPool.hpp" namespace ARDUINOJSON_NAMESPACE { -template -class StaticJsonDocument { +template +class JsonDocument { public: uint8_t nestingLimit; - StaticJsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {} - - StaticMemoryPoolBase& memoryPool() { - return _memoryPool; - } + JsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {} template bool is() const { @@ -51,13 +48,33 @@ class StaticJsonDocument { return getVariant().accept(visitor); } + TMemoryPool& memoryPool() { + return _memoryPool; + } + private: JsonVariant getVariant() const { return JsonVariant(&_memoryPool, &_rootData); } - mutable StaticMemoryPool _memoryPool; + mutable TMemoryPool _memoryPool; mutable JsonVariantData _rootData; }; +class DynamicJsonDocument : public JsonDocument { + public: + DynamicJsonDocument() {} + DynamicJsonDocument(size_t capacity) { + memoryPool().reserve(capacity); + } +}; + +template +class StaticJsonDocument : public JsonDocument > { + public: + StaticMemoryPoolBase& memoryPool() { + return JsonDocument >::memoryPool(); + } +}; + } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Memory/DynamicMemoryPool.hpp b/src/ArduinoJson/Memory/DynamicMemoryPool.hpp index da307304..1bda9cb5 100644 --- a/src/ArduinoJson/Memory/DynamicMemoryPool.hpp +++ b/src/ArduinoJson/Memory/DynamicMemoryPool.hpp @@ -7,7 +7,7 @@ #include "../Strings/StringInMemoryPool.hpp" #include "MemoryPool.hpp" -#include +#include // malloc, free #if defined(__clang__) #pragma clang diagnostic push @@ -52,6 +52,10 @@ class DynamicMemoryPoolBase : public MemoryPool { clear(); } + void reserve(size_t capacity) { + _nextBlockCapacity = capacity; + } + // Gets the number of bytes occupied in the memoryPool size_t size() const { size_t total = 0; diff --git a/src/ArduinoJson/Memory/StaticMemoryPool.hpp b/src/ArduinoJson/Memory/StaticMemoryPool.hpp index ef8157af..f6f47771 100644 --- a/src/ArduinoJson/Memory/StaticMemoryPool.hpp +++ b/src/ArduinoJson/Memory/StaticMemoryPool.hpp @@ -40,9 +40,6 @@ class StaticMemoryPoolBase : public MemoryPool { char* _start; }; - StaticMemoryPoolBase(char* memoryPool, size_t capa) - : _buffer(memoryPool), _capacity(capa), _size(0) {} - // Gets the capacity of the memoryPool in bytes size_t capacity() const { return _capacity; @@ -71,6 +68,9 @@ class StaticMemoryPoolBase : public MemoryPool { } protected: + StaticMemoryPoolBase(char* memoryPool, size_t capa) + : _buffer(memoryPool), _capacity(capa), _size(0) {} + ~StaticMemoryPoolBase() {} private: diff --git a/src/ArduinoJson/Numbers/FloatTraits.hpp b/src/ArduinoJson/Numbers/FloatTraits.hpp index e1e7a108..af6168b8 100644 --- a/src/ArduinoJson/Numbers/FloatTraits.hpp +++ b/src/ArduinoJson/Numbers/FloatTraits.hpp @@ -4,8 +4,8 @@ #pragma once +#include // for size_t #include -#include // for size_t #include "../Configuration.hpp" #include "../Polyfills/math.hpp" diff --git a/src/ArduinoJson/Numbers/parseInteger.hpp b/src/ArduinoJson/Numbers/parseInteger.hpp index e0a29ea6..eff75863 100644 --- a/src/ArduinoJson/Numbers/parseInteger.hpp +++ b/src/ArduinoJson/Numbers/parseInteger.hpp @@ -4,8 +4,6 @@ #pragma once -#include - #include "../Configuration.hpp" #include "../Polyfills/ctype.hpp" diff --git a/src/ArduinoJson/Polyfills/mpl/max.hpp b/src/ArduinoJson/Polyfills/mpl/max.hpp index d8792b86..169ff4d3 100644 --- a/src/ArduinoJson/Polyfills/mpl/max.hpp +++ b/src/ArduinoJson/Polyfills/mpl/max.hpp @@ -4,7 +4,7 @@ #pragma once -#include // for size_t +#include // for size_t namespace ARDUINOJSON_NAMESPACE { diff --git a/src/ArduinoJson/Strings/ZeroTerminatedRamStringConst.hpp b/src/ArduinoJson/Strings/ZeroTerminatedRamStringConst.hpp index 964cbc6d..a0090153 100644 --- a/src/ArduinoJson/Strings/ZeroTerminatedRamStringConst.hpp +++ b/src/ArduinoJson/Strings/ZeroTerminatedRamStringConst.hpp @@ -4,7 +4,7 @@ #pragma once -#include // size_t +#include // size_t #include // strcmp namespace ARDUINOJSON_NAMESPACE {