ArduinoJson is now a header-only library (issue #199)

This commit is contained in:
Benoit Blanchon
2016-06-22 21:41:19 +02:00
parent 0801e16327
commit 8c7edbd9c3
52 changed files with 819 additions and 958 deletions

View File

@ -52,15 +52,16 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
// Create an empty JsonArray attached to the specified JsonBuffer.
// You should not use this constructor directly.
// Instead, use JsonBuffer::createObject() or JsonBuffer.parseObject().
FORCE_INLINE explicit JsonObject(JsonBuffer* buffer)
: Internals::List<JsonPair>(buffer) {}
explicit JsonObject(JsonBuffer* buffer) : Internals::List<JsonPair>(buffer) {}
// Gets or sets the value associated with the specified key.
FORCE_INLINE JsonObjectSubscript<const char*> operator[](const char* key);
FORCE_INLINE JsonObjectSubscript<const String&> operator[](const String& key);
JsonObjectSubscript<const char*> operator[](const char* key);
JsonObjectSubscript<const String&> operator[](const String& key);
// Gets the value associated with the specified key.
FORCE_INLINE JsonVariant operator[](JsonObjectKey key) const;
JsonVariant operator[](JsonObjectKey key) const {
return get(key);
}
// Sets the specified key with the specified value.
// bool set(TKey key, bool value);
@ -73,7 +74,7 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
// bool set(TKey key, const char* value);
// bool set(TKey key, RawJson value);
template <typename T>
FORCE_INLINE bool set(
bool set(
JsonObjectKey key, T value,
typename TypeTraits::EnableIf<
CanSet<T>::value && !TypeTraits::IsReference<T>::value>::type* = 0) {
@ -84,71 +85,117 @@ class JsonObject : public Internals::JsonPrintable<JsonObject>,
// bool set(Key, JsonObject&);
// bool set(Key, JsonVariant&);
template <typename T>
FORCE_INLINE bool set(
JsonObjectKey key, const T& value,
typename TypeTraits::EnableIf<CanSet<T&>::value>::type* = 0) {
bool set(JsonObjectKey key, const T& value,
typename TypeTraits::EnableIf<CanSet<T&>::value>::type* = 0) {
return setNodeAt<T&>(key, const_cast<T&>(value));
}
// bool set(Key, float value, uint8_t decimals);
// bool set(Key, double value, uint8_t decimals);
template <typename TValue>
FORCE_INLINE bool set(
JsonObjectKey key, TValue value, uint8_t decimals,
typename TypeTraits::EnableIf<
TypeTraits::IsFloatingPoint<TValue>::value>::type* = 0) {
bool set(JsonObjectKey key, TValue value, uint8_t decimals,
typename TypeTraits::EnableIf<
TypeTraits::IsFloatingPoint<TValue>::value>::type* = 0) {
return setNodeAt<const JsonVariant&>(key, JsonVariant(value, decimals));
}
// Gets the value associated with the specified key.
FORCE_INLINE JsonVariant get(JsonObjectKey) const;
JsonVariant get(JsonObjectKey key) const {
node_type* node = getNodeAt(key.c_str());
return node ? node->content.value : JsonVariant();
}
// Gets the value associated with the specified key.
template <typename T>
FORCE_INLINE T get(JsonObjectKey) const;
T get(JsonObjectKey key) const {
node_type* node = getNodeAt(key.c_str());
return node ? node->content.value.as<T>() : JsonVariant::defaultValue<T>();
}
// Checks the type of the value associated with the specified key.
template <typename T>
FORCE_INLINE bool is(JsonObjectKey) const;
bool is(JsonObjectKey key) const {
node_type* node = getNodeAt(key.c_str());
return node ? node->content.value.is<T>() : false;
}
// Creates and adds a JsonArray.
// This is a shortcut for JsonBuffer::createArray() and JsonObject::add().
FORCE_INLINE JsonArray& createNestedArray(JsonObjectKey key);
JsonArray& createNestedArray(JsonObjectKey key);
// Creates and adds a JsonObject.
// This is a shortcut for JsonBuffer::createObject() and JsonObject::add().
FORCE_INLINE JsonObject& createNestedObject(JsonObjectKey key);
JsonObject& createNestedObject(JsonObjectKey key);
// Tells weither the specified key is present and associated with a value.
FORCE_INLINE bool containsKey(JsonObjectKey key) const;
bool containsKey(JsonObjectKey key) const {
return getNodeAt(key.c_str()) != NULL;
}
// Removes the specified key and the associated value.
void remove(JsonObjectKey key);
void remove(JsonObjectKey key) {
removeNode(getNodeAt(key.c_str()));
}
// Returns a reference an invalid JsonObject.
// This object is meant to replace a NULL pointer.
// This is used when memory allocation or JSON parsing fail.
static JsonObject& invalid() { return _invalid; }
static JsonObject& invalid() {
static JsonObject instance(NULL);
return instance;
}
// Serialize the object to the specified JsonWriter
void writeTo(Internals::JsonWriter& writer) const;
void writeTo(Internals::JsonWriter& writer) const {
writer.beginObject();
const node_type* node = _firstNode;
while (node) {
writer.writeString(node->content.key);
writer.writeColon();
node->content.value.writeTo(writer);
node = node->next;
if (!node) break;
writer.writeComma();
}
writer.endObject();
}
private:
// Returns the list node that matches the specified key.
node_type* getNodeAt(const char* key) const;
node_type* getOrCreateNodeAt(const char* key);
node_type* getNodeAt(const char* key) const {
for (node_type* node = _firstNode; node; node = node->next) {
if (!strcmp(node->content.key, key)) return node;
}
return NULL;
}
template <typename T>
FORCE_INLINE bool setNodeAt(JsonObjectKey key, T value);
bool setNodeAt(JsonObjectKey key, T value) {
node_type* node = getNodeAt(key.c_str());
if (!node) {
node = addNewNode();
if (!node || !setNodeKey(node, key)) return false;
}
return setNodeValue<T>(node, value);
}
FORCE_INLINE bool setNodeKey(node_type*, JsonObjectKey key);
bool setNodeKey(node_type* node, JsonObjectKey key) {
if (key.needs_copy()) {
node->content.key = _buffer->strdup(key.c_str());
if (node->content.key == NULL) return false;
} else {
node->content.key = key.c_str();
}
return true;
}
template <typename T>
FORCE_INLINE bool setNodeValue(node_type*, T value);
// The instance returned by JsonObject::invalid()
static JsonObject _invalid;
bool setNodeValue(node_type* node, T value) {
node->content.value = value;
return true;
}
};
}
#include "JsonObject.ipp"