diff --git a/CHANGELOG.md b/CHANGELOG.md index 069dfe0..a3e0d33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ * align from serializer/deserializer * AdapterAccess class * helper class Serializer/Deserializer -* deprecated registerBasesList from PolymorphicContext +* removed deprecated function registerBasesList from PolymorphicContext * internal context from config, because it doesn't actually solve any problems, only allows to do same thing in multiple ways * AdapterWriter/Reader classes, and their functionality is moved to `adapters`. * UnsafeInputBufferAdapter, instead config option is provided to disable buffer read errors @@ -27,6 +27,7 @@ (e.g. you can require base class of context in extension, but provided child implementation instead) * renamed NetworkEndianness to Endianness in config * MeasureSize adapter moved to separate file `/adapter/measure_size.h` +* removed Writer/Reader parameter from extensions serialize/deserialize methods ## improvements diff --git a/include/bitsery/deserializer.h b/include/bitsery/deserializer.h index cd480da..b3dabca 100644 --- a/include/bitsery/deserializer.h +++ b/include/bitsery/deserializer.h @@ -168,6 +168,7 @@ namespace bitsery { using BPEnabledType = BasicDeserializer>::type, TContext>; + using TConfig = typename TInputAdapter::TConfig; using details::AdapterAndContextRef::AdapterAndContextRef; @@ -233,7 +234,7 @@ namespace bitsery { static_assert(details::IsExtensionTraitsDefined::value, "Please define ExtensionTraits"); static_assert(traits::ExtensionTraits::SupportLambdaOverload, "extension doesn't support overload with lambda"); - extension.deserialize(*this, this->_adapter, obj, std::forward(fnc)); + extension.deserialize(*this, obj, std::forward(fnc)); } template @@ -243,7 +244,7 @@ namespace bitsery { "extension doesn't support overload with `value`"); using ExtVType = typename traits::ExtensionTraits::TValue; using VType = typename std::conditional::value, details::DummyType, ExtVType>::type; - extension.deserialize(*this, this->_adapter, obj, [](BasicDeserializer& s, VType &v) { s.value(v);}); + extension.deserialize(*this, obj, [](BasicDeserializer& s, VType &v) { s.value(v);}); } template @@ -253,7 +254,7 @@ namespace bitsery { "extension doesn't support overload with `object`"); using ExtVType = typename traits::ExtensionTraits::TValue; using VType = typename std::conditional::value, details::DummyType, ExtVType>::type; - extension.deserialize(*this, this->_adapter, obj, [](BasicDeserializer& s, VType &v) { s.object(v); }); + extension.deserialize(*this, obj, [](BasicDeserializer& s, VType &v) { s.object(v); }); } /* diff --git a/include/bitsery/ext/compact_value.h b/include/bitsery/ext/compact_value.h index be8582b..788674a 100644 --- a/include/bitsery/ext/compact_value.h +++ b/include/bitsery/ext/compact_value.h @@ -35,43 +35,43 @@ namespace bitsery { class CompactValueImpl { public: - template - void serialize(Ser &s, Writer &writer, const T &v, Fnc &&) const { + template + void serialize(Ser &s, const T &v, Fnc &&) const { static_assert(std::is_integral::value || std::is_enum::value, ""); using TValue = typename IntegralFromFundamental::TValue; - serializeImpl(s, writer, reinterpret_cast(v), std::integral_constant{}); + serializeImpl(s.adapter(), reinterpret_cast(v), std::integral_constant{}); } - template - void deserialize(Des &d, Reader &reader, T &v, Fnc &&) const { + template + void deserialize(Des &d, T &v, Fnc &&) const { static_assert(std::is_integral::value || std::is_enum::value, ""); using TValue = typename IntegralFromFundamental::TValue; - deserializeImpl(d, reader, reinterpret_cast(v), std::integral_constant{}); + deserializeImpl(d.adapter(), reinterpret_cast(v), std::integral_constant{}); } private: // if value is 1byte size, just serialize/ deserialize whole value - template - void serializeImpl(Ser &s, Writer &, const T &v, std::false_type) const { - s.value1b(v); + template + void serializeImpl(Writer &writer, const T &v, std::false_type) const { + writer.template writeBytes<1>(v); } - template - void deserializeImpl(Des &d, Reader &, T &v, std::false_type) const { - d.value1b(v); + template + void deserializeImpl(Reader &reader, T &v, std::false_type) const { + reader.template readBytes<1>(v); } // when value is bigger than 1byte size, - template - void serializeImpl(Ser &, Writer &writer, const T &v, std::true_type) const { + template + void serializeImpl(Writer &writer, const T &v, std::true_type) const { auto val = zigZagEncode(v, std::is_signed::TValue>{}); writeBytes(writer, val); } - template - void deserializeImpl(Des &, Reader &reader, T &v, std::true_type) const { + template + void deserializeImpl(Reader &reader, T &v, std::true_type) const { using TUnsigned = SameSizeUnsigned; TUnsigned res{}; readBytes(reader, res); diff --git a/include/bitsery/ext/entropy.h b/include/bitsery/ext/entropy.h index 3a5dd09..4a355d8 100644 --- a/include/bitsery/ext/entropy.h +++ b/include/bitsery/ext/entropy.h @@ -56,24 +56,24 @@ namespace bitsery { _alignBeforeData{alignBeforeData} { }; - template - void serialize(Ser &s, Writer &writer, const T &obj, Fnc &&fnc) const { + template + void serialize(Ser &s, const T &obj, Fnc &&fnc) const { assert(traits::ContainerTraits::size(_values) > 0); auto index = details::findEntropyIndex(obj, _values); s.ext(index, ext::ValueRange{0u, traits::ContainerTraits::size(_values)}); if (_alignBeforeData) - writer.align(); + s.adapter().align(); if (!index) fnc(s, const_cast(obj)); } - template - void deserialize(Des &d, Reader &reader, T &obj, Fnc &&fnc) const { + template + void deserialize(Des &d, T &obj, Fnc &&fnc) const { assert(traits::ContainerTraits::size(_values) > 0); size_t index{}; d.ext(index, ext::ValueRange{0u, traits::ContainerTraits::size(_values)}); if (_alignBeforeData) - reader.align(); + d.adapter().align(); if (index) obj = *std::next(std::begin(_values), index-1); else diff --git a/include/bitsery/ext/growable.h b/include/bitsery/ext/growable.h index 1ae794c..eb8619a 100644 --- a/include/bitsery/ext/growable.h +++ b/include/bitsery/ext/growable.h @@ -37,8 +37,9 @@ namespace bitsery { class Growable { public: - template - void serialize(Ser &ser, Writer &writer, const T &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const T &obj, Fnc &&fnc) const { + auto& writer = ser.adapter(); const auto startPos = writer.currentWritePos(); writer.template writeBytes<4>(static_cast(0)); @@ -50,8 +51,9 @@ namespace bitsery { writer.currentWritePos(endPos); } - template - void deserialize(Des &des, Reader &reader, T &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, T &obj, Fnc &&fnc) const { + auto& reader = des.adapter(); uint32_t size{}; const auto readEndPos = reader.currentReadEndPos(); const auto startPos = reader.currentReadPos(); diff --git a/include/bitsery/ext/inheritance.h b/include/bitsery/ext/inheritance.h index c881ca4..c2c53d0 100644 --- a/include/bitsery/ext/inheritance.h +++ b/include/bitsery/ext/inheritance.h @@ -79,8 +79,8 @@ namespace bitsery { class BaseClass { public: - template - void serialize(Ser &ser, Writer &, const T &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const T &obj, Fnc &&fnc) const { auto& resObj = static_cast(obj); if (auto ctx = ser.template contextOrNull()) { ctx->beginBase(obj, resObj); @@ -91,8 +91,8 @@ namespace bitsery { } } - template - void deserialize(Des &des, Reader &, T &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, T &obj, Fnc &&fnc) const { auto& resObj = static_cast(obj); if (auto ctx = des.template contextOrNull()) { ctx->beginBase(obj, resObj); @@ -110,8 +110,8 @@ namespace bitsery { class VirtualBaseClass { public: - template - void serialize(Ser &ser, Writer &, const T &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const T &obj, Fnc &&fnc) const { auto& ctx = ser.template context(); auto& resObj = static_cast(obj); if (ctx.beginVirtualBase(obj, resObj)) @@ -119,8 +119,8 @@ namespace bitsery { ctx.end(); } - template - void deserialize(Des &des, Reader &, T &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, T &obj, Fnc &&fnc) const { auto& ctx = des.template context(); auto& resObj = static_cast(obj); if (ctx.beginVirtualBase(obj, resObj)) diff --git a/include/bitsery/ext/std_chrono.h b/include/bitsery/ext/std_chrono.h index 2e51cf4..4884b0a 100644 --- a/include/bitsery/ext/std_chrono.h +++ b/include/bitsery/ext/std_chrono.h @@ -32,14 +32,14 @@ namespace bitsery { class StdDuration { public: - template - void serialize(Ser& ser, Writer&, const std::chrono::duration& obj, Fnc&& fnc) const { + template + void serialize(Ser& ser, const std::chrono::duration& obj, Fnc&& fnc) const { auto res = obj.count(); fnc(ser, res); } - template - void deserialize(Des& des, Reader&, std::chrono::duration& obj, Fnc&& fnc) const { + template + void deserialize(Des& des, std::chrono::duration& obj, Fnc&& fnc) const { T res{}; fnc(des, res); obj = std::chrono::duration{res}; @@ -49,15 +49,15 @@ namespace bitsery { class StdTimePoint { public: - template - void serialize(Ser& ser, Writer&, const std::chrono::time_point>& obj, + template + void serialize(Ser& ser, const std::chrono::time_point>& obj, Fnc&& fnc) const { auto res = obj.time_since_epoch().count(); fnc(ser, res); } - template - void deserialize(Des& des, Reader&, std::chrono::time_point>& obj, + template + void deserialize(Des& des, std::chrono::time_point>& obj, Fnc&& fnc) const { T res{}; fnc(des, res); diff --git a/include/bitsery/ext/std_map.h b/include/bitsery/ext/std_map.h index 5d706b1..02d42ca 100644 --- a/include/bitsery/ext/std_map.h +++ b/include/bitsery/ext/std_map.h @@ -37,25 +37,26 @@ namespace bitsery { constexpr explicit StdMap(size_t maxSize):_maxSize{maxSize} {} - template - void serialize(Ser &ser, Writer &writer, const T &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const T &obj, Fnc &&fnc) const { using TKey = typename T::key_type; using TValue = typename T::mapped_type; auto size = obj.size(); assert(size <= _maxSize); - details::writeSize(writer, size); + details::writeSize(ser.adapter(), size); for (auto &v:obj) fnc(ser, const_cast(v.first), const_cast(v.second)); } - template - void deserialize(Des &des, Reader &reader, T &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, T &obj, Fnc &&fnc) const { using TKey = typename T::key_type; using TValue = typename T::mapped_type; size_t size{}; - details::readSize(reader, size, _maxSize, std::integral_constant{}); + details::readSize(des.adapter(), size, _maxSize, + std::integral_constant{}); obj.clear(); reserve(obj, size); diff --git a/include/bitsery/ext/std_optional.h b/include/bitsery/ext/std_optional.h index 7611040..ad0a708 100644 --- a/include/bitsery/ext/std_optional.h +++ b/include/bitsery/ext/std_optional.h @@ -40,21 +40,21 @@ namespace bitsery { */ explicit StdOptional(bool alignBeforeData=true):_alignBeforeData{alignBeforeData} {} - template - void serialize(Ser &ser, Writer &writer, const std::optional &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const std::optional &obj, Fnc &&fnc) const { ser.boolValue(static_cast(obj)); if (_alignBeforeData) - writer.align(); + ser.adapter().align(); if (obj) fnc(ser, const_cast(*obj)); } - template - void deserialize(Des &des, Reader &reader, std::optional &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, std::optional &obj, Fnc &&fnc) const { bool exists{}; des.boolValue(exists); if (_alignBeforeData) - reader.align(); + des.adapter().align(); if (exists) { obj = ::bitsery::Access::create(); fnc(des, *obj); diff --git a/include/bitsery/ext/std_queue.h b/include/bitsery/ext/std_queue.h index 0ffe49c..3f935fa 100644 --- a/include/bitsery/ext/std_queue.h +++ b/include/bitsery/ext/std_queue.h @@ -71,24 +71,24 @@ namespace bitsery { explicit StdQueue(size_t maxSize):_maxSize{maxSize} {}; //for queue - template - void serialize(Ser &ser, Writer &, const std::queue &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const std::queue &obj, Fnc &&fnc) const { ser.container(QueueCnt::getContainer(obj), _maxSize, std::forward(fnc)); } - template - void deserialize(Des &des, Reader &, std::queue &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, std::queue &obj, Fnc &&fnc) const { des.container(QueueCnt::getContainer(obj), _maxSize, std::forward(fnc)); } //for priority_queue - template - void serialize(Ser &ser, Writer &, const std::priority_queue &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const std::priority_queue &obj, Fnc &&fnc) const { ser.container(PriorityQueueCnt::getContainer(obj), _maxSize, std::forward(fnc)); } - template - void deserialize(Des &des, Reader &, std::priority_queue &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, std::priority_queue &obj, Fnc &&fnc) const { des.container(PriorityQueueCnt::getContainer(obj), _maxSize, std::forward(fnc)); } diff --git a/include/bitsery/ext/std_set.h b/include/bitsery/ext/std_set.h index 885a8ec..b9383ca 100644 --- a/include/bitsery/ext/std_set.h +++ b/include/bitsery/ext/std_set.h @@ -37,23 +37,23 @@ namespace bitsery { constexpr explicit StdSet(size_t maxSize):_maxSize{maxSize} {} - template - void serialize(Ser &ser, Writer &writer, const T &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const T &obj, Fnc &&fnc) const { using TKey = typename T::key_type; auto size = obj.size(); assert(size <= _maxSize); - details::writeSize(writer, size); + details::writeSize(ser.adapter(), size); for (auto &v:obj) fnc(ser, const_cast(v)); } - template - void deserialize(Des &des, Reader &reader, T &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, T &obj, Fnc &&fnc) const { using TKey = typename T::key_type; size_t size{}; - details::readSize(reader, size, _maxSize, std::integral_constant{}); + details::readSize(des.adapter(), size, _maxSize, std::integral_constant{}); obj.clear(); reserve(obj, size); auto hint = obj.begin(); diff --git a/include/bitsery/ext/std_stack.h b/include/bitsery/ext/std_stack.h index 1338d59..6feba94 100644 --- a/include/bitsery/ext/std_stack.h +++ b/include/bitsery/ext/std_stack.h @@ -53,13 +53,13 @@ namespace bitsery { public: explicit StdStack(size_t maxSize):_maxSize{maxSize} {}; - template - void serialize(Ser &ser, Writer &, const std::stack &obj, Fnc &&fnc) const { + template + void serialize(Ser &ser, const std::stack &obj, Fnc &&fnc) const { ser.container(StackCnt::getContainer(obj), _maxSize, std::forward(fnc)); } - template - void deserialize(Des &des, Reader &, std::stack &obj, Fnc &&fnc) const { + template + void deserialize(Des &des, std::stack &obj, Fnc &&fnc) const { des.container(StackCnt::getContainer(obj), _maxSize, std::forward(fnc)); } diff --git a/include/bitsery/ext/std_tuple.h b/include/bitsery/ext/std_tuple.h index 25cc578..d698243 100644 --- a/include/bitsery/ext/std_tuple.h +++ b/include/bitsery/ext/std_tuple.h @@ -36,13 +36,13 @@ namespace bitsery { class StdTuple : public details::CompositeTypeOverloadsUtils { public: - template - void serialize(Ser& ser, Writer&, const std::tuple& obj, Fnc&&) const { + template + void serialize(Ser& ser, const std::tuple& obj, Fnc&&) const { serializeAll(ser, const_cast&>(obj)); } - template - void deserialize(Des& des, Reader&, std::tuple& obj, Fnc&&) const { + template + void deserialize(Des& des, std::tuple& obj, Fnc&&) const { serializeAll(des, obj); } diff --git a/include/bitsery/ext/std_variant.h b/include/bitsery/ext/std_variant.h index e85c087..f5dd17f 100644 --- a/include/bitsery/ext/std_variant.h +++ b/include/bitsery/ext/std_variant.h @@ -36,21 +36,21 @@ namespace bitsery { class StdVariant : public details::CompositeTypeOverloadsUtils { public: - template - void serialize(Ser& ser, Writer& writer, const std::variant& obj, Fnc&&) const { + template + void serialize(Ser& ser, const std::variant& obj, Fnc&&) const { auto index = obj.index(); assert(index != std::variant_npos); - details::writeSize(writer, index); + details::writeSize(ser.adapter(), index); this->execIndex(index, const_cast&>(obj), [this, &ser](auto& data, auto index) { constexpr size_t Index = decltype(index)::value; this->serializeType(ser, std::get(data)); }); } - template - void deserialize(Des& des, Reader& reader, std::variant& obj, Fnc&&) const { + template + void deserialize(Des& des, std::variant& obj, Fnc&&) const { size_t index{}; - details::readSize(reader, index, sizeof...(Ts), std::integral_constant{}); + details::readSize(des.adapter(), index, sizeof...(Ts), std::integral_constant{}); this->execIndex(index, obj, [this, &des](auto& data, auto index) { constexpr size_t Index = decltype(index)::value; using TElem = typename std::variant_alternative>::type; diff --git a/include/bitsery/ext/utils/pointer_utils.h b/include/bitsery/ext/utils/pointer_utils.h index 7421e00..d9e12c1 100644 --- a/include/bitsery/ext/utils/pointer_utils.h +++ b/include/bitsery/ext/utils/pointer_utils.h @@ -287,29 +287,29 @@ namespace bitsery { _resource{resource} { } - template - void serialize(Ser& ser, Writer& w, const T& obj, Fnc&& fnc) const { + template + void serialize(Ser& ser, const T& obj, Fnc&& fnc) const { auto ptr = TPtrManager::getPtr(const_cast(obj)); if (ptr) { auto& ctx = ser.template context(); auto& ptrInfo = ctx.getInfoByPtr(getBasePtr(ptr), TPtrManager::getOwnership()); - details::writeSize(w, ptrInfo.id); + details::writeSize(ser.adapter(), ptrInfo.id); if (TPtrManager::getOwnership() != PointerOwnershipType::Observer) { if (!ptrInfo.isSharedProcessed) - serializeImpl(ser, ptr, std::forward(fnc), w, IsPolymorphic{}); + serializeImpl(ser, ptr, std::forward(fnc), IsPolymorphic{}); } } else { assert(_ptrType == PointerType::Nullable); - details::writeSize(w, 0); + details::writeSize(ser.adapter(), 0); } } - template - void deserialize(Des& des, Reader& r, T& obj, Fnc&& fnc) const { + template + void deserialize(Des& des, T& obj, Fnc&& fnc) const { size_t id{}; - details::readSize(r, id, 0, std::false_type{}); + details::readSize(des.adapter(), id, 0, std::false_type{}); auto& ctx = des.template context(); auto prevResource = ctx.getMemResource(); auto memResource = _resource ? _resource : prevResource; @@ -320,7 +320,7 @@ namespace bitsery { } if (id) { auto& ptrInfo = ctx.getInfoById(id, TPtrManager::getOwnership()); - deserializeImpl(memResource, ptrInfo, des, obj, std::forward(fnc), r, IsPolymorphic{}, + deserializeImpl(memResource, ptrInfo, des, obj, std::forward(fnc), IsPolymorphic{}, OwnershipType::getOwnership()>{}); } else { if (_ptrType == PointerType::Nullable) { @@ -328,7 +328,7 @@ namespace bitsery { destroyPtr(memResource, des, obj, IsPolymorphic{}); }; } else - r.error(ReaderError::InvalidPointer); + des.adapter().error(ReaderError::InvalidPointer); } if (_resource && _resourcePropagate) { ctx.setMemResource(prevResource); @@ -360,22 +360,22 @@ namespace bitsery { return ptr; } - template - void serializeImpl(Ser& ser, TPtr& ptr, Fnc&&, Writer& w, std::true_type) const { + template + void serializeImpl(Ser& ser, TPtr& ptr, Fnc&&, std::true_type) const { const auto& ctx = ser.template context>(); - ctx.serialize(ser, w, *ptr); + ctx.serialize(ser, *ptr); } - template - void serializeImpl(Ser& ser, TPtr& ptr, Fnc&& fnc, Writer&, std::false_type) const { + template + void serializeImpl(Ser& ser, TPtr& ptr, Fnc&& fnc, std::false_type) const { fnc(ser, *ptr); } - template + template void deserializeImpl(MemResourceBase* memResource, PLCInfoDeserializer& ptrInfo, Des& des, T& obj, Fnc&&, - Reader& r, std::true_type, OwnershipType) const { + std::true_type, OwnershipType) const { const auto& ctx = des.template context>(); - ctx.deserialize(des, r, TPtrManager::getPtr(obj), + ctx.deserialize(des, TPtrManager::getPtr(obj), [&obj, this, memResource]( const std::shared_ptr& handler) { TPtrManager::createPolymorphic(obj, memResource, handler); @@ -387,9 +387,9 @@ namespace bitsery { ptrInfo.processOwner(TPtrManager::getPtr(obj)); } - template + template void deserializeImpl(MemResourceBase* memResource, PLCInfoDeserializer& ptrInfo, Des& des, T& obj, Fnc&& fnc, - Reader&, std::false_type, OwnershipType) const { + std::false_type, OwnershipType) const { auto ptr = TPtrManager::getPtr(obj); if (ptr) { fnc(des, *ptr); @@ -401,13 +401,12 @@ namespace bitsery { ptrInfo.processOwner(ptr); } - template + template void deserializeImpl(MemResourceBase* memResource, PLCInfoDeserializer& ptrInfo, Des& des, T& obj, Fnc&&, - Reader& r, std::true_type, - OwnershipType) const { + std::true_type, OwnershipType) const { if (!ptrInfo.sharedState) { const auto& ctx = des.template context>(); - ctx.deserialize(des, r, TPtrManager::getPtr(obj), + ctx.deserialize(des, TPtrManager::getPtr(obj), [&obj, &ptrInfo, memResource, this]( const std::shared_ptr& handler) { TPtrManager::createSharedPolymorphic( @@ -425,9 +424,9 @@ namespace bitsery { ptrInfo.processOwner(TPtrManager::getPtr(obj)); } - template + template void deserializeImpl(MemResourceBase* memResource, PLCInfoDeserializer& ptrInfo, Des& des, T& obj, Fnc&& fnc, - Reader&, std::false_type, OwnershipType) const { + std::false_type, OwnershipType) const { if (!ptrInfo.sharedState) { auto ptr = TPtrManager::getPtr(obj); if (ptr) { @@ -444,17 +443,17 @@ namespace bitsery { ptrInfo.processOwner(TPtrManager::getPtr(obj)); } - template + template void deserializeImpl(MemResourceBase* memResource, PLCInfoDeserializer& ptrInfo, Des& des, T& obj, - Fnc&& fnc, Reader& r, isPolymorph polymorph, + Fnc&& fnc, isPolymorph polymorph, OwnershipType) const { - deserializeImpl(memResource, ptrInfo, des, obj, fnc, r, polymorph, + deserializeImpl(memResource, ptrInfo, des, obj, fnc, polymorph, OwnershipType{}); } - template + template void deserializeImpl(MemResourceBase* , PLCInfoDeserializer& ptrInfo, Des&, T& obj, Fnc&&, - Reader&, isPolymorphic, OwnershipType) const { + isPolymorphic, OwnershipType) const { ptrInfo.processObserver(reinterpret_cast(TPtrManager::getPtrRef(obj))); } diff --git a/include/bitsery/ext/utils/polymorphism_utils.h b/include/bitsery/ext/utils/polymorphism_utils.h index 4d0f398..d0233fd 100644 --- a/include/bitsery/ext/utils/polymorphism_utils.h +++ b/include/bitsery/ext/utils/polymorphism_utils.h @@ -226,8 +226,8 @@ namespace bitsery { } - template - void serialize(Serializer& ser, Writer& writer, TBase& obj) const { + template + void serialize(Serializer& ser, TBase& obj) const { //get derived key BaseToDerivedKey key{RTTI::template get(), RTTI::template get(obj)}; auto it = _baseToDerivedMap.find(key); @@ -237,17 +237,17 @@ namespace bitsery { auto& vec = _baseToDerivedArray.find(key.baseHash)->second; auto derivedIndex = static_cast(std::distance(vec.begin(), std::find(vec.begin(), vec.end(), key.derivedHash))); - details::writeSize(writer, derivedIndex); + details::writeSize(ser.adapter(), derivedIndex); //serialize it->second->process(&ser, &obj); } - template - void deserialize(Deserializer& des, Reader& reader, TBase* obj, + template + void deserialize(Deserializer& des, TBase* obj, TCreateFnc createFnc, TDestroyFnc destroyFnc) const { size_t derivedIndex{}; - details::readSize(reader, derivedIndex, 0, std::false_type{}); + details::readSize(des.adapter(), derivedIndex, 0, std::false_type{}); auto baseToDerivedVecIt = _baseToDerivedArray.find(RTTI::template get()); //base class is known at compile time, so we can assert on this one @@ -267,7 +267,7 @@ namespace bitsery { } handler->process(&des, obj); } else - reader.error(ReaderError::InvalidPointer); + des.adapter().error(ReaderError::InvalidPointer); } template diff --git a/include/bitsery/ext/value_range.h b/include/bitsery/ext/value_range.h index 338f4b8..0ca92b8 100644 --- a/include/bitsery/ext/value_range.h +++ b/include/bitsery/ext/value_range.h @@ -167,18 +167,19 @@ namespace bitsery { constexpr ValueRange(const TValue& min, const TValue& max, Args &&... args) :_range{min, max, std::forward(args)...} {} - template - void serialize(Ser &, Writer &writer, const T &v, Fnc &&) const { + template + void serialize(Ser &ser, const T &v, Fnc &&) const { assert(details::isRangeValid(v, _range)); using BT = decltype(details::getRangeValue(v, _range)); - writer.template writeBits(details::getRangeValue(v, _range), _range.bitsRequired); + ser.adapter().template writeBits(details::getRangeValue(v, _range), _range.bitsRequired); } - template - void deserialize(Des &, Reader &reader, T &v, Fnc &&) const { + template + void deserialize(Des &des, T &v, Fnc &&) const { + auto& reader = des.adapter(); reader.readBits(reinterpret_cast &>(v), _range.bitsRequired); details::setRangeValue(v, _range); - handleInvalidRange(reader, v, std::integral_constant{}); + handleInvalidRange(reader, v, std::integral_constant{}); } constexpr size_t getRequiredBits() const { diff --git a/include/bitsery/serializer.h b/include/bitsery/serializer.h index ad7bcf9..7ee4702 100644 --- a/include/bitsery/serializer.h +++ b/include/bitsery/serializer.h @@ -166,6 +166,7 @@ namespace bitsery { using BPEnabledType = BasicSerializer>::type, TContext>; + using TConfig = typename TOutputAdapter::TConfig; using details::AdapterAndContextRef::AdapterAndContextRef; @@ -230,7 +231,7 @@ namespace bitsery { static_assert(details::IsExtensionTraitsDefined::value, "Please define ExtensionTraits"); static_assert(traits::ExtensionTraits::SupportLambdaOverload, "extension doesn't support overload with lambda"); - extension.serialize(*this, this->_adapter, obj, std::forward(fnc)); + extension.serialize(*this, obj, std::forward(fnc)); } template @@ -240,7 +241,7 @@ namespace bitsery { "extension doesn't support overload with `value`"); using ExtVType = typename traits::ExtensionTraits::TValue; using VType = typename std::conditional::value, details::DummyType, ExtVType>::type; - extension.serialize(*this, this->_adapter, obj, [](BasicSerializer& s, VType &v) { s.value(v); }); + extension.serialize(*this, obj, [](BasicSerializer& s, VType &v) { s.value(v); }); } template @@ -250,7 +251,7 @@ namespace bitsery { "extension doesn't support overload with `object`"); using ExtVType = typename traits::ExtensionTraits::TValue; using VType = typename std::conditional::value, details::DummyType, ExtVType>::type; - extension.serialize(*this, this->_adapter, obj, [](BasicSerializer& s, VType &v) { s.object(v); }); + extension.serialize(*this, obj, [](BasicSerializer& s, VType &v) { s.object(v); }); } /*