Skip to content

Commit

Permalink
Added support for enums in as<T>() and is<T>() (issue #1256)
Browse files Browse the repository at this point in the history
  • Loading branch information
bblanchon committed May 4, 2020
1 parent dcf7eee commit d9bbeb9
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -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<T>()` and `is<T>()` (issue #1256)

v6.15.1 (2020-04-08)
-------
Expand Down
8 changes: 8 additions & 0 deletions extras/tests/JsonVariant/as.cpp
Expand Up @@ -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;

Expand Down Expand Up @@ -212,4 +214,10 @@ TEST_CASE("JsonVariant::as()") {
REQUIRE(cvar.as<char*>() == std::string("hello"));
// REQUIRE(cvar.as<std::string>() == std::string("hello"));
}

SECTION("as<enum>()") {
variant.set(1);

REQUIRE(variant.as<MY_ENUM>() == ONE);
}
}
4 changes: 4 additions & 0 deletions extras/tests/JsonVariant/is.cpp
Expand Up @@ -5,6 +5,8 @@
#include <ArduinoJson.h>
#include <catch.hpp>

enum MYENUM2 { ONE = 1, TWO = 2 };

template <typename TVariant>
void checkIsArray(TVariant var) {
REQUIRE(var.template is<JsonArray>());
Expand Down Expand Up @@ -80,6 +82,7 @@ void checkIsInteger(TVariant var) {
REQUIRE(var.template is<int>());
REQUIRE(var.template is<float>());
REQUIRE(var.template is<double>());
REQUIRE(var.template is<MYENUM2>());

REQUIRE_FALSE(var.template is<bool>());
REQUIRE_FALSE(var.template is<const char *>());
Expand Down Expand Up @@ -107,6 +110,7 @@ void checkIsString(TVariant var) {
REQUIRE_FALSE(var.template is<double>());
REQUIRE_FALSE(var.template is<float>());
REQUIRE_FALSE(var.template is<long>());
REQUIRE_FALSE(var.template is<MYENUM2>());
REQUIRE_FALSE(var.template is<JsonArray>());
REQUIRE_FALSE(var.template is<JsonObject>());
}
Expand Down
6 changes: 6 additions & 0 deletions src/ArduinoJson/Variant/VariantAs.hpp
Expand Up @@ -57,6 +57,12 @@ inline typename enable_if<is_integral<T>::value, T>::type variantAs(
return data != 0 ? data->asIntegral<T>() : T(0);
}

template <typename T>
inline typename enable_if<is_enum<T>::value, T>::type variantAs(
const VariantData* data) {
return data != 0 ? static_cast<T>(data->asIntegral<int>()) : T();
}

template <typename T>
inline typename enable_if<is_same<T, bool>::value, T>::type variantAs(
const VariantData* data) {
Expand Down
5 changes: 5 additions & 0 deletions src/ArduinoJson/Variant/VariantRef.hpp
Expand Up @@ -101,6 +101,11 @@ class VariantRefBase {
return variantIsNull(_data);
}
#endif
// bool is<enum>() const;
template <typename T>
FORCE_INLINE typename enable_if<is_enum<T>::value, bool>::type is() const {
return variantIsInteger<int>(_data);
}

FORCE_INLINE bool isNull() const {
return variantIsNull(_data);
Expand Down

0 comments on commit d9bbeb9

Please sign in to comment.