Explorar el Código

Converted `JsonArray::copyFrom()/copyTo()` to free functions `copyArray()`

Benoit Blanchon hace 7 años
padre
commit
7ed92bebd3

+ 2 - 0
CHANGELOG.md

@@ -7,6 +7,8 @@ HEAD
 * Decode escaped Unicode characters like \u00DE (issue #304, PR #791)
 * Decode escaped Unicode characters like \u00DE (issue #304, PR #791)
   Many thanks to Daniel Schulte (aka @trilader) who implemented this feature.
   Many thanks to Daniel Schulte (aka @trilader) who implemented this feature.
 * Add option ARDUINOJSON_DECODE_UNICODE to enable it
 * Add option ARDUINOJSON_DECODE_UNICODE to enable it
+* Converted `JsonArray::copyFrom()/copyTo()` to free functions `copyArray()`
+* Renamed `JsonArray::copyFrom()` and `JsonObject::copyFrom()` to `set()`
 
 
 v6.8.0-beta (2019-01-30)
 v6.8.0-beta (2019-01-30)
 -----------
 -----------

+ 2 - 0
src/ArduinoJson.hpp

@@ -15,6 +15,7 @@
 
 
 #include "ArduinoJson/Array/ArrayImpl.hpp"
 #include "ArduinoJson/Array/ArrayImpl.hpp"
 #include "ArduinoJson/Array/ElementProxy.hpp"
 #include "ArduinoJson/Array/ElementProxy.hpp"
+#include "ArduinoJson/Array/Utilities.hpp"
 #include "ArduinoJson/Collection/CollectionImpl.hpp"
 #include "ArduinoJson/Collection/CollectionImpl.hpp"
 #include "ArduinoJson/Object/MemberProxy.hpp"
 #include "ArduinoJson/Object/MemberProxy.hpp"
 #include "ArduinoJson/Object/ObjectImpl.hpp"
 #include "ArduinoJson/Object/ObjectImpl.hpp"
@@ -39,6 +40,7 @@ typedef ARDUINOJSON_NAMESPACE::String JsonString;
 typedef ARDUINOJSON_NAMESPACE::UInt JsonUInt;
 typedef ARDUINOJSON_NAMESPACE::UInt JsonUInt;
 typedef ARDUINOJSON_NAMESPACE::VariantConstRef JsonVariantConst;
 typedef ARDUINOJSON_NAMESPACE::VariantConstRef JsonVariantConst;
 typedef ARDUINOJSON_NAMESPACE::VariantRef JsonVariant;
 typedef ARDUINOJSON_NAMESPACE::VariantRef JsonVariant;
+using ARDUINOJSON_NAMESPACE::copyArray;
 using ARDUINOJSON_NAMESPACE::DeserializationError;
 using ARDUINOJSON_NAMESPACE::DeserializationError;
 using ARDUINOJSON_NAMESPACE::deserializeJson;
 using ARDUINOJSON_NAMESPACE::deserializeJson;
 using ARDUINOJSON_NAMESPACE::deserializeMsgPack;
 using ARDUINOJSON_NAMESPACE::deserializeMsgPack;

+ 1 - 54
src/ArduinoJson/Array/ArrayRef.hpp

@@ -115,65 +115,12 @@ class ArrayRef : public ArrayRefBase<CollectionData>,
     return iterator();
     return iterator();
   }
   }
 
 
-  // Imports a 1D array
-  template <typename T, size_t N>
-  FORCE_INLINE bool copyFrom(T (&array)[N]) const {
-    return copyFrom(array, N);
-  }
-
-  // Imports a 1D array
-  template <typename T>
-  bool copyFrom(T* array, size_t len) const {
-    bool ok = true;
-    for (size_t i = 0; i < len; i++) {
-      ok &= add(array[i]);
-    }
-    return ok;
-  }
-
-  // Imports a 2D array
-  template <typename T, size_t N1, size_t N2>
-  bool copyFrom(T (&array)[N1][N2]) const {
-    bool ok = true;
-    for (size_t i = 0; i < N1; i++) {
-      ArrayRef nestedArray = createNestedArray();
-      for (size_t j = 0; j < N2; j++) {
-        ok &= nestedArray.add(array[i][j]);
-      }
-    }
-    return ok;
-  }
-
   // Copy a ArrayRef
   // Copy a ArrayRef
-  FORCE_INLINE bool copyFrom(ArrayConstRef src) const {
+  FORCE_INLINE bool set(ArrayConstRef src) const {
     if (!_data || !src._data) return false;
     if (!_data || !src._data) return false;
     return _data->copyFrom(*src._data, _pool);
     return _data->copyFrom(*src._data, _pool);
   }
   }
 
 
-  // Exports a 1D array
-  template <typename T, size_t N>
-  FORCE_INLINE size_t copyTo(T (&array)[N]) const {
-    return copyTo(array, N);
-  }
-
-  // Exports a 1D array
-  template <typename T>
-  size_t copyTo(T* array, size_t len) const {
-    size_t i = 0;
-    for (iterator it = begin(); it != end() && i < len; ++it) array[i++] = *it;
-    return i;
-  }
-
-  // Exports a 2D array
-  template <typename T, size_t N1, size_t N2>
-  void copyTo(T (&array)[N1][N2]) const {
-    if (!_data) return;
-    size_t i = 0;
-    for (iterator it = begin(); it != end() && i < N1; ++it) {
-      it->as<ArrayRef>().copyTo(array[i++]);
-    }
-  }
-
   FORCE_INLINE bool operator==(ArrayRef rhs) const {
   FORCE_INLINE bool operator==(ArrayRef rhs) const {
     return arrayEquals(_data, rhs._data);
     return arrayEquals(_data, rhs._data);
   }
   }

+ 66 - 0
src/ArduinoJson/Array/Utilities.hpp

@@ -0,0 +1,66 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2019
+// MIT License
+
+#pragma once
+
+#include "ArrayRef.hpp"
+
+namespace ARDUINOJSON_NAMESPACE {
+
+// Copy a 1D array to a JsonArray
+template <typename T, size_t N>
+inline bool copyArray(T (&src)[N], ArrayRef dst) {
+  return copyArray(src, N, dst);
+}
+
+// Copy a 1D array to a JsonArray
+template <typename T>
+inline bool copyArray(T* src, size_t len, ArrayRef dst) {
+  bool ok = true;
+  for (size_t i = 0; i < len; i++) {
+    ok &= dst.add(src[i]);
+  }
+  return ok;
+}
+
+// Copy a 2D array to a JsonArray
+template <typename T, size_t N1, size_t N2>
+inline bool copyArray(T (&src)[N1][N2], ArrayRef dst) {
+  bool ok = true;
+  for (size_t i = 0; i < N1; i++) {
+    ArrayRef nestedArray = dst.createNestedArray();
+    for (size_t j = 0; j < N2; j++) {
+      ok &= nestedArray.add(src[i][j]);
+    }
+  }
+  return ok;
+}
+
+// Copy a JsonArray to a 1D array
+template <typename T, size_t N>
+inline size_t copyArray(ArrayConstRef src, T (&dst)[N]) {
+  return copyArray(src, dst, N);
+}
+
+// Copy a JsonArray to a 1D array
+template <typename T>
+inline size_t copyArray(ArrayConstRef src, T* dst, size_t len) {
+  size_t i = 0;
+  for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < len;
+       ++it)
+    dst[i++] = *it;
+  return i;
+}
+
+// Copy a JsonArray to a 2D array
+template <typename T, size_t N1, size_t N2>
+inline void copyArray(ArrayConstRef src, T (&dst)[N1][N2]) {
+  size_t i = 0;
+  for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < N1;
+       ++it) {
+    copyArray(it->as<ArrayConstRef>(), dst[i++]);
+  }
+}
+
+}  // namespace ARDUINOJSON_NAMESPACE

+ 1 - 1
src/ArduinoJson/Object/ObjectRef.hpp

@@ -161,7 +161,7 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
     _data->clear();
     _data->clear();
   }
   }
 
 
-  FORCE_INLINE bool copyFrom(ObjectConstRef src) {
+  FORCE_INLINE bool set(ObjectConstRef src) {
     if (!_data || !src._data) return false;
     if (!_data || !src._data) return false;
     return _data->copyFrom(*src._data, _pool);
     return _data->copyFrom(*src._data, _pool);
   }
   }

+ 1 - 2
test/JsonArray/CMakeLists.txt

@@ -4,8 +4,7 @@
 
 
 add_executable(JsonArrayTests 
 add_executable(JsonArrayTests 
 	add.cpp
 	add.cpp
-	copyFrom.cpp
-	copyTo.cpp
+	copyArray.cpp
 	createNested.cpp
 	createNested.cpp
 	equals.cpp
 	equals.cpp
 	get.cpp
 	get.cpp

+ 117 - 0
test/JsonArray/copyArray.cpp

@@ -0,0 +1,117 @@
+// ArduinoJson - arduinojson.org
+// Copyright Benoit Blanchon 2014-2019
+// MIT License
+
+#include <ArduinoJson.h>
+#include <catch.hpp>
+
+TEST_CASE("copyArray()") {
+  SECTION("1D -> JsonArray") {
+    DynamicJsonDocument doc(4096);
+    JsonArray array = doc.to<JsonArray>();
+    char json[32];
+    int source[] = {1, 2, 3};
+
+    bool ok = copyArray(source, array);
+    REQUIRE(ok);
+
+    serializeJson(array, json, sizeof(json));
+    REQUIRE(std::string("[1,2,3]") == json);
+  }
+
+  SECTION("1D -> JsonArray, but not enough memory") {
+    const size_t SIZE = JSON_ARRAY_SIZE(2);
+    StaticJsonDocument<SIZE> doc;
+    JsonArray array = doc.to<JsonArray>();
+    char json[32];
+    int source[] = {1, 2, 3};
+
+    bool ok = copyArray(source, array);
+    REQUIRE_FALSE(ok);
+
+    serializeJson(array, json, sizeof(json));
+    REQUIRE(std::string("[1,2]") == json);
+  }
+
+  SECTION("2D -> JsonArray") {
+    DynamicJsonDocument doc(4096);
+    JsonArray array = doc.to<JsonArray>();
+    char json[32];
+    int source[][3] = {{1, 2, 3}, {4, 5, 6}};
+
+    bool ok = copyArray(source, array);
+    REQUIRE(ok);
+
+    serializeJson(array, json, sizeof(json));
+    REQUIRE(std::string("[[1,2,3],[4,5,6]]") == json);
+  }
+
+  SECTION("2D -> JsonArray, but not enough memory") {
+    const size_t SIZE =
+        JSON_ARRAY_SIZE(2) + JSON_ARRAY_SIZE(3) + JSON_ARRAY_SIZE(2);
+    StaticJsonDocument<SIZE> doc;
+    JsonArray array = doc.to<JsonArray>();
+    char json[32] = "";
+    int source[][3] = {{1, 2, 3}, {4, 5, 6}};
+
+    CAPTURE(SIZE)
+
+    bool ok = copyArray(source, array);
+    CAPTURE(doc.memoryUsage());
+    CHECK_FALSE(ok);
+
+    serializeJson(array, json, sizeof(json));
+    REQUIRE(std::string("[[1,2,3],[4,5]]") == json);
+  }
+
+  SECTION("JsonArray -> 1D, with more space than needed") {
+    DynamicJsonDocument doc(4096);
+    char json[] = "[1,2,3]";
+    DeserializationError err = deserializeJson(doc, json);
+    REQUIRE(err == DeserializationError::Ok);
+    JsonArray array = doc.as<JsonArray>();
+
+    int destination[4] = {0};
+    size_t result = copyArray(array, destination);
+
+    REQUIRE(3 == result);
+    REQUIRE(1 == destination[0]);
+    REQUIRE(2 == destination[1]);
+    REQUIRE(3 == destination[2]);
+    REQUIRE(0 == destination[3]);
+  }
+
+  SECTION("JsonArray -> 1D, without enough space") {
+    DynamicJsonDocument doc(4096);
+    char json[] = "[1,2,3]";
+    DeserializationError err = deserializeJson(doc, json);
+    REQUIRE(err == DeserializationError::Ok);
+    JsonArray array = doc.as<JsonArray>();
+
+    int destination[2] = {0};
+    size_t result = copyArray(array, destination);
+
+    REQUIRE(2 == result);
+    REQUIRE(1 == destination[0]);
+    REQUIRE(2 == destination[1]);
+  }
+
+  SECTION("JsonArray -> 2D") {
+    DynamicJsonDocument doc(4096);
+    char json[] = "[[1,2],[3],[4]]";
+
+    DeserializationError err = deserializeJson(doc, json);
+    REQUIRE(err == DeserializationError::Ok);
+    JsonArray array = doc.as<JsonArray>();
+
+    int destination[3][2] = {{0}};
+    copyArray(array, destination);
+
+    REQUIRE(1 == destination[0][0]);
+    REQUIRE(2 == destination[0][1]);
+    REQUIRE(3 == destination[1][0]);
+    REQUIRE(0 == destination[1][1]);
+    REQUIRE(4 == destination[2][0]);
+    REQUIRE(0 == destination[2][1]);
+  }
+}

+ 0 - 66
test/JsonArray/copyFrom.cpp

@@ -1,66 +0,0 @@
-// ArduinoJson - arduinojson.org
-// Copyright Benoit Blanchon 2014-2019
-// MIT License
-
-#include <ArduinoJson.h>
-#include <catch.hpp>
-
-TEST_CASE("JsonArray::copyFrom()") {
-  SECTION("OneDimension") {
-    DynamicJsonDocument doc(4096);
-    JsonArray array = doc.to<JsonArray>();
-    char json[32];
-    int source[] = {1, 2, 3};
-
-    bool ok = array.copyFrom(source);
-    REQUIRE(ok);
-
-    serializeJson(array, json, sizeof(json));
-    REQUIRE(std::string("[1,2,3]") == json);
-  }
-
-  SECTION("OneDimension_MemoryPoolTooSmall") {
-    const size_t SIZE = JSON_ARRAY_SIZE(2);
-    StaticJsonDocument<SIZE> doc;
-    JsonArray array = doc.to<JsonArray>();
-    char json[32];
-    int source[] = {1, 2, 3};
-
-    bool ok = array.copyFrom(source);
-    REQUIRE_FALSE(ok);
-
-    serializeJson(array, json, sizeof(json));
-    REQUIRE(std::string("[1,2]") == json);
-  }
-
-  SECTION("TwoDimensions") {
-    DynamicJsonDocument doc(4096);
-    JsonArray array = doc.to<JsonArray>();
-    char json[32];
-    int source[][3] = {{1, 2, 3}, {4, 5, 6}};
-
-    bool ok = array.copyFrom(source);
-    REQUIRE(ok);
-
-    serializeJson(array, json, sizeof(json));
-    REQUIRE(std::string("[[1,2,3],[4,5,6]]") == json);
-  }
-
-  SECTION("TwoDimensions_MemoryPoolTooSmall") {
-    const size_t SIZE =
-        JSON_ARRAY_SIZE(2) + JSON_ARRAY_SIZE(3) + JSON_ARRAY_SIZE(2);
-    StaticJsonDocument<SIZE> doc;
-    JsonArray array = doc.to<JsonArray>();
-    char json[32] = "";
-    int source[][3] = {{1, 2, 3}, {4, 5, 6}};
-
-    CAPTURE(SIZE)
-
-    bool ok = array.copyFrom(source);
-    CAPTURE(doc.memoryUsage());
-    CHECK_FALSE(ok);
-
-    serializeJson(array, json, sizeof(json));
-    REQUIRE(std::string("[[1,2,3],[4,5]]") == json);
-  }
-}

+ 0 - 58
test/JsonArray/copyTo.cpp

@@ -1,58 +0,0 @@
-// ArduinoJson - arduinojson.org
-// Copyright Benoit Blanchon 2014-2019
-// MIT License
-
-#include <ArduinoJson.h>
-#include <catch.hpp>
-
-TEST_CASE("JsonArray::copyTo()") {
-  DynamicJsonDocument doc(4096);
-
-  SECTION("BiggerOneDimensionIntegerArray") {
-    char json[] = "[1,2,3]";
-    DeserializationError err = deserializeJson(doc, json);
-    REQUIRE(err == DeserializationError::Ok);
-    JsonArray array = doc.as<JsonArray>();
-
-    int destination[4] = {0};
-    size_t result = array.copyTo(destination);
-
-    REQUIRE(3 == result);
-    REQUIRE(1 == destination[0]);
-    REQUIRE(2 == destination[1]);
-    REQUIRE(3 == destination[2]);
-    REQUIRE(0 == destination[3]);
-  }
-
-  SECTION("SmallerOneDimensionIntegerArray") {
-    char json[] = "[1,2,3]";
-    DeserializationError err = deserializeJson(doc, json);
-    REQUIRE(err == DeserializationError::Ok);
-    JsonArray array = doc.as<JsonArray>();
-
-    int destination[2] = {0};
-    size_t result = array.copyTo(destination);
-
-    REQUIRE(2 == result);
-    REQUIRE(1 == destination[0]);
-    REQUIRE(2 == destination[1]);
-  }
-
-  SECTION("TwoOneDimensionIntegerArray") {
-    char json[] = "[[1,2],[3],[4]]";
-
-    DeserializationError err = deserializeJson(doc, json);
-    REQUIRE(err == DeserializationError::Ok);
-    JsonArray array = doc.as<JsonArray>();
-
-    int destination[3][2] = {{0}};
-    array.copyTo(destination);
-
-    REQUIRE(1 == destination[0][0]);
-    REQUIRE(2 == destination[0][1]);
-    REQUIRE(3 == destination[1][0]);
-    REQUIRE(0 == destination[1][1]);
-    REQUIRE(4 == destination[2][0]);
-    REQUIRE(0 == destination[2][1]);
-  }
-}

+ 7 - 7
test/JsonObject/copy.cpp

@@ -5,7 +5,7 @@
 #include <ArduinoJson.h>
 #include <ArduinoJson.h>
 #include <catch.hpp>
 #include <catch.hpp>
 
 
-TEST_CASE("JsonObject::copyFrom()") {
+TEST_CASE("JsonObject::set()") {
   DynamicJsonDocument doc1(4096);
   DynamicJsonDocument doc1(4096);
   DynamicJsonDocument doc2(4096);
   DynamicJsonDocument doc2(4096);
 
 
@@ -15,7 +15,7 @@ TEST_CASE("JsonObject::copyFrom()") {
   SECTION("doesn't copy static string in key or value") {
   SECTION("doesn't copy static string in key or value") {
     obj1["hello"] = "world";
     obj1["hello"] = "world";
 
 
-    obj2.copyFrom(obj1);
+    obj2.set(obj1);
 
 
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(obj2["hello"] == std::string("world"));
     REQUIRE(obj2["hello"] == std::string("world"));
@@ -24,7 +24,7 @@ TEST_CASE("JsonObject::copyFrom()") {
   SECTION("copy local string value") {
   SECTION("copy local string value") {
     obj1["hello"] = std::string("world");
     obj1["hello"] = std::string("world");
 
 
-    obj2.copyFrom(obj1);
+    obj2.set(obj1);
 
 
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(obj2["hello"] == std::string("world"));
     REQUIRE(obj2["hello"] == std::string("world"));
@@ -33,7 +33,7 @@ TEST_CASE("JsonObject::copyFrom()") {
   SECTION("copy local key") {
   SECTION("copy local key") {
     obj1[std::string("hello")] = "world";
     obj1[std::string("hello")] = "world";
 
 
-    obj2.copyFrom(obj1);
+    obj2.set(obj1);
 
 
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(obj2["hello"] == std::string("world"));
     REQUIRE(obj2["hello"] == std::string("world"));
@@ -42,7 +42,7 @@ TEST_CASE("JsonObject::copyFrom()") {
   SECTION("copy string from deserializeJson()") {
   SECTION("copy string from deserializeJson()") {
     deserializeJson(doc1, "{'hello':'world'}");
     deserializeJson(doc1, "{'hello':'world'}");
 
 
-    obj2.copyFrom(obj1);
+    obj2.set(obj1);
 
 
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(obj2["hello"] == std::string("world"));
     REQUIRE(obj2["hello"] == std::string("world"));
@@ -51,7 +51,7 @@ TEST_CASE("JsonObject::copyFrom()") {
   SECTION("copy string from deserializeMsgPack()") {
   SECTION("copy string from deserializeMsgPack()") {
     deserializeMsgPack(doc1, "\x81\xA5hello\xA5world");
     deserializeMsgPack(doc1, "\x81\xA5hello\xA5world");
 
 
-    obj2.copyFrom(obj1);
+    obj2.set(obj1);
 
 
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(obj2["hello"] == std::string("world"));
     REQUIRE(obj2["hello"] == std::string("world"));
@@ -60,7 +60,7 @@ TEST_CASE("JsonObject::copyFrom()") {
   SECTION("should work with JsonObjectConst") {
   SECTION("should work with JsonObjectConst") {
     obj1["hello"] = "world";
     obj1["hello"] = "world";
 
 
-    obj2.copyFrom(static_cast<JsonObjectConst>(obj1));
+    obj2.set(static_cast<JsonObjectConst>(obj1));
 
 
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage());
     REQUIRE(obj2["hello"] == std::string("world"));
     REQUIRE(obj2["hello"] == std::string("world"));