diff options
author | vng <viktor.govako@gmail.com> | 2015-07-16 14:31:31 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:57:12 +0300 |
commit | 8fdd97d52366659ec16cf4d4edf3ab98f96b0874 (patch) | |
tree | 1381c0061d93b5ee60b658df1659f3fa265312d0 /indexer/features_vector.hpp | |
parent | 0dc6675aa5d9cc8e19f1ec02a927eae826d97944 (diff) |
Minor refactoring to store feature’s offsets table once for every cache value in mwm set.
Diffstat (limited to 'indexer/features_vector.hpp')
-rw-r--r-- | indexer/features_vector.hpp | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/indexer/features_vector.hpp b/indexer/features_vector.hpp index b858f33925..2b90b6efeb 100644 --- a/indexer/features_vector.hpp +++ b/indexer/features_vector.hpp @@ -1,41 +1,26 @@ #pragma once #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" +#include "std/noncopyable.hpp" + + +namespace feature { class FeaturesOffsetsTable; } /// 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) + FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header, + feature::FeaturesOffsetsTable const * table) + : m_LoadInfo(cont, header), m_RecordReader(m_LoadInfo.GetDataReader(), 256), m_table(table) { - 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 GetByIndex(uint32_t ind, FeatureType & ft) const - { - uint32_t offset = 0, size = 0; - m_RecordReader.ReadRecord(m_table ? m_table->GetFeatureOffset(ind) : ind, m_buffer, offset, size); - ft.Deserialize(m_LoadInfo.GetLoader(), &m_buffer[offset]); - } + void GetByIndex(uint32_t ind, FeatureType & ft) const; template <class ToDo> void ForEach(ToDo toDo) const { @@ -61,4 +46,31 @@ private: feature::SharedLoadInfo m_LoadInfo; VarRecordReader<FilesContainerR::ReaderT, &VarRecordSizeReaderVarint> m_RecordReader; mutable vector<char> m_buffer; + + friend class FeaturesVectorTest; + feature::FeaturesOffsetsTable const * m_table; +}; + +/// Test features vector (reader) that combines all the needed data for stand-alone work. +class FeaturesVectorTest : private noncopyable +{ + FilesContainerR m_cont; + feature::DataHeader m_header; + + struct Initializer + { + Initializer(FeaturesVectorTest * p); + } m_initializer; + + FeaturesVector m_vector; + + void Init(); + +public: + explicit FeaturesVectorTest(string const & filePath); + explicit FeaturesVectorTest(FilesContainerR const & cont); + ~FeaturesVectorTest(); + + feature::DataHeader const & GetHeader() const { return m_header; } + FeaturesVector const & GetVector() const { return m_vector; } }; |