From b47f03877f822432de20c2bd57adf8053a0f4339 Mon Sep 17 00:00:00 2001 From: vng Date: Sat, 5 Feb 2011 12:07:25 +0200 Subject: [PATCH] Better reserve logic in triangles decoding. --- indexer/geometry_serialization.cpp | 18 ++++++++++++------ indexer/geometry_serialization.hpp | 9 ++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/indexer/geometry_serialization.cpp b/indexer/geometry_serialization.cpp index 2b6a41b595..a672c89602 100644 --- a/indexer/geometry_serialization.cpp +++ b/indexer/geometry_serialization.cpp @@ -40,22 +40,30 @@ namespace serial void Encode(EncodeFunT fn, vector const & points, int64_t base, DeltasT & deltas) { + size_t const count = points.size(); + PointsT upoints; - upoints.reserve(points.size()); + upoints.reserve(count); transform(points.begin(), points.end(), back_inserter(upoints), &pts::D2U); + ASSERT ( deltas.empty(), () ); + deltas.reserve(count); (*fn)(upoints, pts::GetBasePoint(base), pts::GetMaxPoint(), deltas); } - void Decode(DecodeFunT fn, DeltasT const & deltas, int64_t base, OutPointsT & points) + void Decode(DecodeFunT fn, DeltasT const & deltas, int64_t base, OutPointsT & points, size_t reserveF/* = 1*/) { + size_t const count = deltas.size() * reserveF; + PointsT upoints; - upoints.reserve(deltas.size()); + upoints.reserve(count); (*fn)(deltas, pts::GetBasePoint(base), pts::GetMaxPoint(), upoints); - // Don't make reserve for points. It may be not empty. + // It is may be not empty, when storing triangles. + if (points.empty()) + points.reserve(count); transform(upoints.begin(), upoints.end(), back_inserter(points), &pts::U2D); } @@ -172,8 +180,6 @@ namespace serial size_t const count = deltas.size(); ASSERT_GREATER ( count, 2, () ); - points.reserve(3*count); - points.push_back(DecodeDelta(deltas[0], basePoint)); points.push_back(DecodeDelta(deltas[1], points.back())); points.push_back(DecodeDelta(deltas[2] >> 2, points.back())); diff --git a/indexer/geometry_serialization.hpp b/indexer/geometry_serialization.hpp index c3698bf1f6..92067bab7c 100644 --- a/indexer/geometry_serialization.hpp +++ b/indexer/geometry_serialization.hpp @@ -36,7 +36,7 @@ namespace serial void Encode(EncodeFunT fn, vector const & points, int64_t base, DeltasT & deltas); typedef buffer_vector OutPointsT; - void Decode(DecodeFunT fn, DeltasT const & deltas, int64_t base, OutPointsT & points); + void Decode(DecodeFunT fn, DeltasT const & deltas, int64_t base, OutPointsT & points, size_t reserveF = 1); template void SaveInner(EncodeFunT fn, vector const & points, int64_t base, TSink & sink) @@ -70,7 +70,7 @@ namespace serial void const * LoadInner(DecodeFunT fn, void const * pBeg, size_t count, int64_t base, OutPointsT & points); template - void LoadOuter(DecodeFunT fn, TSource & src, int64_t base, OutPointsT & points) + void LoadOuter(DecodeFunT fn, TSource & src, int64_t base, OutPointsT & points, size_t reserveF = 1) { uint32_t const count = ReadVarUint(src); vector buffer(count); @@ -81,8 +81,7 @@ namespace serial deltas.reserve(count / 2); ReadVarUint64Array(p, p + count, MakeBackInsertFunctor(deltas)); - points.reserve(deltas.size()); - Decode(fn, deltas, base, points); + Decode(fn, deltas, base, points, reserveF); } @@ -163,7 +162,7 @@ namespace serial int const count = ReadPrimitiveFromSource(src); for (int i = 0; i < count; ++i) - LoadOuter(&DecodeTriangles, src, base, triangles); + LoadOuter(&DecodeTriangles, src, base, triangles, 3); } //@} }