Add meta function ConverterNeedsWriteableRef<T>

This commit is contained in:
Benoit Blanchon
2022-03-31 11:23:24 +02:00
parent 98037e5742
commit ac1d29fac0
2 changed files with 26 additions and 0 deletions

View File

@ -140,3 +140,15 @@ TEST_CASE("Custom converter with specialization") {
REQUIRE(doc["value"]["imag"] == 3); REQUIRE(doc["value"]["imag"] == 3);
} }
} }
TEST_CASE("ConverterNeedsWriteableRef") {
using namespace ARDUINOJSON_NAMESPACE;
CHECK(ConverterNeedsWriteableRef<int>::value == false);
CHECK(ConverterNeedsWriteableRef<float>::value == false);
CHECK(ConverterNeedsWriteableRef<JsonVariant>::value == true);
CHECK(ConverterNeedsWriteableRef<JsonVariantConst>::value == false);
CHECK(ConverterNeedsWriteableRef<JsonObject>::value == true);
CHECK(ConverterNeedsWriteableRef<JsonObjectConst>::value == false);
CHECK(ConverterNeedsWriteableRef<JsonArray>::value == true);
CHECK(ConverterNeedsWriteableRef<JsonArrayConst>::value == false);
}

View File

@ -303,4 +303,18 @@ inline bool canConvertFromJson(VariantConstRef src, const std::string_view&) {
#endif #endif
template <typename T>
struct ConverterNeedsWriteableRef {
protected: // <- to avoid GCC's "all member functions in class are private"
typedef char Yes[1];
typedef char No[2];
static Yes& probe(T (*f)(VariantRef));
static No& probe(T (*f)(VariantConstRef));
public:
static const bool value =
sizeof(probe(Converter<T>::fromJson)) == sizeof(Yes);
};
} // namespace ARDUINOJSON_NAMESPACE } // namespace ARDUINOJSON_NAMESPACE