diff options
author | Daniel Friesel <daniel.friesel@uos.de> | 2021-05-12 09:12:09 +0200 |
---|---|---|
committer | Daniel Friesel <daniel.friesel@uos.de> | 2021-05-12 09:12:09 +0200 |
commit | 39895a677e5d370824e702cfe90ebc67737b8482 (patch) | |
tree | ff5b4cc9e373d33a795d50d9333e05549bd9f2b8 /include/lib/ArduinoJson/Array/Utilities.hpp | |
parent | 42e7fdf01c3a5701bb51e93ad6c650c3dbbc5450 (diff) |
import ArduinoJson 6.18.0
Diffstat (limited to 'include/lib/ArduinoJson/Array/Utilities.hpp')
-rw-r--r-- | include/lib/ArduinoJson/Array/Utilities.hpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/include/lib/ArduinoJson/Array/Utilities.hpp b/include/lib/ArduinoJson/Array/Utilities.hpp new file mode 100644 index 0000000..619b91d --- /dev/null +++ b/include/lib/ArduinoJson/Array/Utilities.hpp @@ -0,0 +1,133 @@ +// ArduinoJson - https://arduinojson.org +// Copyright Benoit Blanchon 2014-2021 +// MIT License + +#pragma once + +#include <ArduinoJson/Array/ArrayRef.hpp> +#include <ArduinoJson/Document/JsonDocument.hpp> +#include <ArduinoJson/Variant/Visitor.hpp> + +namespace ARDUINOJSON_NAMESPACE { + +// Copy a 1D array to a JsonArray +template <typename T, size_t N, typename TDestination> +inline typename enable_if<!is_array<T>::value && + !is_base_of<JsonDocument, TDestination>::value, + bool>::type +copyArray(T (&src)[N], const TDestination& dst) { + return copyArray(src, N, dst); +} + +// Copy a 1D array to a JsonDocument +template <typename T, size_t N> +inline bool copyArray(T (&src)[N], JsonDocument& dst) { + return copyArray(src, dst.to<ArrayRef>()); +} + +// Copy a 1D array to a JsonArray +template <typename T, typename TDestination> +inline typename enable_if<!is_array<T>::value && + !is_base_of<JsonDocument, TDestination>::value, + bool>::type +copyArray(T* src, size_t len, const TDestination& dst) { + bool ok = true; + for (size_t i = 0; i < len; i++) { + ok &= dst.add(src[i]); + } + return ok; +} + +// Copy a 1D array to a JsonDocument +template <typename T> +inline bool copyArray(T* src, size_t len, JsonDocument& dst) { + return copyArray(src, len, dst.to<ArrayRef>()); +} + +// Copy a 2D array to a JsonArray +template <typename T, size_t N1, size_t N2, typename TDestination> +inline typename enable_if<!is_base_of<JsonDocument, TDestination>::value, + bool>::type +copyArray(T (&src)[N1][N2], const TDestination& dst) { + bool ok = true; + for (size_t i = 0; i < N1; i++) { + ArrayRef nestedArray = dst.createNestedArray(); + for (size_t j = 0; j < N2; j++) { + ok &= nestedArray.add(src[i][j]); + } + } + return ok; +} + +// Copy a 2D array to a JsonDocument +template <typename T, size_t N1, size_t N2> +inline bool copyArray(T (&src)[N1][N2], JsonDocument& dst) { + return copyArray(src, dst.to<ArrayRef>()); +} + +template <typename T> +class ArrayCopier1D : public Visitor<size_t> { + public: + ArrayCopier1D(T* destination, size_t capacity) + : _destination(destination), _capacity(capacity) {} + + size_t visitArray(const CollectionData& array) { + size_t size = 0; + VariantSlot* slot = array.head(); + + while (slot != 0 && size < _capacity) { + _destination[size++] = + Converter<T>::fromJson(VariantConstRef(slot->data())); + slot = slot->next(); + } + return size; + } + + private: + T* _destination; + size_t _capacity; +}; + +template <typename T, size_t N1, size_t N2> +class ArrayCopier2D : public Visitor<void> { + public: + ArrayCopier2D(T (*destination)[N1][N2]) : _destination(destination) {} + + void visitArray(const CollectionData& array) { + VariantSlot* slot = array.head(); + size_t n = 0; + while (slot != 0 && n < N1) { + ArrayCopier1D<T> copier((*_destination)[n++], N2); + variantAccept(slot->data(), copier); + slot = slot->next(); + } + } + + private: + T (*_destination)[N1][N2]; + size_t _capacity1, _capacity2; +}; + +// Copy a JsonArray to a 1D array +template <typename TSource, typename T, size_t N> +inline typename enable_if<!is_array<T>::value, size_t>::type copyArray( + const TSource& src, T (&dst)[N]) { + return copyArray(src, dst, N); +} + +// Copy a JsonArray to a 1D array +template <typename TSource, typename T> +inline size_t copyArray(const TSource& src, T* dst, size_t len) { + ArrayCopier1D<T> copier(dst, len); + + return src.accept(copier); +} + +// Copy a JsonArray to a 2D array +template <typename TSource, typename T, size_t N1, size_t N2> +inline void copyArray(const TSource& src, T (&dst)[N1][N2]) { + ArrayCopier2D<T, N1, N2> copier(&dst); + src.accept(copier); +} + +} // namespace ARDUINOJSON_NAMESPACE |