From da53c6195ba1d1f9000013ba501f0f428660967c Mon Sep 17 00:00:00 2001 From: vng Date: Sat, 15 Oct 2011 20:21:08 +0300 Subject: [PATCH] Support dynamic scales in mwm header. --- generator/feature_sorter.cpp | 2 -- indexer/data_header.cpp | 17 ++++++++--------- indexer/data_header.hpp | 14 +++++++++++--- indexer/feature_impl.hpp | 6 +++--- indexer/feature_loader.cpp | 10 +++------- indexer/feature_loader_base.hpp | 2 +- indexer/old/feature_loader_101.cpp | 5 ++--- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/generator/feature_sorter.cpp b/generator/feature_sorter.cpp index 28f5b638dc..0b933a2a26 100644 --- a/generator/feature_sorter.cpp +++ b/generator/feature_sorter.cpp @@ -80,8 +80,6 @@ namespace namespace feature { - typedef array scales_t; - class FeaturesCollector2 : public FeaturesCollector { FilesContainerW m_writer; diff --git a/indexer/data_header.cpp b/indexer/data_header.cpp index 32903af338..47e2161f4a 100644 --- a/indexer/data_header.cpp +++ b/indexer/data_header.cpp @@ -16,8 +16,9 @@ namespace feature { serial::CodingParams DataHeader::GetCodingParams(int scaleIndex) const - { - return serial::CodingParams(m_codingParams.GetCoordBits() - (m_scales[3] - m_scales[scaleIndex]) / 2, + { + return serial::CodingParams(m_codingParams.GetCoordBits() - + (m_scales.back() - m_scales[scaleIndex]) / 2, m_codingParams.GetBasePointUint64()); } @@ -31,12 +32,6 @@ namespace feature m_bounds = RectToInt64(r, m_codingParams.GetCoordBits()); } - void DataHeader::SetScales(int * arr) - { - for (size_t i = 0; i < m_scales.size(); ++i) - m_scales[i] = static_cast(arr[i]); - } - pair DataHeader::GetScaleRange() const { using namespace scales; @@ -64,6 +59,7 @@ namespace feature WriteVarInt(w, m_bounds.first); WriteVarInt(w, m_bounds.second); + WriteVarUint(w, m_scales.size()); w.Write(m_scales.data(), m_scales.size()); WriteVarInt(w, static_cast(m_type)); @@ -77,7 +73,9 @@ namespace feature m_bounds.first = ReadVarInt(src); m_bounds.second = ReadVarInt(src); - src.Read(m_scales.data(), m_scales.size()); + uint32_t const count = ReadVarUint(src); + m_scales.resize(count); + src.Read(m_scales.data(), count); m_type = static_cast(ReadVarInt(src)); @@ -93,6 +91,7 @@ namespace feature m_bounds.first = ReadVarInt(src) + base; m_bounds.second = ReadVarInt(src) + base; + m_scales.resize(4); src.Read(m_scales.data(), m_scales.size()); m_ver = v1; diff --git a/indexer/data_header.hpp b/indexer/data_header.hpp index 30e8d7a81b..bb21f58326 100644 --- a/indexer/data_header.hpp +++ b/indexer/data_header.hpp @@ -4,7 +4,7 @@ #include "../geometry/rect2d.hpp" -#include "../std/array.hpp" +#include "../base/buffer_vector.hpp" class ModelReaderPtr; @@ -14,11 +14,15 @@ namespace feature { class DataHeader { + public: + static const size_t MAX_SCALES_COUNT = 4; + + private: serial::CodingParams m_codingParams; pair m_bounds; - array m_scales; + buffer_vector m_scales; public: @@ -35,7 +39,11 @@ namespace feature m2::RectD const GetBounds() const; void SetBounds(m2::RectD const & r); - void SetScales(int * arr); + template + void SetScales(int const (&arr)[N]) + { + m_scales.assign(arr, arr + N); + } inline size_t GetScalesCount() const { return m_scales.size(); } inline int GetScale(int i) const { return static_cast(m_scales[i]); } diff --git a/indexer/feature_impl.hpp b/indexer/feature_impl.hpp index eb869a4ea2..02fadc3ee8 100644 --- a/indexer/feature_impl.hpp +++ b/indexer/feature_impl.hpp @@ -5,8 +5,8 @@ namespace feature { - static int g_arrWorldScales[] = { 2, 5, 7, 9 }; // 9 = scales::GetUpperWorldScale() - static int g_arrCountryScales[] = { 10, 12, 14, 17 }; // 17 = scales::GetUpperScale() + static int g_arrWorldScales[] = { 5, 7, 9 }; // 9 = scales::GetUpperWorldScale() + static int g_arrCountryScales[] = { 12, 15, 17 }; // 17 = scales::GetUpperScale() inline string GetTagForIndex(char const * prefix, int ind) { @@ -14,7 +14,7 @@ namespace feature str.reserve(strlen(prefix) + 1); str = prefix; - static char arrChar[] = { '0', '1', '2', '3' }; + static char arrChar[] = { '0', '1', '2' }; STATIC_ASSERT ( ARRAY_SIZE(arrChar) == ARRAY_SIZE(g_arrWorldScales) ); STATIC_ASSERT ( ARRAY_SIZE(arrChar) == ARRAY_SIZE(g_arrCountryScales) ); ASSERT ( ind >= 0 && ind < ARRAY_SIZE(arrChar), (ind) ); diff --git a/indexer/feature_loader.cpp b/indexer/feature_loader.cpp index 42d38b7308..320fbea692 100644 --- a/indexer/feature_loader.cpp +++ b/indexer/feature_loader.cpp @@ -266,18 +266,14 @@ namespace void LoaderCurrent::ReadOffsets(ArrayByteSource & src, uint8_t mask, offsets_t & offsets) const { + ASSERT ( offsets.empty(), () ); ASSERT_GREATER ( mask, 0, () ); - int index = 0; while (mask > 0) { - ASSERT_LESS ( index, m_Info.GetScalesCount(), () ); - offsets[index++] = (mask & 0x01) ? ReadVarUint(src) : kInvalidOffset; + offsets.push_back((mask & 0x01) ? ReadVarUint(src) : kInvalidOffset); mask = mask >> 1; } - - while (index < offsets.size()) - offsets[index++] = kInvalidOffset; } int LoaderCurrent::GetScaleIndex(int scale) const @@ -340,7 +336,7 @@ int LoaderCurrent::GetScaleIndex(int scale, offsets_t const & offsets) const return ind; else { - CHECK ( false, ("Feature should have any geometry ...") ); + ASSERT ( false, ("Feature should have any geometry ...") ); return -1; } } diff --git a/indexer/feature_loader_base.hpp b/indexer/feature_loader_base.hpp index 93d5849bc4..8fccfdaa57 100644 --- a/indexer/feature_loader_base.hpp +++ b/indexer/feature_loader_base.hpp @@ -93,7 +93,7 @@ namespace feature uint32_t m_ptsSimpMask; - typedef array offsets_t; // should be synchronized with ARRAY_SIZE(g_arrScales) + typedef buffer_vector offsets_t; offsets_t m_ptsOffsets, m_trgOffsets; }; diff --git a/indexer/old/feature_loader_101.cpp b/indexer/old/feature_loader_101.cpp index 79a1503329..4068683e7d 100644 --- a/indexer/old/feature_loader_101.cpp +++ b/indexer/old/feature_loader_101.cpp @@ -359,13 +359,12 @@ uint32_t LoaderImpl::ParseTriangles(int scale) void LoaderImpl::ReadOffsets(ArrayByteSource & src, uint8_t mask, offsets_t & offsets) const { + ASSERT ( offsets.empty(), () ); ASSERT_GREATER ( mask, 0, () ); - int index = 0; while (mask > 0) { - ASSERT_LESS ( index, m_Info.GetScalesCount(), () ); - offsets[index++] = (mask & 0x01) ? ReadVarUint(src) : kInvalidOffset; + offsets.push_back((mask & 0x01) ? ReadVarUint(src) : kInvalidOffset); mask = mask >> 1; } }