2015-02-19 13:15:16 -05:00
|
|
|
#ifndef QUERYEDGE_HPP
|
|
|
|
#define QUERYEDGE_HPP
|
2012-04-25 04:51:16 -04:00
|
|
|
|
2016-01-02 11:13:44 -05:00
|
|
|
#include "util/typedefs.hpp"
|
2012-04-25 04:51:16 -04:00
|
|
|
|
2015-02-19 13:15:16 -05:00
|
|
|
#include <tuple>
|
|
|
|
|
2016-01-05 10:51:13 -05:00
|
|
|
namespace osrm
|
|
|
|
{
|
|
|
|
namespace contractor
|
|
|
|
{
|
|
|
|
|
2014-05-07 12:39:16 -04:00
|
|
|
struct QueryEdge
|
|
|
|
{
|
2012-04-25 04:51:16 -04:00
|
|
|
NodeID source;
|
|
|
|
NodeID target;
|
2014-05-07 12:39:16 -04:00
|
|
|
struct EdgeData
|
|
|
|
{
|
2017-01-19 16:52:09 -05:00
|
|
|
explicit EdgeData()
|
2017-03-10 04:57:07 -05:00
|
|
|
: turn_id(0), shortcut(false), weight(0), duration(0), forward(false), backward(false)
|
2017-01-19 16:52:09 -05:00
|
|
|
{
|
|
|
|
}
|
2014-07-15 05:46:26 -04:00
|
|
|
|
2017-08-20 19:24:05 -04:00
|
|
|
EdgeData(const NodeID turn_id,
|
|
|
|
const bool shortcut,
|
|
|
|
const EdgeWeight weight,
|
|
|
|
const EdgeWeight duration,
|
|
|
|
const bool forward,
|
|
|
|
const bool backward)
|
|
|
|
: turn_id(turn_id), shortcut(shortcut), weight(weight), duration(duration),
|
|
|
|
forward(forward), backward(backward)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-07-15 05:46:26 -04:00
|
|
|
template <class OtherT> EdgeData(const OtherT &other)
|
|
|
|
{
|
2016-05-12 12:50:10 -04:00
|
|
|
weight = other.weight;
|
2017-01-19 16:52:09 -05:00
|
|
|
duration = other.duration;
|
2014-07-15 05:46:26 -04:00
|
|
|
shortcut = other.shortcut;
|
2017-03-10 04:57:07 -05:00
|
|
|
turn_id = other.id;
|
2014-07-15 05:46:26 -04:00
|
|
|
forward = other.forward;
|
|
|
|
backward = other.backward;
|
|
|
|
}
|
2016-11-18 03:38:26 -05:00
|
|
|
// this ID is either the middle node of the shortcut, or the ID of the edge based node (node
|
|
|
|
// based edge) storing the appropriate data. If `shortcut` is set to true, we get the middle
|
|
|
|
// node. Otherwise we see the edge based node to access node data.
|
2017-03-10 04:57:07 -05:00
|
|
|
NodeID turn_id : 31;
|
2014-05-07 12:39:16 -04:00
|
|
|
bool shortcut : 1;
|
2017-01-19 16:52:09 -05:00
|
|
|
EdgeWeight weight;
|
|
|
|
EdgeWeight duration : 30;
|
|
|
|
std::uint32_t forward : 1;
|
|
|
|
std::uint32_t backward : 1;
|
2012-04-25 04:51:16 -04:00
|
|
|
} data;
|
2013-08-13 12:35:54 -04:00
|
|
|
|
2014-07-15 05:46:26 -04:00
|
|
|
QueryEdge() : source(SPECIAL_NODEID), target(SPECIAL_NODEID) {}
|
|
|
|
|
|
|
|
QueryEdge(NodeID source, NodeID target, EdgeData data)
|
2015-08-18 06:56:34 -04:00
|
|
|
: source(source), target(target), data(std::move(data))
|
2014-07-15 05:46:26 -04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-02-19 13:15:16 -05:00
|
|
|
bool operator<(const QueryEdge &rhs) const
|
2014-05-07 12:39:16 -04:00
|
|
|
{
|
2015-02-19 13:15:16 -05:00
|
|
|
return std::tie(source, target) < std::tie(rhs.source, rhs.target);
|
2012-04-25 04:51:16 -04:00
|
|
|
}
|
|
|
|
|
2014-05-07 12:39:16 -04:00
|
|
|
bool operator==(const QueryEdge &right) const
|
|
|
|
{
|
|
|
|
return (source == right.source && target == right.target &&
|
2017-01-19 16:52:09 -05:00
|
|
|
data.weight == right.data.weight && data.duration == right.data.duration &&
|
|
|
|
data.shortcut == right.data.shortcut && data.forward == right.data.forward &&
|
2017-03-10 04:57:07 -05:00
|
|
|
data.backward == right.data.backward && data.turn_id == right.data.turn_id);
|
2012-04-25 04:51:16 -04:00
|
|
|
}
|
|
|
|
};
|
2016-01-05 10:51:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-19 13:15:16 -05:00
|
|
|
#endif // QUERYEDGE_HPP
|