diff --git a/extras/tests/ResourceManager/StringBuffer.cpp b/extras/tests/ResourceManager/StringBuffer.cpp index b39b60e7..dcf7d512 100644 --- a/extras/tests/ResourceManager/StringBuffer.cpp +++ b/extras/tests/ResourceManager/StringBuffer.cpp @@ -21,8 +21,8 @@ TEST_CASE("StringBuffer") { strcpy(ptr, "hi!"); sb.save(&variant); - REQUIRE(variant.type() == VariantType::TinyString); - REQUIRE(variant.asString(&resources) == "hi!"); + REQUIRE(variant.type == VariantType::TinyString); + REQUIRE(VariantImpl(&variant, &resources).asString() == "hi!"); } SECTION("Tiny string can't contain NUL") { @@ -30,9 +30,9 @@ TEST_CASE("StringBuffer") { memcpy(ptr, "a\0b", 3); sb.save(&variant); - REQUIRE(variant.type() == VariantType::OwnedString); + REQUIRE(variant.type == VariantType::OwnedString); - auto str = variant.asString(&resources); + auto str = VariantImpl(&variant, &resources).asString(); REQUIRE(str.size() == 3); REQUIRE(str.c_str()[0] == 'a'); REQUIRE(str.c_str()[1] == 0); @@ -44,7 +44,7 @@ TEST_CASE("StringBuffer") { strcpy(ptr, "alfa"); sb.save(&variant); - REQUIRE(variant.type() == VariantType::OwnedString); - REQUIRE(variant.asString(&resources) == "alfa"); + REQUIRE(variant.type == VariantType::OwnedString); + REQUIRE(VariantImpl(&variant, &resources).asString() == "alfa"); } } diff --git a/extras/tests/ResourceManager/StringBuilder.cpp b/extras/tests/ResourceManager/StringBuilder.cpp index ec3c2ab4..9398c43b 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,8 +45,8 @@ TEST_CASE("StringBuilder") { str.save(&data); REQUIRE(resources.overflowed() == false); - REQUIRE(data.type() == VariantType::TinyString); - REQUIRE(data.asString(&resources) == "url"); + REQUIRE(data.type == VariantType::TinyString); + REQUIRE(VariantImpl(&data, &resources).asString() == "url"); } SECTION("Short string fits in first allocation") { @@ -134,10 +134,10 @@ TEST_CASE("StringBuilder::save() deduplicates strings") { auto s2 = saveString(builder, "world"); auto s3 = saveString(builder, "hello"); - REQUIRE(s1.asString(&resources) == "hello"); - REQUIRE(s2.asString(&resources) == "world"); - REQUIRE(+s1.asString(&resources).c_str() == - +s3.asString(&resources).c_str()); // same address + REQUIRE(VariantImpl(&s1, &resources).asString() == "hello"); + REQUIRE(VariantImpl(&s2, &resources).asString() == "world"); + REQUIRE(+VariantImpl(&s1, &resources).asString().c_str() == + +VariantImpl(&s3, &resources).asString().c_str()); // same address REQUIRE(spy.log() == AllocatorLog{ @@ -153,10 +153,11 @@ TEST_CASE("StringBuilder::save() deduplicates strings") { auto s1 = saveString(builder, "hello world"); auto s2 = saveString(builder, "hello"); - REQUIRE(s1.asString(&resources) == "hello world"); - REQUIRE(s2.asString(&resources) == "hello"); - REQUIRE(+s2.asString(&resources).c_str() != - +s1.asString(&resources).c_str()); // different address + REQUIRE(VariantImpl(&s1, &resources).asString() == "hello world"); + REQUIRE(VariantImpl(&s2, &resources).asString() == "hello"); + REQUIRE( + +VariantImpl(&s1, &resources).asString().c_str() != + +VariantImpl(&s2, &resources).asString().c_str()); // different address REQUIRE(spy.log() == AllocatorLog{ @@ -171,10 +172,11 @@ TEST_CASE("StringBuilder::save() deduplicates strings") { auto s1 = saveString(builder, "hello world"); auto s2 = saveString(builder, "worl"); - REQUIRE(s1.asString(&resources) == "hello world"); - REQUIRE(s2.asString(&resources) == "worl"); - REQUIRE(s2.asString(&resources).c_str() != - s1.asString(&resources).c_str()); // different address + REQUIRE(VariantImpl(&s1, &resources).asString() == "hello world"); + REQUIRE(VariantImpl(&s2, &resources).asString() == "worl"); + REQUIRE( + VariantImpl(&s1, &resources).asString().c_str() != + VariantImpl(&s2, &resources).asString().c_str()); // different address REQUIRE(spy.log() == AllocatorLog{ 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..20083ecc 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(data, resources).asArray()) {} // 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..87073511 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(data, resources).asArray()) {} // 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 690b48b0..ab433aac 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 ef8247e1..8c456c6a 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -14,7 +14,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE inline CollectionIterator::CollectionIterator(VariantData* slot, SlotId slotId) : slot_(slot), currentId_(slotId) { - nextId_ = slot_ ? slot_->next() : NULL_SLOT; + nextId_ = slot_ ? slot_->next : NULL_SLOT; } inline void CollectionIterator::next(const ResourceManager* resources) { @@ -22,7 +22,7 @@ inline void CollectionIterator::next(const ResourceManager* resources) { slot_ = resources->getVariant(nextId_); currentId_ = nextId_; if (slot_) - nextId_ = slot_->next(); + nextId_ = slot_->next; } inline CollectionImpl::iterator CollectionImpl::createIterator() const { @@ -37,7 +37,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(); @@ -50,11 +50,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(); @@ -69,7 +69,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}); } @@ -86,7 +86,7 @@ inline Slot CollectionImpl::getPreviousSlot( if (currentSlot == target) break; prev = Slot(currentSlot, currentId); - currentId = currentSlot->next(); + currentId = currentSlot->next; } return prev; } @@ -96,9 +96,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) @@ -116,7 +116,7 @@ inline void CollectionImpl::removePair(ObjectImpl::iterator it) { auto valueSlot = resources_->getVariant(valueId); // remove value slot - keySlot->setNext(valueSlot->next()); + keySlot->next = valueSlot->next; resources_->freeVariant({valueSlot, valueId}); // remove key slot @@ -128,7 +128,8 @@ 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_); + VariantImpl variant(it.data(), resources_); + size_t childNesting = variant.nesting(); if (childNesting > maxChildNesting) maxChildNesting = childNesting; } diff --git a/src/ArduinoJson/Deserialization/deserialize.hpp b/src/ArduinoJson/Deserialization/deserialize.hpp index 4c3b2298..5da5df87 100644 --- a/src/ArduinoJson/Deserialization/deserialize.hpp +++ b/src/ArduinoJson/Deserialization/deserialize.hpp @@ -50,7 +50,7 @@ DeserializationError doDeserialize(TDestination&& dst, TReader reader, auto resources = VariantAttorney::getResourceManager(dst); dst.clear(); auto err = TDeserializer(resources, reader) - .parse(*data, options.filter, options.nestingLimit); + .parse(data, options.filter, options.nestingLimit); shrinkJsonDocument(dst); return err; } 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 b70bf4ce..25b81f42 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -28,13 +28,13 @@ class JsonDeserializer { resources_(resources) {} template - DeserializationError parse(VariantData& variant, TFilter filter, + DeserializationError parse(VariantData* variant, TFilter filter, DeserializationOption::NestingLimit nestingLimit) { DeserializationError::Code err; err = parseVariant(variant, filter, nestingLimit); - if (!err && latch_.last() != 0 && variant.isFloat()) { + if (!err && latch_.last() != 0 && variant->isFloat()) { // We don't detect trailing characters earlier, so we need to check now return DeserializationError::InvalidInput; } @@ -60,7 +60,7 @@ class JsonDeserializer { template DeserializationError::Code parseVariant( - VariantData& variant, TFilter filter, + VariantData* variant, TFilter filter, DeserializationOption::NestingLimit nestingLimit) { DeserializationError::Code err; @@ -71,14 +71,15 @@ class JsonDeserializer { switch (current()) { case '[': if (filter.allowArray()) - return parseArray(variant.toArray(resources_), filter, nestingLimit); + return parseArray(VariantImpl(variant, resources_).toArray(), filter, + nestingLimit); else return skipArray(nestingLimit); case '{': if (filter.allowObject()) - return parseObject(variant.toObject(resources_), filter, - nestingLimit); + return parseObject(VariantImpl(variant, resources_).toObject(), + filter, nestingLimit); else return skipObject(nestingLimit); @@ -91,12 +92,12 @@ class JsonDeserializer { case 't': if (filter.allowValue()) - variant.setBoolean(true); + variant->setBoolean(true); return skipKeyword("true"); case 'f': if (filter.allowValue()) - variant.setBoolean(false); + variant->setBoolean(false); return skipKeyword("false"); case 'n': @@ -178,7 +179,7 @@ class JsonDeserializer { return DeserializationError::NoMemory; // 1 - Parse value - err = parseVariant(*value, elementFilter, nestingLimit.decrement()); + err = parseVariant(value, elementFilter, nestingLimit.decrement()); if (err) return err; } else { @@ -282,11 +283,11 @@ class JsonDeserializer { stringBuilder_.save(keyVariant); } else { - member->clear(resources_); + VariantImpl(member, resources_).clear(); } // Parse value - err = parseVariant(*member, memberFilter, nestingLimit.decrement()); + err = parseVariant(member, memberFilter, nestingLimit.decrement()); if (err) return err; } else { @@ -380,7 +381,7 @@ class JsonDeserializer { } } - DeserializationError::Code parseStringValue(VariantData& variant) { + DeserializationError::Code parseStringValue(VariantData* variant) { DeserializationError::Code err; stringBuilder_.startString(); @@ -389,7 +390,7 @@ class JsonDeserializer { if (err) return err; - stringBuilder_.save(&variant); + stringBuilder_.save(variant); return DeserializationError::Ok; } @@ -505,7 +506,7 @@ class JsonDeserializer { return DeserializationError::Ok; } - DeserializationError::Code parseNumericValue(VariantData& result) { + DeserializationError::Code parseNumericValue(VariantData* result) { uint8_t n = 0; char c = current(); @@ -519,26 +520,28 @@ class JsonDeserializer { auto number = parseNumber(buffer_); switch (number.type()) { case NumberType::UnsignedInteger: - if (result.setInteger(number.asUnsignedInteger(), resources_)) + if (VariantImpl(result, resources_) + .setInteger(number.asUnsignedInteger())) return DeserializationError::Ok; else return DeserializationError::NoMemory; case NumberType::SignedInteger: - if (result.setInteger(number.asSignedInteger(), resources_)) + if (VariantImpl(result, resources_) + .setInteger(number.asSignedInteger())) return DeserializationError::Ok; else return DeserializationError::NoMemory; case NumberType::Float: - if (result.setFloat(number.asFloat(), resources_)) + if (VariantImpl(result, resources_).setFloat(number.asFloat())) return DeserializationError::Ok; else return DeserializationError::NoMemory; #if ARDUINOJSON_USE_DOUBLE case NumberType::Double: - if (result.setFloat(number.asDouble(), resources_)) + if (VariantImpl(result, resources_).setFloat(number.asDouble())) return DeserializationError::Ok; else return DeserializationError::NoMemory; diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index e1bb6da8..2c32d0e7 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(slot, resources_).accept(*this); - 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(slot, resources_).accept(*this); - 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..de6e1b1e 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(it.data(), base::resources_).accept(*this); 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(it.data(), base::resources_).accept(*this); it.next(base::resources_); if (isKey) base::write(": "); diff --git a/src/ArduinoJson/Memory/ResourceManager.hpp b/src/ArduinoJson/Memory/ResourceManager.hpp index 4ea6b7b3..52fbc352 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..583e11c3 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(slot.ptr(), this).clear(); variantPools_.freeSlot(slot); } diff --git a/src/ArduinoJson/MsgPack/MsgPackBinary.hpp b/src/ArduinoJson/MsgPack/MsgPackBinary.hpp index 2c0f6b71..bc2bb120 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(data, resources).clear(); if (src.data()) { size_t headerSize = src.size() >= 0x10000 ? 5 : src.size() >= 0x100 ? 3 @@ -66,10 +66,8 @@ struct Converter : private detail::VariantAttorney { } static MsgPackBinary fromJson(JsonVariantConst src) { - auto data = getData(src); - if (!data) - return {}; - auto rawstr = data->asRawString(); + auto variant = VariantAttorney::getVariantImpl(src); + auto rawstr = variant.asRawString(); auto p = reinterpret_cast(rawstr.c_str()); auto n = rawstr.size(); if (n >= 2 && p[0] == 0xc4) { // bin 8 diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index ac1e4056..cb81e5c5 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -24,10 +24,10 @@ class MsgPackDeserializer { foundSomething_(false) {} template - DeserializationError parse(VariantData& variant, TFilter filter, + DeserializationError parse(VariantData* variant, TFilter filter, DeserializationOption::NestingLimit nestingLimit) { DeserializationError::Code err; - err = parseVariant(&variant, filter, nestingLimit); + err = parseVariant(variant, filter, nestingLimit); return foundSomething_ ? err : DeserializationError::EmptyInput; } @@ -91,7 +91,7 @@ class MsgPackDeserializer { if (code <= 0x7f || code >= 0xe0) { // fixint if (allowValue) - variant->setInteger(static_cast(code), resources_); + VariantImpl(variant, resources_).setInteger(static_cast(code)); 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(variant, resources_).setInteger(truncatedValue)) return DeserializationError::NoMemory; } // else set null on overflow } else { auto truncatedValue = static_cast(unsignedValue); if (truncatedValue == unsignedValue) - if (!variant->setInteger(truncatedValue, resources_)) + if (!VariantImpl(variant, resources_).setInteger(truncatedValue)) return DeserializationError::NoMemory; // else set null on overflow } @@ -257,7 +257,7 @@ class MsgPackDeserializer { return err; fixEndianness(value); - variant->setFloat(value, resources_); + VariantImpl(variant, resources_).setFloat(value); return DeserializationError::Ok; } @@ -273,7 +273,7 @@ class MsgPackDeserializer { return err; fixEndianness(value); - if (variant->setFloat(value, resources_)) + if (VariantImpl(variant, resources_).setFloat(value)) return DeserializationError::Ok; else return DeserializationError::NoMemory; @@ -293,7 +293,7 @@ class MsgPackDeserializer { doubleToFloat(i, o); fixEndianness(value); - variant->setFloat(value, resources_); + VariantImpl(variant, resources_).setFloat(value); return DeserializationError::Ok; } @@ -352,7 +352,7 @@ class MsgPackDeserializer { ArrayImpl array; if (allowArray) { ARDUINOJSON_ASSERT(variant != 0); - array = variant->toArray(resources_); + array = VariantImpl(variant, resources_).toArray(); } 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(variant, resources_).toObject(); } for (; n; --n) { diff --git a/src/ArduinoJson/MsgPack/MsgPackExtension.hpp b/src/ArduinoJson/MsgPack/MsgPackExtension.hpp index b51eb30b..78e7833d 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(data, resources).clear(); if (src.data()) { uint8_t format, sizeBytes; if (src.size() >= 0x10000) { @@ -80,10 +80,8 @@ struct Converter : private detail::VariantAttorney { } static MsgPackExtension fromJson(JsonVariantConst src) { - auto data = getData(src); - if (!data) - return {}; - auto rawstr = data->asRawString(); + auto variant = VariantAttorney::getVariantImpl(src); + auto rawstr = variant.asRawString(); if (rawstr.size() == 0) return {}; auto p = reinterpret_cast(rawstr.c_str()); diff --git a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index 56e725fe..6b0122eb 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(slot, resources_).accept(*this); + 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(slot, resources_).accept(*this); + slotId = slot->next; } return bytesWritten(); diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 87c49299..759b1f1d 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(data, resource).asObject()) {} operator JsonVariant() const { return JsonVariant(getData(), getResourceManager()); diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index 264f729f..f38d6d55 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(data, resources).asObject()) {} // INTERNAL USE ONLY JsonObjectConst(const detail::ObjectImpl& impl) : impl_(impl) {} diff --git a/src/ArduinoJson/Object/JsonPair.hpp b/src/ArduinoJson/Object/JsonPair.hpp index afbeba1f..1dcbd94e 100644 --- a/src/ArduinoJson/Object/JsonPair.hpp +++ b/src/ArduinoJson/Object/JsonPair.hpp @@ -18,7 +18,8 @@ class JsonPair { JsonPair(detail::ObjectImpl::iterator iterator, detail::ResourceManager* resources) { if (!iterator.done()) { - key_ = iterator->asString(resources); + detail::VariantImpl variant(iterator.data(), resources); + key_ = variant.asString(); iterator.next(resources); value_ = JsonVariant(iterator.data(), resources); } @@ -46,7 +47,8 @@ class JsonPairConst { JsonPairConst(detail::ObjectImpl::iterator iterator, detail::ResourceManager* resources) { if (!iterator.done()) { - key_ = iterator->asString(resources); + detail::VariantImpl variant(iterator.data(), resources); + key_ = variant.asString(); iterator.next(resources); value_ = JsonVariantConst(iterator.data(), resources); } 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 8ef3ddda..a55503a2 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -33,7 +33,8 @@ inline ObjectImpl::iterator ObjectImpl::findKey(TAdaptedString key) const { return iterator(); bool isKey = true; for (auto it = createIterator(); !it.done(); it.next(resources_)) { - if (isKey && stringEquals(key, adaptString(it->asString(resources_)))) + VariantImpl variant(it.data(), resources_); + if (isKey && stringEquals(key, adaptString(variant.asString()))) return it; isKey = !isKey; } @@ -59,7 +60,8 @@ inline VariantData* ObjectImpl::addMember(TAdaptedString key) { if (!valueSlot) return nullptr; - if (!keySlot->setString(key, resources_)) + VariantImpl keyImpl(keySlot.ptr(), resources_); + if (!keyImpl.setString(key)) return nullptr; CollectionImpl::appendPair(keySlot, valueSlot); diff --git a/src/ArduinoJson/Serialization/measure.hpp b/src/ArduinoJson/Serialization/measure.hpp index 62d8fce1..2bd468a9 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(data, resources).accept(serializer); } ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Serialization/serialize.hpp b/src/ArduinoJson/Serialization/serialize.hpp index ad93adec..fa5afbd9 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(data, resources).accept(serializer); } template