forked from bblanchon/ArduinoJson
Inline class ObjectRefBase
This commit is contained in:
@ -11,11 +11,16 @@ namespace ARDUINOJSON_NAMESPACE {
|
||||
|
||||
class ArrayRef;
|
||||
|
||||
template <typename TData>
|
||||
class ObjectRefBase {
|
||||
class ObjectConstRef : public VariantOperators<ObjectConstRef> {
|
||||
friend class ObjectRef;
|
||||
friend class VariantAttorney;
|
||||
|
||||
public:
|
||||
typedef ObjectConstIterator iterator;
|
||||
|
||||
ObjectConstRef() : _data(0) {}
|
||||
ObjectConstRef(const CollectionData* data) : _data(data) {}
|
||||
|
||||
operator VariantConstRef() const {
|
||||
return VariantConstRef(collectionToVariant(_data));
|
||||
}
|
||||
@ -40,33 +45,6 @@ class ObjectRefBase {
|
||||
return _data ? _data->size() : 0;
|
||||
}
|
||||
|
||||
protected:
|
||||
const VariantData* getData() const {
|
||||
return collectionToVariant(_data);
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
inline VariantData* getMember(TAdaptedString key) const {
|
||||
if (!_data)
|
||||
return 0;
|
||||
return _data->getMember(key);
|
||||
}
|
||||
|
||||
ObjectRefBase(TData* data) : _data(data) {}
|
||||
TData* _data;
|
||||
};
|
||||
|
||||
class ObjectConstRef : public ObjectRefBase<const CollectionData>,
|
||||
public VariantOperators<ObjectConstRef> {
|
||||
friend class ObjectRef;
|
||||
typedef ObjectRefBase<const CollectionData> base_type;
|
||||
|
||||
public:
|
||||
typedef ObjectConstIterator iterator;
|
||||
|
||||
ObjectConstRef() : base_type(0) {}
|
||||
ObjectConstRef(const CollectionData* data) : base_type(data) {}
|
||||
|
||||
FORCE_INLINE iterator begin() const {
|
||||
if (!_data)
|
||||
return iterator();
|
||||
@ -126,20 +104,31 @@ class ObjectConstRef : public ObjectRefBase<const CollectionData>,
|
||||
}
|
||||
return count == rhs.size();
|
||||
}
|
||||
|
||||
private:
|
||||
const VariantData* getData() const {
|
||||
return collectionToVariant(_data);
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
const VariantData* getMember(TAdaptedString key) const {
|
||||
if (!_data)
|
||||
return 0;
|
||||
return _data->getMember(key);
|
||||
}
|
||||
|
||||
const CollectionData* _data;
|
||||
};
|
||||
|
||||
class ObjectRef : public ObjectRefBase<CollectionData>,
|
||||
public VariantOperators<ObjectRef> {
|
||||
typedef ObjectRefBase<CollectionData> base_type;
|
||||
|
||||
class ObjectRef : public VariantOperators<ObjectRef> {
|
||||
friend class VariantAttorney;
|
||||
|
||||
public:
|
||||
typedef ObjectIterator iterator;
|
||||
|
||||
FORCE_INLINE ObjectRef() : base_type(0), _pool(0) {}
|
||||
FORCE_INLINE ObjectRef() : _data(0), _pool(0) {}
|
||||
FORCE_INLINE ObjectRef(MemoryPool* buf, CollectionData* data)
|
||||
: base_type(data), _pool(buf) {}
|
||||
: _data(data), _pool(buf) {}
|
||||
|
||||
operator VariantRef() const {
|
||||
void* data = _data; // prevent warning cast-align
|
||||
@ -150,6 +139,30 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
|
||||
return ObjectConstRef(_data);
|
||||
}
|
||||
|
||||
operator VariantConstRef() const {
|
||||
return VariantConstRef(collectionToVariant(_data));
|
||||
}
|
||||
|
||||
FORCE_INLINE bool isNull() const {
|
||||
return _data == 0;
|
||||
}
|
||||
|
||||
FORCE_INLINE operator bool() const {
|
||||
return _data != 0;
|
||||
}
|
||||
|
||||
FORCE_INLINE size_t memoryUsage() const {
|
||||
return _data ? _data->memoryUsage() : 0;
|
||||
}
|
||||
|
||||
FORCE_INLINE size_t nesting() const {
|
||||
return variantNesting(collectionToVariant(_data));
|
||||
}
|
||||
|
||||
FORCE_INLINE size_t size() const {
|
||||
return _data ? _data->size() : 0;
|
||||
}
|
||||
|
||||
FORCE_INLINE iterator begin() const {
|
||||
if (!_data)
|
||||
return iterator();
|
||||
@ -239,7 +252,7 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
|
||||
return operator[](key).template to<ObjectRef>();
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
MemoryPool* getPool() const {
|
||||
return _pool;
|
||||
}
|
||||
@ -252,6 +265,13 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
|
||||
return collectionToVariant(_data);
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
inline VariantData* getMember(TAdaptedString key) const {
|
||||
if (!_data)
|
||||
return 0;
|
||||
return _data->getMember(key);
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
void removeMember(TAdaptedString key) const {
|
||||
if (!_data)
|
||||
@ -259,7 +279,7 @@ class ObjectRef : public ObjectRefBase<CollectionData>,
|
||||
_data->removeMember(key);
|
||||
}
|
||||
|
||||
private:
|
||||
CollectionData* _data;
|
||||
MemoryPool* _pool;
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user