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

borders.cpp « indexer - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 71066b136c9672f43c6d71eec9a3ea796ce6cfab (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
#include "indexer/borders.hpp"

#include "coding/file_container.hpp"
#include "coding/geometry_coding.hpp"
#include "coding/var_record_reader.hpp"

#include "base/logging.hpp"
#include "base/macros.hpp"

#include "defines.hpp"

using namespace std;

namespace
{
template <class Reader>
class BordersVector
{
public:
  BordersVector(Reader const & reader) : m_recordReader(reader, 256 /* expectedRecordSize */) {}

  template <class ToDo>
  void ForEach(ToDo && toDo) const
  {
    m_recordReader.ForEachRecord([&](uint32_t pos, char const * data, uint32_t /*size*/) {
      ArrayByteSource src(data);
      serial::GeometryCodingParams cp = {};

      auto readPoly = [&cp, &src](vector<m2::PointD> & poly) {
        m2::PointU base = cp.GetBasePoint();
        for (auto & point : poly)
        {
          base = coding::DecodePointDelta(src, base);
          point = PointUToPointD(base, cp.GetCoordBits());
        }
      };

      uint64_t id;
      ReadPrimitiveFromSource(src, id);
      size_t size;
      ReadPrimitiveFromSource(src, size);
      size_t outerSize;
      ReadPrimitiveFromSource(src, outerSize);
      vector<m2::PointD> outer(outerSize);
      readPoly(outer);

      vector<vector<m2::PointD>> inners(size);
      for (auto & inner : inners)
      {
        size_t innerSize;
        ReadPrimitiveFromSource(src, innerSize);
        inner = vector<m2::PointD>(innerSize);
        readPoly(inner);
      }
      toDo(id, outer, inners);
    });
  }

private:
  friend class BordersVectorReader;

  VarRecordReader<FilesContainerR::TReader, &VarRecordSizeReaderVarint> m_recordReader;

  DISALLOW_COPY(BordersVector);
};

class BordersVectorReader
{
public:
  explicit BordersVectorReader(string const & filePath)
    : m_cont(filePath), m_vector(m_cont.GetReader(BORDERS_FILE_TAG))
  {
  }

  BordersVector<ModelReaderPtr> const & GetVector() const { return m_vector; }

private:
  FilesContainerR m_cont;
  BordersVector<ModelReaderPtr> m_vector;

  DISALLOW_COPY(BordersVectorReader);
};
}  // namespace

namespace indexer
{
bool Borders::Border::IsPointInside(m2::PointD const & point) const
{
  if (!m_outer.Contains(point))
    return false;

  for (auto const & inner : m_inners)
  {
    if (inner.Contains(point))
      return false;
  }

  return true;
}

void Borders::Deserialize(string const & filename)
{
  BordersVectorReader reader(filename);
  auto const & records = reader.GetVector();
  DeserializeFromVec(records);
}
}  // namespace indexer