diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2015-04-21 10:43:55 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:47:17 +0300 |
commit | 30737b7bfeb67db966794028345abbe335e7cc79 (patch) | |
tree | e257a0db4d62ea41d453cb50259f89fcdcf22bcd /routing/turns.cpp | |
parent | 861adb654c22419f2c96dad9e70f9f6f46aff725 (diff) |
Fix after colleagues comments
Diffstat (limited to 'routing/turns.cpp')
-rw-r--r-- | routing/turns.cpp | 118 |
1 files changed, 71 insertions, 47 deletions
diff --git a/routing/turns.cpp b/routing/turns.cpp index 4d5e024558..ab2906c449 100644 --- a/routing/turns.cpp +++ b/routing/turns.cpp @@ -1,12 +1,39 @@ #include "routing/turns.hpp" +#include "std/array.hpp" -namespace routing + +namespace { +using namespace routing::turns; +// The order is important. Starting with the most frequent tokens according to +// taginfo.openstreetmap.org to minimize the number of comparisons in ParseSingleLane(). +array<pair<LaneWay, string>, static_cast<size_t>(LaneWay::Count)> const g_laneWayNames = +{{ + { LaneWay::Through, "through" }, + { LaneWay::Left, "left" }, + { LaneWay::Right, "right" }, + { LaneWay::None, "none" }, + { LaneWay::SharpLeft, "sharp_left" }, + { LaneWay::SlightLeft, "slight_left" }, + { LaneWay::MergeToRight, "merge_to_right" }, + { LaneWay::MergeToLeft, "merge_to_left" }, + { LaneWay::SlightRight, "slight_right" }, + { LaneWay::SharpRight, "sharp_right" }, + { LaneWay::Reverse, "reverse" } +}}; +static_assert(g_laneWayNames.size() == static_cast<size_t>(LaneWay::Count), "Check the size of g_laneWayNames"); +} +namespace routing +{ namespace turns { - +bool TurnGeom::operator==(TurnGeom const & other) const +{ + return m_indexInRoute == other.m_indexInRoute && m_turnIndex == other.m_turnIndex + && m_points == other.m_points; +} string turnStrings[] = { "NoTurn", @@ -59,8 +86,7 @@ bool IsGoStraightOrSlightTurn(TurnDirection t) return (t == turns::GoStraight || t == turns::TurnSlightLeft || t == turns::TurnSlightRight); } - -void ParseLanesToStrings(string const & lanesString, char delimiter, vector<string> & lanes) +void SplitLanes(string const & lanesString, char delimiter, vector<string> & lanes) { lanes.clear(); istringstream lanesStream(lanesString); @@ -71,65 +97,40 @@ void ParseLanesToStrings(string const & lanesString, char delimiter, vector<stri } } -bool ParseOneLane(string const & laneString, char delimiter, vector<Lane> & lane) +bool ParseSingleLane(string const & laneString, char delimiter, TSingleLane & lane) { lane.clear(); istringstream laneStream(laneString); string token; while (getline(laneStream, token, delimiter)) { - Lane l = Lane::NONE; - // Staring compare with the most offen tokens according to taginfo.openstreetmap.org to minimize number of comparations. - if (token == "through") - l = Lane::THROUGH; - else if (token == "left") - l = Lane::LEFT; - else if (token == "right") - l = Lane::RIGHT; - else if (token == "none") - l = Lane::NONE; - else if (token == "sharp_left") - l = Lane::SHARP_LEFT; - else if (token == "slight_left") - l = Lane::SLIGH_LEFT; - else if (token == "merge_to_right") - l = Lane::MERGE_TO_RIGHT; - else if (token == "merge_to_left") - l = Lane::MERGE_TO_LEFT; - else if (token == "slight_right") - l = Lane::SLIGHT_RIGHT; - else if (token == "sharp_right") - l = Lane::SHARP_RIGHT; - else if (token == "reverse") - l = Lane::REVERSE; - else + auto const it = find_if(g_laneWayNames.begin(), g_laneWayNames.end(), + [&token](pair<LaneWay, string> const & p) { - lane.clear(); + return p.second == token; + }); + if (it == g_laneWayNames.end()) return false; - } - lane.push_back(l); + lane.push_back(it->first); } return true; } -bool ParseLanes(string const & lanesString, vector<vector<Lane>> & lanes) +bool ParseLanes(string lanesString, vector<TSingleLane> & lanes) { - lanes.clear(); if (lanesString.empty()) return false; - // convert lanesString to lower case - string lanesStringLower; - lanesStringLower.reserve(lanesString.size()); - transform(lanesString.begin(), lanesString.end(), back_inserter(lanesStringLower), tolower); - // removing all spaces - lanesStringLower.erase(remove_if(lanesStringLower.begin(), lanesStringLower.end(), isspace), lanesStringLower.end()); - - vector<string> lanesStrings; - vector<Lane> lane; - ParseLanesToStrings(lanesStringLower, '|', lanesStrings); - for (string const & s : lanesStrings) + lanes.clear(); + transform(lanesString.begin(), lanesString.end(), lanesString.begin(), tolower); + lanesString.erase(remove_if(lanesString.begin(), lanesString.end(), isspace), + lanesString.end()); + + vector<string> SplitLanesStrings; + TSingleLane lane; + SplitLanes(lanesString, '|', SplitLanesStrings); + for (string const & s : SplitLanesStrings) { - if (!ParseOneLane(s, ';', lane)) + if (!ParseSingleLane(s, ';', lane)) { lanes.clear(); return false; @@ -139,5 +140,28 @@ bool ParseLanes(string const & lanesString, vector<vector<Lane>> & lanes) return true; } +string DebugPrint(routing::turns::TurnGeom const & turnGeom) +{ + stringstream out; + out << "[ TurnGeom: m_indexInRoute = " << turnGeom.m_indexInRoute + << ", m_turnIndex = " << turnGeom.m_turnIndex << " ]" << endl; + return out.str(); +} + +string DebugPrint(routing::turns::LaneWay const l) +{ + stringstream out; + auto const it = find_if(g_laneWayNames.begin(), g_laneWayNames.end(), + [&l](pair<LaneWay, string> const & p) + { + return p.first == l; + }); + + if (it == g_laneWayNames.end()) + out << "unknown LaneWay (" << static_cast<int>(l) << ")"; + out << it->second; + return out.str(); +} + } } |