forked from bblanchon/ArduinoJson
Kept only two namespaces ArduinoJson and ArduinoJson::Internals
This commit is contained in:
@ -22,8 +22,8 @@ struct ValueSaver {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename Source>
|
template <typename Source>
|
||||||
struct ValueSaver<Source, typename TypeTraits::EnableIf<
|
struct ValueSaver<
|
||||||
StringTraits<Source>::should_duplicate>::type> {
|
Source, typename EnableIf<StringTraits<Source>::should_duplicate>::type> {
|
||||||
template <typename Destination>
|
template <typename Destination>
|
||||||
static bool save(JsonBuffer* buffer, Destination& dest, Source source) {
|
static bool save(JsonBuffer* buffer, Destination& dest, Source source) {
|
||||||
if (!StringTraits<Source>::is_null(source)) {
|
if (!StringTraits<Source>::is_null(source)) {
|
||||||
@ -40,8 +40,8 @@ struct ValueSaver<Source, typename TypeTraits::EnableIf<
|
|||||||
|
|
||||||
// const char*, const signed char*, const unsigned char*
|
// const char*, const signed char*, const unsigned char*
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
struct ValueSaver<Char*, typename TypeTraits::EnableIf<
|
struct ValueSaver<
|
||||||
!StringTraits<Char*>::should_duplicate>::type> {
|
Char*, typename EnableIf<!StringTraits<Char*>::should_duplicate>::type> {
|
||||||
template <typename Destination>
|
template <typename Destination>
|
||||||
static bool save(JsonBuffer*, Destination& dest, Char* source) {
|
static bool save(JsonBuffer*, Destination& dest, Char* source) {
|
||||||
dest = reinterpret_cast<const char*>(source);
|
dest = reinterpret_cast<const char*>(source);
|
||||||
|
@ -71,7 +71,7 @@ class JsonParser {
|
|||||||
|
|
||||||
template <typename TJsonBuffer, typename TString, typename Enable = void>
|
template <typename TJsonBuffer, typename TString, typename Enable = void>
|
||||||
struct JsonParserBuilder {
|
struct JsonParserBuilder {
|
||||||
typedef typename Internals::StringTraits<TString>::Reader InputReader;
|
typedef typename StringTraits<TString>::Reader InputReader;
|
||||||
typedef JsonParser<InputReader, TJsonBuffer &> TParser;
|
typedef JsonParser<InputReader, TJsonBuffer &> TParser;
|
||||||
|
|
||||||
static TParser makeParser(TJsonBuffer *buffer, TString &json,
|
static TParser makeParser(TJsonBuffer *buffer, TString &json,
|
||||||
@ -81,10 +81,9 @@ struct JsonParserBuilder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename TJsonBuffer, typename TChar>
|
template <typename TJsonBuffer, typename TChar>
|
||||||
struct JsonParserBuilder<
|
struct JsonParserBuilder<TJsonBuffer, TChar *,
|
||||||
TJsonBuffer, TChar *,
|
typename EnableIf<!IsConst<TChar>::value>::type> {
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsConst<TChar>::value>::type> {
|
typedef typename StringTraits<TChar *>::Reader TReader;
|
||||||
typedef typename Internals::StringTraits<TChar *>::Reader TReader;
|
|
||||||
typedef StringWriter<TChar> TWriter;
|
typedef StringWriter<TChar> TWriter;
|
||||||
typedef JsonParser<TReader, TWriter> TParser;
|
typedef JsonParser<TReader, TWriter> TParser;
|
||||||
|
|
||||||
|
@ -141,8 +141,7 @@ inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseObjectTo(
|
|||||||
template <typename TReader, typename TWriter>
|
template <typename TReader, typename TWriter>
|
||||||
inline const char *
|
inline const char *
|
||||||
ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseString() {
|
ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseString() {
|
||||||
typename TypeTraits::RemoveReference<TWriter>::type::String str =
|
typename RemoveReference<TWriter>::type::String str = _writer.startString();
|
||||||
_writer.startString();
|
|
||||||
|
|
||||||
skipSpacesAndComments(_reader);
|
skipSpacesAndComments(_reader);
|
||||||
char c = _reader.current();
|
char c = _reader.current();
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
class DefaultAllocator {
|
class DefaultAllocator {
|
||||||
public:
|
public:
|
||||||
void* allocate(size_t size) {
|
void* allocate(size_t size) {
|
||||||
@ -151,6 +152,7 @@ class DynamicJsonBufferBase
|
|||||||
Block* _head;
|
Block* _head;
|
||||||
size_t _nextBlockCapacity;
|
size_t _nextBlockCapacity;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
@ -163,5 +165,6 @@ class DynamicJsonBufferBase
|
|||||||
// Implements a JsonBuffer with dynamic memory allocation.
|
// Implements a JsonBuffer with dynamic memory allocation.
|
||||||
// You are strongly encouraged to consider using StaticJsonBuffer which is much
|
// You are strongly encouraged to consider using StaticJsonBuffer which is much
|
||||||
// more suitable for embedded systems.
|
// more suitable for embedded systems.
|
||||||
typedef DynamicJsonBufferBase<DefaultAllocator> DynamicJsonBuffer;
|
typedef Internals::DynamicJsonBufferBase<Internals::DefaultAllocator>
|
||||||
|
DynamicJsonBuffer;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,9 @@ namespace ArduinoJson {
|
|||||||
// Forward declarations
|
// Forward declarations
|
||||||
class JsonObject;
|
class JsonObject;
|
||||||
class JsonBuffer;
|
class JsonBuffer;
|
||||||
|
namespace Internals {
|
||||||
class JsonArraySubscript;
|
class JsonArraySubscript;
|
||||||
|
}
|
||||||
|
|
||||||
// An array of JsonVariant.
|
// An array of JsonVariant.
|
||||||
//
|
//
|
||||||
@ -47,10 +49,10 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
|
|||||||
: Internals::List<JsonVariant>(buffer) {}
|
: Internals::List<JsonVariant>(buffer) {}
|
||||||
|
|
||||||
// Gets the value at the specified index
|
// Gets the value at the specified index
|
||||||
const JsonArraySubscript operator[](size_t index) const;
|
const Internals::JsonArraySubscript operator[](size_t index) const;
|
||||||
|
|
||||||
// Gets or sets the value at specified index
|
// Gets or sets the value at specified index
|
||||||
JsonArraySubscript operator[](size_t index);
|
Internals::JsonArraySubscript operator[](size_t index);
|
||||||
|
|
||||||
// Adds the specified value at the end of the array.
|
// Adds the specified value at the end of the array.
|
||||||
//
|
//
|
||||||
@ -97,8 +99,7 @@ class JsonArray : public Internals::JsonPrintable<JsonArray>,
|
|||||||
// bool set(size_t index, TValue value, uint8_t decimals);
|
// bool set(size_t index, TValue value, uint8_t decimals);
|
||||||
// TValue = float, double
|
// TValue = float, double
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsFloatingPoint<T>::value,
|
typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value, bool>::type
|
||||||
bool>::type
|
|
||||||
set(size_t index, T value, uint8_t decimals) {
|
set(size_t index, T value, uint8_t decimals) {
|
||||||
return set_impl<const JsonVariant &>(index, JsonVariant(value, decimals));
|
return set_impl<const JsonVariant &>(index, JsonVariant(value, decimals));
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
||||||
public:
|
public:
|
||||||
FORCE_INLINE JsonArraySubscript(JsonArray& array, size_t index)
|
FORCE_INLINE JsonArraySubscript(JsonArray& array, size_t index)
|
||||||
@ -47,7 +48,7 @@ class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
FORCE_INLINE typename Internals::JsonVariantAs<T>::type as() const {
|
FORCE_INLINE typename JsonVariantAs<T>::type as() const {
|
||||||
return _array.get<T>(_index);
|
return _array.get<T>(_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,21 +87,6 @@ class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
|
|||||||
const size_t _index;
|
const size_t _index;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if ARDUINOJSON_ENABLE_STD_STREAM
|
|
||||||
inline std::ostream& operator<<(std::ostream& os,
|
|
||||||
const JsonArraySubscript& source) {
|
|
||||||
return source.printTo(os);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline JsonArraySubscript JsonArray::operator[](size_t index) {
|
|
||||||
return JsonArraySubscript(*this, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const JsonArraySubscript JsonArray::operator[](size_t index) const {
|
|
||||||
return JsonArraySubscript(*const_cast<JsonArray*>(this), index);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TImpl>
|
template <typename TImpl>
|
||||||
inline JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[](
|
inline JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[](
|
||||||
size_t index) {
|
size_t index) {
|
||||||
@ -113,7 +99,23 @@ inline const JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[](
|
|||||||
return impl()->template as<JsonArray>()[index];
|
return impl()->template as<JsonArray>()[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ArduinoJson
|
#if ARDUINOJSON_ENABLE_STD_STREAM
|
||||||
|
inline std::ostream& operator<<(std::ostream& os,
|
||||||
|
const JsonArraySubscript& source) {
|
||||||
|
return source.printTo(os);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Internals::JsonArraySubscript JsonArray::operator[](size_t index) {
|
||||||
|
return Internals::JsonArraySubscript(*this, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const Internals::JsonArraySubscript JsonArray::operator[](
|
||||||
|
size_t index) const {
|
||||||
|
return Internals::JsonArraySubscript(*const_cast<JsonArray*>(this), index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
@ -42,7 +42,7 @@ class JsonBuffer : Internals::NonCopyable {
|
|||||||
// TValue = const std::string&, const String&,
|
// TValue = const std::string&, const String&,
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
DEPRECATED("char* are duplicated, you don't need strdup() anymore")
|
DEPRECATED("char* are duplicated, you don't need strdup() anymore")
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value,
|
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
|
||||||
const char *>::type strdup(const TString &src) {
|
const char *>::type strdup(const TString &src) {
|
||||||
return Internals::StringTraits<TString>::duplicate(src, this);
|
return Internals::StringTraits<TString>::duplicate(src, this);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "Deserialization/JsonParser.hpp"
|
#include "Deserialization/JsonParser.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
template <typename TDerived>
|
template <typename TDerived>
|
||||||
class JsonBufferBase : public JsonBuffer {
|
class JsonBufferBase : public JsonBuffer {
|
||||||
public:
|
public:
|
||||||
@ -25,7 +26,7 @@ class JsonBufferBase : public JsonBuffer {
|
|||||||
// JsonArray& parseArray(TString);
|
// JsonArray& parseArray(TString);
|
||||||
// TString = const std::string&, const String&
|
// TString = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value,
|
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
|
||||||
JsonArray &>::type
|
JsonArray &>::type
|
||||||
parseArray(const TString &json,
|
parseArray(const TString &json,
|
||||||
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
|
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
|
||||||
@ -62,7 +63,7 @@ class JsonBufferBase : public JsonBuffer {
|
|||||||
// JsonObject& parseObject(TString);
|
// JsonObject& parseObject(TString);
|
||||||
// TString = const std::string&, const String&
|
// TString = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value,
|
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
|
||||||
JsonObject &>::type
|
JsonObject &>::type
|
||||||
parseObject(const TString &json,
|
parseObject(const TString &json,
|
||||||
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
|
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
|
||||||
@ -91,7 +92,7 @@ class JsonBufferBase : public JsonBuffer {
|
|||||||
// JsonVariant parse(TString);
|
// JsonVariant parse(TString);
|
||||||
// TString = const std::string&, const String&
|
// TString = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TString>::value,
|
typename Internals::EnableIf<!Internals::IsArray<TString>::value,
|
||||||
JsonVariant>::type
|
JsonVariant>::type
|
||||||
parse(const TString &json,
|
parse(const TString &json,
|
||||||
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
|
uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
|
||||||
@ -123,3 +124,4 @@ class JsonBufferBase : public JsonBuffer {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -26,6 +26,10 @@ namespace ArduinoJson {
|
|||||||
// Forward declarations
|
// Forward declarations
|
||||||
class JsonArray;
|
class JsonArray;
|
||||||
class JsonBuffer;
|
class JsonBuffer;
|
||||||
|
namespace Internals {
|
||||||
|
template <typename>
|
||||||
|
class JsonObjectSubscript;
|
||||||
|
}
|
||||||
|
|
||||||
// A dictionary of JsonVariant indexed by string (char*)
|
// A dictionary of JsonVariant indexed by string (char*)
|
||||||
//
|
//
|
||||||
@ -50,15 +54,16 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
|
|||||||
// JsonObjectSubscript operator[](TKey)
|
// JsonObjectSubscript operator[](TKey)
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
JsonObjectSubscript<const TString&> operator[](const TString& key) {
|
Internals::JsonObjectSubscript<const TString&> operator[](
|
||||||
return JsonObjectSubscript<const TString&>(*this, key);
|
const TString& key) {
|
||||||
|
return Internals::JsonObjectSubscript<const TString&>(*this, key);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// JsonObjectSubscript operator[](TKey)
|
// JsonObjectSubscript operator[](TKey)
|
||||||
// TKey = char*, const char*, char[], const char[N], const FlashStringHelper*
|
// TKey = char*, const char*, char[], const char[N], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
JsonObjectSubscript<TString*> operator[](TString* key) {
|
Internals::JsonObjectSubscript<TString*> operator[](TString* key) {
|
||||||
return JsonObjectSubscript<TString*>(*this, key);
|
return Internals::JsonObjectSubscript<TString*>(*this, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the value associated with the specified key.
|
// Gets the value associated with the specified key.
|
||||||
@ -66,17 +71,19 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
|
|||||||
// const JsonObjectSubscript operator[](TKey) const;
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
const JsonObjectSubscript<const TString&> operator[](
|
const Internals::JsonObjectSubscript<const TString&> operator[](
|
||||||
const TString& key) const {
|
const TString& key) const {
|
||||||
return JsonObjectSubscript<const TString&>(*const_cast<JsonObject*>(this),
|
return Internals::JsonObjectSubscript<const TString&>(
|
||||||
key);
|
*const_cast<JsonObject*>(this), key);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// const JsonObjectSubscript operator[](TKey) const;
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = const char*, const char[N], const FlashStringHelper*
|
// TKey = const char*, const char[N], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
const JsonObjectSubscript<TString*> operator[](TString* key) const {
|
const Internals::JsonObjectSubscript<TString*> operator[](
|
||||||
return JsonObjectSubscript<TString*>(*const_cast<JsonObject*>(this), key);
|
TString* key) const {
|
||||||
|
return Internals::JsonObjectSubscript<TString*>(
|
||||||
|
*const_cast<JsonObject*>(this), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the specified key with the specified value.
|
// Sets the specified key with the specified value.
|
||||||
@ -120,7 +127,7 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
|
|||||||
// TValue = float, double
|
// TValue = float, double
|
||||||
template <typename TValue, typename TString>
|
template <typename TValue, typename TString>
|
||||||
DEPRECATED("Second argument is not supported anymore")
|
DEPRECATED("Second argument is not supported anymore")
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsFloatingPoint<TValue>::value,
|
typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
|
||||||
bool>::type
|
bool>::type
|
||||||
set(const TString& key, TValue value, uint8_t) {
|
set(const TString& key, TValue value, uint8_t) {
|
||||||
return set_impl<const TString&, const JsonVariant&>(key,
|
return set_impl<const TString&, const JsonVariant&>(key,
|
||||||
@ -132,7 +139,7 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
|
|||||||
// TValue = float, double
|
// TValue = float, double
|
||||||
template <typename TValue, typename TString>
|
template <typename TValue, typename TString>
|
||||||
DEPRECATED("Second argument is not supported anymore")
|
DEPRECATED("Second argument is not supported anymore")
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsFloatingPoint<TValue>::value,
|
typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
|
||||||
bool>::type
|
bool>::type
|
||||||
set(TString* key, TValue value, uint8_t) {
|
set(TString* key, TValue value, uint8_t) {
|
||||||
return set_impl<TString*, const JsonVariant&>(key, JsonVariant(value));
|
return set_impl<TString*, const JsonVariant&>(key, JsonVariant(value));
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
|
||||||
template <typename TStringRef>
|
template <typename TStringRef>
|
||||||
class JsonObjectSubscript
|
class JsonObjectSubscript
|
||||||
@ -35,9 +36,7 @@ class JsonObjectSubscript
|
|||||||
// TValue = bool, char, long, int, short, float, double,
|
// TValue = bool, char, long, int, short, float, double,
|
||||||
// std::string, String, JsonArray, JsonObject
|
// std::string, String, JsonArray, JsonObject
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
FORCE_INLINE
|
FORCE_INLINE typename EnableIf<!IsArray<TValue>::value, this_type&>::type
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TValue>::value,
|
|
||||||
this_type&>::type
|
|
||||||
operator=(const TValue& src) {
|
operator=(const TValue& src) {
|
||||||
_object.set(_key, src);
|
_object.set(_key, src);
|
||||||
return *this;
|
return *this;
|
||||||
@ -56,7 +55,7 @@ class JsonObjectSubscript
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
FORCE_INLINE typename Internals::JsonVariantAs<TValue>::type as() const {
|
FORCE_INLINE typename JsonVariantAs<TValue>::type as() const {
|
||||||
return _object.get<TValue>(_key);
|
return _object.get<TValue>(_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,10 +70,8 @@ class JsonObjectSubscript
|
|||||||
// TValue = bool, char, long, int, short, float, double, RawJson, JsonVariant,
|
// TValue = bool, char, long, int, short, float, double, RawJson, JsonVariant,
|
||||||
// std::string, String, JsonArray, JsonObject
|
// std::string, String, JsonArray, JsonObject
|
||||||
template <typename TValue>
|
template <typename TValue>
|
||||||
FORCE_INLINE
|
FORCE_INLINE typename EnableIf<!IsArray<TValue>::value, bool>::type set(
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsArray<TValue>::value,
|
const TValue& value) {
|
||||||
bool>::type
|
|
||||||
set(const TValue& value) {
|
|
||||||
return _object.set(_key, value);
|
return _object.set(_key, value);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@ -105,7 +102,8 @@ inline std::ostream& operator<<(std::ostream& os,
|
|||||||
return source.printTo(os);
|
return source.printTo(os);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} // namespace ArduinoJson
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
@ -36,7 +36,7 @@ class JsonObject;
|
|||||||
// - a char, short, int or a long (signed or unsigned)
|
// - a char, short, int or a long (signed or unsigned)
|
||||||
// - a string (const char*)
|
// - a string (const char*)
|
||||||
// - a reference to a JsonArray or JsonObject
|
// - a reference to a JsonArray or JsonObject
|
||||||
class JsonVariant : public JsonVariantBase<JsonVariant> {
|
class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
|
||||||
template <typename Print>
|
template <typename Print>
|
||||||
friend class Internals::JsonSerializer;
|
friend class Internals::JsonSerializer;
|
||||||
|
|
||||||
@ -56,8 +56,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// JsonVariant(double value);
|
// JsonVariant(double value);
|
||||||
// JsonVariant(float value);
|
// JsonVariant(float value);
|
||||||
template <typename T>
|
template <typename T>
|
||||||
JsonVariant(T value, typename TypeTraits::EnableIf<
|
JsonVariant(T value, typename Internals::EnableIf<
|
||||||
TypeTraits::IsFloatingPoint<T>::value>::type * = 0) {
|
Internals::IsFloatingPoint<T>::value>::type * = 0) {
|
||||||
using namespace Internals;
|
using namespace Internals;
|
||||||
_type = JSON_FLOAT;
|
_type = JSON_FLOAT;
|
||||||
_content.asFloat = static_cast<JsonFloat>(value);
|
_content.asFloat = static_cast<JsonFloat>(value);
|
||||||
@ -65,8 +65,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
DEPRECATED("Second argument is not supported anymore")
|
DEPRECATED("Second argument is not supported anymore")
|
||||||
JsonVariant(T value, uint8_t,
|
JsonVariant(T value, uint8_t,
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsFloatingPoint<T>::value>::type * = 0) {
|
Internals::IsFloatingPoint<T>::value>::type * = 0) {
|
||||||
using namespace Internals;
|
using namespace Internals;
|
||||||
_type = JSON_FLOAT;
|
_type = JSON_FLOAT;
|
||||||
_content.asFloat = static_cast<JsonFloat>(value);
|
_content.asFloat = static_cast<JsonFloat>(value);
|
||||||
@ -79,9 +79,11 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// JsonVariant(signed long)
|
// JsonVariant(signed long)
|
||||||
// JsonVariant(signed char)
|
// JsonVariant(signed char)
|
||||||
template <typename T>
|
template <typename T>
|
||||||
JsonVariant(T value, typename TypeTraits::EnableIf<
|
JsonVariant(
|
||||||
TypeTraits::IsSignedIntegral<T>::value ||
|
T value,
|
||||||
TypeTraits::IsSame<T, char>::value>::type * = 0) {
|
typename Internals::EnableIf<Internals::IsSignedIntegral<T>::value ||
|
||||||
|
Internals::IsSame<T, char>::value>::type * =
|
||||||
|
0) {
|
||||||
using namespace Internals;
|
using namespace Internals;
|
||||||
if (value >= 0) {
|
if (value >= 0) {
|
||||||
_type = JSON_POSITIVE_INTEGER;
|
_type = JSON_POSITIVE_INTEGER;
|
||||||
@ -96,8 +98,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// JsonVariant(unsigned long)
|
// JsonVariant(unsigned long)
|
||||||
template <typename T>
|
template <typename T>
|
||||||
JsonVariant(T value,
|
JsonVariant(T value,
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsUnsignedIntegral<T>::value>::type * = 0) {
|
Internals::IsUnsignedIntegral<T>::value>::type * = 0) {
|
||||||
using namespace Internals;
|
using namespace Internals;
|
||||||
_type = JSON_POSITIVE_INTEGER;
|
_type = JSON_POSITIVE_INTEGER;
|
||||||
_content.asInteger = static_cast<JsonUInt>(value);
|
_content.asInteger = static_cast<JsonUInt>(value);
|
||||||
@ -110,7 +112,7 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
JsonVariant(
|
JsonVariant(
|
||||||
const TChar *value,
|
const TChar *value,
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsChar<TChar>::value>::type * =
|
typename Internals::EnableIf<Internals::IsChar<TChar>::value>::type * =
|
||||||
0) {
|
0) {
|
||||||
_type = Internals::JSON_STRING;
|
_type = Internals::JSON_STRING;
|
||||||
_content.asString = reinterpret_cast<const char *>(value);
|
_content.asString = reinterpret_cast<const char *>(value);
|
||||||
@ -144,14 +146,13 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// unsigned int as<unsigned int>() const;
|
// unsigned int as<unsigned int>() const;
|
||||||
// unsigned long as<unsigned long>() const;
|
// unsigned long as<unsigned long>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
const typename TypeTraits::EnableIf<TypeTraits::IsIntegral<T>::value, T>::type
|
const typename Internals::EnableIf<Internals::IsIntegral<T>::value, T>::type
|
||||||
as() const {
|
as() const {
|
||||||
return variantAsInteger<T>();
|
return variantAsInteger<T>();
|
||||||
}
|
}
|
||||||
// bool as<bool>() const
|
// bool as<bool>() const
|
||||||
template <typename T>
|
template <typename T>
|
||||||
const typename TypeTraits::EnableIf<TypeTraits::IsSame<T, bool>::value,
|
const typename Internals::EnableIf<Internals::IsSame<T, bool>::value, T>::type
|
||||||
T>::type
|
|
||||||
as() const {
|
as() const {
|
||||||
return variantAsInteger<int>() != 0;
|
return variantAsInteger<int>() != 0;
|
||||||
}
|
}
|
||||||
@ -159,7 +160,7 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// double as<double>() const;
|
// double as<double>() const;
|
||||||
// float as<float>() const;
|
// float as<float>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
const typename TypeTraits::EnableIf<TypeTraits::IsFloatingPoint<T>::value,
|
const typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value,
|
||||||
T>::type
|
T>::type
|
||||||
as() const {
|
as() const {
|
||||||
return variantAsFloat<T>();
|
return variantAsFloat<T>();
|
||||||
@ -168,8 +169,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// const char* as<const char*>() const;
|
// const char* as<const char*>() const;
|
||||||
// const char* as<char*>() const;
|
// const char* as<char*>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsSame<T, const char *>::value ||
|
typename Internals::EnableIf<Internals::IsSame<T, const char *>::value ||
|
||||||
TypeTraits::IsSame<T, char *>::value,
|
Internals::IsSame<T, char *>::value,
|
||||||
const char *>::type
|
const char *>::type
|
||||||
as() const {
|
as() const {
|
||||||
return variantAsString();
|
return variantAsString();
|
||||||
@ -178,7 +179,7 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// std::string as<std::string>() const;
|
// std::string as<std::string>() const;
|
||||||
// String as<String>() const;
|
// String as<String>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<Internals::StringTraits<T>::has_append, T>::type
|
typename Internals::EnableIf<Internals::StringTraits<T>::has_append, T>::type
|
||||||
as() const {
|
as() const {
|
||||||
const char *cstr = variantAsString();
|
const char *cstr = variantAsString();
|
||||||
if (cstr) return T(cstr);
|
if (cstr) return T(cstr);
|
||||||
@ -190,8 +191,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// JsonArray& as<JsonArray> const;
|
// JsonArray& as<JsonArray> const;
|
||||||
// JsonArray& as<JsonArray&> const;
|
// JsonArray& as<JsonArray&> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsSame<typename TypeTraits::RemoveReference<T>::type,
|
Internals::IsSame<typename Internals::RemoveReference<T>::type,
|
||||||
JsonArray>::value,
|
JsonArray>::value,
|
||||||
JsonArray &>::type
|
JsonArray &>::type
|
||||||
as() const {
|
as() const {
|
||||||
@ -200,8 +201,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
//
|
//
|
||||||
// const JsonArray& as<const JsonArray&> const;
|
// const JsonArray& as<const JsonArray&> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsSame<typename TypeTraits::RemoveReference<T>::type,
|
Internals::IsSame<typename Internals::RemoveReference<T>::type,
|
||||||
const JsonArray>::value,
|
const JsonArray>::value,
|
||||||
const JsonArray &>::type
|
const JsonArray &>::type
|
||||||
as() const {
|
as() const {
|
||||||
@ -211,8 +212,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// JsonObject& as<JsonObject> const;
|
// JsonObject& as<JsonObject> const;
|
||||||
// JsonObject& as<JsonObject&> const;
|
// JsonObject& as<JsonObject&> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsSame<typename TypeTraits::RemoveReference<T>::type,
|
Internals::IsSame<typename Internals::RemoveReference<T>::type,
|
||||||
JsonObject>::value,
|
JsonObject>::value,
|
||||||
JsonObject &>::type
|
JsonObject &>::type
|
||||||
as() const {
|
as() const {
|
||||||
@ -222,8 +223,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// JsonObject& as<const JsonObject> const;
|
// JsonObject& as<const JsonObject> const;
|
||||||
// JsonObject& as<const JsonObject&> const;
|
// JsonObject& as<const JsonObject&> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsSame<typename TypeTraits::RemoveReference<T>::type,
|
Internals::IsSame<typename Internals::RemoveReference<T>::type,
|
||||||
const JsonObject>::value,
|
const JsonObject>::value,
|
||||||
const JsonObject &>::type
|
const JsonObject &>::type
|
||||||
as() const {
|
as() const {
|
||||||
@ -232,7 +233,7 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
//
|
//
|
||||||
// JsonVariant as<JsonVariant> const;
|
// JsonVariant as<JsonVariant> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsSame<T, JsonVariant>::value,
|
typename Internals::EnableIf<Internals::IsSame<T, JsonVariant>::value,
|
||||||
T>::type
|
T>::type
|
||||||
as() const {
|
as() const {
|
||||||
return *this;
|
return *this;
|
||||||
@ -251,23 +252,22 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// bool is<unsigned int>() const;
|
// bool is<unsigned int>() const;
|
||||||
// bool is<unsigned long>() const;
|
// bool is<unsigned long>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsIntegral<T>::value, bool>::type
|
typename Internals::EnableIf<Internals::IsIntegral<T>::value, bool>::type is()
|
||||||
is() const {
|
const {
|
||||||
return variantIsInteger();
|
return variantIsInteger();
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool is<double>() const;
|
// bool is<double>() const;
|
||||||
// bool is<float>() const;
|
// bool is<float>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsFloatingPoint<T>::value,
|
typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value, bool>::type
|
||||||
bool>::type
|
|
||||||
is() const {
|
is() const {
|
||||||
return variantIsFloat();
|
return variantIsFloat();
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// bool is<bool>() const
|
// bool is<bool>() const
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsSame<T, bool>::value, bool>::type
|
typename Internals::EnableIf<Internals::IsSame<T, bool>::value, bool>::type
|
||||||
is() const {
|
is() const {
|
||||||
return variantIsBoolean();
|
return variantIsBoolean();
|
||||||
}
|
}
|
||||||
@ -275,8 +275,8 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// bool is<const char*>() const;
|
// bool is<const char*>() const;
|
||||||
// bool is<char*>() const;
|
// bool is<char*>() const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsSame<T, const char *>::value ||
|
typename Internals::EnableIf<Internals::IsSame<T, const char *>::value ||
|
||||||
TypeTraits::IsSame<T, char *>::value,
|
Internals::IsSame<T, char *>::value,
|
||||||
bool>::type
|
bool>::type
|
||||||
is() const {
|
is() const {
|
||||||
return variantIsString();
|
return variantIsString();
|
||||||
@ -286,10 +286,9 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// bool is<JsonArray&> const;
|
// bool is<JsonArray&> const;
|
||||||
// bool is<const JsonArray&> const;
|
// bool is<const JsonArray&> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsSame<
|
Internals::IsSame<typename Internals::RemoveConst<
|
||||||
typename TypeTraits::RemoveConst<
|
typename Internals::RemoveReference<T>::type>::type,
|
||||||
typename TypeTraits::RemoveReference<T>::type>::type,
|
|
||||||
JsonArray>::value,
|
JsonArray>::value,
|
||||||
bool>::type
|
bool>::type
|
||||||
is() const {
|
is() const {
|
||||||
@ -300,10 +299,9 @@ class JsonVariant : public JsonVariantBase<JsonVariant> {
|
|||||||
// bool is<JsonObject&> const;
|
// bool is<JsonObject&> const;
|
||||||
// bool is<const JsonObject&> const;
|
// bool is<const JsonObject&> const;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
typename TypeTraits::EnableIf<
|
typename Internals::EnableIf<
|
||||||
TypeTraits::IsSame<
|
Internals::IsSame<typename Internals::RemoveConst<
|
||||||
typename TypeTraits::RemoveConst<
|
typename Internals::RemoveReference<T>::type>::type,
|
||||||
typename TypeTraits::RemoveReference<T>::type>::type,
|
|
||||||
JsonObject>::value,
|
JsonObject>::value,
|
||||||
bool>::type
|
bool>::type
|
||||||
is() const {
|
is() const {
|
||||||
|
@ -11,12 +11,14 @@
|
|||||||
#include "Serialization/JsonPrintable.hpp"
|
#include "Serialization/JsonPrintable.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
|
||||||
template <typename TImpl>
|
template <typename TImpl>
|
||||||
class JsonVariantBase : public Internals::JsonPrintable<TImpl>,
|
class JsonVariantBase : public JsonPrintable<TImpl>,
|
||||||
public JsonVariantCasts<TImpl>,
|
public JsonVariantCasts<TImpl>,
|
||||||
public JsonVariantComparisons<TImpl>,
|
public JsonVariantComparisons<TImpl>,
|
||||||
public JsonVariantOr<TImpl>,
|
public JsonVariantOr<TImpl>,
|
||||||
public JsonVariantSubscripts<TImpl>,
|
public JsonVariantSubscripts<TImpl>,
|
||||||
public TypeTraits::JsonVariantTag {};
|
public JsonVariantTag {};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "Polyfills/attributes.hpp"
|
#include "Polyfills/attributes.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
|
||||||
template <typename TImpl>
|
template <typename TImpl>
|
||||||
class JsonVariantCasts {
|
class JsonVariantCasts {
|
||||||
@ -55,3 +56,4 @@ class JsonVariantCasts {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "TypeTraits/IsVariant.hpp"
|
#include "TypeTraits/IsVariant.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
|
||||||
template <typename TImpl>
|
template <typename TImpl>
|
||||||
class JsonVariantComparisons {
|
class JsonVariantComparisons {
|
||||||
@ -20,9 +21,7 @@ class JsonVariantComparisons {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename TComparand>
|
template <typename TComparand>
|
||||||
friend
|
friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsVariant<TComparand>::value,
|
|
||||||
bool>::type
|
|
||||||
operator==(TComparand comparand, const JsonVariantComparisons &variant) {
|
operator==(TComparand comparand, const JsonVariantComparisons &variant) {
|
||||||
return variant.equals(comparand);
|
return variant.equals(comparand);
|
||||||
}
|
}
|
||||||
@ -34,9 +33,7 @@ class JsonVariantComparisons {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename TComparand>
|
template <typename TComparand>
|
||||||
friend
|
friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
|
||||||
typename TypeTraits::EnableIf<!TypeTraits::IsVariant<TComparand>::value,
|
|
||||||
bool>::type
|
|
||||||
operator!=(TComparand comparand, const JsonVariantComparisons &variant) {
|
operator!=(TComparand comparand, const JsonVariantComparisons &variant) {
|
||||||
return !variant.equals(comparand);
|
return !variant.equals(comparand);
|
||||||
}
|
}
|
||||||
@ -94,7 +91,7 @@ class JsonVariantComparisons {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
const typename Internals::JsonVariantAs<T>::type as() const {
|
const typename JsonVariantAs<T>::type as() const {
|
||||||
return impl()->template as<T>();
|
return impl()->template as<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,17 +101,15 @@ class JsonVariantComparisons {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
typename TypeTraits::EnableIf<Internals::StringTraits<TString>::has_equals,
|
typename EnableIf<StringTraits<TString>::has_equals, bool>::type equals(
|
||||||
bool>::type
|
const TString &comparand) const {
|
||||||
equals(const TString &comparand) const {
|
|
||||||
const char *value = as<const char *>();
|
const char *value = as<const char *>();
|
||||||
return Internals::StringTraits<TString>::equals(comparand, value);
|
return StringTraits<TString>::equals(comparand, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TComparand>
|
template <typename TComparand>
|
||||||
typename TypeTraits::EnableIf<
|
typename EnableIf<!IsVariant<TComparand>::value &&
|
||||||
!TypeTraits::IsVariant<TComparand>::value &&
|
!StringTraits<TComparand>::has_equals,
|
||||||
!Internals::StringTraits<TComparand>::has_equals,
|
|
||||||
bool>::type
|
bool>::type
|
||||||
equals(const TComparand &comparand) const {
|
equals(const TComparand &comparand) const {
|
||||||
return as<TComparand>() == comparand;
|
return as<TComparand>() == comparand;
|
||||||
@ -140,3 +135,4 @@ class JsonVariantComparisons {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -58,7 +58,7 @@ inline T JsonVariant::variantAsInteger() const {
|
|||||||
return T(~_content.asInteger + 1);
|
return T(~_content.asInteger + 1);
|
||||||
case JSON_STRING:
|
case JSON_STRING:
|
||||||
case JSON_UNPARSED:
|
case JSON_UNPARSED:
|
||||||
return Polyfills::parseInteger<T>(_content.asString);
|
return parseInteger<T>(_content.asString);
|
||||||
default:
|
default:
|
||||||
return T(_content.asFloat);
|
return T(_content.asFloat);
|
||||||
}
|
}
|
||||||
@ -86,7 +86,7 @@ inline T JsonVariant::variantAsFloat() const {
|
|||||||
return -static_cast<T>(_content.asInteger);
|
return -static_cast<T>(_content.asInteger);
|
||||||
case JSON_STRING:
|
case JSON_STRING:
|
||||||
case JSON_UNPARSED:
|
case JSON_UNPARSED:
|
||||||
return Polyfills::parseFloat<T>(_content.asString);
|
return parseFloat<T>(_content.asString);
|
||||||
default:
|
default:
|
||||||
return static_cast<T>(_content.asFloat);
|
return static_cast<T>(_content.asFloat);
|
||||||
}
|
}
|
||||||
@ -106,7 +106,7 @@ inline bool JsonVariant::variantIsInteger() const {
|
|||||||
using namespace Internals;
|
using namespace Internals;
|
||||||
|
|
||||||
return _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER ||
|
return _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER ||
|
||||||
(_type == JSON_UNPARSED && Polyfills::isInteger(_content.asString));
|
(_type == JSON_UNPARSED && isInteger(_content.asString));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool JsonVariant::variantIsFloat() const {
|
inline bool JsonVariant::variantIsFloat() const {
|
||||||
@ -114,7 +114,7 @@ inline bool JsonVariant::variantIsFloat() const {
|
|||||||
|
|
||||||
return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER ||
|
return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER ||
|
||||||
_type == JSON_NEGATIVE_INTEGER ||
|
_type == JSON_NEGATIVE_INTEGER ||
|
||||||
(_type == JSON_UNPARSED && Polyfills::isFloat(_content.asString));
|
(_type == JSON_UNPARSED && isFloat(_content.asString));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ARDUINOJSON_ENABLE_STD_STREAM
|
#if ARDUINOJSON_ENABLE_STD_STREAM
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "Polyfills/attributes.hpp"
|
#include "Polyfills/attributes.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
|
||||||
template <typename TImpl>
|
template <typename TImpl>
|
||||||
class JsonVariantOr {
|
class JsonVariantOr {
|
||||||
@ -34,3 +35,4 @@ class JsonVariantOr {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "TypeTraits/EnableIf.hpp"
|
#include "TypeTraits/EnableIf.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
|
||||||
// Forward declarations.
|
// Forward declarations.
|
||||||
class JsonArraySubscript;
|
class JsonArraySubscript;
|
||||||
@ -41,8 +42,8 @@ class JsonVariantSubscripts {
|
|||||||
// const JsonObjectSubscript operator[](TKey) const;
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename TypeTraits::EnableIf<
|
FORCE_INLINE
|
||||||
Internals::StringTraits<TString>::has_equals,
|
typename EnableIf<StringTraits<TString>::has_equals,
|
||||||
const JsonObjectSubscript<const TString &> >::type
|
const JsonObjectSubscript<const TString &> >::type
|
||||||
operator[](const TString &key) const {
|
operator[](const TString &key) const {
|
||||||
return impl()->template as<JsonObject>()[key];
|
return impl()->template as<JsonObject>()[key];
|
||||||
@ -51,8 +52,7 @@ class JsonVariantSubscripts {
|
|||||||
// const JsonObjectSubscript operator[](TKey) const;
|
// const JsonObjectSubscript operator[](TKey) const;
|
||||||
// TKey = const std::string&, const String&
|
// TKey = const std::string&, const String&
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename TypeTraits::EnableIf<
|
FORCE_INLINE typename EnableIf<StringTraits<TString>::has_equals,
|
||||||
Internals::StringTraits<TString>::has_equals,
|
|
||||||
JsonObjectSubscript<const TString &> >::type
|
JsonObjectSubscript<const TString &> >::type
|
||||||
operator[](const TString &key) {
|
operator[](const TString &key) {
|
||||||
return impl()->template as<JsonObject>()[key];
|
return impl()->template as<JsonObject>()[key];
|
||||||
@ -61,8 +61,7 @@ class JsonVariantSubscripts {
|
|||||||
// JsonObjectSubscript operator[](TKey);
|
// JsonObjectSubscript operator[](TKey);
|
||||||
// TKey = const char*, const char[N], const FlashStringHelper*
|
// TKey = const char*, const char[N], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename TypeTraits::EnableIf<
|
FORCE_INLINE typename EnableIf<StringTraits<const TString *>::has_equals,
|
||||||
Internals::StringTraits<const TString *>::has_equals,
|
|
||||||
JsonObjectSubscript<const TString *> >::type
|
JsonObjectSubscript<const TString *> >::type
|
||||||
operator[](const TString *key) {
|
operator[](const TString *key) {
|
||||||
return impl()->template as<JsonObject>()[key];
|
return impl()->template as<JsonObject>()[key];
|
||||||
@ -71,8 +70,8 @@ class JsonVariantSubscripts {
|
|||||||
// JsonObjectSubscript operator[](TKey);
|
// JsonObjectSubscript operator[](TKey);
|
||||||
// TKey = const char*, const char[N], const FlashStringHelper*
|
// TKey = const char*, const char[N], const FlashStringHelper*
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename TypeTraits::EnableIf<
|
FORCE_INLINE
|
||||||
Internals::StringTraits<TString *>::has_equals,
|
typename EnableIf<StringTraits<TString *>::has_equals,
|
||||||
const JsonObjectSubscript<const TString *> >::type
|
const JsonObjectSubscript<const TString *> >::type
|
||||||
operator[](const TString *key) const {
|
operator[](const TString *key) const {
|
||||||
return impl()->template as<JsonObject>()[key];
|
return impl()->template as<JsonObject>()[key];
|
||||||
@ -84,3 +83,4 @@ class JsonVariantSubscripts {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace Polyfills {
|
namespace Internals {
|
||||||
|
|
||||||
inline bool isdigit(char c) {
|
inline bool isdigit(char c) {
|
||||||
return '0' <= c && c <= '9';
|
return '0' <= c && c <= '9';
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "./ctype.hpp"
|
#include "./ctype.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace Polyfills {
|
namespace Internals {
|
||||||
|
|
||||||
inline bool isFloat(const char* s) {
|
inline bool isFloat(const char* s) {
|
||||||
if (!s) return false;
|
if (!s) return false;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "./ctype.hpp"
|
#include "./ctype.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace Polyfills {
|
namespace Internals {
|
||||||
|
|
||||||
inline bool isInteger(const char* s) {
|
inline bool isInteger(const char* s) {
|
||||||
if (!s) return false;
|
if (!s) return false;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace Polyfills {
|
namespace Internals {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool isNaN(T x) {
|
bool isNaN(T x) {
|
||||||
return x != x;
|
return x != x;
|
||||||
|
@ -9,11 +9,11 @@
|
|||||||
#include "./math.hpp"
|
#include "./math.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace Polyfills {
|
namespace Internals {
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline T parseFloat(const char* s) {
|
inline T parseFloat(const char* s) {
|
||||||
typedef TypeTraits::FloatTraits<T> traits;
|
typedef FloatTraits<T> traits;
|
||||||
typedef typename traits::mantissa_type mantissa_t;
|
typedef typename traits::mantissa_type mantissa_t;
|
||||||
typedef typename traits::exponent_type exponent_t;
|
typedef typename traits::exponent_type exponent_t;
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "./ctype.hpp"
|
#include "./ctype.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace Polyfills {
|
namespace Internals {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T parseInteger(const char *s) {
|
T parseInteger(const char *s) {
|
||||||
if (!s) return 0; // NULL
|
if (!s) return 0; // NULL
|
||||||
|
@ -56,7 +56,7 @@ struct FloatParts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int16_t normalize(TFloat& value) {
|
static int16_t normalize(TFloat& value) {
|
||||||
typedef TypeTraits::FloatTraits<TFloat> traits;
|
typedef FloatTraits<TFloat> traits;
|
||||||
int16_t powersOf10 = 0;
|
int16_t powersOf10 = 0;
|
||||||
|
|
||||||
int8_t index = sizeof(TFloat) == 8 ? 8 : 5;
|
int8_t index = sizeof(TFloat) == 8 ? 8 : 5;
|
||||||
|
@ -29,8 +29,8 @@ template <typename T>
|
|||||||
class JsonPrintable {
|
class JsonPrintable {
|
||||||
public:
|
public:
|
||||||
template <typename Print>
|
template <typename Print>
|
||||||
typename TypeTraits::EnableIf<!StringTraits<Print>::has_append, size_t>::type
|
typename EnableIf<!StringTraits<Print>::has_append, size_t>::type printTo(
|
||||||
printTo(Print &print) const {
|
Print &print) const {
|
||||||
JsonWriter<Print> writer(print);
|
JsonWriter<Print> writer(print);
|
||||||
JsonSerializer<JsonWriter<Print> >::serialize(downcast(), writer);
|
JsonSerializer<JsonWriter<Print> >::serialize(downcast(), writer);
|
||||||
return writer.bytesWritten();
|
return writer.bytesWritten();
|
||||||
@ -55,8 +55,8 @@ class JsonPrintable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
typename TypeTraits::EnableIf<StringTraits<TString>::has_append, size_t>::type
|
typename EnableIf<StringTraits<TString>::has_append, size_t>::type printTo(
|
||||||
printTo(TString &str) const {
|
TString &str) const {
|
||||||
DynamicStringBuilder<TString> sb(str);
|
DynamicStringBuilder<TString> sb(str);
|
||||||
return printTo(sb);
|
return printTo(sb);
|
||||||
}
|
}
|
||||||
@ -78,14 +78,14 @@ class JsonPrintable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Print>
|
template <typename Print>
|
||||||
typename TypeTraits::EnableIf<!StringTraits<Print>::has_append, size_t>::type
|
typename EnableIf<!StringTraits<Print>::has_append, size_t>::type
|
||||||
prettyPrintTo(Print &print) const {
|
prettyPrintTo(Print &print) const {
|
||||||
IndentedPrint<Print> indentedPrint(print);
|
IndentedPrint<Print> indentedPrint(print);
|
||||||
return prettyPrintTo(indentedPrint);
|
return prettyPrintTo(indentedPrint);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TString>
|
template <typename TString>
|
||||||
typename TypeTraits::EnableIf<StringTraits<TString>::has_append, size_t>::type
|
typename EnableIf<StringTraits<TString>::has_append, size_t>::type
|
||||||
prettyPrintTo(TString &str) const {
|
prettyPrintTo(TString &str) const {
|
||||||
DynamicStringBuilder<TString> sb(str);
|
DynamicStringBuilder<TString> sb(str);
|
||||||
return prettyPrintTo(sb);
|
return prettyPrintTo(sb);
|
||||||
|
@ -9,14 +9,15 @@
|
|||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
|
||||||
class JsonArray;
|
class JsonArray;
|
||||||
class JsonArraySubscript;
|
|
||||||
class JsonObject;
|
class JsonObject;
|
||||||
template <typename TKey>
|
|
||||||
class JsonObjectSubscript;
|
|
||||||
class JsonVariant;
|
class JsonVariant;
|
||||||
|
|
||||||
namespace Internals {
|
namespace Internals {
|
||||||
|
|
||||||
|
class JsonArraySubscript;
|
||||||
|
template <typename TKey>
|
||||||
|
class JsonObjectSubscript;
|
||||||
|
|
||||||
template <typename Writer>
|
template <typename Writer>
|
||||||
class JsonSerializer {
|
class JsonSerializer {
|
||||||
public:
|
public:
|
||||||
|
@ -79,14 +79,14 @@ class JsonWriter {
|
|||||||
|
|
||||||
template <typename TFloat>
|
template <typename TFloat>
|
||||||
void writeFloat(TFloat value) {
|
void writeFloat(TFloat value) {
|
||||||
if (Polyfills::isNaN(value)) return writeRaw("NaN");
|
if (isNaN(value)) return writeRaw("NaN");
|
||||||
|
|
||||||
if (value < 0.0) {
|
if (value < 0.0) {
|
||||||
writeRaw('-');
|
writeRaw('-');
|
||||||
value = -value;
|
value = -value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Polyfills::isInfinity(value)) return writeRaw("Infinity");
|
if (isInfinity(value)) return writeRaw("Infinity");
|
||||||
|
|
||||||
FloatParts<TFloat> parts(value);
|
FloatParts<TFloat> parts(value);
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "JsonBufferBase.hpp"
|
#include "JsonBufferBase.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
|
namespace Internals {
|
||||||
|
|
||||||
class StaticJsonBufferBase : public JsonBufferBase<StaticJsonBufferBase> {
|
class StaticJsonBufferBase : public JsonBufferBase<StaticJsonBufferBase> {
|
||||||
public:
|
public:
|
||||||
@ -90,6 +91,7 @@ class StaticJsonBufferBase : public JsonBufferBase<StaticJsonBufferBase> {
|
|||||||
size_t _capacity;
|
size_t _capacity;
|
||||||
size_t _size;
|
size_t _size;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
@ -105,9 +107,10 @@ class StaticJsonBufferBase : public JsonBufferBase<StaticJsonBufferBase> {
|
|||||||
// The template paramenter CAPACITY specifies the capacity of the buffer in
|
// The template paramenter CAPACITY specifies the capacity of the buffer in
|
||||||
// bytes.
|
// bytes.
|
||||||
template <size_t CAPACITY>
|
template <size_t CAPACITY>
|
||||||
class StaticJsonBuffer : public StaticJsonBufferBase {
|
class StaticJsonBuffer : public Internals::StaticJsonBufferBase {
|
||||||
public:
|
public:
|
||||||
explicit StaticJsonBuffer() : StaticJsonBufferBase(_buffer, CAPACITY) {}
|
explicit StaticJsonBuffer()
|
||||||
|
: Internals::StaticJsonBufferBase(_buffer, CAPACITY) {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char _buffer[CAPACITY];
|
char _buffer[CAPACITY];
|
||||||
|
@ -49,11 +49,11 @@ struct ArduinoStreamTraits {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename TStream>
|
template <typename TStream>
|
||||||
struct StringTraits<TStream,
|
struct StringTraits<
|
||||||
|
TStream,
|
||||||
// match any type that is derived from Stream:
|
// match any type that is derived from Stream:
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsBaseOf<
|
typename EnableIf<
|
||||||
Stream, typename TypeTraits::RemoveReference<
|
IsBaseOf<Stream, typename RemoveReference<TStream>::type>::value>::type>
|
||||||
TStream>::type>::value>::type>
|
|
||||||
: ArduinoStreamTraits {};
|
: ArduinoStreamTraits {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,14 +50,13 @@ struct CharPointerTraits {
|
|||||||
|
|
||||||
static const bool has_append = false;
|
static const bool has_append = false;
|
||||||
static const bool has_equals = true;
|
static const bool has_equals = true;
|
||||||
static const bool should_duplicate = !TypeTraits::IsConst<TChar>::value;
|
static const bool should_duplicate = !IsConst<TChar>::value;
|
||||||
};
|
};
|
||||||
|
|
||||||
// char*, unsigned char*, signed char*
|
// char*, unsigned char*, signed char*
|
||||||
// const char*, const unsigned char*, const signed char*
|
// const char*, const unsigned char*, const signed char*
|
||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
struct StringTraits<TChar*, typename TypeTraits::EnableIf<
|
struct StringTraits<TChar*, typename EnableIf<IsChar<TChar>::value>::type>
|
||||||
TypeTraits::IsChar<TChar>::value>::type>
|
|
||||||
: CharPointerTraits<TChar> {};
|
: CharPointerTraits<TChar> {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,11 +48,11 @@ struct StdStreamTraits {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename TStream>
|
template <typename TStream>
|
||||||
struct StringTraits<TStream,
|
struct StringTraits<
|
||||||
|
TStream,
|
||||||
// match any type that is derived from std::istream:
|
// match any type that is derived from std::istream:
|
||||||
typename TypeTraits::EnableIf<TypeTraits::IsBaseOf<
|
typename EnableIf<IsBaseOf<
|
||||||
std::istream, typename TypeTraits::RemoveReference<
|
std::istream, typename RemoveReference<TStream>::type>::value>::type>
|
||||||
TStream>::type>::value>::type>
|
|
||||||
: StdStreamTraits {};
|
: StdStreamTraits {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that return the type T if Condition is true.
|
// A meta-function that return the type T if Condition is true.
|
||||||
template <bool Condition, typename T = void>
|
template <bool Condition, typename T = void>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "../Polyfills/math.hpp"
|
#include "../Polyfills/math.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
template <typename T, size_t = sizeof(T)>
|
template <typename T, size_t = sizeof(T)>
|
||||||
struct FloatTraits {};
|
struct FloatTraits {};
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that return the type T without the const modifier
|
// A meta-function that return the type T without the const modifier
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that returns true if Derived inherits from TBase is an
|
// A meta-function that returns true if Derived inherits from TBase is an
|
||||||
// integral type.
|
// integral type.
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "IsSame.hpp"
|
#include "IsSame.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that returns true if T is a charater
|
// A meta-function that returns true if T is a charater
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that return the type T without the const modifier
|
// A meta-function that return the type T without the const modifier
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "IsSame.hpp"
|
#include "IsSame.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that returns true if T is a floating point type
|
// A meta-function that returns true if T is a floating point type
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -9,14 +9,14 @@
|
|||||||
#include "IsUnsignedIntegral.hpp"
|
#include "IsUnsignedIntegral.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that returns true if T is an integral type.
|
// A meta-function that returns true if T is an integral type.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct IsIntegral {
|
struct IsIntegral {
|
||||||
static const bool value = TypeTraits::IsSignedIntegral<T>::value ||
|
static const bool value = IsSignedIntegral<T>::value ||
|
||||||
TypeTraits::IsUnsignedIntegral<T>::value ||
|
IsUnsignedIntegral<T>::value ||
|
||||||
TypeTraits::IsSame<T, char>::value;
|
IsSame<T, char>::value;
|
||||||
// CAUTION: differs from std::is_integral as it doesn't include bool
|
// CAUTION: differs from std::is_integral as it doesn't include bool
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that returns true if types T and U are the same.
|
// A meta-function that returns true if types T and U are the same.
|
||||||
template <typename T, typename U>
|
template <typename T, typename U>
|
||||||
|
@ -8,21 +8,19 @@
|
|||||||
#include "IsSame.hpp"
|
#include "IsSame.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that returns true if T is an integral type.
|
// A meta-function that returns true if T is an integral type.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct IsSignedIntegral {
|
struct IsSignedIntegral {
|
||||||
static const bool value = TypeTraits::IsSame<T, signed char>::value ||
|
static const bool value =
|
||||||
TypeTraits::IsSame<T, signed short>::value ||
|
IsSame<T, signed char>::value || IsSame<T, signed short>::value ||
|
||||||
TypeTraits::IsSame<T, signed int>::value ||
|
IsSame<T, signed int>::value || IsSame<T, signed long>::value ||
|
||||||
TypeTraits::IsSame<T, signed long>::value ||
|
|
||||||
#if ARDUINOJSON_USE_LONG_LONG
|
#if ARDUINOJSON_USE_LONG_LONG
|
||||||
TypeTraits::IsSame<T, signed long long>::value ||
|
IsSame<T, signed long long>::value ||
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ARDUINOJSON_USE_INT64
|
#if ARDUINOJSON_USE_INT64
|
||||||
TypeTraits::IsSame<T, signed __int64>::value ||
|
IsSame<T, signed __int64>::value ||
|
||||||
#endif
|
#endif
|
||||||
false;
|
false;
|
||||||
};
|
};
|
||||||
|
@ -8,21 +8,19 @@
|
|||||||
#include "IsSame.hpp"
|
#include "IsSame.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that returns true if T is an integral type.
|
// A meta-function that returns true if T is an integral type.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct IsUnsignedIntegral {
|
struct IsUnsignedIntegral {
|
||||||
static const bool value = TypeTraits::IsSame<T, unsigned char>::value ||
|
static const bool value =
|
||||||
TypeTraits::IsSame<T, unsigned short>::value ||
|
IsSame<T, unsigned char>::value || IsSame<T, unsigned short>::value ||
|
||||||
TypeTraits::IsSame<T, unsigned int>::value ||
|
IsSame<T, unsigned int>::value || IsSame<T, unsigned long>::value ||
|
||||||
TypeTraits::IsSame<T, unsigned long>::value ||
|
|
||||||
#if ARDUINOJSON_USE_LONG_LONG
|
#if ARDUINOJSON_USE_LONG_LONG
|
||||||
TypeTraits::IsSame<T, unsigned long long>::value ||
|
IsSame<T, unsigned long long>::value ||
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ARDUINOJSON_USE_INT64
|
#if ARDUINOJSON_USE_INT64
|
||||||
TypeTraits::IsSame<T, unsigned __int64>::value ||
|
IsSame<T, unsigned __int64>::value ||
|
||||||
#endif
|
#endif
|
||||||
false;
|
false;
|
||||||
};
|
};
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "IsBaseOf.hpp"
|
#include "IsBaseOf.hpp"
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
class JsonVariantTag {};
|
class JsonVariantTag {};
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that return the type T without the const modifier
|
// A meta-function that return the type T without the const modifier
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ArduinoJson {
|
namespace ArduinoJson {
|
||||||
namespace TypeTraits {
|
namespace Internals {
|
||||||
|
|
||||||
// A meta-function that return the type T without the reference modifier.
|
// A meta-function that return the type T without the reference modifier.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
static bool isAligned(void* ptr) {
|
static bool isAligned(void* ptr) {
|
||||||
const size_t mask = sizeof(void*) - 1;
|
const size_t mask = sizeof(void*) - 1;
|
||||||
size_t addr = reinterpret_cast<size_t>(ptr);
|
size_t addr = reinterpret_cast<size_t>(ptr);
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
struct NoMemoryAllocator {
|
struct NoMemoryAllocator {
|
||||||
void* allocate(size_t) {
|
void* allocate(size_t) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
using namespace ArduinoJson::TypeTraits;
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
TEST_CASE("TypeTraits") {
|
TEST_CASE("TypeTraits") {
|
||||||
SECTION("IsBaseOf") {
|
SECTION("IsBaseOf") {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <ArduinoJson/Polyfills/isFloat.hpp>
|
#include <ArduinoJson/Polyfills/isFloat.hpp>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
using namespace ArduinoJson::Polyfills;
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
TEST_CASE("isFloat()") {
|
TEST_CASE("isFloat()") {
|
||||||
SECTION("Input is NULL") {
|
SECTION("Input is NULL") {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <ArduinoJson/Polyfills/isInteger.hpp>
|
#include <ArduinoJson/Polyfills/isInteger.hpp>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
using namespace ArduinoJson::Polyfills;
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
TEST_CASE("isInteger()") {
|
TEST_CASE("isInteger()") {
|
||||||
SECTION("Null") {
|
SECTION("Null") {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <ArduinoJson/Polyfills/parseFloat.hpp>
|
#include <ArduinoJson/Polyfills/parseFloat.hpp>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
using namespace ArduinoJson::Polyfills;
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void check(const char* input, T expected) {
|
void check(const char* input, T expected) {
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <ArduinoJson/Polyfills/parseInteger.hpp>
|
#include <ArduinoJson/Polyfills/parseInteger.hpp>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
using namespace ArduinoJson::Polyfills;
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void check(const char* input, T expected) {
|
void check(const char* input, T expected) {
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <catch.hpp>
|
#include <catch.hpp>
|
||||||
|
|
||||||
|
using namespace ArduinoJson::Internals;
|
||||||
|
|
||||||
TEST_CASE("StaticJsonBuffer::startString()") {
|
TEST_CASE("StaticJsonBuffer::startString()") {
|
||||||
SECTION("WorksWhenBufferIsBigEnough") {
|
SECTION("WorksWhenBufferIsBigEnough") {
|
||||||
StaticJsonBuffer<6> jsonBuffer;
|
StaticJsonBuffer<6> jsonBuffer;
|
||||||
|
Reference in New Issue
Block a user