1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#pragma once
#include "feature.hpp"
#include "feature_loader_base.hpp"
#include "../coding/var_record_reader.hpp"
/// Note! This class is NOT Thread-Safe.
/// You should have separate instance of Vector for every thread.
class FeaturesVector
{
public:
FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header)
: m_LoadInfo(cont, header), m_RecordReader(m_LoadInfo.GetDataReader(), 256)
{
}
void Get(uint64_t pos, FeatureType & ft) const
{
uint32_t offset;
m_RecordReader.ReadRecord(pos, m_buffer, offset);
ft.Deserialize(m_LoadInfo.GetLoader(), &m_buffer[offset]);
}
template <class ToDo> void ForEachOffset(ToDo toDo) const
{
m_RecordReader.ForEachRecord(DoGetFeatures<ToDo>(m_LoadInfo, toDo));
}
private:
template <class ToDo> class DoGetFeatures
{
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
{
FeatureType ft;
ft.Deserialize(m_loadInfo.GetLoader(), data);
m_toDo(ft, pos);
}
};
private:
feature::SharedLoadInfo m_LoadInfo;
VarRecordReader<FilesContainerR::ReaderT, &VarRecordSizeReaderVarint> m_RecordReader;
mutable vector<char> m_buffer;
};
|