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

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

#include "routing/cross_mwm_connector.hpp"

#include <type_traits>

using namespace std;

namespace
{
template <typename Number, typename EnableIf = enable_if_t<is_integral<Number>::value, void>>
bool SumWillOverflow(Number lhs, Number rhs)
{
  if (lhs > 0)
    return rhs > numeric_limits<Number>::max() - lhs;
  if (lhs < 0)
    return rhs < numeric_limits<Number>::min() - lhs;
  return false;
}
}  // namespace

namespace routing
{
double RouteWeight::ToCrossMwmWeight() const
{
  if (m_numPassThroughChanges > 0 || m_numAccessChanges > 0)
    return connector::kNoRoute;
  return GetWeight();
}

RouteWeight RouteWeight::operator+(RouteWeight const & rhs) const
{
  ASSERT(!SumWillOverflow(m_numPassThroughChanges, rhs.m_numPassThroughChanges),
         (m_numPassThroughChanges, rhs.m_numPassThroughChanges));
  ASSERT(!SumWillOverflow(m_numAccessChanges, rhs.m_numAccessChanges),
         (m_numAccessChanges, rhs.m_numAccessChanges));
  return RouteWeight(m_weight + rhs.m_weight, m_numPassThroughChanges + rhs.m_numPassThroughChanges,
                     m_numAccessChanges + rhs.m_numAccessChanges,
                     m_transitTime + rhs.m_transitTime);
}

RouteWeight RouteWeight::operator-(RouteWeight const & rhs) const
{
  ASSERT_NOT_EQUAL(m_numPassThroughChanges, numeric_limits<int8_t>::min(), ());
  ASSERT_NOT_EQUAL(m_numAccessChanges, numeric_limits<int8_t>::min(), ());
  ASSERT(!SumWillOverflow(m_numPassThroughChanges, static_cast<int8_t>(-rhs.m_numPassThroughChanges)),
         (m_numPassThroughChanges, -rhs.m_numPassThroughChanges));
  ASSERT(!SumWillOverflow(m_numAccessChanges, static_cast<int8_t>(-rhs.m_numAccessChanges)),
         (m_numAccessChanges, -rhs.m_numAccessChanges));
  return RouteWeight(m_weight - rhs.m_weight, m_numPassThroughChanges - rhs.m_numPassThroughChanges,
                     m_numAccessChanges - rhs.m_numAccessChanges,
                     m_transitTime - rhs.m_transitTime);
}

RouteWeight & RouteWeight::operator+=(RouteWeight const & rhs)
{
  ASSERT(!SumWillOverflow(m_numPassThroughChanges, rhs.m_numPassThroughChanges),
         (m_numPassThroughChanges, rhs.m_numPassThroughChanges));
  ASSERT(!SumWillOverflow(m_numAccessChanges, rhs.m_numAccessChanges),
         (m_numAccessChanges, rhs.m_numAccessChanges));
  m_weight += rhs.m_weight;
  m_numPassThroughChanges += rhs.m_numPassThroughChanges;
  m_numAccessChanges += rhs.m_numAccessChanges;
  m_transitTime += rhs.m_transitTime;
  return *this;
}

ostream & operator<<(ostream & os, RouteWeight const & routeWeight)
{
  os << "(" << static_cast<int32_t>(routeWeight.GetNumPassThroughChanges()) << ", "
     << static_cast<int32_t>(routeWeight.GetNumAccessChanges()) << ", " << routeWeight.GetWeight()
     << ", " << routeWeight.GetTransitTime() << ")";
  return os;
}

RouteWeight operator*(double lhs, RouteWeight const & rhs)
{
  return RouteWeight(lhs * rhs.GetWeight(), rhs.GetNumPassThroughChanges(),
                     rhs.GetNumAccessChanges(), lhs * rhs.GetTransitTime());
}
}  // namespace routing