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

feature_loader_base.hpp « indexer - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1ed33b20d0adda9d1c46caa0f60cee237ae37899 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#pragma once
#include "indexer/coding_params.hpp"
#include "indexer/data_header.hpp"

#include "coding/file_container.hpp"

#include "std/noncopyable.hpp"


class FeatureType;
class ArrayByteSource;

namespace feature
{
  class LoaderBase;

  /// This info is created once.
  class SharedLoadInfo : private noncopyable
  {
    FilesContainerR const & m_cont;
    DataHeader const & m_header;

    typedef FilesContainerR::ReaderT ReaderT;

    LoaderBase * m_pLoader;
    void CreateLoader();

  public:
    SharedLoadInfo(FilesContainerR const & cont, DataHeader const & header);
    ~SharedLoadInfo();

    ReaderT GetDataReader() const;
    ReaderT GetMetadataReader() const;
    ReaderT GetMetadataIndexReader() const;
    ReaderT GetGeometryReader(int ind) const;
    ReaderT GetTrianglesReader(int ind) const;

    LoaderBase * GetLoader() const { return m_pLoader; }

    inline serial::CodingParams const & GetDefCodingParams() const
    {
      return m_header.GetDefCodingParams();
    }
    inline serial::CodingParams GetCodingParams(int scaleIndex) const
    {
      return m_header.GetCodingParams(scaleIndex);
    }

    inline int GetScalesCount() const { return static_cast<int>(m_header.GetScalesCount()); }
    inline int GetScale(int i) const { return m_header.GetScale(i); }
    inline int GetLastScale() const { return m_header.GetLastScale(); }
  };

  class LoaderBase
  {
  public:
    LoaderBase(SharedLoadInfo const & info);
    virtual ~LoaderBase() {}

    // It seems like no need to store a copy of buffer (see FeaturesVector).
    typedef char const * TBuffer;

    /// @name Initialize functions.
    //@{
    void Init(TBuffer data);
    inline void InitFeature(FeatureType * p) { m_pF = p; }

    void ResetGeometry();
    //@}

    virtual uint8_t GetHeader() = 0;

    virtual void ParseTypes() = 0;
    virtual void ParseCommon() = 0;
    virtual void ParseHeader2() = 0;
    virtual uint32_t ParseGeometry(int scale) = 0;
    virtual uint32_t ParseTriangles(int scale) = 0;
    virtual void ParseMetadata() = 0;

    inline uint32_t GetTypesSize() const { return m_CommonOffset - m_TypesOffset; }

  protected:
    inline char const * DataPtr() const { return m_Data; }

    uint32_t CalcOffset(ArrayByteSource const & source) const;

    inline serial::CodingParams const & GetDefCodingParams() const
    {
      return m_Info.GetDefCodingParams();
    }
    inline serial::CodingParams GetCodingParams(int scaleIndex) const
    {
      return m_Info.GetCodingParams(scaleIndex);
    }

    uint8_t Header() const { return static_cast<uint8_t>(*DataPtr()); }

  protected:
    SharedLoadInfo const & m_Info;
    FeatureType * m_pF;

    TBuffer m_Data;

    static uint32_t const m_TypesOffset = 1;
    uint32_t m_CommonOffset, m_Header2Offset;

    uint32_t m_ptsSimpMask;

    typedef buffer_vector<uint32_t, DataHeader::MAX_SCALES_COUNT> offsets_t;
    offsets_t m_ptsOffsets, m_trgOffsets;

    static uint32_t const s_InvalidOffset = uint32_t(-1);

    void ReadOffsets(ArrayByteSource & src, uint8_t mask, offsets_t & offsets) const;
  };
}