// Copyright Benoit Blanchon 2014 // MIT License // // Arduino JSON library // https://github.com/bblanchon/ArduinoJson #pragma once #include #include // for uint8_t #include "Internals/JsonValueContent.hpp" #include "Internals/JsonValueType.hpp" namespace ArduinoJson { class JsonArray; class JsonObject; namespace Internals { class JsonWriter; } class JsonValue { public: JsonValue() : _type(Internals::JSON_UNDEFINED) {} void set(bool value); void set(double value, uint8_t decimals = 2); void set(signed char value) { set(static_cast(value)); } void set(signed int value) { set(static_cast(value)); } void set(signed long value); void set(signed short value) { set(static_cast(value)); } void set(unsigned char value) { set(static_cast(value)); } void set(unsigned int value) { set(static_cast(value)); } void set(unsigned long value) { set(static_cast(value)); } void set(unsigned short value) { set(static_cast(value)); } void set(const char *value); void set(JsonArray &array); void set(JsonObject &object); template JsonValue &operator=(T value) { set(value); return *this; } JsonValue &operator=(JsonArray &array) { set(array); return *this; } JsonValue &operator=(JsonObject &object) { set(object); return *this; } operator bool() const; operator double() const; operator float() const { return as(); } operator signed char() const { return as(); } operator signed int() const { return as(); } operator signed long() const; operator signed short() const { return as(); } operator unsigned char() const { return as(); } operator unsigned int() const { return as(); } operator unsigned long() const { return as(); } operator unsigned short() const { return as(); } operator const char *() const; operator JsonArray &() const; operator JsonObject &() const; const char *asString() const { return this->as(); } JsonArray &asArray() const { return this->as(); }; JsonObject &asObject() const { return this->as(); }; template T as() const { return static_cast(*this); } template bool is() const { return false; } static JsonValue &invalid() { return _invalid; } bool success() { return _type != Internals::JSON_INVALID; } template void writeTo(T &writer) const; private: JsonValue(Internals::JsonValueType type) : _type(type) {} Internals::JsonValueType _type; Internals::JsonValueContent _content; static JsonValue _invalid; }; template <> inline bool JsonValue::is() const { return _type == Internals::JSON_LONG; } template <> inline bool JsonValue::is() const { return _type >= Internals::JSON_DOUBLE_0_DECIMALS; } template inline bool operator==(const JsonValue &left, T right) { return left.as() == right; } template inline bool operator==(T left, const JsonValue &right) { return left == right.as(); } template inline bool operator!=(const JsonValue &left, T right) { return left.as() != right; } template inline bool operator!=(T left, const JsonValue &right) { return left != right.as(); } template inline bool operator<=(const JsonValue &left, T right) { return left.as() <= right; } template inline bool operator<=(T left, const JsonValue &right) { return left <= right.as(); } template inline bool operator>=(const JsonValue &left, T right) { return left.as() >= right; } template inline bool operator>=(T left, const JsonValue &right) { return left >= right.as(); } template inline bool operator<(const JsonValue &left, T right) { return left.as() < right; } template inline bool operator<(T left, const JsonValue &right) { return left < right.as(); } template inline bool operator>(const JsonValue &left, T right) { return left.as() > right; } template inline bool operator>(T left, const JsonValue &right) { return left > right.as(); } }