diff options
author | Daniel Friesel <daniel.friesel@uos.de> | 2021-05-12 09:12:09 +0200 |
---|---|---|
committer | Daniel Friesel <daniel.friesel@uos.de> | 2021-05-12 09:12:09 +0200 |
commit | 39895a677e5d370824e702cfe90ebc67737b8482 (patch) | |
tree | ff5b4cc9e373d33a795d50d9333e05549bd9f2b8 /include/lib/ArduinoJson/Variant/VariantImpl.hpp | |
parent | 42e7fdf01c3a5701bb51e93ad6c650c3dbbc5450 (diff) |
import ArduinoJson 6.18.0
Diffstat (limited to 'include/lib/ArduinoJson/Variant/VariantImpl.hpp')
-rw-r--r-- | include/lib/ArduinoJson/Variant/VariantImpl.hpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/include/lib/ArduinoJson/Variant/VariantImpl.hpp b/include/lib/ArduinoJson/Variant/VariantImpl.hpp new file mode 100644 index 0000000..b91e584 --- /dev/null +++ b/include/lib/ArduinoJson/Variant/VariantImpl.hpp @@ -0,0 +1,143 @@ +// ArduinoJson - https://arduinojson.org +// Copyright Benoit Blanchon 2014-2021 +// MIT License + +#pragma once + +#include <ArduinoJson/Array/ArrayRef.hpp> +#include <ArduinoJson/Configuration.hpp> +#include <ArduinoJson/Numbers/convertNumber.hpp> +#include <ArduinoJson/Numbers/parseNumber.hpp> +#include <ArduinoJson/Object/ObjectRef.hpp> +#include <ArduinoJson/Variant/VariantRef.hpp> + +#include <string.h> // for strcmp + +namespace ARDUINOJSON_NAMESPACE { + +template <typename T> +inline T VariantData::asIntegral() const { + switch (type()) { + case VALUE_IS_BOOLEAN: + return _content.asBoolean; + case VALUE_IS_UNSIGNED_INTEGER: + return convertNumber<T>(_content.asUnsignedInteger); + case VALUE_IS_SIGNED_INTEGER: + return convertNumber<T>(_content.asSignedInteger); + case VALUE_IS_LINKED_STRING: + case VALUE_IS_OWNED_STRING: + return parseNumber<T>(_content.asString); + case VALUE_IS_FLOAT: + return convertNumber<T>(_content.asFloat); + default: + return 0; + } +} + +inline bool VariantData::asBoolean() const { + switch (type()) { + case VALUE_IS_BOOLEAN: + return _content.asBoolean; + case VALUE_IS_SIGNED_INTEGER: + case VALUE_IS_UNSIGNED_INTEGER: + return _content.asUnsignedInteger != 0; + case VALUE_IS_FLOAT: + return _content.asFloat != 0; + case VALUE_IS_NULL: + return false; + default: + return true; + } +} + +// T = float/double +template <typename T> +inline T VariantData::asFloat() const { + switch (type()) { + case VALUE_IS_BOOLEAN: + return static_cast<T>(_content.asBoolean); + case VALUE_IS_UNSIGNED_INTEGER: + return static_cast<T>(_content.asUnsignedInteger); + case VALUE_IS_SIGNED_INTEGER: + return static_cast<T>(_content.asSignedInteger); + case VALUE_IS_LINKED_STRING: + case VALUE_IS_OWNED_STRING: + return parseNumber<T>(_content.asString); + case VALUE_IS_FLOAT: + return static_cast<T>(_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 T> +inline typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type +VariantRef::to() const { + return ArrayRef(_pool, variantToArray(_data)); +} + +template <typename T> +typename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type +VariantRef::to() const { + return ObjectRef(_pool, variantToObject(_data)); +} + +template <typename T> +typename enable_if<is_same<T, VariantRef>::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 <typename TChar> +inline VariantRef VariantRef::getMember(TChar *key) const { + return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0); +} + +template <typename TString> +inline typename enable_if<IsString<TString>::value, VariantRef>::type +VariantRef::getMember(const TString &key) const { + return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0); +} + +template <typename TChar> +inline VariantRef VariantRef::getOrAddMember(TChar *key) const { + return VariantRef(_pool, variantGetOrAddMember(_data, key, _pool)); +} + +template <typename TString> +inline VariantRef VariantRef::getOrAddMember(const TString &key) const { + return VariantRef(_pool, variantGetOrAddMember(_data, key, _pool)); +} + +inline VariantConstRef operator|(VariantConstRef preferedValue, + VariantConstRef defaultValue) { + return preferedValue ? preferedValue : defaultValue; +} +} // namespace ARDUINOJSON_NAMESPACE |