// ArduinoJson - arduinojson.org // Copyright Benoit Blanchon 2014-2020 // MIT License #pragma once #include #include #include #include #include #include // for strcmp namespace ARDUINOJSON_NAMESPACE { template inline T VariantData::asIntegral() const { switch (type()) { case VALUE_IS_POSITIVE_INTEGER: case VALUE_IS_BOOLEAN: return convertPositiveInteger(_content.asInteger); case VALUE_IS_NEGATIVE_INTEGER: return convertNegativeInteger(_content.asInteger); case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: return parseInteger(_content.asString); case VALUE_IS_FLOAT: return convertFloat(_content.asFloat); default: return 0; } } inline bool VariantData::asBoolean() const { switch (type()) { case VALUE_IS_POSITIVE_INTEGER: case VALUE_IS_BOOLEAN: case VALUE_IS_NEGATIVE_INTEGER: return _content.asInteger != 0; case VALUE_IS_FLOAT: return _content.asFloat != 0; case VALUE_IS_NULL: return false; default: return true; } } // T = float/double template inline T VariantData::asFloat() const { switch (type()) { case VALUE_IS_POSITIVE_INTEGER: case VALUE_IS_BOOLEAN: return static_cast(_content.asInteger); case VALUE_IS_NEGATIVE_INTEGER: return -static_cast(_content.asInteger); case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: return parseFloat(_content.asString); case VALUE_IS_FLOAT: return static_cast(_content.asFloat); default: return 0; } } inline const char *VariantData::asString() const { switch (type()) { case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: return _content.asString; default: return 0; } } template typename enable_if::value, bool>::type VariantRef::set( const TVariant &value) const { VariantConstRef v = value; 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 { return ArrayRef(_pool, variantToArray(_data)); } template typename enable_if::value, ObjectRef>::type VariantRef::to() const { return ObjectRef(_pool, variantToObject(_data)); } template typename enable_if::value, VariantRef>::type VariantRef::to() const { variantSetNull(_data); return *this; } inline VariantConstRef VariantConstRef::getElement(size_t index) const { return ArrayConstRef(_data != 0 ? _data->asArray() : 0)[index]; } inline VariantRef VariantRef::addElement() const { return VariantRef(_pool, variantAddElement(_data, _pool)); } inline VariantRef VariantRef::getElement(size_t index) const { return VariantRef(_pool, _data != 0 ? _data->getElement(index) : 0); } inline VariantRef VariantRef::getOrAddElement(size_t index) const { return VariantRef(_pool, variantGetOrAddElement(_data, index, _pool)); } template inline VariantRef VariantRef::getMember(TChar *key) const { return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0); } template inline typename enable_if::value, VariantRef>::type VariantRef::getMember(const TString &key) const { return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0); } template inline VariantRef VariantRef::getOrAddMember(TChar *key) const { return VariantRef(_pool, variantGetOrAddMember(_data, key, _pool)); } template inline VariantRef VariantRef::getOrAddMember(const TString &key) const { return VariantRef(_pool, variantGetOrAddMember(_data, key, _pool)); } } // namespace ARDUINOJSON_NAMESPACE