From 1db803bcd316fafcb26d98be4c1c9b8bd3f4f569 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 22 May 2024 09:59:12 +0200 Subject: [PATCH] Add helpers for type traits, such as `enable_if_t` --- src/ArduinoJson/Array/JsonArray.hpp | 16 +++-- src/ArduinoJson/Array/JsonArrayConst.hpp | 6 +- src/ArduinoJson/Array/Utilities.hpp | 23 ++++--- src/ArduinoJson/Deserialization/Reader.hpp | 5 +- .../Readers/ArduinoStreamReader.hpp | 3 +- .../Readers/ArduinoStringReader.hpp | 3 +- .../Readers/IteratorReader.hpp | 9 +-- .../Deserialization/Readers/RamReader.hpp | 6 +- .../Readers/StdStreamReader.hpp | 3 +- .../Deserialization/Readers/VariantReader.hpp | 2 +- .../Deserialization/deserialize.hpp | 13 ++-- src/ArduinoJson/Document/JsonDocument.hpp | 60 ++++++++----------- src/ArduinoJson/Json/JsonDeserializer.hpp | 10 ++-- src/ArduinoJson/Json/JsonSerializer.hpp | 4 +- src/ArduinoJson/Json/TextFormatter.hpp | 6 +- src/ArduinoJson/Memory/StringNode.hpp | 4 +- src/ArduinoJson/Memory/VariantPool.hpp | 2 +- .../MsgPack/MsgPackDeserializer.hpp | 22 ++++--- src/ArduinoJson/MsgPack/MsgPackSerializer.hpp | 9 ++- src/ArduinoJson/Numbers/FloatTraits.hpp | 36 +++++------ src/ArduinoJson/Numbers/arithmeticCompare.hpp | 42 ++++++------- src/ArduinoJson/Numbers/convertNumber.hpp | 59 +++++++++--------- src/ArduinoJson/Numbers/parseNumber.hpp | 4 +- src/ArduinoJson/Object/JsonObject.hpp | 28 ++++----- src/ArduinoJson/Object/JsonObjectConst.hpp | 17 +++--- src/ArduinoJson/Polyfills/integer.hpp | 11 ++-- src/ArduinoJson/Polyfills/limits.hpp | 4 +- src/ArduinoJson/Polyfills/type_traits.hpp | 2 +- .../Polyfills/type_traits/conditional.hpp | 4 ++ .../Polyfills/type_traits/enable_if.hpp | 3 + .../Polyfills/type_traits/is_base_of.hpp | 4 +- .../type_traits/is_floating_point.hpp | 7 +-- .../Polyfills/type_traits/is_integral.hpp | 24 ++++---- .../Polyfills/type_traits/is_signed.hpp | 16 ++--- .../Polyfills/type_traits/is_unsigned.hpp | 12 ++-- .../Polyfills/type_traits/make_unsigned.hpp | 3 + .../Polyfills/type_traits/make_void.hpp | 14 ----- .../Polyfills/type_traits/remove_const.hpp | 3 + .../Polyfills/type_traits/remove_cv.hpp | 3 + .../type_traits/remove_reference.hpp | 3 + .../Polyfills/type_traits/void_t.hpp | 20 +++++++ src/ArduinoJson/Polyfills/utility.hpp | 6 +- .../Serialization/Writers/PrintWriter.hpp | 5 +- .../Serialization/Writers/StdStreamWriter.hpp | 5 +- .../Serialization/Writers/StdStringWriter.hpp | 9 ++- src/ArduinoJson/Serialization/serialize.hpp | 12 ++-- .../Strings/Adapters/RamString.hpp | 7 +-- .../Strings/Adapters/StringObject.hpp | 19 +++--- src/ArduinoJson/Strings/IsString.hpp | 3 +- src/ArduinoJson/Strings/StringAdapters.hpp | 12 ++-- src/ArduinoJson/Strings/StringTraits.hpp | 19 +++--- src/ArduinoJson/Variant/ConverterImpl.hpp | 16 +++-- src/ArduinoJson/Variant/JsonVariantConst.hpp | 38 +++++------- src/ArduinoJson/Variant/VariantCompare.hpp | 11 ++-- src/ArduinoJson/Variant/VariantData.hpp | 4 +- src/ArduinoJson/Variant/VariantOperators.hpp | 39 +++++------- src/ArduinoJson/Variant/VariantRefBase.hpp | 56 ++++++++--------- .../Variant/VariantRefBaseImpl.hpp | 20 +++---- 58 files changed, 376 insertions(+), 430 deletions(-) delete mode 100644 src/ArduinoJson/Polyfills/type_traits/make_void.hpp create mode 100644 src/ArduinoJson/Polyfills/type_traits/void_t.hpp diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index 71b41ec1..e0699a90 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -44,8 +44,7 @@ class JsonArray : public detail::VariantOperators { // Returns a reference to the new element. // https://arduinojson.org/v7/api/jsonarray/add/ template - typename detail::enable_if::value, T>::type - add() const { + detail::enable_if_t::value, T> add() const { return add().to(); } @@ -53,8 +52,7 @@ class JsonArray : public detail::VariantOperators { // Returns a reference to the new element. // https://arduinojson.org/v7/api/jsonarray/add/ template - typename detail::enable_if::value, T>::type - add() const { + detail::enable_if_t::value, T> add() const { return JsonVariant(detail::ArrayData::addElement(data_, resources_), resources_); } @@ -117,7 +115,7 @@ class JsonArray : public detail::VariantOperators { // Removes the element at the specified index. // https://arduinojson.org/v7/api/jsonarray/remove/ template - typename detail::enable_if::value>::type remove( + detail::enable_if_t::value> remove( TVariant variant) const { if (variant.template is()) remove(variant.template as()); @@ -132,8 +130,8 @@ class JsonArray : public detail::VariantOperators { // Gets or sets the element at the specified index. // https://arduinojson.org/v7/api/jsonarray/subscript/ template - typename detail::enable_if::value, - detail::ElementProxy>::type + detail::enable_if_t::value, + detail::ElementProxy> operator[](T index) const { return {*this, size_t(index)}; } @@ -141,8 +139,8 @@ class JsonArray : public detail::VariantOperators { // Gets or sets the element at the specified index. // https://arduinojson.org/v7/api/jsonarray/subscript/ template - typename detail::enable_if::value, - detail::ElementProxy>::type + detail::enable_if_t::value, + detail::ElementProxy> operator[](const TVariant& variant) const { if (variant.template is()) return operator[](variant.template as()); diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index 19c36c7f..c6e027f8 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -46,8 +46,7 @@ class JsonArrayConst : public detail::VariantOperators { // Returns the element at the specified index. // https://arduinojson.org/v7/api/jsonarrayconst/subscript/ template - typename detail::enable_if::value, - JsonVariantConst>::type + detail::enable_if_t::value, JsonVariantConst> operator[](T index) const { return JsonVariantConst( detail::ArrayData::getElement(data_, size_t(index), resources_), @@ -57,8 +56,7 @@ class JsonArrayConst : public detail::VariantOperators { // Returns the element at the specified index. // https://arduinojson.org/v7/api/jsonarrayconst/subscript/ template - typename detail::enable_if::value, - JsonVariantConst>::type + detail::enable_if_t::value, JsonVariantConst> operator[](const TVariant& variant) const { if (variant.template is()) return operator[](variant.template as()); diff --git a/src/ArduinoJson/Array/Utilities.hpp b/src/ArduinoJson/Array/Utilities.hpp index ff589cea..9073468c 100644 --- a/src/ArduinoJson/Array/Utilities.hpp +++ b/src/ArduinoJson/Array/Utilities.hpp @@ -12,16 +12,16 @@ ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE // Copies a value to a JsonVariant. // This is a degenerated form of copyArray() to stop the recursion. template -inline typename detail::enable_if::value, bool>::type -copyArray(const T& src, JsonVariant dst) { +inline detail::enable_if_t::value, bool> copyArray( + const T& src, JsonVariant dst) { return dst.set(src); } // Copies values from an array to a JsonArray or a JsonVariant. // https://arduinojson.org/v7/api/misc/copyarray/ template -inline typename detail::enable_if< - !detail::is_base_of::value, bool>::type +inline detail::enable_if_t< + !detail::is_base_of::value, bool> copyArray(T (&src)[N], const TDestination& dst) { return copyArray(src, N, dst); } @@ -29,8 +29,8 @@ copyArray(T (&src)[N], const TDestination& dst) { // Copies values from an array to a JsonArray or a JsonVariant. // https://arduinojson.org/v7/api/misc/copyarray/ template -inline typename detail::enable_if< - !detail::is_base_of::value, bool>::type +inline detail::enable_if_t< + !detail::is_base_of::value, bool> copyArray(const T* src, size_t len, const TDestination& dst) { bool ok = true; for (size_t i = 0; i < len; i++) { @@ -63,8 +63,8 @@ inline bool copyArray(const T* src, size_t len, JsonDocument& dst) { // Copies a value from a JsonVariant. // This is a degenerated form of copyArray() to stop the recursion. template -inline typename detail::enable_if::value, size_t>::type -copyArray(JsonVariantConst src, T& dst) { +inline detail::enable_if_t::value, size_t> copyArray( + JsonVariantConst src, T& dst) { dst = src.as(); return 1; } @@ -103,10 +103,9 @@ inline size_t copyArray(JsonVariantConst src, char (&dst)[N]) { // Copies values from a JsonDocument to an array. // https://arduinojson.org/v7/api/misc/copyarray/ template -inline typename detail::enable_if< - detail::is_array::value && - detail::is_base_of::value, - size_t>::type +inline detail::enable_if_t::value && + detail::is_base_of::value, + size_t> copyArray(const TSource& src, T& dst) { return copyArray(src.template as(), dst); } diff --git a/src/ArduinoJson/Deserialization/Reader.hpp b/src/ArduinoJson/Deserialization/Reader.hpp index c4b5edb7..fed87b34 100644 --- a/src/ArduinoJson/Deserialization/Reader.hpp +++ b/src/ArduinoJson/Deserialization/Reader.hpp @@ -62,9 +62,8 @@ ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -Reader::type> makeReader(TInput&& input) { - return Reader::type>{ - detail::forward(input)}; +Reader> makeReader(TInput&& input) { + return Reader>{detail::forward(input)}; } template diff --git a/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp b/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp index 43c5a432..a4b11431 100644 --- a/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp +++ b/src/ArduinoJson/Deserialization/Readers/ArduinoStreamReader.hpp @@ -9,8 +9,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -struct Reader::value>::type> { +struct Reader::value>> { public: explicit Reader(Stream& stream) : stream_(&stream) {} diff --git a/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp b/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp index 4730be01..d55859f7 100644 --- a/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp +++ b/src/ArduinoJson/Deserialization/Readers/ArduinoStringReader.hpp @@ -9,8 +9,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -struct Reader::value>::type> +struct Reader::value>> : BoundedReader { explicit Reader(const ::String& s) : BoundedReader(s.c_str(), s.length()) {} diff --git a/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp b/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp index 1ca46c85..5584ec53 100644 --- a/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp +++ b/src/ArduinoJson/Deserialization/Readers/IteratorReader.hpp @@ -4,6 +4,8 @@ #pragma once +#include + ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template @@ -29,13 +31,8 @@ class IteratorReader { } }; -template -struct void_ { - typedef void type; -}; - template -struct Reader::type> +struct Reader> : IteratorReader { explicit Reader(const TSource& source) : IteratorReader(source.begin(), diff --git a/src/ArduinoJson/Deserialization/Readers/RamReader.hpp b/src/ArduinoJson/Deserialization/Readers/RamReader.hpp index 8603bb13..4739d722 100644 --- a/src/ArduinoJson/Deserialization/Readers/RamReader.hpp +++ b/src/ArduinoJson/Deserialization/Readers/RamReader.hpp @@ -19,8 +19,7 @@ template struct IsCharOrVoid : IsCharOrVoid {}; template -struct Reader::value>::type> { +struct Reader::value>> { const char* ptr_; public: @@ -39,8 +38,7 @@ struct Reader -struct BoundedReader::value>::type> +struct BoundedReader::value>> : public IteratorReader { public: explicit BoundedReader(const void* ptr, size_t len) diff --git a/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp b/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp index 25ba6364..947dd7fe 100644 --- a/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp +++ b/src/ArduinoJson/Deserialization/Readers/StdStreamReader.hpp @@ -9,8 +9,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -struct Reader::value>::type> { +struct Reader::value>> { public: explicit Reader(std::istream& stream) : stream_(&stream) {} diff --git a/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp b/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp index ddb07b8b..92f9541c 100644 --- a/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp +++ b/src/ArduinoJson/Deserialization/Readers/VariantReader.hpp @@ -10,7 +10,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -struct Reader::value>::type> +struct Reader::value>> : Reader { explicit Reader(const TVariant& x) : Reader(x.template as()) {} diff --git a/src/ArduinoJson/Deserialization/deserialize.hpp b/src/ArduinoJson/Deserialization/deserialize.hpp index 21d18764..b33313e1 100644 --- a/src/ArduinoJson/Deserialization/deserialize.hpp +++ b/src/ArduinoJson/Deserialization/deserialize.hpp @@ -29,10 +29,9 @@ struct is_deserialize_destination : false_type {}; template struct is_deserialize_destination< - T, typename enable_if())), - ResourceManager*>::value>::type> : true_type { -}; + T, enable_if_t())), + ResourceManager*>::value>> : true_type {}; template inline void shrinkJsonDocument(TDestination&) { @@ -62,8 +61,8 @@ DeserializationError doDeserialize(TDestination&& dst, TReader reader, template