diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-06-29 18:43:32 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-07-23 10:25:11 +0300 |
commit | ec73bce900be6b5379b49200781d2b1f7c4e4411 (patch) | |
tree | 9751082508a03ac272125122f35b41d293a9922a /indexer | |
parent | 72938d3d53f34256465cfd62c35825c5c8197748 (diff) |
Implementing AltitudeLoader instead of using FeatureType for parsing.
Diffstat (limited to 'indexer')
-rw-r--r-- | indexer/altitude_loader.cpp | 49 | ||||
-rw-r--r-- | indexer/altitude_loader.hpp | 25 | ||||
-rw-r--r-- | indexer/feature.cpp | 12 | ||||
-rw-r--r-- | indexer/feature.hpp | 8 | ||||
-rw-r--r-- | indexer/feature_altitude.hpp | 4 | ||||
-rw-r--r-- | indexer/feature_loader.cpp | 41 | ||||
-rw-r--r-- | indexer/feature_loader.hpp | 1 | ||||
-rw-r--r-- | indexer/feature_loader_base.hpp | 1 | ||||
-rw-r--r-- | indexer/indexer.pro | 2 | ||||
-rw-r--r-- | indexer/old/feature_loader_101.hpp | 1 |
10 files changed, 79 insertions, 65 deletions
diff --git a/indexer/altitude_loader.cpp b/indexer/altitude_loader.cpp new file mode 100644 index 0000000000..66fa124bf8 --- /dev/null +++ b/indexer/altitude_loader.cpp @@ -0,0 +1,49 @@ +#include "indexer/altitude_loader.hpp" + +#include "base/logging.hpp" +#include "base/stl_helpers.hpp" + +#include "defines.hpp" + +namespace feature +{ +AltitudeLoader::AltitudeLoader(MwmValue const * mwmValue) +{ + if (!mwmValue || mwmValue->GetHeader().GetFormat() < version::Format::v8 ) + return; + + try + { + m_idx = make_unique<DDVector<TAltitudeIndexEntry, FilesContainerR::TReader>> + (mwmValue->m_cont.GetReader(ALTITUDE_FILE_TAG)); + } + catch (Reader::OpenException const &) + { + LOG(LINFO, ("MWM does not contain", ALTITUDE_FILE_TAG, "section.")); + } +} + +Altitudes AltitudeLoader::GetAltitudes(uint32_t featureId) const +{ + if (!m_idx || m_idx->size() == 0) + return Altitudes(); + + auto it = lower_bound(m_idx->begin(), m_idx->end(), + TAltitudeIndexEntry{static_cast<uint32_t>(featureId), 0, 0}, + my::LessBy(&TAltitudeIndexEntry::featureId)); + + if (it == m_idx->end()) + return Altitudes(); + + if (featureId != it->featureId) + { + ASSERT(false, ()); + return Altitudes(); + } + + if (it->beginAlt == kInvalidAltitude || it->endAlt == kInvalidAltitude) + return Altitudes(); + + return Altitudes(it->beginAlt, it->endAlt); +} +} // namespace feature diff --git a/indexer/altitude_loader.hpp b/indexer/altitude_loader.hpp new file mode 100644 index 0000000000..d792b28467 --- /dev/null +++ b/indexer/altitude_loader.hpp @@ -0,0 +1,25 @@ +#pragma once +#include "indexer/feature_altitude.hpp" +#include "indexer/index.hpp" + +#include "coding/dd_vector.hpp" + +namespace feature +{ +class AltitudeLoader +{ +public: + AltitudeLoader(MwmValue const * mwmValue); + Altitudes GetAltitudes(uint32_t featureId) const; + +private: + struct TAltitudeIndexEntry + { + uint32_t featureId; + feature::TAltitude beginAlt; + feature::TAltitude endAlt; + }; + + unique_ptr<DDVector<TAltitudeIndexEntry, FilesContainerR::TReader>> m_idx; +}; +} // namespace feature diff --git a/indexer/feature.cpp b/indexer/feature.cpp index b9cd39253f..b05151515a 100644 --- a/indexer/feature.cpp +++ b/indexer/feature.cpp @@ -302,8 +302,7 @@ void FeatureType::Deserialize(feature::LoaderBase * pLoader, TBuffer buffer) m_pLoader->InitFeature(this); - m_header2Parsed = m_pointsParsed = m_trianglesParsed = m_metadataParsed = m_altitudeParsed = - false; + m_header2Parsed = m_pointsParsed = m_trianglesParsed = m_metadataParsed = false; m_innerStats.MakeZero(); } @@ -376,15 +375,6 @@ void FeatureType::ParseMetadata() const m_metadataParsed = true; } -void FeatureType::ParseAltitude() const -{ - if (m_altitudeParsed) - return; - - m_pLoader->ParseAltitude(); - m_altitudeParsed = true; -} - StringUtf8Multilang const & FeatureType::GetNames() const { return m_params.name; diff --git a/indexer/feature.hpp b/indexer/feature.hpp index 458528b3c1..fe5f30c206 100644 --- a/indexer/feature.hpp +++ b/indexer/feature.hpp @@ -202,7 +202,6 @@ public: uint32_t ParseTriangles(int scale) const; void ParseMetadata() const; - void ParseAltitude() const; //@} /// @name Geometry. @@ -245,12 +244,6 @@ public: return m_points[i]; } - inline feature::Altitudes const & GetAltitudes() const - { - ASSERT(m_altitudeParsed, ()); - return m_altitudes; - } - template <typename TFunctor> void ForEachTriangle(TFunctor && f, int scale) const { @@ -377,7 +370,6 @@ private: mutable bool m_pointsParsed = false; mutable bool m_trianglesParsed = false; mutable bool m_metadataParsed = false; - mutable bool m_altitudeParsed = false; mutable inner_geom_stat_t m_innerStats; diff --git a/indexer/feature_altitude.hpp b/indexer/feature_altitude.hpp index d744499ab9..4d59135342 100644 --- a/indexer/feature_altitude.hpp +++ b/indexer/feature_altitude.hpp @@ -16,8 +16,8 @@ struct Altitudes Altitudes() = default; Altitudes(TAltitude b, TAltitude e) : begin(b), end(e) {} - TAltitude begin = 0; - TAltitude end = 0; + TAltitude begin = kInvalidAltitude; + TAltitude end = kInvalidAltitude; }; class Altitude diff --git a/indexer/feature_loader.cpp b/indexer/feature_loader.cpp index 4c6609272e..37093182e8 100644 --- a/indexer/feature_loader.cpp +++ b/indexer/feature_loader.cpp @@ -292,47 +292,6 @@ void LoaderCurrent::ParseMetadata() } } -void LoaderCurrent::ParseAltitude() -{ - // @TODO Index and should be used here before merging to master. - - if (m_Info.GetMWMFormat() < version::Format::v8) - return; - - struct TAltitudeIndexEntry - { - uint32_t featureId; - feature::TAltitude beginAlt; - feature::TAltitude endAlt; - }; - - try - { - DDVector<TAltitudeIndexEntry, FilesContainerR::TReader> idx(m_Info.GetAltitudeReader()); - auto it = lower_bound(idx.begin(), idx.end(), - TAltitudeIndexEntry{static_cast<uint32_t>(m_pF->m_id.m_index), 0, 0}, - [](TAltitudeIndexEntry const & v1, TAltitudeIndexEntry const & v2) - { - return v1.featureId < v2.featureId; - }); - if (it == idx.end()) - return; - - if (m_pF->m_id.m_index != it->featureId) - return; - - if (it->beginAlt == kInvalidAltitude || it->endAlt == kInvalidAltitude) - return; - - m_pF->m_altitudes.begin = it->beginAlt; - m_pF->m_altitudes.end = it->endAlt; - } - catch (Reader::OpenException const &) - { - // Now ignore exception because not all mwm have needed sections. - } -} - int LoaderCurrent::GetScaleIndex(int scale) const { int const count = m_Info.GetScalesCount(); diff --git a/indexer/feature_loader.hpp b/indexer/feature_loader.hpp index 513ca984c3..7788d05446 100644 --- a/indexer/feature_loader.hpp +++ b/indexer/feature_loader.hpp @@ -29,6 +29,5 @@ namespace feature uint32_t ParseGeometry(int scale) override; uint32_t ParseTriangles(int scale) override; void ParseMetadata() override; - void ParseAltitude() override; }; } diff --git a/indexer/feature_loader_base.hpp b/indexer/feature_loader_base.hpp index 2a2b2ff617..78a5179281 100644 --- a/indexer/feature_loader_base.hpp +++ b/indexer/feature_loader_base.hpp @@ -79,7 +79,6 @@ namespace feature virtual uint32_t ParseGeometry(int scale) = 0; virtual uint32_t ParseTriangles(int scale) = 0; virtual void ParseMetadata() = 0; - virtual void ParseAltitude() = 0; inline uint32_t GetTypesSize() const { return m_CommonOffset - m_TypesOffset; } diff --git a/indexer/indexer.pro b/indexer/indexer.pro index 6602f18ddf..f5b6d8e255 100644 --- a/indexer/indexer.pro +++ b/indexer/indexer.pro @@ -10,6 +10,7 @@ ROOT_DIR = .. include($$ROOT_DIR/common.pri) SOURCES += \ + altitude_loader.cpp \ categories_holder.cpp \ categories_holder_loader.cpp \ categories_index.cpp \ @@ -61,6 +62,7 @@ SOURCES += \ types_mapping.cpp \ HEADERS += \ + altitude_loader.hpp \ categories_holder.hpp \ categories_index.hpp \ cell_coverer.hpp \ diff --git a/indexer/old/feature_loader_101.hpp b/indexer/old/feature_loader_101.hpp index 83f74b8853..00f857d2ce 100644 --- a/indexer/old/feature_loader_101.hpp +++ b/indexer/old/feature_loader_101.hpp @@ -37,7 +37,6 @@ namespace old_101 { namespace feature uint32_t ParseGeometry(int scale) override; uint32_t ParseTriangles(int scale) override; void ParseMetadata() override {} /// not supported in this version - void ParseAltitude() override {} /// not supported in this version }; } } |