From c955049207901d53c5a19b4536bbd7249865a26a Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sun, 28 May 2017 15:33:03 +0200 Subject: [PATCH] Fixed IntelliSense errors in Visual Micro (issue #483) --- CHANGELOG.md | 5 + .../Deserialization/JsonParserImpl.hpp | 10 +- .../Deserialization/StringWriter.hpp | 4 +- src/ArduinoJson/DynamicJsonBuffer.hpp | 2 +- src/ArduinoJson/JsonArraySubscript.hpp | 4 +- src/ArduinoJson/JsonVariant.hpp | 2 +- src/ArduinoJson/JsonVariantBase.hpp | 4 +- src/ArduinoJson/JsonVariantImpl.hpp | 9 +- src/ArduinoJson/Polyfills/math.hpp | 114 +----------------- src/ArduinoJson/Polyfills/parseInteger.hpp | 4 +- .../Serialization/StaticStringBuilder.hpp | 2 +- src/ArduinoJson/StringTraits/CharPointer.hpp | 8 +- src/ArduinoJson/TypeTraits/FloatTraits.hpp | 12 +- test/IntegrationTests/gbathree.cpp | 22 ++-- test/JsonVariant/subscript.cpp | 2 +- 15 files changed, 51 insertions(+), 153 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 600f4359..09a753f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Fixed IntelliSense errors in Visual Micro (issue #483) + v5.10.0 ------- diff --git a/src/ArduinoJson/Deserialization/JsonParserImpl.hpp b/src/ArduinoJson/Deserialization/JsonParserImpl.hpp index 14c16255..1c41bdaa 100644 --- a/src/ArduinoJson/Deserialization/JsonParserImpl.hpp +++ b/src/ArduinoJson/Deserialization/JsonParserImpl.hpp @@ -20,9 +20,8 @@ inline bool ArduinoJson::Internals::JsonParser::eat( } template -inline bool -ArduinoJson::Internals::JsonParser::parseAnythingTo( - JsonVariant *destination) { +inline bool ArduinoJson::Internals::JsonParser< + TReader, TWriter>::parseAnythingTo(JsonVariant *destination) { if (_nestingLimit == 0) return false; _nestingLimit--; bool success = parseAnythingToUnsafe(destination); @@ -31,9 +30,8 @@ ArduinoJson::Internals::JsonParser::parseAnythingTo( } template -inline bool -ArduinoJson::Internals::JsonParser::parseAnythingToUnsafe( - JsonVariant *destination) { +inline bool ArduinoJson::Internals::JsonParser< + TReader, TWriter>::parseAnythingToUnsafe(JsonVariant *destination) { skipSpacesAndComments(_reader); switch (_reader.current()) { diff --git a/src/ArduinoJson/Deserialization/StringWriter.hpp b/src/ArduinoJson/Deserialization/StringWriter.hpp index 42402692..42ee640d 100644 --- a/src/ArduinoJson/Deserialization/StringWriter.hpp +++ b/src/ArduinoJson/Deserialization/StringWriter.hpp @@ -17,8 +17,8 @@ class StringWriter { public: String(TChar** ptr) : _writePtr(ptr), _startPtr(*ptr) {} - void append(TChar c) { - *(*_writePtr)++ = c; + void append(char c) { + *(*_writePtr)++ = TChar(c); } const char* c_str() const { diff --git a/src/ArduinoJson/DynamicJsonBuffer.hpp b/src/ArduinoJson/DynamicJsonBuffer.hpp index 65206d10..bda4a58e 100644 --- a/src/ArduinoJson/DynamicJsonBuffer.hpp +++ b/src/ArduinoJson/DynamicJsonBuffer.hpp @@ -98,7 +98,7 @@ class DynamicJsonBufferBase private: DynamicJsonBufferBase* _parent; char* _start; - int _length; + size_t _length; }; String startString() { diff --git a/src/ArduinoJson/JsonArraySubscript.hpp b/src/ArduinoJson/JsonArraySubscript.hpp index dddfbd1d..fc19822e 100644 --- a/src/ArduinoJson/JsonArraySubscript.hpp +++ b/src/ArduinoJson/JsonArraySubscript.hpp @@ -107,13 +107,13 @@ inline const JsonArraySubscript JsonArray::operator[](size_t index) const { } template -inline JsonArraySubscript JsonVariantBase::operator[](int index) { +inline JsonArraySubscript JsonVariantBase::operator[](size_t index) { return as()[index]; } template inline const JsonArraySubscript JsonVariantBase::operator[]( - int index) const { + size_t index) const { return as()[index]; } diff --git a/src/ArduinoJson/JsonVariant.hpp b/src/ArduinoJson/JsonVariant.hpp index 2899c8d6..9037d54d 100644 --- a/src/ArduinoJson/JsonVariant.hpp +++ b/src/ArduinoJson/JsonVariant.hpp @@ -52,7 +52,7 @@ class JsonVariant : public JsonVariantBase { JsonVariant(bool value) { using namespace Internals; _type = JSON_BOOLEAN; - _content.asInteger = static_cast(value); + _content.asInteger = static_cast(value); } // Create a JsonVariant containing a floating point value. diff --git a/src/ArduinoJson/JsonVariantBase.hpp b/src/ArduinoJson/JsonVariantBase.hpp index 60aa0ee4..ac5ad907 100644 --- a/src/ArduinoJson/JsonVariantBase.hpp +++ b/src/ArduinoJson/JsonVariantBase.hpp @@ -78,8 +78,8 @@ class JsonVariantBase : public Internals::JsonPrintable { // Mimics an array. // Returns the element at specified index if the variant is an array. // Returns JsonVariant::invalid() if the variant is not an array. - FORCE_INLINE const JsonArraySubscript operator[](int index) const; - FORCE_INLINE JsonArraySubscript operator[](int index); + FORCE_INLINE const JsonArraySubscript operator[](size_t index) const; + FORCE_INLINE JsonArraySubscript operator[](size_t index); // Mimics an object. // Returns the value associated with the specified key if the variant is diff --git a/src/ArduinoJson/JsonVariantImpl.hpp b/src/ArduinoJson/JsonVariantImpl.hpp index 0bd6535d..1700f1b7 100644 --- a/src/ArduinoJson/JsonVariantImpl.hpp +++ b/src/ArduinoJson/JsonVariantImpl.hpp @@ -56,16 +56,16 @@ inline T JsonVariant::variantAsInteger() const { return 0; case JSON_POSITIVE_INTEGER: case JSON_BOOLEAN: - return static_cast(_content.asInteger); + return T(_content.asInteger); case JSON_NEGATIVE_INTEGER: - return static_cast(_content.asInteger * -1); + return T(~_content.asInteger + 1); case JSON_STRING: case JSON_UNPARSED: if (!_content.asString) return 0; if (!strcmp("true", _content.asString)) return 1; return Polyfills::parseInteger(_content.asString); default: - return static_cast(_content.asFloat); + return T(_content.asFloat); } } @@ -117,7 +117,8 @@ inline bool JsonVariant::variantIsInteger() const { inline bool JsonVariant::variantIsFloat() const { using namespace Internals; - return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER || + return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER || + _type == JSON_NEGATIVE_INTEGER || (_type == JSON_UNPARSED && Polyfills::isFloat(_content.asString)); } diff --git a/src/ArduinoJson/Polyfills/math.hpp b/src/ArduinoJson/Polyfills/math.hpp index 3f1aafe7..9dbd161d 100644 --- a/src/ArduinoJson/Polyfills/math.hpp +++ b/src/ArduinoJson/Polyfills/math.hpp @@ -7,126 +7,16 @@ #pragma once -// If Visual Studo -#if defined(_MSC_VER) - -#include -#include - namespace ArduinoJson { namespace Polyfills { template bool isNaN(T x) { - return _isnan(x) != 0; + return x != x; } template bool isInfinity(T x) { - return !_finite(x); -} - -template -T nan() { - return std::numeric_limits::quiet_NaN(); -} - -template -T inf() { - return std::numeric_limits::infinity(); + return x != 0.0 && x * 2 == x; } } } - -#else - -#include - -// GCC warning: "conversion to 'float' from 'double' may alter its value" -#ifdef __GNUC__ -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) -#pragma GCC diagnostic push -#endif -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) -#pragma GCC diagnostic ignored "-Wfloat-conversion" -#else -#pragma GCC diagnostic ignored "-Wconversion" -#endif -#endif - -// Workaround for libs that #undef isnan or isinf -// https://bblanchon.github.io/ArduinoJson//issues/284 -#if !defined(isnan) || !defined(isinf) -namespace std {} -#endif - -namespace ArduinoJson { -namespace Polyfills { - -template -bool isNaN(T x) { -// Workaround for libs that #undef isnan -// https://bblanchon.github.io/ArduinoJson//issues/284 -#ifndef isnan - using namespace std; -#endif - - return isnan(x); -} - -#if defined(_GLIBCXX_HAVE_ISNANL) && _GLIBCXX_HAVE_ISNANL -template <> -inline bool isNaN(double x) { - return isnanl(x); -} -#endif - -#if defined(_GLIBCXX_HAVE_ISNANF) && _GLIBCXX_HAVE_ISNANF -template <> -inline bool isNaN(float x) { - return isnanf(x); -} -#endif - -template -bool isInfinity(T x) { -// Workaround for libs that #undef isinf -// https://bblanchon.github.io/ArduinoJson//issues/284 -#ifndef isinf - using namespace std; -#endif - - return isinf(x); -} - -#if defined(_GLIBCXX_HAVE_ISINFL) && _GLIBCXX_HAVE_ISINFL -template <> -inline bool isInfinity(double x) { - return isinfl(x); -} -#endif - -#if defined(_GLIBCXX_HAVE_ISINFF) && _GLIBCXX_HAVE_ISINFF -template <> -inline bool isInfinity(float x) { - return isinff(x); -} -#endif - -template -T nan() { - return static_cast(NAN); -} - -template -T inf() { - return static_cast(INFINITY); -} - -#if defined(__GNUC__) -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) -#pragma GCC diagnostic pop -#endif -#endif -} -} -#endif diff --git a/src/ArduinoJson/Polyfills/parseInteger.hpp b/src/ArduinoJson/Polyfills/parseInteger.hpp index 28e0832b..2845cd86 100644 --- a/src/ArduinoJson/Polyfills/parseInteger.hpp +++ b/src/ArduinoJson/Polyfills/parseInteger.hpp @@ -30,11 +30,11 @@ T parseInteger(const char *s) { } while (isdigit(*s)) { - result = static_cast(result * 10 + (*s - '0')); + result = T(result * 10 + T(*s - '0')); s++; } - return negative_result ? static_cast(result * -1) : result; + return negative_result ? T(~result + 1) : result; } } } diff --git a/src/ArduinoJson/Serialization/StaticStringBuilder.hpp b/src/ArduinoJson/Serialization/StaticStringBuilder.hpp index 4f7352a0..2df932fd 100644 --- a/src/ArduinoJson/Serialization/StaticStringBuilder.hpp +++ b/src/ArduinoJson/Serialization/StaticStringBuilder.hpp @@ -28,7 +28,7 @@ class StaticStringBuilder { char *begin = p; while (p < end && *s) *p++ = *s++; *p = '\0'; - return p - begin; + return size_t(p - begin); } private: diff --git a/src/ArduinoJson/StringTraits/CharPointer.hpp b/src/ArduinoJson/StringTraits/CharPointer.hpp index bbdf1e92..203e3924 100644 --- a/src/ArduinoJson/StringTraits/CharPointer.hpp +++ b/src/ArduinoJson/StringTraits/CharPointer.hpp @@ -23,12 +23,12 @@ struct CharPointerTraits { ++_ptr; } - TChar current() const { - return _ptr[0]; + char current() const { + return char(_ptr[0]); } - TChar next() const { - return _ptr[1]; + char next() const { + return char(_ptr[1]); } }; diff --git a/src/ArduinoJson/TypeTraits/FloatTraits.hpp b/src/ArduinoJson/TypeTraits/FloatTraits.hpp index 3c737323..d33c9f00 100644 --- a/src/ArduinoJson/TypeTraits/FloatTraits.hpp +++ b/src/ArduinoJson/TypeTraits/FloatTraits.hpp @@ -43,11 +43,13 @@ struct FloatTraits { } static T nan() { - return Polyfills::nan(); + uint64_t x = uint64_t(0x7ff8) << 48; + return *reinterpret_cast(&x); } static T inf() { - return Polyfills::inf(); + uint64_t x = uint64_t(0x7ff0) << 48; + return *reinterpret_cast(&x); } }; #endif @@ -73,11 +75,13 @@ struct FloatTraits { } static T nan() { - return Polyfills::nan(); + uint32_t x = 0x7fc00000; + return *reinterpret_cast(&x); } static T inf() { - return Polyfills::inf(); + uint32_t x = 0x7f800000; + return *reinterpret_cast(&x); } }; } diff --git a/test/IntegrationTests/gbathree.cpp b/test/IntegrationTests/gbathree.cpp index 45aaabfa..f8170a07 100644 --- a/test/IntegrationTests/gbathree.cpp +++ b/test/IntegrationTests/gbathree.cpp @@ -87,7 +87,7 @@ TEST_CASE("Gbathree") { REQUIRE(3 == array.size()); - for (int i = 0; i < 3; i++) { + for (size_t i = 0; i < 3; i++) { REQUIRE(50 == array[i]); } } @@ -112,11 +112,11 @@ TEST_CASE("Gbathree") { REQUIRE(array.success()); REQUIRE(4 == array.size()); - for (int i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { JsonArray& nestedArray = array[i]; REQUIRE(4 == nestedArray.size()); - for (int j = 0; j < 4; j++) { + for (size_t j = 0; j < 4; j++) { REQUIRE(34 == nestedArray[j]); } } @@ -130,7 +130,7 @@ TEST_CASE("Gbathree") { REQUIRE(4 == array.size()); - for (int i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { REQUIRE(2 == array[i]); } } @@ -143,7 +143,7 @@ TEST_CASE("Gbathree") { REQUIRE(4 == array.size()); - for (int i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { REQUIRE(2 == array[i]); } } @@ -155,12 +155,12 @@ TEST_CASE("Gbathree") { REQUIRE(array.success()); REQUIRE(4 == array.size()); - for (int i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { JsonArray& nestedArray = array[i]; REQUIRE(4 == nestedArray.size()); - for (int j = 0; j < 4; j++) { + for (size_t j = 0; j < 4; j++) { REQUIRE(15 == nestedArray[j]); } } @@ -173,11 +173,11 @@ TEST_CASE("Gbathree") { REQUIRE(array.success()); REQUIRE(4 == array.size()); - for (int i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { JsonArray& nestedArray = array[i]; REQUIRE(4 == nestedArray.size()); - for (int j = 0; j < 4; j++) { + for (size_t j = 0; j < 4; j++) { REQUIRE(15 == nestedArray[j]); } } @@ -191,7 +191,7 @@ TEST_CASE("Gbathree") { REQUIRE(4 == array.size()); - for (int i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { REQUIRE(2 == array[i]); } } @@ -204,7 +204,7 @@ TEST_CASE("Gbathree") { REQUIRE(4 == array.size()); - for (int i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { REQUIRE(2 == array[i]); } } diff --git a/test/JsonVariant/subscript.cpp b/test/JsonVariant/subscript.cpp index b77153ce..a2ce3e2f 100644 --- a/test/JsonVariant/subscript.cpp +++ b/test/JsonVariant/subscript.cpp @@ -23,7 +23,7 @@ TEST_CASE("JsonVariant::operator[]") { REQUIRE(std::string("element at index 1") == var[1]); REQUIRE(std::string("element at index 0") == var[static_cast(0)]); // issue #381 - REQUIRE_FALSE(var[-1].success()); + REQUIRE_FALSE(var[666].success()); REQUIRE_FALSE(var[3].success()); REQUIRE_FALSE(var["0"].success()); }