diff options
Diffstat (limited to 'include/lib/ArduinoJson/JsonArray.hpp')
-rw-r--r-- | include/lib/ArduinoJson/JsonArray.hpp | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/include/lib/ArduinoJson/JsonArray.hpp b/include/lib/ArduinoJson/JsonArray.hpp new file mode 100644 index 0000000..4431e7a --- /dev/null +++ b/include/lib/ArduinoJson/JsonArray.hpp @@ -0,0 +1,227 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Data/JsonBufferAllocated.hpp" +#include "Data/List.hpp" +#include "Data/ReferenceType.hpp" +#include "Data/ValueSaver.hpp" +#include "JsonVariant.hpp" +#include "Serialization/JsonPrintable.hpp" +#include "StringTraits/StringTraits.hpp" +#include "TypeTraits/EnableIf.hpp" +#include "TypeTraits/IsArray.hpp" +#include "TypeTraits/IsFloatingPoint.hpp" +#include "TypeTraits/IsSame.hpp" + +// Returns the size (in bytes) of an array with n elements. +// Can be very handy to determine the size of a StaticJsonBuffer. +#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \ + (sizeof(JsonArray) + (NUMBER_OF_ELEMENTS) * sizeof(JsonArray::node_type)) + +namespace ArduinoJson { + +// Forward declarations +class JsonObject; +class JsonBuffer; +namespace Internals { +class JsonArraySubscript; +} + +// An array of JsonVariant. +// +// The constructor is private, instances must be created via +// JsonBuffer::createArray() or JsonBuffer::parseArray(). +// A JsonArray can be serialized to a JSON string via JsonArray::printTo(). +// It can also be deserialized from a JSON string via JsonBuffer::parseArray(). +class JsonArray : public Internals::JsonPrintable<JsonArray>, + public Internals::ReferenceType, + public Internals::NonCopyable, + public Internals::List<JsonVariant>, + public Internals::JsonBufferAllocated { + public: + // Create an empty JsonArray attached to the specified JsonBuffer. + // You should not call this constructor directly. + // Instead, use JsonBuffer::createArray() or JsonBuffer::parseArray(). + explicit JsonArray(JsonBuffer *buffer) throw() + : Internals::List<JsonVariant>(buffer) {} + + // Gets the value at the specified index + const Internals::JsonArraySubscript operator[](size_t index) const; + + // Gets or sets the value at specified index + Internals::JsonArraySubscript operator[](size_t index); + + // Adds the specified value at the end of the array. + // + // bool add(TValue); + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template <typename T> + bool add(const T &value) { + return add_impl<const T &>(value); + } + // + // bool add(TValue); + // TValue = char*, const char*, const FlashStringHelper* + template <typename T> + bool add(T *value) { + return add_impl<T *>(value); + } + // + // bool add(TValue value, uint8_t decimals); + // TValue = float, double + template <typename T> + DEPRECATED("Second argument is not supported anymore") + bool add(T value, uint8_t) { + return add_impl<const JsonVariant &>(JsonVariant(value)); + } + + // Sets the value at specified index. + // + // bool add(size_t index, const TValue&); + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template <typename T> + bool set(size_t index, const T &value) { + return set_impl<const T &>(index, value); + } + // + // bool add(size_t index, TValue); + // TValue = char*, const char*, const FlashStringHelper* + template <typename T> + bool set(size_t index, T *value) { + return set_impl<T *>(index, value); + } + // + // bool set(size_t index, TValue value, uint8_t decimals); + // TValue = float, double + template <typename T> + typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value, bool>::type + set(size_t index, T value, uint8_t decimals) { + return set_impl<const JsonVariant &>(index, JsonVariant(value, decimals)); + } + + // Gets the value at the specified index. + template <typename T> + typename Internals::JsonVariantAs<T>::type get(size_t index) const { + const_iterator it = begin() += index; + return it != end() ? it->as<T>() : Internals::JsonVariantDefault<T>::get(); + } + + // Check the type of the value at specified index. + template <typename T> + bool is(size_t index) const { + const_iterator it = begin() += index; + return it != end() ? it->is<T>() : false; + } + + // Creates a JsonArray and adds a reference at the end of the array. + // It's a shortcut for JsonBuffer::createArray() and JsonArray::add() + JsonArray &createNestedArray(); + + // Creates a JsonObject and adds a reference at the end of the array. + // It's a shortcut for JsonBuffer::createObject() and JsonArray::add() + JsonObject &createNestedObject(); + + // Removes element at specified index. + void remove(size_t index) { + remove(begin() += index); + } + using Internals::List<JsonVariant>::remove; + + // Returns a reference an invalid JsonArray. + // This object is meant to replace a NULL pointer. + // This is used when memory allocation or JSON parsing fail. + static JsonArray &invalid() { + static JsonArray instance(NULL); + return instance; + } + + // Imports a 1D array + template <typename T, size_t TN> + bool copyFrom(T (&array)[TN]) { + return copyFrom(array, TN); + } + + // Imports a 1D array + template <typename T> + bool copyFrom(T *array, size_t len) { + bool ok = true; + for (size_t i = 0; i < len; i++) { + ok &= add(array[i]); + } + return ok; + } + + // Imports a 2D array + template <typename T, size_t N1, size_t N2> + bool copyFrom(T (&array)[N1][N2]) { + bool ok = true; + for (size_t i = 0; i < N1; i++) { + JsonArray &nestedArray = createNestedArray(); + for (size_t j = 0; j < N2; j++) { + ok &= nestedArray.add(array[i][j]); + } + } + return ok; + } + + // Exports a 1D array + template <typename T, size_t TN> + size_t copyTo(T (&array)[TN]) const { + return copyTo(array, TN); + } + + // Exports a 1D array + template <typename T> + size_t copyTo(T *array, size_t len) const { + size_t i = 0; + for (const_iterator it = begin(); it != end() && i < len; ++it) + array[i++] = *it; + return i; + } + + // Exports a 2D array + template <typename T, size_t N1, size_t N2> + void copyTo(T (&array)[N1][N2]) const { + size_t i = 0; + for (const_iterator it = begin(); it != end() && i < N1; ++it) { + it->as<JsonArray>().copyTo(array[i++]); + } + } + +#if ARDUINOJSON_ENABLE_DEPRECATED + DEPRECATED("use remove() instead") + FORCE_INLINE void removeAt(size_t index) { + return remove(index); + } +#endif + + private: + template <typename TValueRef> + bool set_impl(size_t index, TValueRef value) { + iterator it = begin() += index; + if (it == end()) return false; + return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value); + } + + template <typename TValueRef> + bool add_impl(TValueRef value) { + iterator it = Internals::List<JsonVariant>::add(); + if (it == end()) return false; + return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value); + } +}; + +namespace Internals { +template <> +struct JsonVariantDefault<JsonArray> { + static JsonArray &get() { + return JsonArray::invalid(); + } +}; +} +} |