From 5fefeae4041432650abe1fc4507e1df7e286e2c7 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sun, 22 Jan 2017 17:24:17 +0100 Subject: [PATCH] Added `deprecated` attribute on `asArray()`, `asObject()` and `asString()` (issue #420) --- CHANGELOG.md | 1 + include/ArduinoJson/Configuration.hpp | 5 +++ include/ArduinoJson/JsonArray.hpp | 2 +- include/ArduinoJson/JsonArraySubscript.hpp | 4 +-- include/ArduinoJson/JsonVariant.hpp | 34 ++++++++---------- include/ArduinoJson/JsonVariantBase.hpp | 34 +++++++++--------- include/ArduinoJson/JsonVariantImpl.hpp | 10 +++--- include/ArduinoJson/Polyfills/attributes.hpp | 6 ++++ test/Deprecated_Tests.cpp | 36 ++++++++++++++++++++ test/JsonObject_Set_Tests.cpp | 4 +-- test/JsonObject_Subscript_Tests.cpp | 2 -- test/JsonVariant_Copy_Tests.cpp | 4 +-- test/JsonVariant_Subscript_Tests.cpp | 13 ++++--- test/JsonVariant_Undefined_Tests.cpp | 6 ++-- 14 files changed, 101 insertions(+), 60 deletions(-) create mode 100644 test/Deprecated_Tests.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b2b0943..1934aa3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ HEAD * Fixed error when the key of a `JsonObject` is a `char[]` (issue #423) * Reduced code size when using `const` references * Fixed error with string of type `unsigned char*` (issue #428) +* Added `deprecated` attribute on `asArray()`, `asObject()` and `asString()` (issue #420) v5.8.1 ------ diff --git a/include/ArduinoJson/Configuration.hpp b/include/ArduinoJson/Configuration.hpp index 284ff333..ba8a90df 100644 --- a/include/ArduinoJson/Configuration.hpp +++ b/include/ArduinoJson/Configuration.hpp @@ -7,6 +7,11 @@ #pragma once +// enable deprecated functions by default +#ifndef ARDUINOJSON_ENABLE_DEPRECATED +#define ARDUINOJSON_ENABLE_DEPRECATED 1 +#endif + #ifdef ARDUINO // assume this is an embedded platform // store using float instead of double to reduce the memory usage (issue #134) diff --git a/include/ArduinoJson/JsonArray.hpp b/include/ArduinoJson/JsonArray.hpp index 88a90c69..41365351 100644 --- a/include/ArduinoJson/JsonArray.hpp +++ b/include/ArduinoJson/JsonArray.hpp @@ -193,7 +193,7 @@ class JsonArray : public Internals::JsonPrintable, void copyTo(T (&array)[N1][N2]) const { size_t i = 0; for (const_iterator it = begin(); it != end() && i < N1; ++it) { - it->asArray().copyTo(array[i++]); + it->as().copyTo(array[i++]); } } diff --git a/include/ArduinoJson/JsonArraySubscript.hpp b/include/ArduinoJson/JsonArraySubscript.hpp index d2aa1ac0..1deda075 100644 --- a/include/ArduinoJson/JsonArraySubscript.hpp +++ b/include/ArduinoJson/JsonArraySubscript.hpp @@ -107,13 +107,13 @@ inline const JsonArraySubscript JsonArray::operator[](size_t index) const { template inline JsonArraySubscript JsonVariantBase::operator[](int index) { - return asArray()[index]; + return as()[index]; } template inline const JsonArraySubscript JsonVariantBase::operator[]( int index) const { - return asArray()[index]; + return as()[index]; } } // namespace ArduinoJson diff --git a/include/ArduinoJson/JsonVariant.hpp b/include/ArduinoJson/JsonVariant.hpp index a41baeea..31a3151d 100644 --- a/include/ArduinoJson/JsonVariant.hpp +++ b/include/ArduinoJson/JsonVariant.hpp @@ -136,7 +136,7 @@ class JsonVariant : public JsonVariantBase { const typename TypeTraits::EnableIf::value, T>::type as() const { - return static_cast(asInteger()); + return static_cast(variantAsInteger()); } // // short as() const; @@ -155,7 +155,7 @@ class JsonVariant : public JsonVariantBase { const typename TypeTraits::EnableIf::value, T>::type as() const { - return static_cast(asFloat()); + return static_cast(variantAsFloat()); } // // const char* as() const; @@ -165,7 +165,7 @@ class JsonVariant : public JsonVariantBase { TypeTraits::IsSame::value, const char *>::type as() const { - return asString(); + return variantAsString(); } // // std::string as() const; @@ -173,7 +173,7 @@ class JsonVariant : public JsonVariantBase { template typename TypeTraits::EnableIf::has_append, T>::type as() const { - const char *cstr = asString(); + const char *cstr = variantAsString(); if (cstr) return T(cstr); T s; printTo(s); @@ -185,7 +185,7 @@ class JsonVariant : public JsonVariantBase { const typename TypeTraits::EnableIf::value, T>::type as() const { - return asInteger() != 0; + return variantAsInteger() != 0; } // // JsonArray& as const; @@ -196,7 +196,7 @@ class JsonVariant : public JsonVariantBase { JsonArray>::value, JsonArray &>::type as() const { - return asArray(); + return variantAsArray(); } // // const JsonArray& as const; @@ -206,7 +206,7 @@ class JsonVariant : public JsonVariantBase { const JsonArray>::value, const JsonArray &>::type as() const { - return asArray(); + return variantAsArray(); } // // JsonObject& as const; @@ -217,7 +217,7 @@ class JsonVariant : public JsonVariantBase { JsonObject>::value, JsonObject &>::type as() const { - return asObject(); + return variantAsObject(); } // // JsonObject& as const; @@ -228,7 +228,7 @@ class JsonVariant : public JsonVariantBase { const JsonObject>::value, const JsonObject &>::type as() const { - return asObject(); + return variantAsObject(); } // // JsonVariant as const; @@ -313,23 +313,17 @@ class JsonVariant : public JsonVariantBase { return _type != Internals::JSON_UNDEFINED; } - // DEPRECATED: use as() instead - const char *asString() const; - - // DEPRECATED: use as() instead - JsonArray &asArray() const; - - // DEPRECATED: use as() instead - JsonObject &asObject() const; - private: // It's not allowed to store a char template JsonVariant(T value, typename TypeTraits::EnableIf< TypeTraits::IsSame::value>::type * = 0); - Internals::JsonFloat asFloat() const; - Internals::JsonInteger asInteger() const; + JsonArray &variantAsArray() const; + JsonObject &variantAsObject() const; + const char *variantAsString() const; + Internals::JsonFloat variantAsFloat() const; + Internals::JsonInteger variantAsInteger() const; Internals::JsonUInt asUnsignedInteger() const; bool isBoolean() const; bool isFloat() const; diff --git a/include/ArduinoJson/JsonVariantBase.hpp b/include/ArduinoJson/JsonVariantBase.hpp index 22cb9114..b2024894 100644 --- a/include/ArduinoJson/JsonVariantBase.hpp +++ b/include/ArduinoJson/JsonVariantBase.hpp @@ -21,10 +21,22 @@ class JsonObjectSubscript; template class JsonVariantBase : public Internals::JsonPrintable { public: - // DEPRECATED: use as() instead +#if ARDUINOJSON_ENABLE_DEPRECATED + DEPRECATED("use as() instead") + FORCE_INLINE JsonArray &asArray() const { + return as(); + } + + DEPRECATED("use as() instead") + FORCE_INLINE JsonObject &asObject() const { + return as(); + } + + DEPRECATED("use as() instead") FORCE_INLINE const char *asString() const { return as(); } +#endif // Gets the variant as an array. // Returns a reference to the JsonArray or JsonArray::invalid() if the @@ -34,11 +46,6 @@ class JsonVariantBase : public Internals::JsonPrintable { return as(); } - // DEPRECATED: use as() instead - FORCE_INLINE JsonArray &asArray() const { - return as(); - } - // Gets the variant as an object. // Returns a reference to the JsonObject or JsonObject::invalid() if the // variant is not an object. @@ -46,11 +53,6 @@ class JsonVariantBase : public Internals::JsonPrintable { return as(); } - // DEPRECATED: use as() instead - FORCE_INLINE JsonObject &asObject() const { - return as(); - } - template FORCE_INLINE operator T() const { return as(); @@ -65,7 +67,7 @@ class JsonVariantBase : public Internals::JsonPrintable { // Returns the size of the array or object if the variant has that type. // Returns 0 if the variant is neither an array nor an object size_t size() const { - return asArray().size() + asObject().size(); + return as().size() + as().size(); } // Mimics an array. @@ -86,7 +88,7 @@ class JsonVariantBase : public Internals::JsonPrintable { Internals::StringTraits::has_equals, const JsonObjectSubscript >::type operator[](const TString &key) const { - return asObject()[key]; + return as()[key]; } // // const JsonObjectSubscript operator[](TKey) const; @@ -96,7 +98,7 @@ class JsonVariantBase : public Internals::JsonPrintable { Internals::StringTraits::has_equals, JsonObjectSubscript >::type operator[](const TString &key) { - return asObject()[key]; + return as()[key]; } // // JsonObjectSubscript operator[](TKey); @@ -106,7 +108,7 @@ class JsonVariantBase : public Internals::JsonPrintable { Internals::StringTraits::has_equals, JsonObjectSubscript >::type operator[](const TString *key) { - return asObject()[key]; + return as()[key]; } // // JsonObjectSubscript operator[](TKey); @@ -116,7 +118,7 @@ class JsonVariantBase : public Internals::JsonPrintable { Internals::StringTraits::has_equals, const JsonObjectSubscript >::type operator[](const TString *key) const { - return asObject()[key]; + return as()[key]; } private: diff --git a/include/ArduinoJson/JsonVariantImpl.hpp b/include/ArduinoJson/JsonVariantImpl.hpp index a40f6dcb..fc41b886 100644 --- a/include/ArduinoJson/JsonVariantImpl.hpp +++ b/include/ArduinoJson/JsonVariantImpl.hpp @@ -37,17 +37,17 @@ inline JsonVariant::JsonVariant(const JsonObject &object) { } } -inline JsonArray &JsonVariant::asArray() const { +inline JsonArray &JsonVariant::variantAsArray() const { if (_type == Internals::JSON_ARRAY) return *_content.asArray; return JsonArray::invalid(); } -inline JsonObject &JsonVariant::asObject() const { +inline JsonObject &JsonVariant::variantAsObject() const { if (_type == Internals::JSON_OBJECT) return *_content.asObject; return JsonObject::invalid(); } -inline Internals::JsonInteger JsonVariant::asInteger() const { +inline Internals::JsonInteger JsonVariant::variantAsInteger() const { using namespace Internals; switch (_type) { case JSON_UNDEFINED: @@ -86,7 +86,7 @@ inline Internals::JsonUInt JsonVariant::asUnsignedInteger() const { } } -inline const char *JsonVariant::asString() const { +inline const char *JsonVariant::variantAsString() const { using namespace Internals; if (_type == JSON_UNPARSED && _content.asString && !strcmp("null", _content.asString)) @@ -95,7 +95,7 @@ inline const char *JsonVariant::asString() const { return NULL; } -inline Internals::JsonFloat JsonVariant::asFloat() const { +inline Internals::JsonFloat JsonVariant::variantAsFloat() const { using namespace Internals; switch (_type) { case JSON_UNDEFINED: diff --git a/include/ArduinoJson/Polyfills/attributes.hpp b/include/ArduinoJson/Polyfills/attributes.hpp index 9992d594..d0d1d52e 100644 --- a/include/ArduinoJson/Polyfills/attributes.hpp +++ b/include/ArduinoJson/Polyfills/attributes.hpp @@ -10,7 +10,13 @@ #ifdef _MSC_VER #define FORCE_INLINE __forceinline #define NO_INLINE __declspec(noinline) +#define DEPRECATED(msg) __declspec(deprecated(msg)) #else #define FORCE_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define DEPRECATED(msg) __attribute__((deprecated(msg))) +#else +#define DEPRECATED(msg) __attribute__((deprecated)) +#endif #endif diff --git a/test/Deprecated_Tests.cpp b/test/Deprecated_Tests.cpp new file mode 100644 index 00000000..790efa6a --- /dev/null +++ b/test/Deprecated_Tests.cpp @@ -0,0 +1,36 @@ +// Copyright Benoit Blanchon 2014-2017 +// MIT License +// +// Arduino JSON library +// https://github.com/bblanchon/ArduinoJson +// If you like this project, please add a star! + +#define ARDUINOJSON_ENABLE_DEPRECATED 1 + +#include +#include + +#if defined(__clang__) +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#elif defined(_MSC_VER) +#pragma warning(disable : 4996) +#endif + +TEST(Deprecated, asArray) { + DynamicJsonBuffer jsonBuffer; + JsonVariant variant = jsonBuffer.createArray(); + ASSERT_TRUE(variant.asArray().success()); +} + +TEST(Deprecated, asObject) { + DynamicJsonBuffer jsonBuffer; + JsonVariant variant = jsonBuffer.createObject(); + ASSERT_TRUE(variant.asObject().success()); +} + +TEST(Deprecated, asString) { + JsonVariant variant = "hello"; + ASSERT_STREQ("hello", variant.asString()); +} diff --git a/test/JsonObject_Set_Tests.cpp b/test/JsonObject_Set_Tests.cpp index 1b11696d..252d6c7b 100644 --- a/test/JsonObject_Set_Tests.cpp +++ b/test/JsonObject_Set_Tests.cpp @@ -75,7 +75,7 @@ TEST_(StoreArray) { _object.set("hello", arr); - EXPECT_EQ(&arr, &_object["hello"].asArray()); + EXPECT_EQ(&arr, &_object["hello"].as()); EXPECT_TRUE(_object["hello"].is()); EXPECT_FALSE(_object["hello"].is()); } @@ -85,7 +85,7 @@ TEST_(StoreObject) { _object.set("hello", obj); - EXPECT_EQ(&obj, &_object["hello"].asObject()); + EXPECT_EQ(&obj, &_object["hello"].as()); EXPECT_TRUE(_object["hello"].is()); EXPECT_FALSE(_object["hello"].is()); } diff --git a/test/JsonObject_Subscript_Tests.cpp b/test/JsonObject_Subscript_Tests.cpp index c829afca..8fd8eb35 100644 --- a/test/JsonObject_Subscript_Tests.cpp +++ b/test/JsonObject_Subscript_Tests.cpp @@ -85,7 +85,6 @@ TEST_(StoreArray) { _object["hello"] = arr; - EXPECT_EQ(&arr, &_object["hello"].asArray()); // <- DEPRECATED EXPECT_EQ(&arr, &_object["hello"].as()); EXPECT_EQ(&arr, &_object["hello"].as()); // <- short hand EXPECT_EQ(&arr, &_object["hello"].as()); @@ -102,7 +101,6 @@ TEST_(StoreObject) { _object["hello"] = obj; - EXPECT_EQ(&obj, &_object["hello"].asObject()); // DEPRECATED EXPECT_EQ(&obj, &_object["hello"].as()); EXPECT_EQ(&obj, &_object["hello"].as()); // <- short hand EXPECT_EQ(&obj, &_object["hello"].as()); diff --git a/test/JsonVariant_Copy_Tests.cpp b/test/JsonVariant_Copy_Tests.cpp index 2acf66f4..082b30c8 100644 --- a/test/JsonVariant_Copy_Tests.cpp +++ b/test/JsonVariant_Copy_Tests.cpp @@ -54,7 +54,7 @@ TEST_F(JsonVariant_Copy_Tests, ObjectsAreCopiedByReference) { object["hello"] = "world"; - EXPECT_EQ(1, _variant1.asObject().size()); + EXPECT_EQ(1, _variant1.as().size()); } TEST_F(JsonVariant_Copy_Tests, ArraysAreCopiedByReference) { @@ -64,5 +64,5 @@ TEST_F(JsonVariant_Copy_Tests, ArraysAreCopiedByReference) { array.add("world"); - EXPECT_EQ(1, _variant1.asArray().size()); + EXPECT_EQ(1, _variant1.as().size()); } diff --git a/test/JsonVariant_Subscript_Tests.cpp b/test/JsonVariant_Subscript_Tests.cpp index cf812d79..fe5677b3 100644 --- a/test/JsonVariant_Subscript_Tests.cpp +++ b/test/JsonVariant_Subscript_Tests.cpp @@ -22,11 +22,10 @@ TEST_F(JsonVariant_Subscript_Tests, Array) { _variant = array; EXPECT_EQ(2, _variant.size()); - EXPECT_STREQ("element at index 0", _variant[0].asString()); - EXPECT_STREQ("element at index 1", _variant[1].asString()); - EXPECT_STREQ( - "element at index 0", - _variant[static_cast(0)].asString()); // issue #381 + EXPECT_STREQ("element at index 0", _variant[0]); + EXPECT_STREQ("element at index 1", _variant[1]); + EXPECT_STREQ("element at index 0", + _variant[static_cast(0)]); // issue #381 EXPECT_FALSE(_variant[-1].success()); EXPECT_FALSE(_variant[3].success()); EXPECT_FALSE(_variant["0"].success()); @@ -40,8 +39,8 @@ TEST_F(JsonVariant_Subscript_Tests, Object) { _variant = object; EXPECT_EQ(2, _variant.size()); - EXPECT_STREQ("element at key \"a\"", _variant["a"].asString()); - EXPECT_STREQ("element at key \"b\"", _variant["b"].asString()); + EXPECT_STREQ("element at key \"a\"", _variant["a"]); + EXPECT_STREQ("element at key \"b\"", _variant["b"]); EXPECT_FALSE(_variant["c"].success()); EXPECT_FALSE(_variant[0].success()); } diff --git a/test/JsonVariant_Undefined_Tests.cpp b/test/JsonVariant_Undefined_Tests.cpp index d432c4bf..b1fb160e 100644 --- a/test/JsonVariant_Undefined_Tests.cpp +++ b/test/JsonVariant_Undefined_Tests.cpp @@ -22,7 +22,7 @@ TEST_F(JsonVariant_Undefined_Tests, AsUnsignedReturns0) { } TEST_F(JsonVariant_Undefined_Tests, AsStringReturnsNull) { - EXPECT_EQ(0, variant.asString()); + EXPECT_EQ(0, variant.as()); } TEST_F(JsonVariant_Undefined_Tests, AsDoubleReturns0) { @@ -50,9 +50,9 @@ TEST_F(JsonVariant_Undefined_Tests, AsConstObjectReturnInvalid) { } TEST_F(JsonVariant_Undefined_Tests, AsArrayWrapperReturnInvalid) { - EXPECT_EQ(JsonArray::invalid(), variant.asArray()); + EXPECT_EQ(JsonArray::invalid(), variant.as()); } TEST_F(JsonVariant_Undefined_Tests, AsObjectWrapperReturnInvalid) { - EXPECT_EQ(JsonObject::invalid(), variant.asObject()); + EXPECT_EQ(JsonObject::invalid(), variant.as()); }