// ArduinoJson - https://arduinojson.org // Copyright © 2014-2022, Benoit BLANCHON // MIT License #pragma once #include #include #include #include #include #include #include // for strcmp namespace ARDUINOJSON_NAMESPACE { template inline T VariantData::asIntegral() const { switch (type()) { case VALUE_IS_BOOLEAN: return _content.asBoolean; case VALUE_IS_UNSIGNED_INTEGER: return convertNumber(_content.asUnsignedInteger); case VALUE_IS_SIGNED_INTEGER: return convertNumber(_content.asSignedInteger); case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: return parseNumber(_content.asString.data); case VALUE_IS_FLOAT: return convertNumber(_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 inline T VariantData::asFloat() const { switch (type()) { case VALUE_IS_BOOLEAN: return static_cast(_content.asBoolean); case VALUE_IS_UNSIGNED_INTEGER: return static_cast(_content.asUnsignedInteger); case VALUE_IS_SIGNED_INTEGER: return static_cast(_content.asSignedInteger); case VALUE_IS_LINKED_STRING: case VALUE_IS_OWNED_STRING: return parseNumber(_content.asString.data); case VALUE_IS_FLOAT: return static_cast(_content.asFloat); default: return 0; } } inline String VariantData::asString() const { switch (type()) { case VALUE_IS_LINKED_STRING: return String(_content.asString.data, _content.asString.size, String::Linked); case VALUE_IS_OWNED_STRING: return String(_content.asString.data, _content.asString.size, String::Copied); default: return String(); } } inline bool VariantData::copyFrom(const VariantData &src, MemoryPool *pool) { switch (src.type()) { case VALUE_IS_ARRAY: return toArray().copyFrom(src._content.asCollection, pool); case VALUE_IS_OBJECT: return toObject().copyFrom(src._content.asCollection, pool); case VALUE_IS_OWNED_STRING: { String value = src.asString(); return storeString(adaptString(value), pool, getStringStoragePolicy(value)); } case VALUE_IS_OWNED_RAW: return storeOwnedRaw( serialized(src._content.asString.data, src._content.asString.size), pool); default: setType(src.type()); _content = src._content; return true; } } 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; } // Out of class definition to avoid #1560 inline bool VariantRef::set(char value) const { return set(static_cast(value)); } // TODO: move somewhere else template bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool, TCallback callback) { const char *copy = pool->saveString(str); String storedString(copy, str.size(), String::Copied); callback(storedString); return copy != 0; } } // namespace ARDUINOJSON_NAMESPACE