Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2015-03-21 12:55:05 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:57:09 +0300
commit792311a255f844b940fee3ade42fda4195cbaa0f (patch)
tree58314904937f4b7fdf2ac2e4e675d84e98790203 /indexer/features_vector.hpp
parentb7e5bc5301e1563664028677d36711a4a0872fee (diff)
Feature index refactoring.
Diffstat (limited to 'indexer/features_vector.hpp')
-rw-r--r--indexer/features_vector.hpp58
1 files changed, 33 insertions, 25 deletions
diff --git a/indexer/features_vector.hpp b/indexer/features_vector.hpp
index 665e7de98c..b858f33925 100644
--- a/indexer/features_vector.hpp
+++ b/indexer/features_vector.hpp
@@ -1,53 +1,61 @@
#pragma once
-#include "indexer/feature.hpp"
-#include "indexer/feature_loader_base.hpp"
+#include "feature.hpp"
+#include "feature_loader_base.hpp"
+#include "features_offsets_table.hpp"
+
+#include "platform/platform.hpp"
#include "coding/var_record_reader.hpp"
+#include "coding/file_name_utils.hpp"
/// Note! This class is NOT Thread-Safe.
/// You should have separate instance of Vector for every thread.
class FeaturesVector
{
+ unique_ptr<feature::FeaturesOffsetsTable> m_table;
+
public:
FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header)
: m_LoadInfo(cont, header), m_RecordReader(m_LoadInfo.GetDataReader(), 256)
{
+ if (header.GetFormat() >= version::v5)
+ {
+ string const & filePath = cont.GetFileName();
+ size_t const sepIndex = filePath.rfind(my::GetNativeSeparator());
+ string const name(filePath, sepIndex + 1, filePath.rfind(DATA_FILE_EXTENSION) - sepIndex - 1);
+ string const path = GetPlatform().GetIndexFileName(name, FEATURES_OFFSETS_TABLE_FILE_EXT);
+
+ m_table = feature::FeaturesOffsetsTable::CreateIfNotExistsAndLoad(path, cont);
+ }
}
- void Get(uint64_t pos, FeatureType & ft) const
+ void GetByIndex(uint32_t ind, FeatureType & ft) const
{
uint32_t offset = 0, size = 0;
- m_RecordReader.ReadRecord(pos, m_buffer, offset, size);
-
+ m_RecordReader.ReadRecord(m_table ? m_table->GetFeatureOffset(ind) : ind, m_buffer, offset, size);
ft.Deserialize(m_LoadInfo.GetLoader(), &m_buffer[offset]);
}
- template <class ToDo> void ForEachOffset(ToDo toDo) const
+ template <class ToDo> void ForEach(ToDo toDo) const
{
- m_RecordReader.ForEachRecord(DoGetFeatures<ToDo>(m_LoadInfo, toDo));
+ uint32_t ind = 0;
+ m_RecordReader.ForEachRecord([&] (uint32_t pos, char const * data, uint32_t /*size*/)
+ {
+ FeatureType ft;
+ ft.Deserialize(m_LoadInfo.GetLoader(), data);
+ toDo(ft, m_table ? ind++ : pos);
+ });
}
-private:
- template <class ToDo> class DoGetFeatures
+ template <class ToDo> static void ForEachOffset(ModelReaderPtr reader, ToDo toDo)
{
- feature::SharedLoadInfo const & m_loadInfo;
- ToDo & m_toDo;
-
- public:
- DoGetFeatures(feature::SharedLoadInfo const & loadInfo, ToDo & toDo)
- : m_loadInfo(loadInfo), m_toDo(toDo)
- {
- }
-
- void operator() (uint32_t pos, char const * data, uint32_t /*size*/) const
+ VarRecordReader<ModelReaderPtr, &VarRecordSizeReaderVarint> recordReader(reader, 256);
+ recordReader.ForEachRecord([&] (uint32_t pos, char const * /*data*/, uint32_t /*size*/)
{
- FeatureType ft;
- ft.Deserialize(m_loadInfo.GetLoader(), data);
-
- m_toDo(ft, pos);
- }
- };
+ toDo(pos);
+ });
+ }
private:
feature::SharedLoadInfo m_LoadInfo;