Răsfoiți Sursa

Merge `CollectionImpl` into `VariantImpl`

Benoit Blanchon 4 luni în urmă
părinte
comite
4a2568e3c8

+ 2 - 2
src/ArduinoJson/Array/ArrayImpl.hpp

@@ -30,7 +30,7 @@ inline VariantData* VariantImpl::addElement(VariantData* data,
   auto slot = resources->allocVariant();
   if (!slot)
     return nullptr;
-  CollectionImpl::appendOne(slot, data, resources);
+  appendOne(slot, data, resources);
   return slot.ptr();
 }
 
@@ -73,7 +73,7 @@ inline bool VariantImpl::addValue(const T& value, VariantData* data,
     resources->freeVariant(slot);
     return false;
   }
-  CollectionImpl::appendOne(slot, data, resources);
+  appendOne(slot, data, resources);
   return true;
 }
 

+ 1 - 67
src/ArduinoJson/Collection/CollectionData.hpp

@@ -16,7 +16,7 @@ struct VariantData;
 class ResourceManager;
 
 class CollectionIterator {
-  friend class CollectionImpl;
+  friend class VariantImpl;
 
  public:
   CollectionIterator() : slot_(nullptr), currentId_(NULL_SLOT) {}
@@ -66,70 +66,4 @@ class CollectionIterator {
   SlotId currentId_;
 };
 
-class CollectionImpl {
- protected:
-  VariantData* data_;
-  ResourceManager* resources_;
-
- public:
-  using iterator = CollectionIterator;
-
-  CollectionImpl() : data_(nullptr), resources_(nullptr) {}
-
-  CollectionImpl(VariantData* data, ResourceManager* resources)
-      : data_(data), resources_(resources) {}
-
-  explicit operator bool() const {
-    return data_ && data_->isCollection();
-  }
-
-  bool isNull() const {
-    return !operator bool();
-  }
-
-  VariantData* getData() const {
-    return data_;
-  }
-
-  ResourceManager* getResourceManager() const {
-    return resources_;
-  }
-
-  iterator createIterator() const {
-    if (isNull())
-      return iterator();
-    return createIterator(data_, resources_);
-  }
-
-  static iterator createIterator(VariantData*, ResourceManager*);
-
-  size_t size() const;
-  size_t nesting() const;
-
-  void clear() {
-    if (isNull())
-      return;
-    clear(data_, resources_);
-  }
-
-  static void clear(VariantData*, ResourceManager*);
-
-  SlotId head() const {
-    ARDUINOJSON_ASSERT(data_ != nullptr);
-    ARDUINOJSON_ASSERT(data_->isCollection());
-    return data_->content.asCollection.head;
-  }
-
-  static void appendOne(Slot<VariantData> slot, VariantData*, ResourceManager*);
-
-  static void appendPair(Slot<VariantData> key, Slot<VariantData> value,
-                         VariantData*, ResourceManager*);
-
-  void removeOne(iterator it);
-  void removePair(iterator it);
-
- private:
-  Slot<VariantData> getPreviousSlot(VariantData*) const;
-};
-
 ARDUINOJSON_END_PRIVATE_NAMESPACE

+ 11 - 20
src/ArduinoJson/Collection/CollectionImpl.hpp

@@ -19,7 +19,7 @@ inline void CollectionIterator::next(const ResourceManager* resources) {
   currentId_ = nextId;
 }
 
-inline CollectionImpl::iterator CollectionImpl::createIterator(
+inline VariantImpl::iterator VariantImpl::createIterator(
     VariantData* data, ResourceManager* resources) {
   ARDUINOJSON_ASSERT(data != nullptr);
   ARDUINOJSON_ASSERT(data->isCollection());
@@ -28,8 +28,8 @@ inline CollectionImpl::iterator CollectionImpl::createIterator(
   return iterator(resources->getVariant(head), head);
 }
 
-inline void CollectionImpl::appendOne(Slot<VariantData> slot, VariantData* data,
-                                      ResourceManager* resources) {
+inline void VariantImpl::appendOne(Slot<VariantData> slot, VariantData* data,
+                                   ResourceManager* resources) {
   ARDUINOJSON_ASSERT(data != nullptr);
   ARDUINOJSON_ASSERT(data->isCollection());
   ARDUINOJSON_ASSERT(resources != nullptr);
@@ -46,10 +46,9 @@ inline void CollectionImpl::appendOne(Slot<VariantData> slot, VariantData* data,
   }
 }
 
-inline void CollectionImpl::appendPair(Slot<VariantData> key,
-                                       Slot<VariantData> value,
-                                       VariantData* data,
-                                       ResourceManager* resources) {
+inline void VariantImpl::appendPair(Slot<VariantData> key,
+                                    Slot<VariantData> value, VariantData* data,
+                                    ResourceManager* resources) {
   ARDUINOJSON_ASSERT(data != nullptr);
   ARDUINOJSON_ASSERT(resources != nullptr);
 
@@ -67,8 +66,7 @@ inline void CollectionImpl::appendPair(Slot<VariantData> key,
   }
 }
 
-inline void CollectionImpl::clear(VariantData* data,
-                                  ResourceManager* resources) {
+inline void VariantImpl::empty(VariantData* data, ResourceManager* resources) {
   ARDUINOJSON_ASSERT(data != nullptr);
   ARDUINOJSON_ASSERT(data->isCollection());
   ARDUINOJSON_ASSERT(resources != nullptr);
@@ -87,7 +85,7 @@ inline void CollectionImpl::clear(VariantData* data,
   coll->tail = NULL_SLOT;
 }
 
-inline Slot<VariantData> CollectionImpl::getPreviousSlot(
+inline Slot<VariantData> VariantImpl::getPreviousSlot(
     VariantData* target) const {
   ARDUINOJSON_ASSERT(data_ != nullptr);
   ARDUINOJSON_ASSERT(data_->isCollection());
@@ -105,7 +103,7 @@ inline Slot<VariantData> CollectionImpl::getPreviousSlot(
   return prev;
 }
 
-inline void CollectionImpl::removeOne(iterator it) {
+inline void VariantImpl::removeOne(iterator it) {
   if (it.done())
     return;
   auto curr = it.slot_;
@@ -121,7 +119,7 @@ inline void CollectionImpl::removeOne(iterator it) {
   resources_->freeVariant({it.slot_, it.currentId_});
 }
 
-inline void CollectionImpl::removePair(iterator it) {
+inline void VariantImpl::removePair(iterator it) {
   if (it.done())
     return;
 
@@ -138,7 +136,7 @@ inline void CollectionImpl::removePair(iterator it) {
   removeOne(it);
 }
 
-inline size_t CollectionImpl::nesting() const {
+inline size_t VariantImpl::nesting() const {
   if (!data_ || !data_->isCollection())
     return 0;
   size_t maxChildNesting = 0;
@@ -150,11 +148,4 @@ inline size_t CollectionImpl::nesting() const {
   return maxChildNesting + 1;
 }
 
-inline size_t CollectionImpl::size() const {
-  size_t count = 0;
-  for (auto it = createIterator(); !it.done(); it.next(resources_))
-    count++;
-  return count;
-}
-
 ARDUINOJSON_END_PRIVATE_NAMESPACE

+ 3 - 3
src/ArduinoJson/Object/ObjectImpl.hpp

@@ -44,7 +44,7 @@ inline VariantImpl::iterator VariantImpl::findKey(TAdaptedString key,
   if (key.isNull())
     return iterator();
   bool isKey = true;
-  for (auto it = CollectionImpl::createIterator(data, resources); !it.done();
+  for (auto it = createIterator(data, resources); !it.done();
        it.next(resources)) {
     if (isKey && stringEquals(key, adaptString(it->asString())))
       return it;
@@ -72,7 +72,7 @@ inline VariantData* VariantImpl::addMember(TAdaptedString key,
   if (!VariantImpl::setString(key, keySlot.ptr(), resources))
     return nullptr;
 
-  CollectionImpl::appendPair(keySlot, valueSlot, data, resources);
+  appendPair(keySlot, valueSlot, data, resources);
 
   return valueSlot.ptr();
 }
@@ -93,7 +93,7 @@ inline VariantData* VariantImpl::addPair(VariantData** value, VariantData* data,
     return nullptr;
   *value = valueSlot.ptr();
 
-  CollectionImpl::appendPair(keySlot, valueSlot, data, resources);
+  appendPair(keySlot, valueSlot, data, resources);
 
   return keySlot.ptr();
 }

+ 31 - 16
src/ArduinoJson/Variant/VariantImpl.hpp

@@ -169,10 +169,6 @@ class VariantImpl {
     }
   }
 
-  CollectionImpl asCollection() const {
-    return CollectionImpl(data_, resources_);
-  }
-
   template <typename T>
   T asFloat() const {
     return asFloat<T>(data_, resources_);
@@ -272,9 +268,13 @@ class VariantImpl {
   iterator at(size_t index) const;
 
   iterator createIterator() const {
-    return asCollection().createIterator();
+    if (!isCollection())
+      return iterator();
+    return createIterator(data_, resources_);
   }
 
+  static iterator createIterator(VariantData*, ResourceManager*);
+
 #if ARDUINOJSON_USE_8_BYTE_POOL
   static const EightByteValue* getEightByte(VariantData* data,
                                             ResourceManager* resources) {
@@ -363,23 +363,21 @@ class VariantImpl {
     return type() == VariantType::Object;
   }
 
-  size_t nesting() const {
-    return asCollection().nesting();
-  }
+  size_t nesting() const;
 
   void removeElement(size_t index);
 
   void removeElement(CollectionIterator it) {
-    asCollection().removeOne(it);
+    removeOne(it);
   }
 
   template <typename TAdaptedString>
   void removeMember(TAdaptedString key) {
-    asCollection().removePair(findKey(key));
+    removePair(findKey(key));
   }
 
   void removeMember(CollectionIterator it) {
-    asCollection().removePair(it);
+    removePair(it);
   }
 
   bool setBoolean(bool value) {
@@ -539,7 +537,7 @@ class VariantImpl {
   }
 
   size_t size() const {
-    if (!data_)
+    if (!isCollection())
       return 0;
 
     return size(data_, resources_);
@@ -547,9 +545,13 @@ class VariantImpl {
 
   static size_t size(VariantData* data, ResourceManager* resources) {
     ARDUINOJSON_ASSERT(data != nullptr);
+    ARDUINOJSON_ASSERT(data->isCollection());
     ARDUINOJSON_ASSERT(resources != nullptr);
 
-    size_t n = CollectionImpl(data, resources).size();
+    size_t n = 0;
+    for (auto it = createIterator(data, resources); !it.done();
+         it.next(resources))
+      n++;
 
     if (data->type == VariantType::Object) {
       ARDUINOJSON_ASSERT((n % 2) == 0);
@@ -598,16 +600,19 @@ class VariantImpl {
 #endif
 
     if (data->type & VariantTypeBits::CollectionMask)
-      CollectionImpl::clear(data, resources);
+      empty(data, resources);
 
     data->type = VariantType::Null;
   }
 
   void empty() {
-    if (isCollection())
-      CollectionImpl::clear(data_, resources_);
+    if (!isCollection())
+      return;
+    empty(data_, resources_);
   }
 
+  static void empty(VariantData*, ResourceManager*);
+
  private:
   VariantData* data_;
   ResourceManager* resources_;
@@ -621,6 +626,16 @@ class VariantImpl {
 
   template <typename TAdaptedString>
   static iterator findKey(TAdaptedString key, VariantData*, ResourceManager*);
+
+  static void appendOne(Slot<VariantData> slot, VariantData*, ResourceManager*);
+
+  static void appendPair(Slot<VariantData> key, Slot<VariantData> value,
+                         VariantData*, ResourceManager*);
+
+  void removeOne(iterator it);
+  void removePair(iterator it);
+
+  Slot<VariantData> getPreviousSlot(VariantData*) const;
 };
 
 ARDUINOJSON_END_PRIVATE_NAMESPACE