Procházet zdrojové kódy

Added support for `enum`s in `as<T>()` and `is<T>()` (fixes #1256)

Benoit Blanchon před 5 roky
rodič
revize
3bb0a7aa8e

+ 1 - 0
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<T>()` and `is<T>()`  (issue #1256)
 
 v6.15.1 (2020-04-08)
 -------

+ 8 - 0
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<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 - 0
extras/tests/JsonVariant/is.cpp

@@ -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>());
@@ -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 *>());
@@ -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>());
 }

+ 6 - 0
src/ArduinoJson/Variant/VariantAs.hpp

@@ -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) {

+ 5 - 0
src/ArduinoJson/Variant/VariantRef.hpp

@@ -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);