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

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

#include "routing/fake_feature_ids.hpp"

#include "base/assert.hpp"

#include <sstream>

namespace routing
{
bool IsRealSegment(Segment const & segment)
{
  return segment.GetFeatureId() != FakeFeatureIds::kIndexGraphStarterId;
}

JointSegment::JointSegment(Segment const & from, Segment const & to)
{
  // Can not check segment for fake or not with segment.IsRealSegment(), because all segments
  // have got fake m_numMwmId during mwm generation.
  CHECK(IsRealSegment(from) && IsRealSegment(to),
        ("Segments of joints can not be fake. Only through ToFake() method."));

  CHECK_EQUAL(from.GetMwmId(), to.GetMwmId(), ("Different mwmIds in segments for JointSegment"));
  m_numMwmId = from.GetMwmId();

  CHECK_EQUAL(from.IsForward(), to.IsForward(), ("Different forward in segments for JointSegment"));
  m_forward = from.IsForward();

  CHECK_EQUAL(from.GetFeatureId(), to.GetFeatureId(), ());
  m_featureId = from.GetFeatureId();

  m_startSegmentId = from.GetSegmentIdx();
  m_endSegmentId = to.GetSegmentIdx();
}

void JointSegment::ToFake(uint32_t fakeId)
{
  m_featureId = kInvalidId;
  m_startSegmentId = fakeId;
  m_endSegmentId = fakeId;
  m_numMwmId = kFakeNumMwmId;
  m_forward = false;
}

bool JointSegment::IsFake() const
{
  // This is enough, but let's check in Debug for confidence.
  bool result = m_featureId == kInvalidId && m_startSegmentId != kInvalidId;
  if (result)
  {
    ASSERT_EQUAL(m_startSegmentId, m_endSegmentId, ());
    ASSERT_EQUAL(m_numMwmId, kFakeNumMwmId, ());
    ASSERT_EQUAL(m_forward, false, ());
  }

  return result;
}

bool JointSegment::operator<(JointSegment const & rhs) const
{
  if (m_featureId != rhs.GetFeatureId())
    return m_featureId < rhs.GetFeatureId();

  if (m_forward != rhs.IsForward())
    return m_forward < rhs.IsForward();

  if (m_startSegmentId != rhs.m_startSegmentId)
    return m_startSegmentId < rhs.m_startSegmentId;

  if (m_endSegmentId != rhs.m_endSegmentId)
    return m_endSegmentId < rhs.m_endSegmentId;

  return m_numMwmId < rhs.GetMwmId();
}

bool JointSegment::operator==(JointSegment const & rhs) const
{
  return m_featureId == rhs.m_featureId && m_forward == rhs.m_forward &&
         m_startSegmentId == rhs.m_startSegmentId && m_endSegmentId == rhs.m_endSegmentId &&
         m_numMwmId == rhs.m_numMwmId;
}

std::string DebugPrint(JointSegment const & jointSegment)
{
  std::ostringstream out;
  if (jointSegment.IsFake())
    out << "[FAKE]";

  out << std::boolalpha
      << "JointSegment(" << jointSegment.GetMwmId() << ", " << jointSegment.GetFeatureId() << ", "
      << "[" << jointSegment.GetStartSegmentId() << " => " << jointSegment.GetEndSegmentId() << "], "
      << jointSegment.IsForward() << ")";
  return out.str();
}
}  // namespace routing