From 3bb0a7aa8ebeff82e11f1386860c9f6bd5756215 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 4 May 2020 09:09:57 +0200 Subject: [PATCH] Added support for `enum`s in `as()` and `is()` (fixes #1256) --- CHANGELOG.md | 1 + extras/tests/JsonVariant/as.cpp | 8 ++++++++ extras/tests/JsonVariant/is.cpp | 4 ++++ src/ArduinoJson/Variant/VariantAs.hpp | 6 ++++++ src/ArduinoJson/Variant/VariantRef.hpp | 5 +++++ 5 files changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c140494c..1aa1d9ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ HEAD * CMake: made project arch-independent * Visual Studio: fixed error C2766 with flag `/Zc:__cplusplus` (issue #1250) * Added support for `JsonDocument` to `copyArray()` (issue #1255) +* Added support for `enum`s in `as()` and `is()` (issue #1256) v6.15.1 (2020-04-08) ------- diff --git a/extras/tests/JsonVariant/as.cpp b/extras/tests/JsonVariant/as.cpp index 0a82f51c..05cb7d47 100644 --- a/extras/tests/JsonVariant/as.cpp +++ b/extras/tests/JsonVariant/as.cpp @@ -10,6 +10,8 @@ namespace my { using ARDUINOJSON_NAMESPACE::isinf; } // namespace my +enum MY_ENUM { ONE = 1, TWO = 2 }; + TEST_CASE("JsonVariant::as()") { static const char* null = 0; @@ -212,4 +214,10 @@ TEST_CASE("JsonVariant::as()") { REQUIRE(cvar.as() == std::string("hello")); // REQUIRE(cvar.as() == std::string("hello")); } + + SECTION("as()") { + variant.set(1); + + REQUIRE(variant.as() == ONE); + } } diff --git a/extras/tests/JsonVariant/is.cpp b/extras/tests/JsonVariant/is.cpp index d61b90dd..48b81d12 100644 --- a/extras/tests/JsonVariant/is.cpp +++ b/extras/tests/JsonVariant/is.cpp @@ -5,6 +5,8 @@ #include #include +enum MYENUM2 { ONE = 1, TWO = 2 }; + template void checkIsArray(TVariant var) { REQUIRE(var.template is()); @@ -80,6 +82,7 @@ void checkIsInteger(TVariant var) { REQUIRE(var.template is()); REQUIRE(var.template is()); REQUIRE(var.template is()); + REQUIRE(var.template is()); REQUIRE_FALSE(var.template is()); REQUIRE_FALSE(var.template is()); @@ -107,6 +110,7 @@ void checkIsString(TVariant var) { REQUIRE_FALSE(var.template is()); REQUIRE_FALSE(var.template is()); REQUIRE_FALSE(var.template is()); + REQUIRE_FALSE(var.template is()); REQUIRE_FALSE(var.template is()); REQUIRE_FALSE(var.template is()); } diff --git a/src/ArduinoJson/Variant/VariantAs.hpp b/src/ArduinoJson/Variant/VariantAs.hpp index bb8d90ee..dd428871 100644 --- a/src/ArduinoJson/Variant/VariantAs.hpp +++ b/src/ArduinoJson/Variant/VariantAs.hpp @@ -57,6 +57,12 @@ inline typename enable_if::value, T>::type variantAs( return data != 0 ? data->asIntegral() : T(0); } +template +inline typename enable_if::value, T>::type variantAs( + const VariantData* data) { + return data != 0 ? static_cast(data->asIntegral()) : T(); +} + template inline typename enable_if::value, T>::type variantAs( const VariantData* data) { diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index cab128a6..a32bb5b1 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -101,6 +101,11 @@ class VariantRefBase { return variantIsNull(_data); } #endif + // bool is() const; + template + FORCE_INLINE typename enable_if::value, bool>::type is() const { + return variantIsInteger(_data); + } FORCE_INLINE bool isNull() const { return variantIsNull(_data);