Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
VariantImpl.hpp
00001 // ArduinoJson - arduinojson.org 00002 // Copyright Benoit Blanchon 2014-2021 00003 // MIT License 00004 00005 #pragma once 00006 00007 #include <ArduinoJson/Array/ArrayRef.hpp> 00008 #include <ArduinoJson/Configuration.hpp> 00009 #include <ArduinoJson/Numbers/convertNumber.hpp> 00010 #include <ArduinoJson/Numbers/parseNumber.hpp> 00011 #include <ArduinoJson/Object/ObjectRef.hpp> 00012 #include <ArduinoJson/Variant/VariantRef.hpp> 00013 00014 #include <string.h> // for strcmp 00015 00016 namespace ARDUINOJSON_NAMESPACE { 00017 00018 template <typename T> 00019 inline T VariantData::asIntegral() const { 00020 switch (type()) { 00021 case VALUE_IS_POSITIVE_INTEGER: 00022 case VALUE_IS_BOOLEAN: 00023 return convertPositiveInteger<T>(_content.asInteger); 00024 case VALUE_IS_NEGATIVE_INTEGER: 00025 return convertNegativeInteger<T>(_content.asInteger); 00026 case VALUE_IS_LINKED_STRING: 00027 case VALUE_IS_OWNED_STRING: 00028 return parseNumber<T>(_content.asString); 00029 case VALUE_IS_FLOAT: 00030 return convertFloat<T>(_content.asFloat); 00031 default: 00032 return 0; 00033 } 00034 } 00035 00036 inline bool VariantData::asBoolean() const { 00037 switch (type()) { 00038 case VALUE_IS_POSITIVE_INTEGER: 00039 case VALUE_IS_BOOLEAN: 00040 case VALUE_IS_NEGATIVE_INTEGER: 00041 return _content.asInteger != 0; 00042 case VALUE_IS_FLOAT: 00043 return _content.asFloat != 0; 00044 case VALUE_IS_NULL: 00045 return false; 00046 default: 00047 return true; 00048 } 00049 } 00050 00051 // T = float/double 00052 template <typename T> 00053 inline T VariantData::asFloat() const { 00054 switch (type()) { 00055 case VALUE_IS_POSITIVE_INTEGER: 00056 case VALUE_IS_BOOLEAN: 00057 return static_cast<T>(_content.asInteger); 00058 case VALUE_IS_NEGATIVE_INTEGER: 00059 return -static_cast<T>(_content.asInteger); 00060 case VALUE_IS_LINKED_STRING: 00061 case VALUE_IS_OWNED_STRING: 00062 return parseNumber<T>(_content.asString); 00063 case VALUE_IS_FLOAT: 00064 return static_cast<T>(_content.asFloat); 00065 default: 00066 return 0; 00067 } 00068 } 00069 00070 inline const char *VariantData::asString() const { 00071 switch (type()) { 00072 case VALUE_IS_LINKED_STRING: 00073 case VALUE_IS_OWNED_STRING: 00074 return _content.asString; 00075 default: 00076 return 0; 00077 } 00078 } 00079 00080 template <typename TVariant> 00081 typename enable_if<IsVisitable<TVariant>::value, bool>::type VariantRef::set( 00082 const TVariant &value) const { 00083 VariantConstRef v = value; 00084 return variantCopyFrom(_data, v._data, _pool); 00085 } 00086 00087 template <typename T> 00088 inline typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type 00089 VariantRef::to() const { 00090 return ArrayRef(_pool, variantToArray(_data)); 00091 } 00092 00093 template <typename T> 00094 typename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type 00095 VariantRef::to() const { 00096 return ObjectRef(_pool, variantToObject(_data)); 00097 } 00098 00099 template <typename T> 00100 typename enable_if<is_same<T, VariantRef>::value, VariantRef>::type 00101 VariantRef::to() const { 00102 variantSetNull(_data); 00103 return *this; 00104 } 00105 00106 inline VariantConstRef VariantConstRef::getElement(size_t index) const { 00107 return ArrayConstRef(_data != 0 ? _data->asArray() : 0)[index]; 00108 } 00109 00110 inline VariantRef VariantRef::addElement() const { 00111 return VariantRef(_pool, variantAddElement(_data, _pool)); 00112 } 00113 00114 inline VariantRef VariantRef::getElement(size_t index) const { 00115 return VariantRef(_pool, _data != 0 ? _data->getElement(index) : 0); 00116 } 00117 00118 inline VariantRef VariantRef::getOrAddElement(size_t index) const { 00119 return VariantRef(_pool, variantGetOrAddElement(_data, index, _pool)); 00120 } 00121 00122 template <typename TChar> 00123 inline VariantRef VariantRef::getMember(TChar *key) const { 00124 return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0); 00125 } 00126 00127 template <typename TString> 00128 inline typename enable_if<IsString<TString>::value, VariantRef>::type 00129 VariantRef::getMember(const TString &key) const { 00130 return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0); 00131 } 00132 00133 template <typename TChar> 00134 inline VariantRef VariantRef::getOrAddMember(TChar *key) const { 00135 return VariantRef(_pool, variantGetOrAddMember(_data, key, _pool)); 00136 } 00137 00138 template <typename TString> 00139 inline VariantRef VariantRef::getOrAddMember(const TString &key) const { 00140 return VariantRef(_pool, variantGetOrAddMember(_data, key, _pool)); 00141 } 00142 00143 inline VariantConstRef operator|(VariantConstRef preferedValue, 00144 VariantConstRef defaultValue) { 00145 return preferedValue ? preferedValue : defaultValue; 00146 } 00147 } // namespace ARDUINOJSON_NAMESPACE
Generated on Wed Jul 13 2022 01:10:37 by
1.7.2