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

features_vector.hpp « indexer - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 93bea22d58466be36b18319a64b0175130d66f21 (plain)
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;
};