diff --git a/extras/tests/ResourceManager/StringBuffer.cpp b/extras/tests/ResourceManager/StringBuffer.cpp index 167120f4..fc164a5d 100644 --- a/extras/tests/ResourceManager/StringBuffer.cpp +++ b/extras/tests/ResourceManager/StringBuffer.cpp @@ -21,7 +21,7 @@ TEST_CASE("StringBuffer") { strcpy(ptr, "hi!"); sb.save(&variant); - REQUIRE(variant.type() == VariantType::TinyString); + REQUIRE(variant.type == VariantType::TinyString); REQUIRE(variant.asString() == "hi!"); } @@ -30,7 +30,7 @@ TEST_CASE("StringBuffer") { memcpy(ptr, "a\0b", 3); sb.save(&variant); - REQUIRE(variant.type() == VariantType::LongString); + REQUIRE(variant.type == VariantType::LongString); auto str = variant.asString(); REQUIRE(str.size() == 3); @@ -44,7 +44,7 @@ TEST_CASE("StringBuffer") { strcpy(ptr, "alfa"); sb.save(&variant); - REQUIRE(variant.type() == VariantType::LongString); + REQUIRE(variant.type == VariantType::LongString); REQUIRE(variant.asString() == "alfa"); } } diff --git a/extras/tests/ResourceManager/StringBuilder.cpp b/extras/tests/ResourceManager/StringBuilder.cpp index 5c6dd220..541bbb60 100644 --- a/extras/tests/ResourceManager/StringBuilder.cpp +++ b/extras/tests/ResourceManager/StringBuilder.cpp @@ -26,7 +26,7 @@ TEST_CASE("StringBuilder") { REQUIRE(spyingAllocator.log() == AllocatorLog{ Allocate(sizeofStringBuffer()), }); - REQUIRE(data.type() == VariantType::TinyString); + REQUIRE(data.type == VariantType::TinyString); } SECTION("Tiny string") { @@ -45,7 +45,7 @@ TEST_CASE("StringBuilder") { str.save(&data); REQUIRE(resources.overflowed() == false); - REQUIRE(data.type() == VariantType::TinyString); + REQUIRE(data.type == VariantType::TinyString); REQUIRE(data.asString() == "url"); } diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index 05f69d95..c42c2432 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -55,17 +55,12 @@ class ElementProxy : public VariantRefBase>, } FORCE_INLINE VariantData* getData() const { - auto data = VariantAttorney::getData(upstream_); - auto resources = VariantAttorney::getResourceManager(upstream_); - return VariantData::asArray(data, resources).getElement(index_); + return VariantAttorney::getVariantImpl(upstream_).getElement(index_); } VariantData* getOrCreateData() const { - auto data = VariantAttorney::getOrCreateData(upstream_); - if (!data) - return nullptr; - return data->getOrAddElement( - index_, VariantAttorney::getResourceManager(upstream_)); + return VariantAttorney::getOrCreateVariantImpl(upstream_).getOrAddElement( + index_); } TUpstream upstream_; diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index a2d2c1ae..37676d50 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -24,7 +24,7 @@ class JsonArray : public detail::VariantOperators { // INTERNAL USE ONLY JsonArray(detail::VariantData* data, detail::ResourceManager* resources) - : impl_(detail::VariantData::asArray(data, resources)) {} + : impl_(detail::VariantImpl::asArray(data, resources)) {} // INTERNAL USE ONLY JsonArray(const detail::ArrayImpl& impl) : impl_(impl) {} diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index 918f5f95..8dc20516 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -38,7 +38,7 @@ class JsonArrayConst : public detail::VariantOperators { // INTERNAL USE ONLY JsonArrayConst(detail::VariantData* data, detail::ResourceManager* resources) - : impl_(detail::VariantData::asArray(data, resources)) {} + : impl_(detail::VariantImpl::asArray(data, resources)) {} // INTERNAL USE ONLY JsonArrayConst(const detail::ArrayImpl& impl) : impl_(impl) {} diff --git a/src/ArduinoJson/Collection/CollectionData.hpp b/src/ArduinoJson/Collection/CollectionData.hpp index 8548b8a9..46ec0b21 100644 --- a/src/ArduinoJson/Collection/CollectionData.hpp +++ b/src/ArduinoJson/Collection/CollectionData.hpp @@ -12,7 +12,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -class VariantData; +struct VariantData; class ResourceManager; class CollectionIterator { diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index b15a8095..f0e88ef1 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -14,7 +14,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE inline void CollectionIterator::next(const ResourceManager* resources) { ARDUINOJSON_ASSERT(slot_); - auto nextId = slot_->next(); + auto nextId = slot_->next; slot_ = resources->getVariant(nextId); currentId_ = nextId; } @@ -31,7 +31,7 @@ inline void CollectionImpl::appendOne(Slot slot) { if (data_->tail != NULL_SLOT) { auto tail = resources_->getVariant(data_->tail); - tail->setNext(slot.id()); + tail->next = slot.id(); data_->tail = slot.id(); } else { data_->head = slot.id(); @@ -44,11 +44,11 @@ inline void CollectionImpl::appendPair(Slot key, ARDUINOJSON_ASSERT(data_ != nullptr); ARDUINOJSON_ASSERT(resources_ != nullptr); - key->setNext(value.id()); + key->next = value.id(); if (data_->tail != NULL_SLOT) { auto tail = resources_->getVariant(data_->tail); - tail->setNext(key.id()); + tail->next = key.id(); data_->tail = value.id(); } else { data_->head = key.id(); @@ -63,7 +63,7 @@ inline void CollectionImpl::clear() { while (next != NULL_SLOT) { auto currId = next; auto slot = resources_->getVariant(next); - next = slot->next(); + next = slot->next; resources_->freeVariant({slot, currId}); } @@ -80,7 +80,7 @@ inline Slot CollectionImpl::getPreviousSlot( if (currentSlot == target) break; prev = Slot(currentSlot, currentId); - currentId = currentSlot->next(); + currentId = currentSlot->next; } return prev; } @@ -90,9 +90,9 @@ inline void CollectionImpl::removeOne(iterator it) { return; auto curr = it.slot_; auto prev = getPreviousSlot(curr); - auto next = curr->next(); + auto next = curr->next; if (prev) - prev->setNext(next); + prev->next = next; else data_->head = next; if (next == NULL_SLOT) @@ -106,11 +106,11 @@ inline void CollectionImpl::removePair(ObjectImpl::iterator it) { auto keySlot = it.slot_; - auto valueId = keySlot->next(); + auto valueId = keySlot->next; auto valueSlot = resources_->getVariant(valueId); // remove value slot - keySlot->setNext(valueSlot->next()); + keySlot->next = valueSlot->next; resources_->freeVariant({valueSlot, valueId}); // remove key slot @@ -122,7 +122,7 @@ inline size_t CollectionImpl::nesting() const { return 0; size_t maxChildNesting = 0; for (auto it = createIterator(); !it.done(); it.next(resources_)) { - size_t childNesting = it->nesting(resources_); + size_t childNesting = VariantImpl(it.data(), resources_).nesting(); if (childNesting > maxChildNesting) maxChildNesting = childNesting; } diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 9980c424..5da7b0a6 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -88,7 +88,7 @@ class JsonDocument : public detail::VariantOperators { // https://arduinojson.org/v7/api/jsondocument/clear/ void clear() { resources_.clear(); - data_.reset(); + data_.type = detail::VariantType::Null; } // Returns true if the root is of the specified type. @@ -120,13 +120,13 @@ class JsonDocument : public detail::VariantOperators { // Returns the depth (nesting level) of the array. // https://arduinojson.org/v7/api/jsondocument/nesting/ size_t nesting() const { - return data_.nesting(&resources_); + return getVariantImpl().nesting(); } // Returns the number of elements in the root array or object. // https://arduinojson.org/v7/api/jsondocument/size/ size_t size() const { - return data_.size(&resources_); + return getVariantImpl().size(); } // Copies the specified document. @@ -165,7 +165,7 @@ class JsonDocument : public detail::VariantOperators { template ARDUINOJSON_DEPRECATED("use doc[\"key\"].is() instead") bool containsKey(TChar* key) const { - return data_.getMember(detail::adaptString(key), &resources_) != 0; + return getVariantImpl().getMember(detail::adaptString(key)) != 0; } // DEPRECATED: use obj[key].is() instead @@ -174,7 +174,7 @@ class JsonDocument : public detail::VariantOperators { detail::enable_if_t::value, int> = 0> ARDUINOJSON_DEPRECATED("use doc[key].is() instead") bool containsKey(const TString& key) const { - return data_.getMember(detail::adaptString(key), &resources_) != 0; + return getVariantImpl().getMember(detail::adaptString(key)) != 0; } // DEPRECATED: use obj[key].is() instead @@ -212,7 +212,7 @@ class JsonDocument : public detail::VariantOperators { detail::enable_if_t::value, int> = 0> JsonVariantConst operator[](const TString& key) const { return JsonVariantConst( - data_.getMember(detail::adaptString(key), &resources_), &resources_); + getVariantImpl().getMember(detail::adaptString(key)), &resources_); } // Gets a root object's member. @@ -223,7 +223,7 @@ class JsonDocument : public detail::VariantOperators { int> = 0> JsonVariantConst operator[](TChar* key) const { return JsonVariantConst( - data_.getMember(detail::adaptString(key), &resources_), &resources_); + getVariantImpl().getMember(detail::adaptString(key)), &resources_); } // Gets or sets a root array's element. @@ -237,7 +237,7 @@ class JsonDocument : public detail::VariantOperators { // Gets a root array's member. // https://arduinojson.org/v7/api/jsondocument/subscript/ JsonVariantConst operator[](size_t index) const { - return JsonVariantConst(data_.getElement(index, &resources_), &resources_); + return JsonVariantConst(getVariantImpl().getElement(index), &resources_); } // Gets or sets a root object's member. @@ -267,14 +267,14 @@ class JsonDocument : public detail::VariantOperators { template ::value, int> = 0> JsonVariant add() { - return JsonVariant(data_.addElement(&resources_), &resources_); + return JsonVariant(getVariantImpl().addElement(), &resources_); } // Appends a value to the root array. // https://arduinojson.org/v7/api/jsondocument/add/ template bool add(const TValue& value) { - return data_.addValue(value, &resources_); + return getVariantImpl().addValue(value); } // Appends a value to the root array. @@ -282,7 +282,7 @@ class JsonDocument : public detail::VariantOperators { template ::value, int> = 0> bool add(TChar* value) { - return data_.addValue(value, &resources_); + return getVariantImpl().addValue(value); } // Removes an element of the root array. @@ -290,8 +290,7 @@ class JsonDocument : public detail::VariantOperators { template ::value, int> = 0> void remove(T index) { - detail::VariantData::removeElement(getData(), size_t(index), - getResourceManager()); + getVariantImpl().removeElement(size_t(index)); } // Removes a member of the root object. @@ -301,8 +300,7 @@ class JsonDocument : public detail::VariantOperators { !detail::is_const::value, int> = 0> void remove(TChar* key) { - detail::VariantData::removeMember(getData(), detail::adaptString(key), - getResourceManager()); + getVariantImpl().removeMember(detail::adaptString(key)); } // Removes a member of the root object. @@ -310,8 +308,7 @@ class JsonDocument : public detail::VariantOperators { template ::value, int> = 0> void remove(const TString& key) { - detail::VariantData::removeMember(getData(), detail::adaptString(key), - getResourceManager()); + getVariantImpl().removeMember(detail::adaptString(key)); } // Removes a member of the root object or an element of the root array. @@ -391,6 +388,10 @@ class JsonDocument : public detail::VariantOperators { } private: + detail::VariantImpl getVariantImpl() const { + return detail::VariantImpl(&data_, &resources_); + } + JsonVariant getVariant() { return JsonVariant(&data_, &resources_); } diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index 91449229..dfb1f165 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -71,13 +71,14 @@ class JsonDeserializer { switch (current()) { case '[': if (filter.allowArray()) - return parseArray(variant->toArray(resources_), filter, nestingLimit); + return parseArray(VariantImpl::toArray(variant, resources_), filter, + nestingLimit); else return skipArray(nestingLimit); case '{': if (filter.allowObject()) - return parseObject(variant->toObject(resources_), filter, + return parseObject(VariantImpl::toObject(variant, resources_), filter, nestingLimit); else return skipObject(nestingLimit); @@ -282,7 +283,7 @@ class JsonDeserializer { stringBuilder_.save(keyVariant); } else { - member->clear(resources_); + VariantImpl::clear(member, resources_); } // Parse value @@ -519,26 +520,28 @@ class JsonDeserializer { auto number = parseNumber(buffer_); switch (number.type()) { case NumberType::UnsignedInteger: - if (result->setInteger(number.asUnsignedInteger(), resources_)) + if (VariantImpl::setInteger(number.asUnsignedInteger(), result, + resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; case NumberType::SignedInteger: - if (result->setInteger(number.asSignedInteger(), resources_)) + if (VariantImpl::setInteger(number.asSignedInteger(), result, + resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; case NumberType::Float: - if (result->setFloat(number.asFloat(), resources_)) + if (VariantImpl::setFloat(number.asFloat(), result, resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; #if ARDUINOJSON_USE_DOUBLE case NumberType::Double: - if (result->setFloat(number.asDouble(), resources_)) + if (VariantImpl::setFloat(number.asDouble(), result, resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index e1bb6da8..80314438 100644 --- a/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/src/ArduinoJson/Json/JsonSerializer.hpp @@ -27,9 +27,9 @@ class JsonSerializer : public VariantDataVisitor { while (slotId != NULL_SLOT) { auto slot = resources_->getVariant(slotId); - slot->accept(*this, resources_); + VariantImpl::accept(*this, slot, resources_); - slotId = slot->next(); + slotId = slot->next; if (slotId != NULL_SLOT) write(','); @@ -48,9 +48,9 @@ class JsonSerializer : public VariantDataVisitor { while (slotId != NULL_SLOT) { auto slot = resources_->getVariant(slotId); - slot->accept(*this, resources_); + VariantImpl::accept(*this, slot, resources_); - slotId = slot->next(); + slotId = slot->next; if (slotId != NULL_SLOT) write(isKey ? ':' : ','); diff --git a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp index 29c01f8c..99567c95 100644 --- a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp +++ b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp @@ -26,7 +26,7 @@ class PrettyJsonSerializer : public JsonSerializer { nesting_++; while (!it.done()) { indent(); - it->accept(*this, base::resources_); + VariantImpl::accept(*this, it.data(), base::resources_); it.next(base::resources_); base::write(it.done() ? "\r\n" : ",\r\n"); @@ -49,7 +49,7 @@ class PrettyJsonSerializer : public JsonSerializer { while (!it.done()) { if (isKey) indent(); - it->accept(*this, base::resources_); + VariantImpl::accept(*this, it.data(), base::resources_); it.next(base::resources_); if (isKey) base::write(": "); diff --git a/src/ArduinoJson/Memory/ResourceManager.hpp b/src/ArduinoJson/Memory/ResourceManager.hpp index 0a0cfe4c..fb353e4e 100644 --- a/src/ArduinoJson/Memory/ResourceManager.hpp +++ b/src/ArduinoJson/Memory/ResourceManager.hpp @@ -14,7 +14,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -class VariantData; +struct VariantData; class VariantWithId; class ResourceManager { diff --git a/src/ArduinoJson/Memory/ResourceManagerImpl.hpp b/src/ArduinoJson/Memory/ResourceManagerImpl.hpp index c5cf7df2..409af0ab 100644 --- a/src/ArduinoJson/Memory/ResourceManagerImpl.hpp +++ b/src/ArduinoJson/Memory/ResourceManagerImpl.hpp @@ -22,7 +22,7 @@ inline Slot ResourceManager::allocVariant() { } inline void ResourceManager::freeVariant(Slot slot) { - slot->clear(this); + VariantImpl::clear(slot.ptr(), this); variantPools_.freeSlot(slot); } diff --git a/src/ArduinoJson/MsgPack/MsgPackBinary.hpp b/src/ArduinoJson/MsgPack/MsgPackBinary.hpp index 2c0f6b71..6b1c179b 100644 --- a/src/ArduinoJson/MsgPack/MsgPackBinary.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackBinary.hpp @@ -29,7 +29,7 @@ struct Converter : private detail::VariantAttorney { if (!data) return; auto resources = getResourceManager(dst); - data->clear(resources); + detail::VariantImpl::clear(data, resources); if (src.data()) { size_t headerSize = src.size() >= 0x10000 ? 5 : src.size() >= 0x100 ? 3 diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 42ec422e..f3d280d7 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -91,7 +91,7 @@ class MsgPackDeserializer { if (code <= 0x7f || code >= 0xe0) { // fixint if (allowValue) - variant->setInteger(static_cast(code), resources_); + VariantImpl::setInteger(static_cast(code), variant, resources_); return DeserializationError::Ok; } @@ -231,14 +231,14 @@ class MsgPackDeserializer { if (isSigned) { auto truncatedValue = static_cast(signedValue); if (truncatedValue == signedValue) { - if (!variant->setInteger(truncatedValue, resources_)) + if (!VariantImpl::setInteger(truncatedValue, variant, resources_)) return DeserializationError::NoMemory; } // else set null on overflow } else { auto truncatedValue = static_cast(unsignedValue); if (truncatedValue == unsignedValue) - if (!variant->setInteger(truncatedValue, resources_)) + if (!VariantImpl::setInteger(truncatedValue, variant, resources_)) return DeserializationError::NoMemory; // else set null on overflow } @@ -257,7 +257,7 @@ class MsgPackDeserializer { return err; fixEndianness(value); - variant->setFloat(value, resources_); + VariantImpl::setFloat(value, variant, resources_); return DeserializationError::Ok; } @@ -273,7 +273,7 @@ class MsgPackDeserializer { return err; fixEndianness(value); - if (variant->setFloat(value, resources_)) + if (VariantImpl::setFloat(value, variant, resources_)) return DeserializationError::Ok; else return DeserializationError::NoMemory; @@ -293,7 +293,7 @@ class MsgPackDeserializer { doubleToFloat(i, o); fixEndianness(value); - variant->setFloat(value, resources_); + VariantImpl::setFloat(value, variant, resources_); return DeserializationError::Ok; } @@ -352,7 +352,7 @@ class MsgPackDeserializer { ArrayImpl array; if (allowArray) { ARDUINOJSON_ASSERT(variant != 0); - array = variant->toArray(resources_); + array = VariantImpl::toArray(variant, resources_); } TFilter elementFilter = filter[0U]; @@ -388,7 +388,7 @@ class MsgPackDeserializer { ObjectImpl object; if (filter.allowObject()) { ARDUINOJSON_ASSERT(variant != 0); - object = variant->toObject(resources_); + object = VariantImpl::toObject(variant, resources_); } for (; n; --n) { diff --git a/src/ArduinoJson/MsgPack/MsgPackExtension.hpp b/src/ArduinoJson/MsgPack/MsgPackExtension.hpp index b51eb30b..696e42d7 100644 --- a/src/ArduinoJson/MsgPack/MsgPackExtension.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackExtension.hpp @@ -31,11 +31,11 @@ class MsgPackExtension { template <> struct Converter : private detail::VariantAttorney { static void toJson(MsgPackExtension src, JsonVariant dst) { - auto data = VariantAttorney::getData(dst); + auto data = getData(dst); if (!data) return; auto resources = getResourceManager(dst); - data->clear(resources); + detail::VariantImpl::clear(data, resources); if (src.data()) { uint8_t format, sizeBytes; if (src.size() >= 0x10000) { diff --git a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index 56e725fe..a9d05206 100644 --- a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp @@ -62,8 +62,8 @@ class MsgPackSerializer : public VariantDataVisitor { auto slotId = array.head(); while (slotId != NULL_SLOT) { auto slot = resources_->getVariant(slotId); - slot->accept(*this, resources_); - slotId = slot->next(); + VariantImpl::accept(*this, slot, resources_); + slotId = slot->next; } return bytesWritten(); @@ -84,8 +84,8 @@ class MsgPackSerializer : public VariantDataVisitor { auto slotId = object.head(); while (slotId != NULL_SLOT) { auto slot = resources_->getVariant(slotId); - slot->accept(*this, resources_); - slotId = slot->next(); + VariantImpl::accept(*this, slot, resources_); + slotId = slot->next; } return bytesWritten(); diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 87c49299..c6b55626 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -27,7 +27,7 @@ class JsonObject : public detail::VariantOperators { // INTERNAL USE ONLY JsonObject(detail::VariantData* data, detail::ResourceManager* resource) - : impl_(detail::VariantData::asObject(data, resource)) {} + : impl_(detail::VariantImpl::asObject(data, resource)) {} operator JsonVariant() const { return JsonVariant(getData(), getResourceManager()); diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index 264f729f..19531c0d 100644 --- a/src/ArduinoJson/Object/JsonObjectConst.hpp +++ b/src/ArduinoJson/Object/JsonObjectConst.hpp @@ -23,7 +23,7 @@ class JsonObjectConst : public detail::VariantOperators { // INTERNAL USE ONLY JsonObjectConst(detail::VariantData* data, detail::ResourceManager* resources) - : impl_(detail::VariantData::asObject(data, resources)) {} + : impl_(detail::VariantImpl::asObject(data, resources)) {} // INTERNAL USE ONLY JsonObjectConst(const detail::ObjectImpl& impl) : impl_(impl) {} diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index 7e43d38d..7bdd642b 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -56,17 +56,12 @@ class MemberProxy } VariantData* getData() const { - return VariantData::getMember( - VariantAttorney::getData(upstream_), key_, - VariantAttorney::getResourceManager(upstream_)); + return VariantAttorney::getVariantImpl(upstream_).getMember(key_); } VariantData* getOrCreateData() const { - auto data = VariantAttorney::getOrCreateData(upstream_); - if (!data) - return nullptr; - return data->getOrAddMember(key_, - VariantAttorney::getResourceManager(upstream_)); + return VariantAttorney::getOrCreateVariantImpl(upstream_).getOrAddMember( + key_); } private: diff --git a/src/ArduinoJson/Object/ObjectData.hpp b/src/ArduinoJson/Object/ObjectData.hpp index 3d3cd946..a52f8b96 100644 --- a/src/ArduinoJson/Object/ObjectData.hpp +++ b/src/ArduinoJson/Object/ObjectData.hpp @@ -8,6 +8,8 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE +class VariantImpl; + class ObjectImpl : public CollectionImpl { public: ObjectImpl() {} diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp index 127ce77c..a91ba63c 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -59,7 +59,7 @@ inline VariantData* ObjectImpl::addMember(TAdaptedString key) { if (!valueSlot) return nullptr; - if (!keySlot->setString(key, resources_)) + if (!VariantImpl::setString(key, keySlot.ptr(), resources_)) return nullptr; CollectionImpl::appendPair(keySlot, valueSlot); diff --git a/src/ArduinoJson/Serialization/measure.hpp b/src/ArduinoJson/Serialization/measure.hpp index 62d8fce1..cd8a1bac 100644 --- a/src/ArduinoJson/Serialization/measure.hpp +++ b/src/ArduinoJson/Serialization/measure.hpp @@ -14,7 +14,7 @@ size_t measure(ArduinoJson::JsonVariantConst source) { auto data = VariantAttorney::getData(source); auto resources = VariantAttorney::getResourceManager(source); TSerializer serializer(dp, resources); - return VariantData::accept(data, resources, serializer); + return VariantImpl::accept(serializer, data, resources); } ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Serialization/serialize.hpp b/src/ArduinoJson/Serialization/serialize.hpp index ad93adec..5af72296 100644 --- a/src/ArduinoJson/Serialization/serialize.hpp +++ b/src/ArduinoJson/Serialization/serialize.hpp @@ -13,7 +13,7 @@ size_t doSerialize(ArduinoJson::JsonVariantConst source, TWriter writer) { auto data = VariantAttorney::getData(source); auto resources = VariantAttorney::getResourceManager(source); TSerializer serializer(writer, resources); - return VariantData::accept(data, resources, serializer); + return VariantImpl::accept(serializer, data, resources); } template