diff --git a/indexer/complex/serdes.hpp b/indexer/complex/serdes.hpp index 9e1a1b1198..de685e3e9a 100644 --- a/indexer/complex/serdes.hpp +++ b/indexer/complex/serdes.hpp @@ -67,32 +67,22 @@ public: } private: - using ByteVector = std::vector; - class V0 { public: template static void Serialize(Sink & sink, tree_node::Forest const & forest) { - ByteVector forestBuffer; - MemWriter forestWriter(forestBuffer); - WriterSink forestMemSink(forestWriter); - forest.ForEachTree([&](auto const & tree) { Serialize(forestMemSink, tree); }); - coding_utils::WriteCollectionPrimitive(sink, forestBuffer); + forest.ForEachTree([&](auto const & tree) { Serialize(sink, tree); }); } template static bool Deserialize(Src & src, tree_node::Forest & forest) { - ByteVector forestBuffer; - coding_utils::ReadCollectionPrimitive(src, std::back_inserter(forestBuffer)); - MemReader forestReader(forestBuffer.data(), forestBuffer.size()); - ReaderSource forestSrc(forestReader); - while (forestSrc.Size() > 0) + while (src.Size() > 0) { tree_node::types::Ptr tree; - if (!Deserialize(forestSrc, tree)) + if (!Deserialize(src, tree)) return false; forest.Append(tree); @@ -111,7 +101,7 @@ private: }); WriteVarUint(sink, base); tree_node::PreOrderVisit(tree, [&](auto const & node) { - coding_utils::DeltaEncode(sink, node->GetData(), base); + coding_utils::DeltaEncode(sink, node->GetData(), base); auto const size = base::checked_cast(node->GetChildren().size()); WriteVarUint(sink, size); }); @@ -127,7 +117,7 @@ private: return true; Ids ids; - coding_utils::DeltaDecode(src, std::back_inserter(ids), base); + coding_utils::DeltaDecode(src, std::back_inserter(ids), base); tree = tree_node::MakeTreeNode(std::move(ids)); auto const size = ReadVarUint(src); tree_node::types::Ptrs children(size); diff --git a/indexer/complex/serdes_utils.hpp b/indexer/complex/serdes_utils.hpp index 84a341472a..fb083a7f2c 100644 --- a/indexer/complex/serdes_utils.hpp +++ b/indexer/complex/serdes_utils.hpp @@ -3,10 +3,9 @@ #include "coding/reader.hpp" #include "coding/varint.hpp" +#include "base/assert.hpp" #include "base/checked_cast.hpp" -#include - namespace coding_utils { namespace detail @@ -59,7 +58,7 @@ void DeltaEncodeAs(Sink & sink, Cont const & container, Fn && fn) ()); auto const contSize = base::checked_cast(container.size()); - detail::WriteVarIntegral(sink, contSize); + WriteVarUint(sink, contSize); if (contSize == 0) return; @@ -70,8 +69,8 @@ void DeltaEncodeAs(Sink & sink, Cont const & container, Fn && fn) while (++first != last) { auto const val = fn(*first); - auto const delta = base::checked_cast(val - acc); - detail::WriteVarIntegral(sink, delta); + auto const delta = base::checked_cast(val - acc); + WriteVarUint(sink, delta); acc = val; } } @@ -81,7 +80,7 @@ void DeltaEncodeAs(Sink & sink, Cont const & container, Fn && fn) template void DeltaDecodeAs(Source & src, OutIt it, Fn && fn) { - auto contSize = detail::ReadVarIntegral(src); + auto contSize = ReadVarUint(src); if (contSize == 0) return; @@ -89,18 +88,18 @@ void DeltaDecodeAs(Source & src, OutIt it, Fn && fn) *it++ = fn(sum); while (--contSize) { - sum = sum + detail::ReadVarIntegral(src); + sum += base::checked_cast(ReadVarUint(src)); *it++ = fn(sum); } } -template +template void DeltaEncode(Sink & sink, Cont const & container, ValueType base = {}) { DeltaEncodeAs(sink, container, [&](ValueType val) { return val - base; }); } -template +template void DeltaDecode(Source & src, OutIt it, ValueType base = {}) { DeltaDecodeAs(src, it, [&](ValueType val) { return val + base; }); @@ -110,7 +109,7 @@ void DeltaDecode(Source & src, OutIt it, ValueType base = {}) template void WriteCollectionPrimitive(Sink & sink, Cont const & container) { - auto const contSize = static_cast(container.size()); + auto const contSize = base::checked_cast(container.size()); WriteVarUint(sink, contSize); for (auto value : container) WriteToSink(sink, value); diff --git a/indexer/indexer_tests/complex_serdes_utils_tests.cpp b/indexer/indexer_tests/complex_serdes_utils_tests.cpp index c3f515c29f..e0fa37e73d 100644 --- a/indexer/indexer_tests/complex_serdes_utils_tests.cpp +++ b/indexer/indexer_tests/complex_serdes_utils_tests.cpp @@ -21,12 +21,12 @@ void DeltaEncodeDecodelTest(T const & cont, ValueType base = {}) ByteVector buffer; MemWriter writer(buffer); WriterSink sink(writer); - coding_utils::DeltaEncode(sink, cont, base); + coding_utils::DeltaEncode(sink, cont, base); MemReader reader(buffer.data(), buffer.size()); ReaderSource src(reader); T res; - coding_utils::DeltaDecode(src, std::inserter(res, std::end(res)), base); + coding_utils::DeltaDecode(src, std::inserter(res, std::end(res)), base); TEST_EQUAL(cont, res, ()); }