104 lines
2.3 KiB
C++
104 lines
2.3 KiB
C++
#ifndef OSRM_UTIL_GUIDANCE_TURN_LANES_HPP
|
|
#define OSRM_UTIL_GUIDANCE_TURN_LANES_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <functional>
|
|
#include <vector>
|
|
|
|
#include "util/typedefs.hpp"
|
|
|
|
#include <boost/functional/hash.hpp>
|
|
|
|
namespace osrm
|
|
{
|
|
namespace util
|
|
{
|
|
namespace guidance
|
|
{
|
|
class LaneTuple;
|
|
class LaneTupleIdPair;
|
|
} // namespace guidance
|
|
} // namespace util
|
|
} // namespace osrm
|
|
|
|
namespace std
|
|
{
|
|
template <> struct hash<::osrm::util::guidance::LaneTuple>
|
|
{
|
|
inline std::size_t operator()(const ::osrm::util::guidance::LaneTuple &bearing_class) const;
|
|
};
|
|
template <> struct hash<::osrm::util::guidance::LaneTupleIdPair>
|
|
{
|
|
inline std::size_t
|
|
operator()(const ::osrm::util::guidance::LaneTupleIdPair &bearing_class) const;
|
|
};
|
|
} // namespace std
|
|
|
|
namespace osrm
|
|
{
|
|
namespace util
|
|
{
|
|
namespace guidance
|
|
{
|
|
|
|
// The mapping of turn lanes can be done two values. We describe every turn by the number of
|
|
// contributing lanes and the first lane from the right..
|
|
// Given a road like this:
|
|
// | | |
|
|
// | | |
|
|
// ----------- |
|
|
// -^ |
|
|
// ----------- -------------
|
|
// -^ ->
|
|
// --------------------------------
|
|
// -v |
|
|
// ---------- |
|
|
// | |
|
|
//
|
|
// we generate a set of tuples in the form of:
|
|
// (2,1), (1,1), (1,0) for left, through and right respectively
|
|
class LaneTuple
|
|
{
|
|
public:
|
|
LaneTuple();
|
|
LaneTuple(const LaneID lanes_in_turn, const LaneID first_lane_from_the_right);
|
|
|
|
bool operator==(const LaneTuple other) const;
|
|
bool operator!=(const LaneTuple other) const;
|
|
|
|
LaneID lanes_in_turn;
|
|
LaneID first_lane_from_the_right;
|
|
|
|
friend std::size_t hash_value(const LaneTuple &tup)
|
|
{
|
|
std::size_t seed{0};
|
|
boost::hash_combine(seed, tup.lanes_in_turn);
|
|
boost::hash_combine(seed, tup.first_lane_from_the_right);
|
|
return seed;
|
|
}
|
|
};
|
|
|
|
class LaneTupleIdPair
|
|
{
|
|
public:
|
|
util::guidance::LaneTuple first;
|
|
LaneDescriptionID second;
|
|
|
|
bool operator==(const LaneTupleIdPair &other) const;
|
|
|
|
friend std::size_t hash_value(const LaneTupleIdPair &pair)
|
|
{
|
|
std::size_t seed{0};
|
|
boost::hash_combine(seed, pair.first);
|
|
boost::hash_combine(seed, pair.second);
|
|
return seed;
|
|
}
|
|
};
|
|
|
|
} // namespace guidance
|
|
} // namespace util
|
|
} // namespace osrm
|
|
|
|
#endif /* OSRM_UTIL_GUIDANCE_TURN_LANES_HPP */
|