Przeglądaj źródła

JsonArrayConst: replace `ArrayData*` member with `VariantData*`

Benoit Blanchon 8 miesięcy temu
rodzic
commit
4457cb7cc5

+ 1 - 1
src/ArduinoJson/Array/JsonArray.hpp

@@ -37,7 +37,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
   // Returns a read-only reference to the array.
   // Returns a read-only reference to the array.
   // https://arduinojson.org/v7/api/jsonarrayconst/
   // https://arduinojson.org/v7/api/jsonarrayconst/
   operator JsonArrayConst() const {
   operator JsonArrayConst() const {
-    return JsonArrayConst(data_, resources_);
+    return JsonArrayConst(getData(), resources_);
   }
   }
 
 
   // Appends a new (empty) element to the array.
   // Appends a new (empty) element to the array.

+ 9 - 8
src/ArduinoJson/Array/JsonArrayConst.hpp

@@ -24,9 +24,10 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
   // Returns an iterator to the first element of the array.
   // Returns an iterator to the first element of the array.
   // https://arduinojson.org/v7/api/jsonarrayconst/begin/
   // https://arduinojson.org/v7/api/jsonarrayconst/begin/
   iterator begin() const {
   iterator begin() const {
-    if (!data_)
+    auto array = detail::VariantData::asArray(data_);
+    if (!array)
       return iterator();
       return iterator();
-    return iterator(data_->createIterator(resources_), resources_);
+    return iterator(array->createIterator(resources_), resources_);
   }
   }
 
 
   // Returns an iterator to the element following the last element of the array.
   // Returns an iterator to the element following the last element of the array.
@@ -39,7 +40,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
   JsonArrayConst() : data_(0), resources_(0) {}
   JsonArrayConst() : data_(0), resources_(0) {}
 
 
   // INTERNAL USE ONLY
   // INTERNAL USE ONLY
-  JsonArrayConst(const detail::ArrayData* data,
+  JsonArrayConst(const detail::VariantData* data,
                  const detail::ResourceManager* resources)
                  const detail::ResourceManager* resources)
       : data_(data), resources_(resources) {}
       : data_(data), resources_(resources) {}
 
 
@@ -49,7 +50,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
             detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
             detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
   JsonVariantConst operator[](T index) const {
   JsonVariantConst operator[](T index) const {
     return JsonVariantConst(
     return JsonVariantConst(
-        detail::ArrayData::getElement(data_, size_t(index), resources_),
+        detail::VariantData::getElement(data_, size_t(index), resources_),
         resources_);
         resources_);
   }
   }
 
 
@@ -71,13 +72,13 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
   // Returns true if the reference is unbound.
   // Returns true if the reference is unbound.
   // https://arduinojson.org/v7/api/jsonarrayconst/isnull/
   // https://arduinojson.org/v7/api/jsonarrayconst/isnull/
   bool isNull() const {
   bool isNull() const {
-    return data_ == 0;
+    return !data_ || !data_->isArray();
   }
   }
 
 
   // Returns true if the reference is bound.
   // Returns true if the reference is bound.
   // https://arduinojson.org/v7/api/jsonarrayconst/isnull/
   // https://arduinojson.org/v7/api/jsonarrayconst/isnull/
   operator bool() const {
   operator bool() const {
-    return data_ != 0;
+    return !isNull();
   }
   }
 
 
   // Returns the depth (nesting level) of the array.
   // Returns the depth (nesting level) of the array.
@@ -100,10 +101,10 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
 
 
  private:
  private:
   const detail::VariantData* getData() const {
   const detail::VariantData* getData() const {
-    return collectionToVariant(data_);
+    return data_;
   }
   }
 
 
-  const detail::ArrayData* data_;
+  const detail::VariantData* data_;
   const detail::ResourceManager* resources_;
   const detail::ResourceManager* resources_;
 };
 };
 
 

+ 1 - 3
src/ArduinoJson/Variant/ConverterImpl.hpp

@@ -329,9 +329,7 @@ struct Converter<JsonArrayConst> : private detail::VariantAttorney {
   }
   }
 
 
   static JsonArrayConst fromJson(JsonVariantConst src) {
   static JsonArrayConst fromJson(JsonVariantConst src) {
-    auto data = getData(src);
-    auto array = data ? data->asArray() : nullptr;
-    return JsonArrayConst(array, getResourceManager(src));
+    return JsonArrayConst(getData(src), getResourceManager(src));
   }
   }
 
 
   static bool checkJson(JsonVariantConst src) {
   static bool checkJson(JsonVariantConst src) {

+ 2 - 1
src/ArduinoJson/Variant/JsonVariantVisitor.hpp

@@ -30,7 +30,8 @@ class VisitorAdapter {
       : visitor_(&visitor), resources_(resources) {}
       : visitor_(&visitor), resources_(resources) {}
 
 
   result_type visit(const ArrayData& value) {
   result_type visit(const ArrayData& value) {
-    return visitor_->visit(JsonArrayConst(&value, resources_));
+    return visitor_->visit(
+        JsonArrayConst(collectionToVariant(&value), resources_));
   }
   }
 
 
   result_type visit(const ObjectData& value) {
   result_type visit(const ObjectData& value) {

+ 4 - 0
src/ArduinoJson/Variant/VariantData.hpp

@@ -182,6 +182,10 @@ class VariantData {
     return const_cast<VariantData*>(this)->asArray();
     return const_cast<VariantData*>(this)->asArray();
   }
   }
 
 
+  static const ArrayData* asArray(const VariantData* var) {
+    return var ? var->asArray() : 0;
+  }
+
   CollectionData* asCollection() {
   CollectionData* asCollection() {
     return isCollection() ? &content_.asCollection : 0;
     return isCollection() ? &content_.asCollection : 0;
   }
   }