#include "routing/route_weight.hpp" #include "routing/cross_mwm_connector.hpp" #include using namespace std; namespace { template ::value, void>> bool SumWillOverflow(Number lhs, Number rhs) { if (lhs > 0) return rhs > numeric_limits::max() - lhs; if (lhs < 0) return rhs < numeric_limits::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::min(), ()); ASSERT_NOT_EQUAL(m_numAccessChanges, numeric_limits::min(), ()); ASSERT(!SumWillOverflow(m_numPassThroughChanges, static_cast(-rhs.m_numPassThroughChanges)), (m_numPassThroughChanges, -rhs.m_numPassThroughChanges)); ASSERT(!SumWillOverflow(m_numAccessChanges, static_cast(-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(routeWeight.GetNumPassThroughChanges()) << ", " << static_cast(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