Remove ArrayShortcuts and ObjectShortcuts

This commit is contained in:
Benoit Blanchon
2022-11-02 09:18:02 +01:00
parent b8d1dccb21
commit 2182c83b87
9 changed files with 210 additions and 211 deletions

View File

@ -9,21 +9,25 @@
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
template <typename TArray> inline ObjectRef ArrayRef::createNestedObject() const {
inline ArrayRef ArrayShortcuts<TArray>::createNestedArray() const { return add().to<ObjectRef>();
return impl()->add().template to<ArrayRef>();
} }
template <typename TArray> template <typename TDataSource>
inline ObjectRef ArrayShortcuts<TArray>::createNestedObject() const { inline ArrayRef VariantRefBase<TDataSource>::createNestedArray() const {
return impl()->add().template to<ObjectRef>(); return add().template to<ArrayRef>();
} }
template <typename TArray> template <typename TDataSource>
inline VariantProxy<ElementDataSource<TArray> > inline ObjectRef VariantRefBase<TDataSource>::createNestedObject() const {
ArrayShortcuts<TArray>::operator[](size_t index) const { return add().template to<ObjectRef>();
return VariantProxy<ElementDataSource<TArray> >( }
ElementDataSource<TArray>(*impl(), index));
template <typename TDataSource>
inline VariantProxy<ElementDataSource<VariantRefBase<TDataSource> > >
VariantRefBase<TDataSource>::operator[](size_t index) const {
return VariantProxy<ElementDataSource<VariantRefBase<TDataSource> > >(
ElementDataSource<VariantRefBase<TDataSource> >(*this, index));
} }
} // namespace ARDUINOJSON_NAMESPACE } // namespace ARDUINOJSON_NAMESPACE

View File

@ -6,6 +6,7 @@
#include <ArduinoJson/Array/ArrayFunctions.hpp> #include <ArduinoJson/Array/ArrayFunctions.hpp>
#include <ArduinoJson/Array/ArrayIterator.hpp> #include <ArduinoJson/Array/ArrayIterator.hpp>
#include <ArduinoJson/Array/ElementProxy.hpp>
#include <ArduinoJson/Variant/VariantAttorney.hpp> #include <ArduinoJson/Variant/VariantAttorney.hpp>
#include <ArduinoJson/Variant/VariantData.hpp> #include <ArduinoJson/Variant/VariantData.hpp>
@ -106,7 +107,6 @@ class ArrayConstRef : public ArrayRefBase<const CollectionData>,
}; };
class ArrayRef : public ArrayRefBase<CollectionData>, class ArrayRef : public ArrayRefBase<CollectionData>,
public ArrayShortcuts<ArrayRef>,
public VariantOperators<ArrayRef> { public VariantOperators<ArrayRef> {
typedef ArrayRefBase<CollectionData> base_type; typedef ArrayRefBase<CollectionData> base_type;
@ -132,7 +132,15 @@ class ArrayRef : public ArrayRefBase<CollectionData>,
return VariantRef(_pool, arrayAdd(_data, _pool)); return VariantRef(_pool, arrayAdd(_data, _pool));
} }
using ArrayShortcuts<ArrayRef>::add; template <typename T>
FORCE_INLINE bool add(const T& value) const {
return add().set(value);
}
template <typename T>
FORCE_INLINE bool add(T* value) const {
return add().set(value);
}
FORCE_INLINE iterator begin() const { FORCE_INLINE iterator begin() const {
if (!_data) if (!_data)
@ -175,6 +183,19 @@ class ArrayRef : public ArrayRefBase<CollectionData>,
_data->clear(); _data->clear();
} }
// Returns the element at specified index if the variant is an array.
FORCE_INLINE VariantProxy<ElementDataSource<ArrayRef> > operator[](
size_t index) const {
return VariantProxy<ElementDataSource<ArrayRef> >(
ElementDataSource<ArrayRef>(*this, index));
}
FORCE_INLINE ObjectRef createNestedObject() const;
FORCE_INLINE ArrayRef createNestedArray() const {
return add().to<ArrayRef>();
}
protected: protected:
MemoryPool* getPool() const { MemoryPool* getPool() const {
return _pool; return _pool;

View File

@ -1,54 +0,0 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2022, Benoit BLANCHON
// MIT License
#pragma once
#include <ArduinoJson/Polyfills/attributes.hpp>
#include <ArduinoJson/Polyfills/type_traits.hpp>
namespace ARDUINOJSON_NAMESPACE {
// Forward declarations.
class ArrayRef;
class ObjectRef;
template <typename>
class ElementDataSource;
template <typename>
class VariantProxy;
template <typename TArray>
class ArrayShortcuts {
public:
// Returns the element at specified index if the variant is an array.
FORCE_INLINE VariantProxy<ElementDataSource<TArray> > operator[](
size_t index) const;
FORCE_INLINE ObjectRef createNestedObject() const;
FORCE_INLINE ArrayRef createNestedArray() const;
// Adds the specified value at the end of the array.
//
// bool add(TValue);
// TValue = bool, long, int, short, float, double, serialized, VariantRef,
// std::string, String, ObjectRef
template <typename T>
FORCE_INLINE bool add(const T& value) const {
return impl()->add().set(value);
}
//
// bool add(TValue);
// TValue = char*, const char*, const __FlashStringHelper*
template <typename T>
FORCE_INLINE bool add(T* value) const {
return impl()->add().set(value);
}
private:
const TArray* impl() const {
return static_cast<const TArray*>(this);
}
};
} // namespace ARDUINOJSON_NAMESPACE

View File

@ -9,67 +9,78 @@
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
template <typename TObject>
template <typename TString> template <typename TString>
inline ArrayRef ObjectShortcuts<TObject>::createNestedArray( inline ArrayRef ObjectRef::createNestedArray(const TString& key) const {
const TString& key) const { return operator[](key).template to<ArrayRef>();
return impl()->operator[](key).template to<ArrayRef>();
} }
template <typename TObject>
template <typename TChar> template <typename TChar>
inline ArrayRef ObjectShortcuts<TObject>::createNestedArray(TChar* key) const { inline ArrayRef ObjectRef::createNestedArray(TChar* key) const {
return impl()->operator[](key).template to<ArrayRef>(); return operator[](key).template to<ArrayRef>();
} }
template <typename TObject> template <typename TDataSource>
template <typename TString> template <typename TString>
inline ObjectRef ObjectShortcuts<TObject>::createNestedObject( inline ArrayRef VariantRefBase<TDataSource>::createNestedArray(
const TString& key) const { const TString& key) const {
return impl()->operator[](key).template to<ObjectRef>(); return operator[](key).template to<ArrayRef>();
} }
template <typename TObject> template <typename TDataSource>
template <typename TChar> template <typename TChar>
inline ObjectRef ObjectShortcuts<TObject>::createNestedObject( inline ArrayRef VariantRefBase<TDataSource>::createNestedArray(
TChar* key) const { TChar* key) const {
return impl()->operator[](key).template to<ObjectRef>(); return operator[](key).template to<ArrayRef>();
} }
template <typename TObject> template <typename TDataSource>
template <typename TString>
inline ObjectRef VariantRefBase<TDataSource>::createNestedObject(
const TString& key) const {
return operator[](key).template to<ObjectRef>();
}
template <typename TDataSource>
template <typename TChar>
inline ObjectRef VariantRefBase<TDataSource>::createNestedObject(
TChar* key) const {
return operator[](key).template to<ObjectRef>();
}
template <typename TDataSource>
template <typename TString> template <typename TString>
inline typename enable_if<IsString<TString>::value, bool>::type inline typename enable_if<IsString<TString>::value, bool>::type
ObjectShortcuts<TObject>::containsKey(const TString& key) const { VariantRefBase<TDataSource>::containsKey(const TString& key) const {
return variantGetMember(VariantAttorney::getData(*impl()), return variantGetMember(VariantAttorney::getData(*this), adaptString(key)) !=
adaptString(key)) != 0; 0;
} }
template <typename TObject> template <typename TDataSource>
template <typename TChar> template <typename TChar>
inline typename enable_if<IsString<TChar*>::value, bool>::type inline typename enable_if<IsString<TChar*>::value, bool>::type
ObjectShortcuts<TObject>::containsKey(TChar* key) const { VariantRefBase<TDataSource>::containsKey(TChar* key) const {
return variantGetMember(VariantAttorney::getData(*impl()), return variantGetMember(VariantAttorney::getData(*this), adaptString(key)) !=
adaptString(key)) != 0; 0;
} }
template <typename TObject> template <typename TDataSource>
template <typename TString> template <typename TString>
inline typename enable_if< inline typename enable_if<IsString<TString*>::value,
IsString<TString*>::value, VariantProxy<MemberDataSource<
VariantProxy<MemberDataSource<TObject, TString*> > >::type VariantRefBase<TDataSource>, TString*> > >::type
ObjectShortcuts<TObject>::operator[](TString* key) const { VariantRefBase<TDataSource>::operator[](TString* key) const {
return VariantProxy<MemberDataSource<TObject, TString*> >( return VariantProxy<MemberDataSource<VariantRefBase, TString*> >(
MemberDataSource<TObject, TString*>(*impl(), key)); MemberDataSource<VariantRefBase, TString*>(*this, key));
} }
template <typename TObject> template <typename TDataSource>
template <typename TString> template <typename TString>
inline inline typename enable_if<IsString<TString>::value,
typename enable_if<IsString<TString>::value, VariantProxy<MemberDataSource<
VariantProxy<MemberDataSource<TObject, TString> > >::type VariantRefBase<TDataSource>, TString> > >::type
ObjectShortcuts<TObject>::operator[](const TString& key) const { VariantRefBase<TDataSource>::operator[](const TString& key) const {
return VariantProxy<MemberDataSource<TObject, TString> >( return VariantProxy<MemberDataSource<VariantRefBase, TString> >(
MemberDataSource<TObject, TString>(*impl(), key)); MemberDataSource<VariantRefBase, TString>(*this, key));
} }
} // namespace ARDUINOJSON_NAMESPACE } // namespace ARDUINOJSON_NAMESPACE

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <ArduinoJson/Object/MemberProxy.hpp>
#include <ArduinoJson/Object/ObjectFunctions.hpp> #include <ArduinoJson/Object/ObjectFunctions.hpp>
#include <ArduinoJson/Object/ObjectIterator.hpp> #include <ArduinoJson/Object/ObjectIterator.hpp>
@ -14,6 +15,8 @@
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
class ArrayRef;
template <typename TData> template <typename TData>
class ObjectRefBase { class ObjectRefBase {
friend class VariantAttorney; friend class VariantAttorney;
@ -125,7 +128,6 @@ class ObjectConstRef : public ObjectRefBase<const CollectionData>,
}; };
class ObjectRef : public ObjectRefBase<CollectionData>, class ObjectRef : public ObjectRefBase<CollectionData>,
public ObjectShortcuts<ObjectRef>,
public VariantOperators<ObjectRef> { public VariantOperators<ObjectRef> {
typedef ObjectRefBase<CollectionData> base_type; typedef ObjectRefBase<CollectionData> base_type;
@ -173,6 +175,24 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
return ObjectConstRef(_data) == ObjectConstRef(rhs._data); return ObjectConstRef(_data) == ObjectConstRef(rhs._data);
} }
template <typename TString>
FORCE_INLINE typename enable_if<
IsString<TString>::value,
VariantProxy<MemberDataSource<ObjectRef, TString> > >::type
operator[](const TString& key) const {
return VariantProxy<MemberDataSource<ObjectRef, TString> >(
MemberDataSource<ObjectRef, TString>(*this, key));
}
template <typename TChar>
FORCE_INLINE typename enable_if<
IsString<TChar*>::value,
VariantProxy<MemberDataSource<ObjectRef, TChar*> > >::type
operator[](TChar* key) const {
return VariantProxy<MemberDataSource<ObjectRef, TChar*> >(
MemberDataSource<ObjectRef, TChar*>(*this, key));
}
FORCE_INLINE void remove(iterator it) const { FORCE_INLINE void remove(iterator it) const {
if (!_data) if (!_data)
return; return;
@ -194,6 +214,34 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
objectRemove(_data, adaptString(key)); objectRemove(_data, adaptString(key));
} }
template <typename TString>
FORCE_INLINE typename enable_if<IsString<TString>::value, bool>::type
containsKey(const TString& key) const {
return objectGetMember(_data, adaptString(key)) != 0;
}
template <typename TChar>
FORCE_INLINE typename enable_if<IsString<TChar*>::value, bool>::type
containsKey(TChar* key) const {
return objectGetMember(_data, adaptString(key)) != 0;
}
template <typename TString>
FORCE_INLINE ArrayRef createNestedArray(const TString& key) const;
template <typename TChar>
FORCE_INLINE ArrayRef createNestedArray(TChar* key) const;
template <typename TString>
ObjectRef createNestedObject(const TString& key) const {
return operator[](key).template to<ObjectRef>();
}
template <typename TChar>
ObjectRef createNestedObject(TChar* key) const {
return operator[](key).template to<ObjectRef>();
}
protected: protected:
MemoryPool* getPool() const { MemoryPool* getPool() const {
return _pool; return _pool;

View File

@ -1,78 +0,0 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2022, Benoit BLANCHON
// MIT License
#pragma once
#include <ArduinoJson/Polyfills/attributes.hpp>
#include <ArduinoJson/Polyfills/type_traits.hpp>
#include <ArduinoJson/Strings/IsString.hpp>
namespace ARDUINOJSON_NAMESPACE {
template <typename TSource>
class VariantProxy;
template <typename TParent, typename TStringRef>
class MemberDataSource;
template <typename TObject>
class ObjectShortcuts {
public:
// containsKey(const std::string&) const
// containsKey(const String&) const
template <typename TString>
FORCE_INLINE typename enable_if<IsString<TString>::value, bool>::type
containsKey(const TString& key) const;
// containsKey(char*) const
// containsKey(const char*) const
// containsKey(const __FlashStringHelper*) const
template <typename TChar>
FORCE_INLINE typename enable_if<IsString<TChar*>::value, bool>::type
containsKey(TChar* key) const;
// operator[](const std::string&) const
// operator[](const String&) const
template <typename TString>
FORCE_INLINE typename enable_if<
IsString<TString>::value,
VariantProxy<MemberDataSource<TObject, TString> > >::type
operator[](const TString& key) const;
// operator[](char*) const
// operator[](const char*) const
// operator[](const __FlashStringHelper*) const
template <typename TChar>
FORCE_INLINE typename enable_if<
IsString<TChar*>::value,
VariantProxy<MemberDataSource<TObject, TChar*> > >::type
operator[](TChar* key) const;
// createNestedArray(const std::string&) const
// createNestedArray(const String&) const
template <typename TString>
FORCE_INLINE ArrayRef createNestedArray(const TString& key) const;
// createNestedArray(char*) const
// createNestedArray(const char*) const
// createNestedArray(const __FlashStringHelper*) const
template <typename TChar>
FORCE_INLINE ArrayRef createNestedArray(TChar* key) const;
// createNestedObject(const std::string&) const
// createNestedObject(const String&) const
template <typename TString>
ObjectRef createNestedObject(const TString& key) const;
// createNestedObject(char*) const
// createNestedObject(const char*) const
// createNestedObject(const __FlashStringHelper*) const
template <typename TChar>
ObjectRef createNestedObject(TChar* key) const;
private:
const TObject* impl() const {
return static_cast<const TObject*>(this);
}
};
} // namespace ARDUINOJSON_NAMESPACE

View File

@ -9,12 +9,12 @@
#include <ArduinoJson/Memory/MemoryPool.hpp> #include <ArduinoJson/Memory/MemoryPool.hpp>
#include <ArduinoJson/Polyfills/type_traits.hpp> #include <ArduinoJson/Polyfills/type_traits.hpp>
#include <ArduinoJson/Strings/IsString.hpp>
#include <ArduinoJson/Strings/StringAdapters.hpp> #include <ArduinoJson/Strings/StringAdapters.hpp>
#include <ArduinoJson/Variant/VariantAttorney.hpp> #include <ArduinoJson/Variant/VariantAttorney.hpp>
#include <ArduinoJson/Variant/VariantConstRef.hpp> #include <ArduinoJson/Variant/VariantConstRef.hpp>
#include <ArduinoJson/Variant/VariantFunctions.hpp> #include <ArduinoJson/Variant/VariantFunctions.hpp>
#include <ArduinoJson/Variant/VariantOperators.hpp> #include <ArduinoJson/Variant/VariantOperators.hpp>
#include <ArduinoJson/Variant/VariantShortcuts.hpp>
#include <ArduinoJson/Variant/VariantTag.hpp> #include <ArduinoJson/Variant/VariantTag.hpp>
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
@ -24,8 +24,7 @@ class ArrayRef;
class ObjectRef; class ObjectRef;
class VariantConstRef : public VariantTag, class VariantConstRef : public VariantTag,
public VariantOperators<VariantConstRef>, public VariantOperators<VariantConstRef> {
public VariantShortcuts<VariantConstRef> {
friend class VariantAttorney; friend class VariantAttorney;
public: public:
@ -126,6 +125,23 @@ class VariantConstRef : public VariantTag,
return VariantConstRef(variantGetMember(_data, adaptString(key))); return VariantConstRef(variantGetMember(_data, adaptString(key)));
} }
// containsKey(const std::string&) const
// containsKey(const String&) const
template <typename TString>
FORCE_INLINE typename enable_if<IsString<TString>::value, bool>::type
containsKey(const TString& key) const {
return variantGetMember(getData(), adaptString(key)) != 0;
}
// containsKey(char*) const
// containsKey(const char*) const
// containsKey(const __FlashStringHelper*) const
template <typename TChar>
FORCE_INLINE typename enable_if<IsString<TChar*>::value, bool>::type
containsKey(TChar* key) const {
return variantGetMember(getData(), adaptString(key)) != 0;
}
protected: protected:
const VariantData* getData() const { const VariantData* getData() const {
return _data; return _data;

View File

@ -8,16 +8,23 @@
#include <ArduinoJson/Variant/Converter.hpp> #include <ArduinoJson/Variant/Converter.hpp>
#include <ArduinoJson/Variant/VariantConstRef.hpp> #include <ArduinoJson/Variant/VariantConstRef.hpp>
#include <ArduinoJson/Variant/VariantOperators.hpp> #include <ArduinoJson/Variant/VariantOperators.hpp>
#include <ArduinoJson/Variant/VariantShortcuts.hpp>
#include <ArduinoJson/Variant/VariantTo.hpp> #include <ArduinoJson/Variant/VariantTo.hpp>
namespace ARDUINOJSON_NAMESPACE { namespace ARDUINOJSON_NAMESPACE {
class VariantRef; class VariantRef;
template <typename>
class ElementDataSource;
template <typename, typename>
class MemberDataSource;
template <typename>
class VariantProxy;
template <typename TDataSource> template <typename TDataSource>
class VariantRefBase : public VariantShortcuts<VariantRefBase<TDataSource> >, class VariantRefBase : public VariantTag {
public VariantTag {
friend class VariantAttorney; friend class VariantAttorney;
public: public:
@ -160,7 +167,17 @@ class VariantRefBase : public VariantShortcuts<VariantRefBase<TDataSource> >,
FORCE_INLINE VariantRef add() const; FORCE_INLINE VariantRef add() const;
using ArrayShortcuts<VariantRefBase<TDataSource> >::add; template <typename T>
FORCE_INLINE bool add(const T& value) const {
return add().set(value);
}
//
// bool add(TValue);
// TValue = char*, const char*, const __FlashStringHelper*
template <typename T>
FORCE_INLINE bool add(T* value) const {
return add().set(value);
}
FORCE_INLINE void remove(size_t index) const { FORCE_INLINE void remove(size_t index) const {
VariantData* data = getData(); VariantData* data = getData();
@ -187,6 +204,43 @@ class VariantRefBase : public VariantShortcuts<VariantRefBase<TDataSource> >,
data->remove(adaptString(key)); data->remove(adaptString(key));
} }
FORCE_INLINE ArrayRef createNestedArray() const;
FORCE_INLINE ObjectRef createNestedObject() const;
FORCE_INLINE VariantProxy<ElementDataSource<VariantRefBase> > operator[](
size_t index) const;
template <typename TString>
FORCE_INLINE typename enable_if<IsString<TString>::value, bool>::type
containsKey(const TString& key) const;
template <typename TChar>
FORCE_INLINE typename enable_if<IsString<TChar*>::value, bool>::type
containsKey(TChar* key) const;
template <typename TString>
FORCE_INLINE typename enable_if<
IsString<TString>::value,
VariantProxy<MemberDataSource<VariantRefBase, TString> > >::type
operator[](const TString& key) const;
template <typename TChar>
FORCE_INLINE typename enable_if<
IsString<TChar*>::value,
VariantProxy<MemberDataSource<VariantRefBase, TChar*> > >::type
operator[](TChar* key) const;
template <typename TString>
FORCE_INLINE ArrayRef createNestedArray(const TString& key) const;
template <typename TChar>
FORCE_INLINE ArrayRef createNestedArray(TChar* key) const;
template <typename TString>
ObjectRef createNestedObject(const TString& key) const;
template <typename TChar>
ObjectRef createNestedObject(TChar* key) const;
protected: protected:
FORCE_INLINE MemoryPool* getPool() const { FORCE_INLINE MemoryPool* getPool() const {
return _source.getPool(); return _source.getPool();

View File

@ -1,23 +0,0 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2022, Benoit BLANCHON
// MIT License
#pragma once
#include <ArduinoJson/Array/ArrayShortcuts.hpp>
#include <ArduinoJson/Object/ObjectShortcuts.hpp>
namespace ARDUINOJSON_NAMESPACE {
template <typename TVariant>
class VariantShortcuts : public ObjectShortcuts<TVariant>,
public ArrayShortcuts<TVariant> {
public:
using ArrayShortcuts<TVariant>::createNestedArray;
using ArrayShortcuts<TVariant>::createNestedObject;
using ArrayShortcuts<TVariant>::operator[];
using ObjectShortcuts<TVariant>::createNestedArray;
using ObjectShortcuts<TVariant>::createNestedObject;
using ObjectShortcuts<TVariant>::operator[];
};
} // namespace ARDUINOJSON_NAMESPACE