Fix #2413 by converting enums to unsigned char constants

This commit is contained in:
Michael Krasnyk 2016-05-19 23:26:07 +02:00
parent abed7690d0
commit b5225f07cb
No known key found for this signature in database
GPG Key ID: A277FCFBE39A658D
10 changed files with 92 additions and 94 deletions

View File

@ -33,8 +33,8 @@ namespace json
namespace detail namespace detail
{ {
std::string instructionTypeToString(extractor::guidance::TurnType type); std::string instructionTypeToString(extractor::guidance::TurnType::Enum type);
std::string instructionModifierToString(extractor::guidance::DirectionModifier modifier); std::string instructionModifierToString(extractor::guidance::DirectionModifier::Enum modifier);
util::json::Array coordinateToLonLat(const util::Coordinate coordinate); util::json::Array coordinateToLonLat(const util::Coordinate coordinate);

View File

@ -49,7 +49,7 @@ inline bool staysOnRoundabout(const extractor::guidance::TurnInstruction instruc
return instruction.type == extractor::guidance::TurnType::StayOnRoundabout; return instruction.type == extractor::guidance::TurnType::StayOnRoundabout;
} }
inline extractor::guidance::DirectionModifier angleToDirectionModifier(const double bearing) inline extractor::guidance::DirectionModifier::Enum angleToDirectionModifier(const double bearing)
{ {
if (bearing < 135) if (bearing < 135)
{ {

View File

@ -49,7 +49,7 @@ class IntersectionHandler
std::size_t countValid(const Intersection &intersection) const; std::size_t countValid(const Intersection &intersection) const;
// Decide on a basic turn types // Decide on a basic turn types
TurnType findBasicTurnType(const EdgeID via_edge, const ConnectedRoad &candidate) const; TurnType::Enum findBasicTurnType(const EdgeID via_edge, const ConnectedRoad &candidate) const;
// Get the Instruction for an obvious turn // Get the Instruction for an obvious turn
TurnInstruction getInstructionForObvious(const std::size_t number_of_candidates, TurnInstruction getInstructionForObvious(const std::size_t number_of_candidates,

View File

@ -145,13 +145,13 @@ getRepresentativeCoordinate(const NodeID from_node,
} }
// shift an instruction around the degree circle in CCW order // shift an instruction around the degree circle in CCW order
inline DirectionModifier forcedShiftCCW(const DirectionModifier modifier) inline DirectionModifier::Enum forcedShiftCCW(const DirectionModifier::Enum modifier)
{ {
return static_cast<DirectionModifier>((static_cast<std::uint32_t>(modifier) + 1) % return static_cast<DirectionModifier::Enum>((static_cast<std::uint32_t>(modifier) + 1) %
detail::num_direction_modifiers); detail::num_direction_modifiers);
} }
inline DirectionModifier shiftCCW(const DirectionModifier modifier) inline DirectionModifier::Enum shiftCCW(const DirectionModifier::Enum modifier)
{ {
if (detail::shiftable_ccw[static_cast<int>(modifier)]) if (detail::shiftable_ccw[static_cast<int>(modifier)])
return forcedShiftCCW(modifier); return forcedShiftCCW(modifier);
@ -160,14 +160,14 @@ inline DirectionModifier shiftCCW(const DirectionModifier modifier)
} }
// shift an instruction around the degree circle in CW order // shift an instruction around the degree circle in CW order
inline DirectionModifier forcedShiftCW(const DirectionModifier modifier) inline DirectionModifier::Enum forcedShiftCW(const DirectionModifier::Enum modifier)
{ {
return static_cast<DirectionModifier>( return static_cast<DirectionModifier::Enum>(
(static_cast<std::uint32_t>(modifier) + detail::num_direction_modifiers - 1) % (static_cast<std::uint32_t>(modifier) + detail::num_direction_modifiers - 1) %
detail::num_direction_modifiers); detail::num_direction_modifiers);
} }
inline DirectionModifier shiftCW(const DirectionModifier modifier) inline DirectionModifier::Enum shiftCW(const DirectionModifier::Enum modifier)
{ {
if (detail::shiftable_cw[static_cast<int>(modifier)]) if (detail::shiftable_cw[static_cast<int>(modifier)])
return forcedShiftCW(modifier); return forcedShiftCW(modifier);
@ -175,7 +175,7 @@ inline DirectionModifier shiftCW(const DirectionModifier modifier)
return modifier; return modifier;
} }
inline bool isBasic(const TurnType type) inline bool isBasic(const TurnType::Enum type)
{ {
return type == TurnType::Turn || type == TurnType::EndOfRoad; return type == TurnType::Turn || type == TurnType::EndOfRoad;
} }
@ -219,7 +219,7 @@ inline bool isSlightTurn(const TurnInstruction turn)
turn.direction_modifier == DirectionModifier::SlightLeft); turn.direction_modifier == DirectionModifier::SlightLeft);
} }
inline bool isSlightModifier(const DirectionModifier direction_modifier) inline bool isSlightModifier(const DirectionModifier::Enum direction_modifier)
{ {
return (direction_modifier == DirectionModifier::Straight || return (direction_modifier == DirectionModifier::Straight ||
direction_modifier == DirectionModifier::SlightRight || direction_modifier == DirectionModifier::SlightRight ||
@ -257,7 +257,7 @@ inline double angleFromDiscreteAngle(const DiscreteAngle angle)
0.5 * detail::discrete_angle_step_size; 0.5 * detail::discrete_angle_step_size;
} }
inline double getAngularPenalty(const double angle, DirectionModifier modifier) inline double getAngularPenalty(const double angle, DirectionModifier::Enum modifier)
{ {
// these are not aligned with getTurnDirection but represent an ideal center // these are not aligned with getTurnDirection but represent an ideal center
const double center[] = {0, 45, 90, 135, 180, 225, 270, 315}; const double center[] = {0, 45, 90, 135, 180, 225, 270, 315};
@ -278,16 +278,16 @@ inline double getTurnConfidence(const double angle, TurnInstruction instruction)
} }
// swaps left <-> right modifier types // swaps left <-> right modifier types
inline DirectionModifier mirrorDirectionModifier(const DirectionModifier modifier) inline DirectionModifier::Enum mirrorDirectionModifier(const DirectionModifier::Enum modifier)
{ {
const constexpr DirectionModifier results[] = { const constexpr DirectionModifier::Enum results[] = {
DirectionModifier::UTurn, DirectionModifier::SharpLeft, DirectionModifier::Left, DirectionModifier::UTurn, DirectionModifier::SharpLeft, DirectionModifier::Left,
DirectionModifier::SlightLeft, DirectionModifier::Straight, DirectionModifier::SlightRight, DirectionModifier::SlightLeft, DirectionModifier::Straight, DirectionModifier::SlightRight,
DirectionModifier::Right, DirectionModifier::SharpRight}; DirectionModifier::Right, DirectionModifier::SharpRight};
return results[modifier]; return results[modifier];
} }
inline bool canBeSuppressed(const TurnType type) inline bool canBeSuppressed(const TurnType::Enum type)
{ {
if (type == TurnType::Turn) if (type == TurnType::Turn)
return true; return true;
@ -300,7 +300,7 @@ inline bool isLowPriorityRoadClass(const FunctionalRoadClass road_class)
road_class == FunctionalRoadClass::SERVICE; road_class == FunctionalRoadClass::SERVICE;
} }
inline bool isDistinct(const DirectionModifier first, const DirectionModifier second) inline bool isDistinct(const DirectionModifier::Enum first, const DirectionModifier::Enum second)
{ {
if ((first + 1) % detail::num_direction_modifiers == second) if ((first + 1) % detail::num_direction_modifiers == second)
return false; return false;
@ -441,7 +441,7 @@ inline bool canBeSeenAsFork(const FunctionalRoadClass first, const FunctionalRoa
// turn and vice versa. // turn and vice versa.
inline ConnectedRoad mirror(ConnectedRoad road) inline ConnectedRoad mirror(ConnectedRoad road)
{ {
const constexpr DirectionModifier mirrored_modifiers[] = { const constexpr DirectionModifier::Enum mirrored_modifiers[] = {
DirectionModifier::UTurn, DirectionModifier::SharpLeft, DirectionModifier::Left, DirectionModifier::UTurn, DirectionModifier::SharpLeft, DirectionModifier::Left,
DirectionModifier::SlightLeft, DirectionModifier::Straight, DirectionModifier::SlightRight, DirectionModifier::SlightLeft, DirectionModifier::Straight, DirectionModifier::SlightRight,
DirectionModifier::Right, DirectionModifier::SharpRight}; DirectionModifier::Right, DirectionModifier::SharpRight};

View File

@ -20,62 +20,62 @@ namespace detail
const constexpr uint8_t num_direction_modifiers = 8; const constexpr uint8_t num_direction_modifiers = 8;
} // detail } // detail
// direction modifiers based on angle
// Would be nice to have
// enum class DirectionModifier : unsigned char
enum DirectionModifier
{
UTurn,
SharpRight,
Right,
SlightRight,
Straight,
SlightLeft,
Left,
SharpLeft
};
// enum class TurnType : unsigned char // direction modifiers based on angle
enum TurnType // at the moment we can support 32 turn types, without increasing memory consumption namespace DirectionModifier
{ {
Invalid, // no valid turn instruction typedef std::uint8_t Enum;
NewName, // no turn, but name changes const constexpr Enum UTurn = 0;
Continue, // remain on a street const constexpr Enum SharpRight = 1;
Turn, // basic turn const constexpr Enum Right = 2;
Merge, // merge onto a street const constexpr Enum SlightRight = 3;
OnRamp, // special turn (highway ramp on-ramps) const constexpr Enum Straight = 4;
OffRamp, // special turn, highway exit const constexpr Enum SlightLeft = 5;
Fork, // fork road splitting up const constexpr Enum Left = 6;
EndOfRoad, // T intersection const constexpr Enum SharpLeft = 7;
Notification, // Travel Mode Changes, Restrictions apply... }
EnterRoundabout, // Entering a small Roundabout
EnterAndExitRoundabout, // Touching a roundabout namespace TurnType
EnterRotary, // Enter a rotary {
EnterAndExitRotary, // Touching a rotary typedef std::uint8_t Enum;
EnterRoundaboutIntersection, // Entering a small Roundabout const constexpr Enum Invalid = 0; // no valid turn instruction
EnterAndExitRoundaboutIntersection, // Touching a roundabout const constexpr Enum NewName = 1; // no turn, but name changes
NoTurn, // end of segment without turn/middle of a segment const constexpr Enum Continue = 2; // remain on a street
Suppressed, // location that suppresses a turn const constexpr Enum Turn = 3; // basic turn
EnterRoundaboutAtExit, // Entering a small Roundabout at a countable exit const constexpr Enum Merge = 4; // merge onto a street
ExitRoundabout, // Exiting a small Roundabout const constexpr Enum OnRamp = 5; // special turn (highway ramp on-ramps)
EnterRotaryAtExit, // Enter A Rotary at a countable exit const constexpr Enum OffRamp = 6; // special turn, highway exit
ExitRotary, // Exit a rotary const constexpr Enum Fork = 7; // fork road splitting up
EnterRoundaboutIntersectionAtExit, // Entering a small Roundabout at a countable exit const constexpr Enum EndOfRoad = 8; // T intersection
ExitRoundaboutIntersection, // Exiting a small Roundabout const constexpr Enum Notification = 9; // Travel Mode Changes, Restrictions apply...
StayOnRoundabout // Continue on Either a small or a large Roundabout const constexpr Enum EnterRoundabout = 10; // Entering a small Roundabout
}; const constexpr Enum EnterAndExitRoundabout = 11; // Touching a roundabout
const constexpr Enum EnterRotary = 12; // Enter a rotary
const constexpr Enum EnterAndExitRotary = 13; // Touching a rotary
const constexpr Enum EnterRoundaboutIntersection = 14; // Entering a small Roundabout
const constexpr Enum EnterAndExitRoundaboutIntersection = 15; // Touching a roundabout
const constexpr Enum NoTurn = 16; // end of segment without turn/middle of a segment
const constexpr Enum Suppressed = 17; // location that suppresses a turn
const constexpr Enum EnterRoundaboutAtExit = 18; // Entering a small Roundabout at a countable exit
const constexpr Enum ExitRoundabout = 19; // Exiting a small Roundabout
const constexpr Enum EnterRotaryAtExit = 20; // Enter A Rotary at a countable exit
const constexpr Enum ExitRotary = 21; // Exit a rotary
const constexpr Enum EnterRoundaboutIntersectionAtExit = 22; // Entering a small Roundabout at a countable exit
const constexpr Enum ExitRoundaboutIntersection = 23; // Exiting a small Roundabout
const constexpr Enum StayOnRoundabout = 24; // Continue on Either a small or a large Roundabout
}
// turn angle in 1.40625 degree -> 128 == 180 degree // turn angle in 1.40625 degree -> 128 == 180 degree
struct TurnInstruction struct TurnInstruction
{ {
TurnInstruction(const TurnType type = TurnType::Invalid, TurnInstruction(const TurnType::Enum type = TurnType::Invalid,
const DirectionModifier direction_modifier = DirectionModifier::Straight) const DirectionModifier::Enum direction_modifier = DirectionModifier::Straight)
: type(type), direction_modifier(direction_modifier) : type(type), direction_modifier(direction_modifier)
{ {
} }
TurnType type : 5; TurnType::Enum type : 5;
DirectionModifier direction_modifier : 3; DirectionModifier::Enum direction_modifier : 3;
static TurnInstruction INVALID() static TurnInstruction INVALID()
{ {
@ -87,53 +87,55 @@ struct TurnInstruction
return TurnInstruction(TurnType::NoTurn, DirectionModifier::UTurn); return TurnInstruction(TurnType::NoTurn, DirectionModifier::UTurn);
} }
static TurnInstruction REMAIN_ROUNDABOUT(const RoundaboutType, const DirectionModifier modifier) static TurnInstruction REMAIN_ROUNDABOUT(const RoundaboutType, const DirectionModifier::Enum modifier)
{ {
return TurnInstruction(TurnType::StayOnRoundabout, modifier); return TurnInstruction(TurnType::StayOnRoundabout, modifier);
} }
static TurnInstruction ENTER_ROUNDABOUT(const RoundaboutType roundabout_type, static TurnInstruction ENTER_ROUNDABOUT(const RoundaboutType roundabout_type,
const DirectionModifier modifier) const DirectionModifier::Enum modifier)
{ {
const constexpr TurnType enter_instruction[] = { const constexpr TurnType::Enum enter_instruction[] = {
TurnType::Invalid, TurnType::EnterRoundabout, TurnType::EnterRotary, TurnType::Invalid, TurnType::EnterRoundabout, TurnType::EnterRotary,
TurnType::EnterRoundaboutIntersection}; TurnType::EnterRoundaboutIntersection};
return {enter_instruction[static_cast<int>(roundabout_type)], modifier}; return {enter_instruction[static_cast<int>(roundabout_type)], modifier};
} }
static TurnInstruction EXIT_ROUNDABOUT(const RoundaboutType roundabout_type, static TurnInstruction EXIT_ROUNDABOUT(const RoundaboutType roundabout_type,
const DirectionModifier modifier) const DirectionModifier::Enum modifier)
{ {
const constexpr TurnType exit_instruction[] = {TurnType::Invalid, TurnType::ExitRoundabout, const constexpr TurnType::Enum exit_instruction[] = {TurnType::Invalid, TurnType::ExitRoundabout,
TurnType::ExitRotary, TurnType::ExitRotary,
TurnType::ExitRoundaboutIntersection}; TurnType::ExitRoundaboutIntersection};
return {exit_instruction[static_cast<int>(roundabout_type)], modifier}; return {exit_instruction[static_cast<int>(roundabout_type)], modifier};
} }
static TurnInstruction ENTER_AND_EXIT_ROUNDABOUT(const RoundaboutType roundabout_type, static TurnInstruction ENTER_AND_EXIT_ROUNDABOUT(const RoundaboutType roundabout_type,
const DirectionModifier modifier) const DirectionModifier::Enum modifier)
{ {
const constexpr TurnType exit_instruction[] = { const constexpr TurnType::Enum exit_instruction[] = {
TurnType::Invalid, TurnType::EnterAndExitRoundabout, TurnType::EnterAndExitRotary, TurnType::Invalid, TurnType::EnterAndExitRoundabout, TurnType::EnterAndExitRotary,
TurnType::EnterAndExitRoundaboutIntersection}; TurnType::EnterAndExitRoundaboutIntersection};
return {exit_instruction[static_cast<int>(roundabout_type)], modifier}; return {exit_instruction[static_cast<int>(roundabout_type)], modifier};
} }
static TurnInstruction ENTER_ROUNDABOUT_AT_EXIT(const RoundaboutType roundabout_type, static TurnInstruction ENTER_ROUNDABOUT_AT_EXIT(const RoundaboutType roundabout_type,
const DirectionModifier modifier) const DirectionModifier::Enum modifier)
{ {
const constexpr TurnType enter_instruction[] = { const constexpr TurnType::Enum enter_instruction[] = {
TurnType::Invalid, TurnType::EnterRoundaboutAtExit, TurnType::EnterRotaryAtExit, TurnType::Invalid, TurnType::EnterRoundaboutAtExit, TurnType::EnterRotaryAtExit,
TurnType::EnterRoundaboutIntersectionAtExit}; TurnType::EnterRoundaboutIntersectionAtExit};
return {enter_instruction[static_cast<int>(roundabout_type)], modifier}; return {enter_instruction[static_cast<int>(roundabout_type)], modifier};
} }
static TurnInstruction SUPPRESSED(const DirectionModifier modifier) static TurnInstruction SUPPRESSED(const DirectionModifier::Enum modifier)
{ {
return {TurnType::Suppressed, modifier}; return {TurnType::Suppressed, modifier};
} }
}; };
static_assert(sizeof(TurnInstruction) == 1, "TurnInstruction does not fit one byte");
inline bool operator!=(const TurnInstruction lhs, const TurnInstruction rhs) inline bool operator!=(const TurnInstruction lhs, const TurnInstruction rhs)
{ {
return lhs.type != rhs.type || lhs.direction_modifier != rhs.direction_modifier; return lhs.type != rhs.type || lhs.direction_modifier != rhs.direction_modifier;

View File

@ -20,24 +20,24 @@ struct OriginalEdgeData
guidance::TurnInstruction turn_instruction, guidance::TurnInstruction turn_instruction,
EntryClassID entry_classid, EntryClassID entry_classid,
TravelMode travel_mode) TravelMode travel_mode)
: via_node(via_node), name_id(name_id), turn_instruction(turn_instruction), : via_node(via_node), name_id(name_id), entry_classid(entry_classid),
entry_classid(entry_classid), travel_mode(travel_mode) turn_instruction(turn_instruction), travel_mode(travel_mode)
{ {
} }
OriginalEdgeData() OriginalEdgeData()
: via_node(std::numeric_limits<unsigned>::max()), : via_node(std::numeric_limits<unsigned>::max()),
name_id(std::numeric_limits<unsigned>::max()), name_id(std::numeric_limits<unsigned>::max()),
turn_instruction(guidance::TurnInstruction::INVALID()),
entry_classid(INVALID_ENTRY_CLASSID), entry_classid(INVALID_ENTRY_CLASSID),
turn_instruction(guidance::TurnInstruction::INVALID()),
travel_mode(TRAVEL_MODE_INACCESSIBLE) travel_mode(TRAVEL_MODE_INACCESSIBLE)
{ {
} }
NodeID via_node; NodeID via_node;
unsigned name_id; unsigned name_id;
guidance::TurnInstruction turn_instruction;
EntryClassID entry_classid; EntryClassID entry_classid;
guidance::TurnInstruction turn_instruction;
TravelMode travel_mode; TravelMode travel_mode;
}; };
} }

View File

@ -26,7 +26,7 @@ inline double angularDeviation(const double angle, const double from)
return std::min(360 - deviation, deviation); return std::min(360 - deviation, deviation);
} }
inline extractor::guidance::DirectionModifier getTurnDirection(const double angle) inline extractor::guidance::DirectionModifier::Enum getTurnDirection(const double angle)
{ {
// An angle of zero is a u-turn // An angle of zero is a u-turn
// 180 goes perfectly straight // 180 goes perfectly straight

View File

@ -17,8 +17,8 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
using TurnType = osrm::extractor::guidance::TurnType; namespace TurnType = osrm::extractor::guidance::TurnType;
using DirectionModifier = osrm::extractor::guidance::DirectionModifier; namespace DirectionModifier = osrm::extractor::guidance::DirectionModifier;
using TurnInstruction = osrm::extractor::guidance::TurnInstruction; using TurnInstruction = osrm::extractor::guidance::TurnInstruction;
namespace osrm namespace osrm
@ -55,12 +55,12 @@ inline bool isValidModifier(const guidance::StepManeuver maneuver)
return true; return true;
} }
std::string instructionTypeToString(const TurnType type) std::string instructionTypeToString(const TurnType::Enum type)
{ {
return turn_type_names[static_cast<std::size_t>(type)]; return turn_type_names[static_cast<std::size_t>(type)];
} }
std::string instructionModifierToString(const DirectionModifier modifier) std::string instructionModifierToString(const DirectionModifier::Enum modifier)
{ {
return modifier_names[static_cast<std::size_t>(modifier)]; return modifier_names[static_cast<std::size_t>(modifier)];
} }

View File

@ -17,8 +17,8 @@
#include <utility> #include <utility>
using TurnInstruction = osrm::extractor::guidance::TurnInstruction; using TurnInstruction = osrm::extractor::guidance::TurnInstruction;
using TurnType = osrm::extractor::guidance::TurnType; namespace TurnType = osrm::extractor::guidance::TurnType;
using DirectionModifier = osrm::extractor::guidance::DirectionModifier; namespace DirectionModifier = osrm::extractor::guidance::DirectionModifier;
using osrm::util::guidance::angularDeviation; using osrm::util::guidance::angularDeviation;
using osrm::util::guidance::getTurnDirection; using osrm::util::guidance::getTurnDirection;
@ -41,12 +41,8 @@ void print(const std::vector<RouteStep> &steps)
int segment = 0; int segment = 0;
for (const auto &step : steps) for (const auto &step : steps)
{ {
const auto type = std::cout << "\t[" << ++segment << "]: " << step.maneuver.instruction.type
static_cast<std::underlying_type<TurnType>::type>(step.maneuver.instruction.type); << " " << step.maneuver.instruction.direction_modifier << " " << static_cast<int>(step.maneuver.waypoint_type)
const auto modifier = static_cast<std::underlying_type<DirectionModifier>::type>(
step.maneuver.instruction.direction_modifier);
std::cout << "\t[" << ++segment << "]: " << type << " " << modifier << " " << static_cast<int>(step.maneuver.waypoint_type)
<< " Duration: " << step.duration << " Distance: " << step.distance << " Duration: " << step.duration << " Distance: " << step.distance
<< " Geometry: " << step.geometry_begin << " " << step.geometry_end << " Geometry: " << step.geometry_begin << " " << step.geometry_end
<< " exit: " << step.maneuver.exit << " exit: " << step.maneuver.exit
@ -187,7 +183,7 @@ void closeOffRoundabout(const bool on_roundabout,
steps[1] = forwardInto(steps[1], steps[0]); steps[1] = forwardInto(steps[1], steps[0]);
steps[0].duration = 0; steps[0].duration = 0;
steps[0].distance = 0; steps[0].distance = 0;
const auto exitToEnter = [](const TurnType type) { const auto exitToEnter = [](const TurnType::Enum type) {
if (TurnType::ExitRotary == type) if (TurnType::ExitRotary == type)
return TurnType::EnterRotary; return TurnType::EnterRotary;
// if we do not enter the roundabout Intersection, we cannot treat the full traversal as // if we do not enter the roundabout Intersection, we cannot treat the full traversal as

View File

@ -42,7 +42,7 @@ std::size_t IntersectionHandler::countValid(const Intersection &intersection) co
[](const ConnectedRoad &road) { return road.entry_allowed; }); [](const ConnectedRoad &road) { return road.entry_allowed; });
} }
TurnType IntersectionHandler::findBasicTurnType(const EdgeID via_edge, TurnType::Enum IntersectionHandler::findBasicTurnType(const EdgeID via_edge,
const ConnectedRoad &road) const const ConnectedRoad &road) const
{ {