From 7415f206ea314daf111f3e8b21b53e2531a60a59 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sat, 27 May 2017 15:08:11 +0200 Subject: [PATCH] Reduced code size --- src/ArduinoJson/Serialization/JsonWriter.hpp | 68 +++++++++++++------- test/JsonWriter/writeFloat.cpp | 1 + 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/ArduinoJson/Serialization/JsonWriter.hpp b/src/ArduinoJson/Serialization/JsonWriter.hpp index b6b27763c..560f95e8f 100644 --- a/src/ArduinoJson/Serialization/JsonWriter.hpp +++ b/src/ArduinoJson/Serialization/JsonWriter.hpp @@ -38,18 +38,34 @@ class JsonWriter { // Returns the number of bytes sent to the Print implementation. // This is very handy for implementations of printTo() that must return the // number of bytes written. - size_t bytesWritten() const { return _length; } + size_t bytesWritten() const { + return _length; + } - void beginArray() { writeRaw('['); } - void endArray() { writeRaw(']'); } + void beginArray() { + writeRaw('['); + } + void endArray() { + writeRaw(']'); + } - void beginObject() { writeRaw('{'); } - void endObject() { writeRaw('}'); } + void beginObject() { + writeRaw('{'); + } + void endObject() { + writeRaw('}'); + } - void writeColon() { writeRaw(':'); } - void writeComma() { writeRaw(','); } + void writeColon() { + writeRaw(':'); + } + void writeComma() { + writeRaw(','); + } - void writeBoolean(bool value) { writeRaw(value ? "true" : "false"); } + void writeBoolean(bool value) { + writeRaw(value ? "true" : "false"); + } void writeString(const char *value) { if (!value) { @@ -106,7 +122,7 @@ class JsonWriter { *ptr = 0; do { - *--ptr = static_cast(value % 10 + '0'); + *--ptr = char(value % 10 + '0'); value = UInt(value / 10); } while (value); @@ -137,8 +153,12 @@ class JsonWriter { writeRaw(ptr); } - void writeRaw(const char *s) { _length += _sink.print(s); } - void writeRaw(char c) { _length += _sink.print(c); } + void writeRaw(const char *s) { + _length += _sink.print(s); + } + void writeRaw(char c) { + _length += _sink.print(c); + } protected: Print &_sink; @@ -154,19 +174,19 @@ class JsonWriter { integralPart = uint32_t(value); JsonFloat remainder = value - JsonFloat(integralPart); - decimalPart = uint32_t(remainder * maxDecimalPart); - remainder = remainder * maxDecimalPart - JsonFloat(decimalPart); - - // rounding - if (remainder > 0.5) { - decimalPart++; - if (decimalPart >= maxDecimalPart) { - decimalPart -= maxDecimalPart; - integralPart++; - if (powersOf10 && integralPart >= 10) { - powersOf10++; - integralPart /= 10; - } + remainder *= maxDecimalPart; + decimalPart = uint32_t(remainder); + remainder = remainder - JsonFloat(decimalPart); + + // rounding: + // increment by 1 if remainder >= 0.5 + decimalPart += uint32_t(remainder * 2); + if (decimalPart >= maxDecimalPart) { + decimalPart = 0; + integralPart++; + if (powersOf10 && integralPart >= 10) { + powersOf10++; + integralPart = 1; } } } diff --git a/test/JsonWriter/writeFloat.cpp b/test/JsonWriter/writeFloat.cpp index 2f01b6f1a..e2d62f05b 100644 --- a/test/JsonWriter/writeFloat.cpp +++ b/test/JsonWriter/writeFloat.cpp @@ -84,6 +84,7 @@ TEST_CASE("JsonWriter::writeFloat()") { SECTION("Rounding when too many decimals") { check(0.000099999999999, "0.0001"); check(0.0000099999999999, "1e-5"); + check(0.9999999996, "1"); } SECTION("9 decimal places") {