From 77b4270d976456e56436ea00414305d633c62f0d Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sun, 3 Jul 2022 15:37:08 +0200 Subject: [PATCH 001/166] Remove `Visitable` --- extras/tests/Misc/TypeTraits.cpp | 33 +++++++------- src/ArduinoJson/Array/ArrayRef.hpp | 6 +-- src/ArduinoJson/Array/ElementProxy.hpp | 3 -- src/ArduinoJson/Document/JsonDocument.hpp | 3 +- .../Document/StaticJsonDocument.hpp | 5 ++- src/ArduinoJson/Json/JsonSerializer.hpp | 4 +- src/ArduinoJson/Misc/Visitable.hpp | 21 --------- src/ArduinoJson/Object/MemberProxy.hpp | 3 -- src/ArduinoJson/Object/ObjectRef.hpp | 6 +-- .../Polyfills/type_traits/is_convertible.hpp | 4 +- src/ArduinoJson/Variant/VariantCompare.hpp | 25 ++++++----- src/ArduinoJson/Variant/VariantImpl.hpp | 5 --- src/ArduinoJson/Variant/VariantOperators.hpp | 44 ++++++++++++------- src/ArduinoJson/Variant/VariantRef.hpp | 7 +-- 14 files changed, 75 insertions(+), 94 deletions(-) delete mode 100644 src/ArduinoJson/Misc/Visitable.hpp diff --git a/extras/tests/Misc/TypeTraits.cpp b/extras/tests/Misc/TypeTraits.cpp index 0b2b1ced3..5f861afa6 100644 --- a/extras/tests/Misc/TypeTraits.cpp +++ b/extras/tests/Misc/TypeTraits.cpp @@ -177,6 +177,24 @@ TEST_CASE("Polyfills/type_traits") { CHECK((is_convertible::value == true)); CHECK((is_convertible::value == false)); CHECK((is_convertible::value == false)); + + CHECK((is_convertible::value == + false)); + CHECK((is_convertible::value == false)); + CHECK((is_convertible::value == true)); + CHECK((is_convertible::value == true)); + CHECK((is_convertible::value == true)); + CHECK((is_convertible, JsonVariantConst>::value == + true)); + CHECK((is_convertible::value == true)); + CHECK((is_convertible::value == true)); + CHECK((is_convertible, + JsonVariantConst>::value == true)); + CHECK((is_convertible::value == true)); + CHECK( + (is_convertible::value == true)); + CHECK((is_convertible, JsonVariantConst>::value == + true)); } SECTION("is_class") { @@ -194,19 +212,4 @@ TEST_CASE("Polyfills/type_traits") { CHECK(is_enum::value == false); CHECK(is_enum::value == false); } - - SECTION("IsVisitable") { - CHECK(IsVisitable::value == false); - CHECK(IsVisitable::value == false); - CHECK(IsVisitable::value == true); - CHECK(IsVisitable::value == true); - CHECK(IsVisitable::value == true); - CHECK(IsVisitable >::value == true); - CHECK(IsVisitable::value == true); - CHECK(IsVisitable::value == true); - CHECK((IsVisitable >::value == true)); - CHECK(IsVisitable::value == true); - CHECK(IsVisitable::value == true); - CHECK(IsVisitable >::value == true); - } } diff --git a/src/ArduinoJson/Array/ArrayRef.hpp b/src/ArduinoJson/Array/ArrayRef.hpp index 66d2eb08d..e5853cad8 100644 --- a/src/ArduinoJson/Array/ArrayRef.hpp +++ b/src/ArduinoJson/Array/ArrayRef.hpp @@ -62,8 +62,7 @@ class ArrayRefBase { }; class ArrayConstRef : public ArrayRefBase, - public VariantOperators, - public Visitable { + public VariantOperators { friend class ArrayRef; typedef ArrayRefBase base_type; @@ -117,8 +116,7 @@ class ArrayConstRef : public ArrayRefBase, class ArrayRef : public ArrayRefBase, public ArrayShortcuts, - public VariantOperators, - public Visitable { + public VariantOperators { typedef ArrayRefBase base_type; public: diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index 490d17eee..e42b8895b 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -19,13 +19,10 @@ namespace ARDUINOJSON_NAMESPACE { template class ElementProxy : public VariantOperators >, public VariantShortcuts >, - public Visitable, public VariantTag { typedef ElementProxy this_type; public: - typedef VariantRef variant_type; - FORCE_INLINE ElementProxy(TArray array, size_t index) : _array(array), _index(index) {} diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 9f0892a3f..1721b880b 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -14,8 +14,7 @@ namespace ARDUINOJSON_NAMESPACE { -class JsonDocument : public Visitable, - public VariantOperators { +class JsonDocument : public VariantOperators { public: template typename TVisitor::result_type accept(TVisitor& visitor) const { diff --git a/src/ArduinoJson/Document/StaticJsonDocument.hpp b/src/ArduinoJson/Document/StaticJsonDocument.hpp index 557c99946..338424afc 100644 --- a/src/ArduinoJson/Document/StaticJsonDocument.hpp +++ b/src/ArduinoJson/Document/StaticJsonDocument.hpp @@ -22,8 +22,9 @@ class StaticJsonDocument : public JsonDocument { } template - StaticJsonDocument(const T& src, - typename enable_if::value>::type* = 0) + StaticJsonDocument( + const T& src, + typename enable_if::value>::type* = 0) : JsonDocument(_buffer, _capacity) { set(src); } diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index f45ed3298..31bd529ed 100644 --- a/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/src/ArduinoJson/Json/JsonSerializer.hpp @@ -5,7 +5,6 @@ #pragma once #include -#include #include #include #include @@ -132,7 +131,8 @@ inline size_t measureJson(VariantConstRef source) { #if ARDUINOJSON_ENABLE_STD_STREAM template -inline typename enable_if::value, std::ostream &>::type +inline typename enable_if::value, + std::ostream &>::type operator<<(std::ostream &os, const T &source) { serializeJson(source, os); return os; diff --git a/src/ArduinoJson/Misc/Visitable.hpp b/src/ArduinoJson/Misc/Visitable.hpp deleted file mode 100644 index 2efced641..000000000 --- a/src/ArduinoJson/Misc/Visitable.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include - -namespace ARDUINOJSON_NAMESPACE { - -struct Visitable { - // template - // void accept(Visitor&) const; -}; - -template -struct IsVisitable : is_base_of {}; - -template -struct IsVisitable : IsVisitable {}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index c7f93e943..a76ed2fab 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -22,13 +22,10 @@ namespace ARDUINOJSON_NAMESPACE { template class MemberProxy : public VariantOperators >, public VariantShortcuts >, - public Visitable, public VariantTag { typedef MemberProxy this_type; public: - typedef VariantRef variant_type; - FORCE_INLINE MemberProxy(TObject variant, TStringRef key) : _object(variant), _key(key) {} diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index f7a19f6e2..53e940f99 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -57,8 +57,7 @@ class ObjectRefBase { }; class ObjectConstRef : public ObjectRefBase, - public VariantOperators, - public Visitable { + public VariantOperators { friend class ObjectRef; typedef ObjectRefBase base_type; @@ -148,8 +147,7 @@ class ObjectConstRef : public ObjectRefBase, class ObjectRef : public ObjectRefBase, public ObjectShortcuts, - public VariantOperators, - public Visitable { + public VariantOperators { typedef ObjectRefBase base_type; public: diff --git a/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp b/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp index cf6888efb..a639153e6 100644 --- a/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp +++ b/src/ArduinoJson/Polyfills/type_traits/is_convertible.hpp @@ -30,8 +30,10 @@ struct is_convertible { static Yes &probe(To); static No &probe(...); + static From &_from; + public: - static const bool value = sizeof(probe(declval())) == sizeof(Yes); + static const bool value = sizeof(probe(_from)) == sizeof(Yes); }; } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantCompare.hpp b/src/ArduinoJson/Variant/VariantCompare.hpp index 50967788b..fc589441c 100644 --- a/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/src/ArduinoJson/Variant/VariantCompare.hpp @@ -5,7 +5,6 @@ #pragma once #include -#include #include #include #include @@ -128,12 +127,10 @@ struct RawComparer : ComparerBase { } }; -template -struct Comparer::value>::type> - : ComparerBase { - const T *rhs; // TODO: should be a VariantConstRef +struct VariantComparer : ComparerBase { + VariantConstRef rhs; - explicit Comparer(const T &value) : rhs(&value) {} + explicit VariantComparer(VariantConstRef value) : rhs(value) {} CompareResult visitArray(const CollectionData &lhs) { ArrayComparer comparer(lhs); @@ -183,7 +180,7 @@ struct Comparer::value>::type> private: template CompareResult accept(TComparer &comparer) { - CompareResult reversedResult = rhs->accept(comparer); + CompareResult reversedResult = rhs.accept(comparer); switch (reversedResult) { case COMPARE_RESULT_GREATER: return COMPARE_RESULT_LESS; @@ -195,9 +192,17 @@ struct Comparer::value>::type> } }; -template -CompareResult compare(const T1 &lhs, const T2 &rhs) { - Comparer comparer(rhs); +template +struct Comparer< + T, typename enable_if::value>::type> + : VariantComparer { + explicit Comparer(const T &value) + : VariantComparer(value.operator VariantConstRef()) {} +}; + +template +CompareResult compare(VariantConstRef lhs, const T &rhs) { + Comparer comparer(rhs); return lhs.accept(comparer); } diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index c74cbde7e..4db050cf6 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -124,11 +124,6 @@ VariantRef::to() const { return *this; } -inline VariantConstRef operator|(VariantConstRef preferedValue, - VariantConstRef defaultValue) { - return preferedValue ? preferedValue : defaultValue; -} - // Out of class definition to avoid #1560 inline bool VariantRef::set(char value) const { return set(static_cast(value)); diff --git a/src/ArduinoJson/Variant/VariantOperators.hpp b/src/ArduinoJson/Variant/VariantOperators.hpp index a56c53aa7..2aa169061 100644 --- a/src/ArduinoJson/Variant/VariantOperators.hpp +++ b/src/ArduinoJson/Variant/VariantOperators.hpp @@ -4,7 +4,6 @@ #pragma once -#include #include #include #include @@ -12,11 +11,16 @@ namespace ARDUINOJSON_NAMESPACE { -template -CompareResult compare(const T1 &lhs, const T2 &rhs); // VariantCompare.cpp +class VariantConstRef; + +template +CompareResult compare(VariantConstRef lhs, + const T &rhs); // VariantCompare.cpp + +struct VariantOperatorTag {}; template -struct VariantOperators { +struct VariantOperators : VariantOperatorTag { // Returns the default value if the VariantRef is unbound or incompatible // // int operator|(JsonVariant, int) @@ -43,7 +47,7 @@ struct VariantOperators { // // JsonVariant operator|(JsonVariant, JsonVariant) template - friend typename enable_if::value, typename T::variant_type>::type + friend typename enable_if::value, VariantConstRef>::type operator|(const TVariant &variant, T defaultValue) { if (variant) return variant; @@ -67,8 +71,9 @@ struct VariantOperators { return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; } template - friend typename enable_if::value, bool>::type operator==( - TVariant lhs, const T &rhs) { + friend + typename enable_if::value, bool>::type + operator==(TVariant lhs, const T &rhs) { return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; } @@ -88,8 +93,9 @@ struct VariantOperators { return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; } template - friend typename enable_if::value, bool>::type operator!=( - TVariant lhs, const T &rhs) { + friend + typename enable_if::value, bool>::type + operator!=(TVariant lhs, const T &rhs) { return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; } @@ -109,8 +115,9 @@ struct VariantOperators { return compare(lhs, rhs) == COMPARE_RESULT_LESS; } template - friend typename enable_if::value, bool>::type operator<( - TVariant lhs, const T &rhs) { + friend + typename enable_if::value, bool>::type + operator<(TVariant lhs, const T &rhs) { return compare(lhs, rhs) == COMPARE_RESULT_LESS; } @@ -130,8 +137,9 @@ struct VariantOperators { return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; } template - friend typename enable_if::value, bool>::type operator<=( - TVariant lhs, const T &rhs) { + friend + typename enable_if::value, bool>::type + operator<=(TVariant lhs, const T &rhs) { return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; } @@ -151,8 +159,9 @@ struct VariantOperators { return compare(lhs, rhs) == COMPARE_RESULT_GREATER; } template - friend typename enable_if::value, bool>::type operator>( - TVariant lhs, const T &rhs) { + friend + typename enable_if::value, bool>::type + operator>(TVariant lhs, const T &rhs) { return compare(lhs, rhs) == COMPARE_RESULT_GREATER; } @@ -172,8 +181,9 @@ struct VariantOperators { return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; } template - friend typename enable_if::value, bool>::type operator>=( - TVariant lhs, const T &rhs) { + friend + typename enable_if::value, bool>::type + operator>=(TVariant lhs, const T &rhs) { return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; } }; diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index a31983f9c..afd9afe51 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -8,7 +8,6 @@ #include // for uint8_t #include -#include #include #include #include @@ -66,8 +65,7 @@ class VariantRefBase : public VariantTag { class VariantConstRef : public VariantRefBase, public VariantOperators, - public VariantShortcuts, - public Visitable { + public VariantShortcuts { typedef VariantRefBase base_type; public: @@ -180,8 +178,7 @@ class VariantConstRef : public VariantRefBase, // - a reference to a ArrayRef or ObjectRef class VariantRef : public VariantRefBase, public VariantOperators, - public VariantShortcuts, - public Visitable { + public VariantShortcuts { typedef VariantRefBase base_type; public: From 5b06b1564ebdbcffd49811b4622ed20ba6079c29 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sun, 3 Jul 2022 15:51:01 +0200 Subject: [PATCH 002/166] Remove undocumented `accept()` functions --- CHANGELOG.md | 1 + src/ArduinoJson/Array/ArrayRef.hpp | 5 ----- src/ArduinoJson/Array/ElementProxy.hpp | 5 ----- src/ArduinoJson/Document/JsonDocument.hpp | 5 ----- src/ArduinoJson/Object/MemberProxy.hpp | 5 ----- src/ArduinoJson/Object/ObjectRef.hpp | 5 ----- src/ArduinoJson/Serialization/measure.hpp | 3 ++- src/ArduinoJson/Serialization/serialize.hpp | 3 ++- src/ArduinoJson/Variant/VariantCompare.hpp | 4 ++-- src/ArduinoJson/Variant/VariantFunctions.hpp | 9 +++++++++ src/ArduinoJson/Variant/VariantRef.hpp | 7 ------- 11 files changed, 16 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 375a7fb56..8341c2361 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ HEAD * Add `JsonVariant::link()` (issue #1343) * Fix `9.22337e+18 is outside the range of representable values of type 'long'` * Fix comparison operators for `JsonArray`, `JsonArrayConst`, `JsonObject`, and `JsonObjectConst` +* Remove undocumented `accept()` functions v6.19.4 (2022-04-05) ------- diff --git a/src/ArduinoJson/Array/ArrayRef.hpp b/src/ArduinoJson/Array/ArrayRef.hpp index e5853cad8..a2e6eb114 100644 --- a/src/ArduinoJson/Array/ArrayRef.hpp +++ b/src/ArduinoJson/Array/ArrayRef.hpp @@ -26,11 +26,6 @@ class ArrayRefBase { return VariantConstRef(getVariantData()); } - template - FORCE_INLINE typename TVisitor::result_type accept(TVisitor& visitor) const { - return arrayAccept(_data, visitor); - } - FORCE_INLINE bool isNull() const { return _data == 0; } diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index e42b8895b..588f33315 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -127,11 +127,6 @@ class ElementProxy : public VariantOperators >, return getOrAddUpstreamElement().set(value); } - template - typename TVisitor::result_type accept(TVisitor& visitor) const { - return getUpstreamElementConst().accept(visitor); - } - FORCE_INLINE size_t size() const { return getUpstreamElementConst().size(); } diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 1721b880b..17f06e300 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -16,11 +16,6 @@ namespace ARDUINOJSON_NAMESPACE { class JsonDocument : public VariantOperators { public: - template - typename TVisitor::result_type accept(TVisitor& visitor) const { - return getVariant().accept(visitor); - } - template T as() { return getVariant().template as(); diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index a76ed2fab..67f49d78f 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -154,11 +154,6 @@ class MemberProxy : public VariantOperators >, return getOrAddUpstreamMember().set(value); } - template - typename TVisitor::result_type accept(TVisitor &visitor) const { - return getUpstreamMemberConst().accept(visitor); - } - FORCE_INLINE VariantRef addElement() const { return getOrAddUpstreamMember().addElement(); } diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index 53e940f99..7dcd43f02 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -21,11 +21,6 @@ class ObjectRefBase { return VariantConstRef(getVariantData()); } - template - typename TVisitor::result_type accept(TVisitor& visitor) const { - return objectAccept(_data, visitor); - } - FORCE_INLINE bool isNull() const { return _data == 0; } diff --git a/src/ArduinoJson/Serialization/measure.hpp b/src/ArduinoJson/Serialization/measure.hpp index 3de588d2e..5153d8ef7 100644 --- a/src/ArduinoJson/Serialization/measure.hpp +++ b/src/ArduinoJson/Serialization/measure.hpp @@ -5,6 +5,7 @@ #pragma once #include +#include namespace ARDUINOJSON_NAMESPACE { @@ -12,7 +13,7 @@ template