mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Improved deserializeMsgPack() speed by reading several bytes at once
				
					
				
			This commit is contained in:
		| @@ -5,7 +5,7 @@ | ||||
| add_executable(MiscTests | ||||
| 	conflicts.cpp | ||||
| 	FloatParts.cpp | ||||
| 	StreamReader.cpp | ||||
| 	Readers.cpp | ||||
| 	StringAdapters.cpp | ||||
| 	StringWriter.cpp | ||||
| 	TypeTraits.cpp | ||||
|   | ||||
							
								
								
									
										166
									
								
								extras/tests/Misc/Readers.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								extras/tests/Misc/Readers.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,166 @@ | ||||
| // ArduinoJson - arduinojson.org | ||||
| // Copyright Benoit Blanchon 2014-2019 | ||||
| // MIT License | ||||
|  | ||||
| #include <ArduinoJson.h> | ||||
| #include <catch.hpp> | ||||
|  | ||||
| using namespace ARDUINOJSON_NAMESPACE; | ||||
|  | ||||
| TEST_CASE("StdStreamReader") { | ||||
|   SECTION("read()") { | ||||
|     std::istringstream src("\x01\xFF"); | ||||
|     StdStreamReader reader(src); | ||||
|  | ||||
|     REQUIRE(reader.read() == 0x01); | ||||
|     REQUIRE(reader.read() == 0xFF); | ||||
|     REQUIRE(reader.read() == -1); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() all at once") { | ||||
|     std::istringstream src("ABC"); | ||||
|     StdStreamReader reader(src); | ||||
|  | ||||
|     char buffer[8] = "abcd"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 3); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'd'); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() in two parts") { | ||||
|     std::istringstream src("ABCDEF"); | ||||
|     StdStreamReader reader(src); | ||||
|  | ||||
|     char buffer[12] = "abcdefg"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 4); | ||||
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'D'); | ||||
|     REQUIRE(buffer[4] == 'E'); | ||||
|     REQUIRE(buffer[5] == 'F'); | ||||
|     REQUIRE(buffer[6] == 'g'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST_CASE("SafeCharPointerReader") { | ||||
|   SECTION("read") { | ||||
|     SafeCharPointerReader reader("\x01\xFF", 2); | ||||
|     REQUIRE(reader.read() == 0x01); | ||||
|     REQUIRE(reader.read() == 0xFF); | ||||
|     REQUIRE(reader.read() == -1); | ||||
|     REQUIRE(reader.read() == -1); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() all at once") { | ||||
|     SafeCharPointerReader reader("ABCD", 3); | ||||
|  | ||||
|     char buffer[8] = "abcd"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 3); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'd'); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() in two parts") { | ||||
|     SafeCharPointerReader reader("ABCDEF", 6); | ||||
|  | ||||
|     char buffer[8] = "abcdefg"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 4); | ||||
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'D'); | ||||
|     REQUIRE(buffer[4] == 'E'); | ||||
|     REQUIRE(buffer[5] == 'F'); | ||||
|     REQUIRE(buffer[6] == 'g'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST_CASE("UnsafeCharPointerReader") { | ||||
|   SECTION("read()") { | ||||
|     UnsafeCharPointerReader reader("\x01\xFF\x00\x12"); | ||||
|     REQUIRE(reader.read() == 0x01); | ||||
|     REQUIRE(reader.read() == 0xFF); | ||||
|     REQUIRE(reader.read() == 0); | ||||
|     REQUIRE(reader.read() == 0x12); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() all at once") { | ||||
|     UnsafeCharPointerReader reader("ABCD"); | ||||
|  | ||||
|     char buffer[8] = "abcd"; | ||||
|     REQUIRE(reader.readBytes(buffer, 3) == 3); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'd'); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() in two parts") { | ||||
|     UnsafeCharPointerReader reader("ABCDEF"); | ||||
|  | ||||
|     char buffer[8] = "abcdefg"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 4); | ||||
|     REQUIRE(reader.readBytes(buffer + 4, 2) == 2); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'D'); | ||||
|     REQUIRE(buffer[4] == 'E'); | ||||
|     REQUIRE(buffer[5] == 'F'); | ||||
|     REQUIRE(buffer[6] == 'g'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST_CASE("IteratorReader") { | ||||
|   SECTION("read()") { | ||||
|     std::string src("\x01\xFF"); | ||||
|     IteratorReader<std::string::const_iterator> reader(src.begin(), src.end()); | ||||
|  | ||||
|     REQUIRE(reader.read() == 0x01); | ||||
|     REQUIRE(reader.read() == 0xFF); | ||||
|     REQUIRE(reader.read() == -1); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() all at once") { | ||||
|     std::string src("ABC"); | ||||
|     IteratorReader<std::string::const_iterator> reader(src.begin(), src.end()); | ||||
|  | ||||
|     char buffer[8] = "abcd"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 3); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'd'); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() in two parts") { | ||||
|     std::string src("ABCDEF"); | ||||
|     IteratorReader<std::string::const_iterator> reader(src.begin(), src.end()); | ||||
|  | ||||
|     char buffer[12] = "abcdefg"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 4); | ||||
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'D'); | ||||
|     REQUIRE(buffer[4] == 'E'); | ||||
|     REQUIRE(buffer[5] == 'F'); | ||||
|     REQUIRE(buffer[6] == 'g'); | ||||
|   } | ||||
| } | ||||
| @@ -1,33 +0,0 @@ | ||||
| // ArduinoJson - arduinojson.org | ||||
| // Copyright Benoit Blanchon 2014-2019 | ||||
| // MIT License | ||||
|  | ||||
| #include <ArduinoJson.h> | ||||
| #include <catch.hpp> | ||||
|  | ||||
| using namespace ARDUINOJSON_NAMESPACE; | ||||
|  | ||||
| TEST_CASE("StdStreamReader") { | ||||
|   std::istringstream src("\x01\xFF"); | ||||
|   StdStreamReader reader(src); | ||||
|  | ||||
|   REQUIRE(reader.read() == 0x01); | ||||
|   REQUIRE(reader.read() == 0xFF); | ||||
|   REQUIRE(reader.read() == -1); | ||||
| } | ||||
|  | ||||
| TEST_CASE("SafeCharPointerReader") { | ||||
|   SafeCharPointerReader reader("\x01\xFF", 2); | ||||
|  | ||||
|   REQUIRE(reader.read() == 0x01); | ||||
|   REQUIRE(reader.read() == 0xFF); | ||||
|   REQUIRE(reader.read() == -1); | ||||
| } | ||||
|  | ||||
| TEST_CASE("UnsafeCharPointerReader") { | ||||
|   UnsafeCharPointerReader reader("\x01\xFF"); | ||||
|  | ||||
|   REQUIRE(reader.read() == 0x01); | ||||
|   REQUIRE(reader.read() == 0xFF); | ||||
|   REQUIRE(reader.read() == 0); | ||||
| } | ||||
| @@ -85,3 +85,83 @@ TEST_CASE("memcpy_P") { | ||||
|   CHECK(dst[2] == 'C'); | ||||
|   CHECK(dst[3] == 0); | ||||
| } | ||||
|  | ||||
| TEST_CASE("SafeCharPointerReader") { | ||||
|   using ARDUINOJSON_NAMESPACE::SafeFlashStringReader; | ||||
|  | ||||
|   SECTION("read") { | ||||
|     SafeFlashStringReader reader(F("\x01\xFF"), 2); | ||||
|     REQUIRE(reader.read() == 0x01); | ||||
|     REQUIRE(reader.read() == 0xFF); | ||||
|     REQUIRE(reader.read() == -1); | ||||
|     REQUIRE(reader.read() == -1); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() all at once") { | ||||
|     SafeFlashStringReader reader(F("ABCD"), 3); | ||||
|  | ||||
|     char buffer[8] = "abcd"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 3); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'd'); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() in two parts") { | ||||
|     SafeFlashStringReader reader(F("ABCDEF"), 6); | ||||
|  | ||||
|     char buffer[8] = "abcdefg"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 4); | ||||
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'D'); | ||||
|     REQUIRE(buffer[4] == 'E'); | ||||
|     REQUIRE(buffer[5] == 'F'); | ||||
|     REQUIRE(buffer[6] == 'g'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST_CASE("UnsafeFlashStringReader") { | ||||
|   using ARDUINOJSON_NAMESPACE::UnsafeFlashStringReader; | ||||
|  | ||||
|   SECTION("read()") { | ||||
|     UnsafeFlashStringReader reader(F("\x01\xFF\x00\x12")); | ||||
|     REQUIRE(reader.read() == 0x01); | ||||
|     REQUIRE(reader.read() == 0xFF); | ||||
|     REQUIRE(reader.read() == 0); | ||||
|     REQUIRE(reader.read() == 0x12); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() all at once") { | ||||
|     UnsafeFlashStringReader reader(F("ABCD")); | ||||
|  | ||||
|     char buffer[8] = "abcd"; | ||||
|     REQUIRE(reader.readBytes(buffer, 3) == 3); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'd'); | ||||
|   } | ||||
|  | ||||
|   SECTION("readBytes() in two parts") { | ||||
|     UnsafeFlashStringReader reader(F("ABCDEF")); | ||||
|  | ||||
|     char buffer[8] = "abcdefg"; | ||||
|     REQUIRE(reader.readBytes(buffer, 4) == 4); | ||||
|     REQUIRE(reader.readBytes(buffer + 4, 2) == 2); | ||||
|  | ||||
|     REQUIRE(buffer[0] == 'A'); | ||||
|     REQUIRE(buffer[1] == 'B'); | ||||
|     REQUIRE(buffer[2] == 'C'); | ||||
|     REQUIRE(buffer[3] == 'D'); | ||||
|     REQUIRE(buffer[4] == 'E'); | ||||
|     REQUIRE(buffer[5] == 'F'); | ||||
|     REQUIRE(buffer[6] == 'g'); | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user