Просмотр исходного кода

Extracted a base class for JsonDocument

Benoit Blanchon 7 лет назад
Родитель
Сommit
39e5660c4a

+ 2 - 5
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"
 

+ 2 - 0
src/ArduinoJson/Data/JsonInteger.hpp

@@ -6,6 +6,8 @@
 
 #include "../Configuration.hpp"
 
+#include <stdint.h>  // int64_t
+
 namespace ARDUINOJSON_NAMESPACE {
 
 #if ARDUINOJSON_USE_LONG_LONG

+ 1 - 1
src/ArduinoJson/Data/JsonVariantData.hpp

@@ -4,7 +4,7 @@
 
 #pragma once
 
-#include <stdlib.h>  // size_t
+#include <stddef.h>  // ptrdiff_t, size_t
 
 #include "JsonFloat.hpp"
 #include "JsonInteger.hpp"

+ 0 - 64
src/ArduinoJson/DynamicJsonDocument.hpp

@@ -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 <typename T>
-  bool is() const {
-    return getVariant().is<T>();
-  }
-
-  template <typename T>
-  typename JsonVariantAs<T>::type as() const {
-    return getVariant().as<T>();
-  }
-
-  template <typename T>
-  typename JsonVariantTo<T>::type to() {
-    _memoryPool.clear();
-    return getVariant().to<T>();
-  }
-
-  void clear() {
-    _memoryPool.clear();
-    _rootData.type = JSON_NULL;
-  }
-
-  size_t memoryUsage() const {
-    return _memoryPool.size();
-  }
-
-  template <typename Visitor>
-  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

+ 25 - 8
src/ArduinoJson/StaticJsonDocument.hpp → 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 <size_t CAPACITY>
-class StaticJsonDocument {
+template <typename TMemoryPool>
+class JsonDocument {
  public:
   uint8_t nestingLimit;
 
-  StaticJsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {}
-
-  StaticMemoryPoolBase& memoryPool() {
-    return _memoryPool;
-  }
+  JsonDocument() : nestingLimit(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {}
 
   template <typename T>
   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<CAPACITY> _memoryPool;
+  mutable TMemoryPool _memoryPool;
   mutable JsonVariantData _rootData;
 };
 
+class DynamicJsonDocument : public JsonDocument<DynamicMemoryPool> {
+ public:
+  DynamicJsonDocument() {}
+  DynamicJsonDocument(size_t capacity) {
+    memoryPool().reserve(capacity);
+  }
+};
+
+template <size_t CAPACITY>
+class StaticJsonDocument : public JsonDocument<StaticMemoryPool<CAPACITY> > {
+ public:
+  StaticMemoryPoolBase& memoryPool() {
+    return JsonDocument<StaticMemoryPool<CAPACITY> >::memoryPool();
+  }
+};
+
 }  // namespace ARDUINOJSON_NAMESPACE

+ 5 - 1
src/ArduinoJson/Memory/DynamicMemoryPool.hpp

@@ -7,7 +7,7 @@
 #include "../Strings/StringInMemoryPool.hpp"
 #include "MemoryPool.hpp"
 
-#include <stdlib.h>
+#include <stdlib.h>  // 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;

+ 3 - 3
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:

+ 1 - 1
src/ArduinoJson/Numbers/FloatTraits.hpp

@@ -4,8 +4,8 @@
 
 #pragma once
 
+#include <stddef.h>  // for size_t
 #include <stdint.h>
-#include <stdlib.h>  // for size_t
 #include "../Configuration.hpp"
 #include "../Polyfills/math.hpp"
 

+ 0 - 2
src/ArduinoJson/Numbers/parseInteger.hpp

@@ -4,8 +4,6 @@
 
 #pragma once
 
-#include <stdlib.h>
-
 #include "../Configuration.hpp"
 #include "../Polyfills/ctype.hpp"
 

+ 1 - 1
src/ArduinoJson/Polyfills/mpl/max.hpp

@@ -4,7 +4,7 @@
 
 #pragma once
 
-#include <stdlib.h>  // for size_t
+#include <stddef.h>  // for size_t
 
 namespace ARDUINOJSON_NAMESPACE {
 

+ 1 - 1
src/ArduinoJson/Strings/ZeroTerminatedRamStringConst.hpp

@@ -4,7 +4,7 @@
 
 #pragma once
 
-#include <stdlib.h>  // size_t
+#include <stddef.h>  // size_t
 #include <string.h>  // strcmp
 
 namespace ARDUINOJSON_NAMESPACE {