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-07-16 14:31:31 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:57:12 +0300
commit8fdd97d52366659ec16cf4d4edf3ab98f96b0874 (patch)
tree1381c0061d93b5ee60b658df1659f3fa265312d0 /indexer/features_vector.hpp
parent0dc6675aa5d9cc8e19f1ec02a927eae826d97944 (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.hpp58
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; }
};