mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Converted JsonArray::copyFrom()/copyTo() to free functions copyArray()
				
					
				
			This commit is contained in:
		| @@ -7,6 +7,8 @@ HEAD | ||||
| * Decode escaped Unicode characters like \u00DE (issue #304, PR #791) | ||||
|   Many thanks to Daniel Schulte (aka @trilader) who implemented this feature. | ||||
| * 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) | ||||
| ----------- | ||||
|   | ||||
| @@ -15,6 +15,7 @@ | ||||
|  | ||||
| #include "ArduinoJson/Array/ArrayImpl.hpp" | ||||
| #include "ArduinoJson/Array/ElementProxy.hpp" | ||||
| #include "ArduinoJson/Array/Utilities.hpp" | ||||
| #include "ArduinoJson/Collection/CollectionImpl.hpp" | ||||
| #include "ArduinoJson/Object/MemberProxy.hpp" | ||||
| #include "ArduinoJson/Object/ObjectImpl.hpp" | ||||
| @@ -39,6 +40,7 @@ typedef ARDUINOJSON_NAMESPACE::String JsonString; | ||||
| typedef ARDUINOJSON_NAMESPACE::UInt JsonUInt; | ||||
| typedef ARDUINOJSON_NAMESPACE::VariantConstRef JsonVariantConst; | ||||
| typedef ARDUINOJSON_NAMESPACE::VariantRef JsonVariant; | ||||
| using ARDUINOJSON_NAMESPACE::copyArray; | ||||
| using ARDUINOJSON_NAMESPACE::DeserializationError; | ||||
| using ARDUINOJSON_NAMESPACE::deserializeJson; | ||||
| using ARDUINOJSON_NAMESPACE::deserializeMsgPack; | ||||
|   | ||||
| @@ -115,65 +115,12 @@ class ArrayRef : public ArrayRefBase<CollectionData>, | ||||
|     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 | ||||
|   FORCE_INLINE bool copyFrom(ArrayConstRef src) const { | ||||
|   FORCE_INLINE bool set(ArrayConstRef src) const { | ||||
|     if (!_data || !src._data) return false; | ||||
|     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 { | ||||
|     return arrayEquals(_data, rhs._data); | ||||
|   } | ||||
|   | ||||
							
								
								
									
										66
									
								
								src/ArduinoJson/Array/Utilities.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/ArduinoJson/Array/Utilities.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
| @@ -161,7 +161,7 @@ class ObjectRef : public ObjectRefBase<CollectionData>, | ||||
|     _data->clear(); | ||||
|   } | ||||
|  | ||||
|   FORCE_INLINE bool copyFrom(ObjectConstRef src) { | ||||
|   FORCE_INLINE bool set(ObjectConstRef src) { | ||||
|     if (!_data || !src._data) return false; | ||||
|     return _data->copyFrom(*src._data, _pool); | ||||
|   } | ||||
|   | ||||
| @@ -4,8 +4,7 @@ | ||||
|  | ||||
| add_executable(JsonArrayTests  | ||||
| 	add.cpp | ||||
| 	copyFrom.cpp | ||||
| 	copyTo.cpp | ||||
| 	copyArray.cpp | ||||
| 	createNested.cpp | ||||
| 	equals.cpp | ||||
| 	get.cpp | ||||
|   | ||||
							
								
								
									
										117
									
								
								test/JsonArray/copyArray.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								test/JsonArray/copyArray.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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]); | ||||
|   } | ||||
| } | ||||
| @@ -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); | ||||
|   } | ||||
| } | ||||
| @@ -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]); | ||||
|   } | ||||
| } | ||||
| @@ -5,7 +5,7 @@ | ||||
| #include <ArduinoJson.h> | ||||
| #include <catch.hpp> | ||||
|  | ||||
| TEST_CASE("JsonObject::copyFrom()") { | ||||
| TEST_CASE("JsonObject::set()") { | ||||
|   DynamicJsonDocument doc1(4096); | ||||
|   DynamicJsonDocument doc2(4096); | ||||
|  | ||||
| @@ -15,7 +15,7 @@ TEST_CASE("JsonObject::copyFrom()") { | ||||
|   SECTION("doesn't copy static string in key or value") { | ||||
|     obj1["hello"] = "world"; | ||||
|  | ||||
|     obj2.copyFrom(obj1); | ||||
|     obj2.set(obj1); | ||||
|  | ||||
|     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage()); | ||||
|     REQUIRE(obj2["hello"] == std::string("world")); | ||||
| @@ -24,7 +24,7 @@ TEST_CASE("JsonObject::copyFrom()") { | ||||
|   SECTION("copy local string value") { | ||||
|     obj1["hello"] = std::string("world"); | ||||
|  | ||||
|     obj2.copyFrom(obj1); | ||||
|     obj2.set(obj1); | ||||
|  | ||||
|     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage()); | ||||
|     REQUIRE(obj2["hello"] == std::string("world")); | ||||
| @@ -33,7 +33,7 @@ TEST_CASE("JsonObject::copyFrom()") { | ||||
|   SECTION("copy local key") { | ||||
|     obj1[std::string("hello")] = "world"; | ||||
|  | ||||
|     obj2.copyFrom(obj1); | ||||
|     obj2.set(obj1); | ||||
|  | ||||
|     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage()); | ||||
|     REQUIRE(obj2["hello"] == std::string("world")); | ||||
| @@ -42,7 +42,7 @@ TEST_CASE("JsonObject::copyFrom()") { | ||||
|   SECTION("copy string from deserializeJson()") { | ||||
|     deserializeJson(doc1, "{'hello':'world'}"); | ||||
|  | ||||
|     obj2.copyFrom(obj1); | ||||
|     obj2.set(obj1); | ||||
|  | ||||
|     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage()); | ||||
|     REQUIRE(obj2["hello"] == std::string("world")); | ||||
| @@ -51,7 +51,7 @@ TEST_CASE("JsonObject::copyFrom()") { | ||||
|   SECTION("copy string from deserializeMsgPack()") { | ||||
|     deserializeMsgPack(doc1, "\x81\xA5hello\xA5world"); | ||||
|  | ||||
|     obj2.copyFrom(obj1); | ||||
|     obj2.set(obj1); | ||||
|  | ||||
|     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage()); | ||||
|     REQUIRE(obj2["hello"] == std::string("world")); | ||||
| @@ -60,7 +60,7 @@ TEST_CASE("JsonObject::copyFrom()") { | ||||
|   SECTION("should work with JsonObjectConst") { | ||||
|     obj1["hello"] = "world"; | ||||
|  | ||||
|     obj2.copyFrom(static_cast<JsonObjectConst>(obj1)); | ||||
|     obj2.set(static_cast<JsonObjectConst>(obj1)); | ||||
|  | ||||
|     REQUIRE(doc1.memoryUsage() == doc2.memoryUsage()); | ||||
|     REQUIRE(obj2["hello"] == std::string("world")); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user