diff options
author | vng <viktor.govako@gmail.com> | 2015-03-21 12:55:05 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:57:09 +0300 |
commit | 792311a255f844b940fee3ade42fda4195cbaa0f (patch) | |
tree | 58314904937f4b7fdf2ac2e4e675d84e98790203 /indexer/features_vector.hpp | |
parent | b7e5bc5301e1563664028677d36711a4a0872fee (diff) |
Feature index refactoring.
Diffstat (limited to 'indexer/features_vector.hpp')
-rw-r--r-- | indexer/features_vector.hpp | 58 |
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; |