From 0cb85fd05976047a635211036ecf2321350f44ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B8=CC=86=20=D0=AD=D1=8D?= =?UTF-8?q?=D1=85?= Date: Fri, 24 Mar 2017 18:26:14 +0300 Subject: [PATCH] [routing] Add osm ids to cross mwm section --- generator/generator_tool/generator_tool.cpp | 8 ++- generator/routing_helpers.cpp | 68 ++++++++++++++----- generator/routing_helpers.hpp | 2 + generator/routing_index_generator.cpp | 17 ++++- generator/routing_index_generator.hpp | 3 +- routing/cross_mwm_connector.cpp | 36 ++++++++-- routing/cross_mwm_connector.hpp | 15 ++-- routing/cross_mwm_connector_serialization.cpp | 19 +++++- routing/cross_mwm_connector_serialization.hpp | 44 ++++++++---- .../cross_mwm_connector_test.cpp | 23 ++++--- 10 files changed, 177 insertions(+), 58 deletions(-) diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index fb96013b0b..0cb1d27912 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -249,9 +249,10 @@ int main(int argc, char ** argv) if (!FLAGS_srtm_path.empty()) routing::BuildRoadAltitudes(datFile, FLAGS_srtm_path); + string const osmToFeatureFilename = genInfo.GetTargetFileName(country) + OSM2FEATURE_FILE_EXTENSION; + if (FLAGS_make_routing_index) { - string const osmToFeatureFilename = genInfo.GetTargetFileName(country) + OSM2FEATURE_FILE_EXTENSION; string const restrictionsFilename = genInfo.GetIntermediateFileName(RESTRICTIONS_FILENAME, "" /* extension */); string const roadAccessFilename = @@ -263,7 +264,10 @@ int main(int argc, char ** argv) } if (FLAGS_make_cross_mwm) - routing::BuildCrossMwmSection(path, datFile, country); + { + if (!routing::BuildCrossMwmSection(path, datFile, country, osmToFeatureFilename)) + LOG(LCRITICAL, ("Error generating cross mwm section.")); + } if (FLAGS_generate_traffic_keys) { diff --git a/generator/routing_helpers.cpp b/generator/routing_helpers.cpp index 7434c4283f..8f1273e857 100644 --- a/generator/routing_helpers.cpp +++ b/generator/routing_helpers.cpp @@ -10,6 +10,33 @@ using std::map; using std::string; +namespace +{ +template +bool ForEachRoadFromFile(string const & filename, ToDo && toDo) +{ + gen::OsmID2FeatureID osmIdsToFeatureIds; + try + { + FileReader reader(filename); + ReaderSource src(reader); + osmIdsToFeatureIds.Read(src); + } + catch (FileReader::Exception const & e) + { + LOG(LERROR, ("Exception while reading file:", filename, ". Msg:", e.Msg())); + return false; + } + + osmIdsToFeatureIds.ForEach([&](gen::OsmID2FeatureID::ValueT const & p) { + if (p.first.IsWay()) + toDo(p.second /* feature id */, p.first.OsmId()); + }); + + return true; +} +} // namespace + namespace routing { void AddFeatureId(map & osmIdToFeatureId, uint32_t featureId, uint64_t osmId) @@ -25,26 +52,31 @@ void AddFeatureId(map & osmIdToFeatureId, uint32_t featureId bool ParseOsmIdToFeatureIdMapping(string const & osmIdsToFeatureIdPath, map & osmIdToFeatureId) { - gen::OsmID2FeatureID osmIdsToFeatureIds; - try - { - FileReader reader(osmIdsToFeatureIdPath); - ReaderSource src(reader); - osmIdsToFeatureIds.Read(src); - } - catch (FileReader::Exception const & e) - { - LOG(LWARNING, ("Exception while reading file:", osmIdsToFeatureIdPath, ". Msg:", e.Msg())); - return false; - } + return ForEachRoadFromFile(osmIdsToFeatureIdPath, [&](uint32_t featureId, uint64_t osmId) { + AddFeatureId(osmIdToFeatureId, featureId, osmId); + }); +} - osmIdsToFeatureIds.ForEach([&](gen::OsmID2FeatureID::ValueT const & p) { - if (p.first.IsWay()) - { - AddFeatureId(osmIdToFeatureId, p.second /* feature id */, p.first.OsmId() /* osm id */); - } +bool ParseFeatureIdToOsmIdMapping(string const & osmIdsToFeatureIdPath, + map & featureIdToOsmId) +{ + bool result = true; + + result &= ForEachRoadFromFile(osmIdsToFeatureIdPath, [&](uint32_t featureId, uint64_t osmId) { + auto const emplaced = featureIdToOsmId.emplace(featureId, osmId); + if (emplaced.second) + return; + + result = false; + LOG(LERROR, + ("Feature id", featureId, "is included in two osm ids:", emplaced.first->second, osmId)); }); - return true; + if (result) + return true; + + LOG(LERROR, ("Can't load osm id mapping from", osmIdsToFeatureIdPath)); + featureIdToOsmId.clear(); + return false; } } // namespace routing diff --git a/generator/routing_helpers.hpp b/generator/routing_helpers.hpp index 7099d286ec..d93617de48 100644 --- a/generator/routing_helpers.hpp +++ b/generator/routing_helpers.hpp @@ -28,4 +28,6 @@ void AddFeatureId(std::map & osmIdToFeatureId, uint32_t feat // 138001, 5170228, bool ParseOsmIdToFeatureIdMapping(std::string const & osmIdsToFeatureIdPath, std::map & osmIdToFeatureId); +bool ParseFeatureIdToOsmIdMapping(std::string const & osmIdsToFeatureIdPath, + std::map & featureIdToOsmId); } // namespace routing diff --git a/generator/routing_index_generator.cpp b/generator/routing_index_generator.cpp index 3455ff7806..12071ca09c 100644 --- a/generator/routing_index_generator.cpp +++ b/generator/routing_index_generator.cpp @@ -2,6 +2,7 @@ #include "generator/borders_generator.hpp" #include "generator/borders_loader.hpp" +#include "generator/routing_helpers.hpp" #include "routing/base/astar_algorithm.hpp" #include "routing/cross_mwm_connector.hpp" @@ -208,6 +209,7 @@ double CalcDistanceAlongTheBorders(vector const & borders, } void CalcCrossMwmTransitions(string const & path, string const & mwmFile, string const & country, + map const & featureIdToOsmId, vector & transitions, CrossMwmConnectorPerVehicleType & connectors) { @@ -228,6 +230,10 @@ void CalcCrossMwmTransitions(string const & path, string const & mwmFile, string if (pointsCount == 0) return; + auto osmIt = featureIdToOsmId.find(featureId); + CHECK(osmIt != featureIdToOsmId.end(), ("Can't find osm id for feature id", featureId)); + uint64_t const osmId = osmIt->second; + bool prevPointIn = RegionsContain(borders, f.GetPoint(0)); for (size_t i = 1; i < pointsCount; ++i) @@ -239,7 +245,7 @@ void CalcCrossMwmTransitions(string const & path, string const & mwmFile, string uint32_t const segmentIdx = base::asserted_cast(i - 1); VehicleMask const oneWayMask = maskMaker.CalcOneWayMask(f); - transitions.emplace_back(featureId, segmentIdx, roadMask, oneWayMask, currPointIn, + transitions.emplace_back(osmId, featureId, segmentIdx, roadMask, oneWayMask, currPointIn, f.GetPoint(i - 1), f.GetPoint(i)); prevPointIn = currPointIn; @@ -370,14 +376,18 @@ bool BuildRoutingIndex(string const & filename, string const & country) } } -void BuildCrossMwmSection(string const & path, string const & mwmFile, string const & country) +bool BuildCrossMwmSection(string const & path, string const & mwmFile, string const & country, string const & osmToFeatureFile) { LOG(LINFO, ("Building cross mwm section for", country)); + map featureIdToOsmId; + if (!ParseFeatureIdToOsmIdMapping(osmToFeatureFile, featureIdToOsmId)) + return false; + CrossMwmConnectorPerVehicleType connectors; vector transitions; - CalcCrossMwmTransitions(path, mwmFile, country, transitions, connectors); + CalcCrossMwmTransitions(path, mwmFile, country, featureIdToOsmId, transitions, connectors); for (size_t i = 0; i < connectors.size(); ++i) { @@ -397,5 +407,6 @@ void BuildCrossMwmSection(string const & path, string const & mwmFile, string co auto const sectionSize = writer.Pos() - startPos; LOG(LINFO, ("Cross mwm section generated, size:", sectionSize, "bytes")); + return true; } } // namespace routing diff --git a/generator/routing_index_generator.hpp b/generator/routing_index_generator.hpp index d693a25678..37f30c9f38 100644 --- a/generator/routing_index_generator.hpp +++ b/generator/routing_index_generator.hpp @@ -5,6 +5,5 @@ namespace routing { bool BuildRoutingIndex(std::string const & filename, std::string const & country); -void BuildCrossMwmSection(std::string const & path, std::string const & mwmFile, - std::string const & country); +bool BuildCrossMwmSection(std::string const & path, std::string const & mwmFile, std::string const & country, std::string const & osmToFeatureFile); } // namespace routing diff --git a/routing/cross_mwm_connector.cpp b/routing/cross_mwm_connector.cpp index 0b0220a17e..f8b030c1b7 100644 --- a/routing/cross_mwm_connector.cpp +++ b/routing/cross_mwm_connector.cpp @@ -1,5 +1,7 @@ #include "routing/cross_mwm_connector.hpp" +#include "geometry/mercator.hpp" + namespace { uint32_t constexpr kFakeId = std::numeric_limits::max(); @@ -10,11 +12,11 @@ namespace routing // static double constexpr CrossMwmConnector::kNoRoute; -void CrossMwmConnector::AddTransition(uint32_t featureId, uint32_t segmentIdx, bool oneWay, - bool forwardIsEnter, m2::PointD const & backPoint, - m2::PointD const & frontPoint) +void CrossMwmConnector::AddTransition(uint64_t osmId, uint32_t featureId, uint32_t segmentIdx, + bool oneWay, bool forwardIsEnter, + m2::PointD const & backPoint, m2::PointD const & frontPoint) { - Transition transition(kFakeId, kFakeId, oneWay, forwardIsEnter, backPoint, frontPoint); + Transition transition(kFakeId, kFakeId, osmId, oneWay, forwardIsEnter, backPoint, frontPoint); if (forwardIsEnter) { @@ -63,6 +65,32 @@ bool CrossMwmConnector::IsTransition(Segment const & segment, bool isOutgoing) c return isEnter != isOutgoing; } +Segment const * CrossMwmConnector::GetTransition(uint64_t osmId, bool isEnter) const +{ + auto it = m_osmIdToKey.find(osmId); + if (it == m_osmIdToKey.cend()) + return nullptr; + + Key const & key = it->second; + auto it2 = m_transitions.find(key); + CHECK(it2 != m_transitions.cend(), ("Can't find transition by key, osmId:", osmId, ", feature:", + key.m_featureId, ", segment:", key.m_segmentIdx)); + + Transition const & transition = it2->second; + CHECK_EQUAL(transition.m_osmId, osmId, + ("feature:", key.m_featureId, ", segment:", key.m_segmentIdx, ", point:", + MercatorBounds::ToLatLon(transition.m_frontPoint))); + bool const isForward = transition.m_forwardIsEnter == isEnter; + if (transition.m_oneWay && !isForward) + return nullptr; + + Segment const & segment = + isEnter ? GetEnter(transition.m_enterIdx) : GetExit(transition.m_exitIdx); + CHECK_EQUAL(segment.IsForward(), isForward, ("osmId:", osmId, ", segment:", segment, ", point:", + MercatorBounds::ToLatLon(transition.m_frontPoint))); + return &segment; +} + m2::PointD const & CrossMwmConnector::GetPoint(Segment const & segment, bool front) const { Transition const & transition = GetTransition(segment); diff --git a/routing/cross_mwm_connector.hpp b/routing/cross_mwm_connector.hpp index c1b611ef0c..17c6575026 100644 --- a/routing/cross_mwm_connector.hpp +++ b/routing/cross_mwm_connector.hpp @@ -21,10 +21,14 @@ public: CrossMwmConnector() : m_mwmId(kFakeNumMwmId) {} explicit CrossMwmConnector(NumMwmId mwmId) : m_mwmId(mwmId) {} - void AddTransition(uint32_t featureId, uint32_t segmentIdx, bool oneWay, bool forwardIsEnter, - m2::PointD const & backPoint, m2::PointD const & frontPoint); + void AddTransition(uint64_t osmId, uint32_t featureId, uint32_t segmentIdx, bool oneWay, + bool forwardIsEnter, m2::PointD const & backPoint, + m2::PointD const & frontPoint); bool IsTransition(Segment const & segment, bool isOutgoing) const; + uint64_t GetOsmId(Segment const & segment) const { return GetTransition(segment).m_osmId; } + // returns nullptr if there is no transition for such osm id. + Segment const * GetTransition(uint64_t osmId, bool isOutgoing) const; m2::PointD const & GetPoint(Segment const & segment, bool front) const; void GetEdgeList(Segment const & segment, bool isOutgoing, std::vector & edges) const; @@ -101,10 +105,11 @@ private: { Transition() = default; - Transition(uint32_t enterIdx, uint32_t exitIdx, bool oneWay, bool forwardIsEnter, - m2::PointD const & backPoint, m2::PointD const & frontPoint) + Transition(uint32_t enterIdx, uint32_t exitIdx, uint64_t osmId, bool oneWay, + bool forwardIsEnter, m2::PointD const & backPoint, m2::PointD const & frontPoint) : m_enterIdx(enterIdx) , m_exitIdx(exitIdx) + , m_osmId(osmId) , m_backPoint(backPoint) , m_frontPoint(frontPoint) , m_oneWay(oneWay) @@ -114,6 +119,7 @@ private: uint32_t m_enterIdx = 0; uint32_t m_exitIdx = 0; + uint64_t m_osmId = 0; // Endpoints of transition segment. // m_backPoint = points[segmentIdx] // m_frontPoint = points[segmentIdx + 1] @@ -145,6 +151,7 @@ private: std::vector m_enters; std::vector m_exits; std::unordered_map m_transitions; + std::unordered_map m_osmIdToKey; WeightsLoadState m_weightsLoadState = WeightsLoadState::Unknown; uint64_t m_weightsOffset = 0; Weight m_granularity = 0; diff --git a/routing/cross_mwm_connector_serialization.cpp b/routing/cross_mwm_connector_serialization.cpp index b9a05c517c..4f8f75f785 100644 --- a/routing/cross_mwm_connector_serialization.cpp +++ b/routing/cross_mwm_connector_serialization.cpp @@ -1,5 +1,9 @@ #include "routing/cross_mwm_connector_serialization.hpp" +#include "base/bits.hpp" + +#include + using namespace std; namespace routing @@ -7,15 +11,26 @@ namespace routing // static uint32_t constexpr CrossMwmConnectorSerializer::kLastVersion; +// static +uint32_t CrossMwmConnectorSerializer::CalcBitsPerOsmId(std::vector const & transitions) +{ + uint64_t maxOsmId = 0; + for (Transition const & transition : transitions) + maxOsmId = std::max(maxOsmId, transition.GetOsmId()); + + return bits::NumUsedBits(maxOsmId); +} + // static void CrossMwmConnectorSerializer::WriteTransitions(vector const & transitions, serial::CodingParams const & codingParams, - uint8_t bitsPerMask, vector & buffer) + uint32_t bitsPerOsmId, uint8_t bitsPerMask, + vector & buffer) { MemWriter> memWriter(buffer); for (Transition const & transition : transitions) - transition.Serialize(codingParams, bitsPerMask, memWriter); + transition.Serialize(codingParams, bitsPerOsmId, bitsPerMask, memWriter); } // static diff --git a/routing/cross_mwm_connector_serialization.hpp b/routing/cross_mwm_connector_serialization.hpp index f4ca185a55..934f06d22b 100644 --- a/routing/cross_mwm_connector_serialization.hpp +++ b/routing/cross_mwm_connector_serialization.hpp @@ -32,10 +32,11 @@ public: public: Transition() = default; - Transition(uint32_t featureId, uint32_t segmentIdx, VehicleMask roadMask, + Transition(uint64_t osmId, uint32_t featureId, uint32_t segmentIdx, VehicleMask roadMask, VehicleMask oneWayMask, bool forwardIsEnter, m2::PointD const & backPoint, m2::PointD const & frontPoint) - : m_featureId(featureId) + : m_osmId(osmId) + , m_featureId(featureId) , m_segmentIdx(segmentIdx) , m_backPoint(backPoint) , m_frontPoint(frontPoint) @@ -46,13 +47,14 @@ public: } template - void Serialize(serial::CodingParams const & codingParams, uint8_t bitsPerMask, - Sink & sink) const + void Serialize(serial::CodingParams const & codingParams, uint32_t bitsPerOsmId, + uint8_t bitsPerMask, Sink & sink) const { serial::SavePoint(sink, m_backPoint, codingParams); serial::SavePoint(sink, m_frontPoint, codingParams); BitWriter writer(sink); + writer.WriteAtMost64Bits(m_osmId, bitsPerOsmId); WriteDelta(writer, m_featureId + 1); WriteDelta(writer, m_segmentIdx + 1); writer.WriteAtMost32Bits(base::asserted_cast(m_roadMask), bitsPerMask); @@ -61,12 +63,14 @@ public: } template - void Deserialize(serial::CodingParams const & codingParams, uint8_t bitsPerMask, Source & src) + void Deserialize(serial::CodingParams const & codingParams, uint32_t bitsPerOsmId, + uint8_t bitsPerMask, Source & src) { m_backPoint = serial::LoadPoint(src, codingParams); m_frontPoint = serial::LoadPoint(src, codingParams); BitReader reader(src); + m_osmId = reader.ReadAtMost64Bits(bitsPerOsmId); m_featureId = ReadDelta(reader) - 1; m_segmentIdx = ReadDelta(reader) - 1; m_roadMask = base::asserted_cast(reader.ReadAtMost32Bits(bitsPerMask)); @@ -74,6 +78,7 @@ public: m_forwardIsEnter = reader.Read(1) == 0; } + uint64_t GetOsmId() const { return m_osmId; } uint32_t GetFeatureId() const { return m_featureId; } uint32_t GetSegmentIdx() const { return m_segmentIdx; } m2::PointD const & GetBackPoint() const { return m_backPoint; } @@ -83,6 +88,7 @@ public: VehicleMask GetOneWayMask() const { return m_oneWayMask; } private: + uint64_t m_osmId = 0; uint32_t m_featureId = 0; uint32_t m_segmentIdx = 0; m2::PointD m_backPoint = m2::PointD::Zero(); @@ -99,12 +105,14 @@ public: CrossMwmConnectorPerVehicleType const & connectors, serial::CodingParams const & codingParams, Sink & sink) { + uint32_t const bitsPerOsmId = CalcBitsPerOsmId(transitions); auto const bitsPerMask = GetBitsPerMask(); std::vector transitionsBuf; - WriteTransitions(transitions, codingParams, bitsPerMask, transitionsBuf); + WriteTransitions(transitions, codingParams, bitsPerOsmId, bitsPerMask, transitionsBuf); Header header(base::checked_cast(transitions.size()), - base::checked_cast(transitionsBuf.size()), codingParams, bitsPerMask); + base::checked_cast(transitionsBuf.size()), codingParams, bitsPerOsmId, + bitsPerMask); std::vector> weightBuffers(connectors.size()); for (size_t i = 0; i < connectors.size(); ++i) @@ -144,7 +152,8 @@ public: for (size_t i = 0; i < numTransitions; ++i) { Transition transition; - transition.Deserialize(header.GetCodingParams(), header.GetBitsPerMask(), src); + transition.Deserialize(header.GetCodingParams(), header.GetBitsPerOsmId(), + header.GetBitsPerMask(), src); AddTransition(transition, requiredMask, connector); } @@ -226,9 +235,9 @@ public: return; bool const isOneWay = (transition.GetOneWayMask() & requiredMask) != 0; - connector.AddTransition(transition.GetFeatureId(), transition.GetSegmentIdx(), isOneWay, - transition.ForwardIsEnter(), transition.GetBackPoint(), - transition.GetFrontPoint()); + connector.AddTransition(transition.GetOsmId(), transition.GetFeatureId(), + transition.GetSegmentIdx(), isOneWay, transition.ForwardIsEnter(), + transition.GetBackPoint(), transition.GetFrontPoint()); } private: @@ -291,10 +300,11 @@ private: Header() = default; Header(uint32_t numTransitions, uint64_t sizeTransitions, - serial::CodingParams const & codingParams, uint8_t bitsPerMask) + serial::CodingParams const & codingParams, uint32_t bitsPerOsmId, uint8_t bitsPerMask) : m_numTransitions(numTransitions) , m_sizeTransitions(sizeTransitions) , m_codingParams(codingParams) + , m_bitsPerOsmId(bitsPerOsmId) , m_bitsPerMask(bitsPerMask) { } @@ -307,6 +317,7 @@ private: WriteToSink(sink, m_sizeTransitions); WriteToSink(sink, m_granularity); m_codingParams.Save(sink); + WriteToSink(sink, m_bitsPerOsmId); WriteToSink(sink, m_bitsPerMask); WriteToSink(sink, base::checked_cast(m_sections.size())); @@ -328,6 +339,7 @@ private: m_sizeTransitions = ReadPrimitiveFromSource(src); m_granularity = ReadPrimitiveFromSource(src); m_codingParams.Load(src); + m_bitsPerOsmId = ReadPrimitiveFromSource(src); m_bitsPerMask = ReadPrimitiveFromSource(src); auto const sectionsSize = ReadPrimitiveFromSource(src); @@ -342,6 +354,7 @@ private: uint64_t GetSizeTransitions() const { return m_sizeTransitions; } Weight GetGranularity() const { return m_granularity; } serial::CodingParams const & GetCodingParams() const { return m_codingParams; } + uint8_t GetBitsPerOsmId() const { return m_bitsPerOsmId; } uint8_t GetBitsPerMask() const { return m_bitsPerMask; } std::vector
const & GetSections() const { return m_sections; } @@ -351,10 +364,13 @@ private: uint64_t m_sizeTransitions = 0; Weight m_granularity = kGranularity; serial::CodingParams m_codingParams; + uint32_t m_bitsPerOsmId = 0; uint8_t m_bitsPerMask = 0; std::vector
m_sections; }; + static uint32_t CalcBitsPerOsmId(std::vector const & transitions); + template static T GetBitsPerMask() { @@ -372,8 +388,8 @@ private: } static void WriteTransitions(std::vector const & transitions, - serial::CodingParams const & codingParams, uint8_t bitsPerMask, - std::vector & buffer); + serial::CodingParams const & codingParams, uint32_t bitsPerOsmId, + uint8_t bitsPerMask, std::vector & buffer); static void WriteWeights(std::vector const & weights, std::vector & buffer); }; diff --git a/routing/routing_tests/cross_mwm_connector_test.cpp b/routing/routing_tests/cross_mwm_connector_test.cpp index 54404fe997..4260c49e3c 100644 --- a/routing/routing_tests/cross_mwm_connector_test.cpp +++ b/routing/routing_tests/cross_mwm_connector_test.cpp @@ -39,10 +39,11 @@ namespace routing_test { UNIT_TEST(OneWayEnter) { + uint64_t constexpr osmId = 1; uint32_t constexpr featureId = 1; uint32_t constexpr segmentIdx = 1; CrossMwmConnector connector(mwmId); - connector.AddTransition(featureId, segmentIdx, true /* oneWay */, true /* forwardIsEnter */, + connector.AddTransition(osmId, featureId, segmentIdx, true /* oneWay */, true /* forwardIsEnter */, {} /* backPoint */, {} /* frontPoint */); TestConnectorConsistency(connector); @@ -64,10 +65,11 @@ UNIT_TEST(OneWayEnter) UNIT_TEST(OneWayExit) { + uint64_t constexpr osmId = 1; uint32_t constexpr featureId = 1; uint32_t constexpr segmentIdx = 1; CrossMwmConnector connector(mwmId); - connector.AddTransition(featureId, segmentIdx, true /* oneWay */, false /* forwardIsEnter */, + connector.AddTransition(osmId, featureId, segmentIdx, true /* oneWay */, false /* forwardIsEnter */, {} /* backPoint */, {} /* frontPoint */); TestConnectorConsistency(connector); @@ -89,10 +91,11 @@ UNIT_TEST(OneWayExit) UNIT_TEST(TwoWayEnter) { + uint64_t constexpr osmId = 1; uint32_t constexpr featureId = 1; uint32_t constexpr segmentIdx = 1; CrossMwmConnector connector(mwmId); - connector.AddTransition(featureId, segmentIdx, false /* oneWay */, true /* forwardIsEnter */, + connector.AddTransition(osmId, featureId, segmentIdx, false /* oneWay */, true /* forwardIsEnter */, {} /* backPoint */, {} /* frontPoint */); TestConnectorConsistency(connector); @@ -114,10 +117,11 @@ UNIT_TEST(TwoWayEnter) UNIT_TEST(TwoWayExit) { + uint64_t constexpr osmId = 1; uint32_t constexpr featureId = 1; uint32_t constexpr segmentIdx = 1; CrossMwmConnector connector(mwmId); - connector.AddTransition(featureId, segmentIdx, false /* oneWay */, false /* forwardIsEnter */, + connector.AddTransition(osmId, featureId, segmentIdx, false /* oneWay */, false /* forwardIsEnter */, {} /* backPoint */, {} /* frontPoint */); TestConnectorConsistency(connector); @@ -144,10 +148,10 @@ UNIT_TEST(Serialization) vector buffer; { vector transitions = { - /* featureId, segmentIdx, roadMask, oneWayMask, forwardIsEnter, backPoint, frontPoint */ - {10, 1, kCarMask, kCarMask, true, m2::PointD(1.1, 1.2), m2::PointD(1.3, 1.4)}, - {20, 2, kCarMask, 0, true, m2::PointD(2.1, 2.2), m2::PointD(2.3, 2.4)}, - {30, 3, kPedestrianMask, kCarMask, true, m2::PointD(3.1, 3.2), m2::PointD(3.3, 3.4)}}; + /* osmId featureId, segmentIdx, roadMask, oneWayMask, forwardIsEnter, backPoint, frontPoint */ + {100, 10, 1, kCarMask, kCarMask, true, m2::PointD(1.1, 1.2), m2::PointD(1.3, 1.4)}, + {200, 20, 2, kCarMask, 0, true, m2::PointD(2.1, 2.2), m2::PointD(2.3, 2.4)}, + {300, 30, 3, kPedestrianMask, kCarMask, true, m2::PointD(3.1, 3.2), m2::PointD(3.3, 3.4)}}; CrossMwmConnectorPerVehicleType connectors; CrossMwmConnector & carConnector = connectors[static_cast(VehicleType::Car)]; @@ -250,7 +254,8 @@ UNIT_TEST(WeightsSerialization) vector transitions; for (uint32_t featureId = 0; featureId < kNumTransitions; ++featureId) { - transitions.emplace_back(featureId, 1 /* segmentIdx */, kCarMask, 0 /* oneWayMask */, + auto const osmId = static_cast(featureId * 10); + transitions.emplace_back(osmId, featureId, 1 /* segmentIdx */, kCarMask, 0 /* oneWayMask */, true /* forwardIsEnter */, m2::PointD::Zero(), m2::PointD::Zero()); }