From ec43bf4fe9077df623310babab34ba1603a09e27 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 8 Apr 2020 18:18:18 +0200 Subject: [PATCH] Simplified the implementation of implicit casts --- src/ArduinoJson/Array/ElementProxy.hpp | 5 +++ src/ArduinoJson/Object/MemberProxy.hpp | 5 +++ src/ArduinoJson/Operators/VariantCasts.hpp | 24 ------------ .../Operators/VariantOperators.hpp | 4 +- src/ArduinoJson/Variant/VariantAs.hpp | 32 +++++++++------ src/ArduinoJson/Variant/VariantAsImpl.hpp | 15 +++++++ src/ArduinoJson/Variant/VariantImpl.hpp | 12 ------ src/ArduinoJson/Variant/VariantRef.hpp | 39 +++++-------------- 8 files changed, 56 insertions(+), 80 deletions(-) delete mode 100644 src/ArduinoJson/Operators/VariantCasts.hpp diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index 9af0994bf..24cb1d456 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -72,6 +72,11 @@ class ElementProxy : public VariantOperators >, return getUpstreamElement().template as(); } + template + FORCE_INLINE operator T() const { + return getUpstreamElement(); + } + template FORCE_INLINE bool is() const { return getUpstreamElement().template is(); diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index 926a1e766..d33b509d0 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -73,6 +73,11 @@ class MemberProxy : public VariantOperators >, return getUpstreamMember().template as(); } + template + FORCE_INLINE operator T() const { + return getUpstreamMember(); + } + template FORCE_INLINE bool is() const { return getUpstreamMember().template is(); diff --git a/src/ArduinoJson/Operators/VariantCasts.hpp b/src/ArduinoJson/Operators/VariantCasts.hpp deleted file mode 100644 index 86a21b39c..000000000 --- a/src/ArduinoJson/Operators/VariantCasts.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2020 -// MIT License - -#pragma once - -#include - -namespace ARDUINOJSON_NAMESPACE { - -template -class VariantCasts { - public: - template - FORCE_INLINE operator T() const { - return impl()->template as(); - } - - private: - const TImpl *impl() const { - return static_cast(this); - } -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Operators/VariantOperators.hpp b/src/ArduinoJson/Operators/VariantOperators.hpp index 0b1a24938..9e4551969 100644 --- a/src/ArduinoJson/Operators/VariantOperators.hpp +++ b/src/ArduinoJson/Operators/VariantOperators.hpp @@ -4,7 +4,6 @@ #pragma once -#include #include #include #include @@ -12,8 +11,7 @@ namespace ARDUINOJSON_NAMESPACE { template -class VariantOperators : public VariantCasts, - public VariantComparisons, +class VariantOperators : public VariantComparisons, public VariantOr, public VariantShortcuts {}; } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantAs.hpp b/src/ArduinoJson/Variant/VariantAs.hpp index 9dd95677f..bb8d90ee9 100644 --- a/src/ArduinoJson/Variant/VariantAs.hpp +++ b/src/ArduinoJson/Variant/VariantAs.hpp @@ -53,44 +53,52 @@ struct VariantConstAs { template inline typename enable_if::value, T>::type variantAs( - const VariantData* _data) { - return _data != 0 ? _data->asIntegral() : T(0); + const VariantData* data) { + return data != 0 ? data->asIntegral() : T(0); } template inline typename enable_if::value, T>::type variantAs( - const VariantData* _data) { - return _data != 0 ? _data->asBoolean() : false; + const VariantData* data) { + return data != 0 ? data->asBoolean() : false; } template inline typename enable_if::value, T>::type variantAs( - const VariantData* _data) { - return _data != 0 ? _data->asFloat() : T(0); + const VariantData* data) { + return data != 0 ? data->asFloat() : T(0); } template inline typename enable_if::value || is_same::value, const char*>::type -variantAs(const VariantData* _data) { - return _data != 0 ? _data->asString() : 0; +variantAs(const VariantData* data) { + return data != 0 ? data->asString() : 0; +} + +template +T variantAs(VariantData* data, MemoryPool*) { + // By default use the read-only conversion. + // There are specializations for + // - ArrayRef + return variantAs(data); } template inline typename enable_if::value, T>::type variantAs( - const VariantData* _data); + const VariantData* data); template inline typename enable_if::value, T>::type variantAs( - const VariantData* _data); + const VariantData* data); template inline typename enable_if::value, T>::type -variantAs(const VariantData* _data); +variantAs(const VariantData* data); template inline typename enable_if::value, T>::type variantAs( - const VariantData* _data); + const VariantData* data); } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantAsImpl.hpp b/src/ArduinoJson/Variant/VariantAsImpl.hpp index a24d837d9..2cc5780ed 100644 --- a/src/ArduinoJson/Variant/VariantAsImpl.hpp +++ b/src/ArduinoJson/Variant/VariantAsImpl.hpp @@ -39,4 +39,19 @@ inline typename enable_if::value, T>::type variantAs( return s; } +template <> +inline ArrayRef variantAs(VariantData* data, MemoryPool* pool) { + return ArrayRef(pool, data != 0 ? data->asArray() : 0); +} + +template <> +inline ObjectRef variantAs(VariantData* data, MemoryPool* pool) { + return ObjectRef(pool, data != 0 ? data->asObject() : 0); +} + +template <> +inline VariantRef variantAs(VariantData* data, MemoryPool* pool) { + return VariantRef(pool, data); +} + } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 05633297f..49af574ea 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -83,18 +83,6 @@ typename enable_if::value, bool>::type VariantRef::set( return variantCopyFrom(_data, v._data, _pool); } -template -inline typename enable_if::value, T>::type VariantRef::as() - const { - return ArrayRef(_pool, _data != 0 ? _data->asArray() : 0); -} - -template -inline typename enable_if::value, T>::type -VariantRef::as() const { - return ObjectRef(_pool, variantAsObject(_data)); -} - template inline typename enable_if::value, ArrayRef>::type VariantRef::to() const { diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index c86553459..cab128a67 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -246,36 +246,14 @@ class VariantRef : public VariantRefBase, return variantSetSignedInteger(_data, static_cast(value)); } - // Get the variant as the specified type. - // - // std::string as() const; - // String as() const; template - FORCE_INLINE typename enable_if::value && - !is_same::value && - !is_same::value, - typename VariantAs::type>::type - as() const { - return variantAs(_data); + FORCE_INLINE typename VariantAs::type as() const { + return variantAs::type>(_data, _pool); } - // - // ArrayRef as() const; - // const ArrayRef as() const; - template - FORCE_INLINE typename enable_if::value, T>::type as() - const; - // - // ObjectRef as() const; - // const ObjectRef as() const; - template - FORCE_INLINE typename enable_if::value, T>::type as() - const; - // - // VariantRef as const; + template - FORCE_INLINE typename enable_if::value, T>::type as() - const { - return *this; + FORCE_INLINE operator T() const { + return variantAs(_data, _pool); } template @@ -376,13 +354,16 @@ class VariantConstRef : public VariantRefBase, variantAccept(_data, visitor); } - // Get the variant as the specified type. - // template FORCE_INLINE typename VariantConstAs::type as() const { return variantAs::type>(_data); } + template + FORCE_INLINE operator T() const { + return variantAs(_data); + } + FORCE_INLINE VariantConstRef getElement(size_t) const; FORCE_INLINE VariantConstRef operator[](size_t index) const {