// ArduinoJson - https://arduinojson.org // Copyright Benoit Blanchon 2014-2021 // MIT License #pragma once #include "lib/ArduinoJson/Array/ArrayRef.hpp" #include "lib/ArduinoJson/Document/JsonDocument.hpp" #include "lib/ArduinoJson/Variant/Visitor.hpp" namespace ARDUINOJSON_NAMESPACE { // Copy a 1D array to a JsonArray template inline typename enable_if::value && !is_base_of::value, bool>::type copyArray(T (&src)[TN], const TDestination& dst) { return copyArray(src, TN, dst); } // Copy a 1D array to a JsonDocument template inline bool copyArray(T (&src)[TN], JsonDocument& dst) { return copyArray(src, dst.to()); } // Copy a 1D array to a JsonArray template inline typename enable_if::value && !is_base_of::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 inline bool copyArray(T* src, size_t len, JsonDocument& dst) { return copyArray(src, len, dst.to()); } // Copy a 2D array to a JsonArray template inline typename enable_if::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 inline bool copyArray(T (&src)[N1][N2], JsonDocument& dst) { return copyArray(src, dst.to()); } template class ArrayCopier1D : public Visitor { 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::fromJson(VariantConstRef(slot->data())); slot = slot->next(); } return size; } private: T* _destination; size_t _capacity; }; template class ArrayCopier2D : public Visitor { 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 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 inline typename enable_if::value, size_t>::type copyArray( const TSource& src, T (&dst)[TN]) { return copyArray(src, dst, TN); } // Copy a JsonArray to a 1D array template inline size_t copyArray(const TSource& src, T* dst, size_t len) { ArrayCopier1D copier(dst, len); return src.accept(copier); } // Copy a JsonArray to a 2D array template inline void copyArray(const TSource& src, T (&dst)[N1][N2]) { ArrayCopier2D copier(&dst); src.accept(copier); } } // namespace ARDUINOJSON_NAMESPACE