diff --git a/generator/transit_generator.cpp b/generator/transit_generator.cpp index c0a4aaeb28..dd7b26cbef 100644 --- a/generator/transit_generator.cpp +++ b/generator/transit_generator.cpp @@ -210,6 +210,23 @@ void DeserializerFromJson::operator()(m2::PointD & p, char const * name) FromJSONObject(pointItem, "x", p.x); FromJSONObject(pointItem, "y", p.y); } + +void DeserializerFromJson::operator()(OsmId & osmId, char const * name) +{ + // Conversion osm id to feature id. + std::string osmIdStr; + GetField(osmIdStr, name); + CHECK(strings::is_number(osmIdStr), ()); + uint64_t osmIdNum; + CHECK(strings::to_uint64(osmIdStr.c_str(), osmIdNum), ()); + osm::Id const id(osmIdNum); + auto const it = m_osmIdToFeatureIds->find(id); + CHECK(it != m_osmIdToFeatureIds->cend(), ()); + CHECK_EQUAL(it->second.size(), 1, + ("Osm id:", id, "from transit graph doesn't present by a single feature in mwm.")); + osmId = OsmId(it->second[0]); +} + DeserializerFromJson::DeserializerFromJson(json_struct_t * node, shared_ptr const & osmIdToFeatureIds) : m_node(node), m_osmIdToFeatureIds(osmIdToFeatureIds) diff --git a/generator/transit_generator.hpp b/generator/transit_generator.hpp index 48e3771aef..a9aefaec09 100644 --- a/generator/transit_generator.hpp +++ b/generator/transit_generator.hpp @@ -34,28 +34,13 @@ public: typename std::enable_if::value || std::is_enum::value || std::is_same::value>::type operator()(T & t, char const * name = nullptr) { - if (name == nullptr || strcmp(name, "osm_id") != 0) - { - GetField(t, name); - return; - } - - // Conversion osm id to feature id. - std::string osmIdStr; - GetField(osmIdStr, name); - CHECK(strings::is_number(osmIdStr), ()); - uint64_t osmIdNum; - CHECK(strings::to_uint64(osmIdStr.c_str(), osmIdNum), ()); - osm::Id const osmId(osmIdNum); - auto const it = m_osmIdToFeatureIds->find(osm::Id(osmIdNum)); - CHECK(it != m_osmIdToFeatureIds->cend(), ()); - CHECK_EQUAL(it->second.size(), 1, - ("Osm id:", osmId, "from transit graph doesn't present by a single feature in mwm.")); - t = static_cast(it->second[0]); + GetField(t, name); + return; } void operator()(std::string & s, char const * name = nullptr) { GetField(s, name); } void operator()(m2::PointD & p, char const * name = nullptr); + void operator()(OsmId & osmId, char const * name = nullptr); template void operator()(std::vector & vs, char const * name = nullptr) diff --git a/routing_common/transit_types.cpp b/routing_common/transit_types.cpp index 169d3fc1bc..500d19ec32 100644 --- a/routing_common/transit_types.cpp +++ b/routing_common/transit_types.cpp @@ -84,7 +84,7 @@ Stop::Stop(StopId id, FeatureId featureId, TransferId transferId, std::vector const & lineIds, m2::PointD const & point, std::vector const & titleAnchors) : m_id(id) - , m_featureId(featureId) + , m_osmId(featureId) , m_transferId(transferId) , m_lineIds(lineIds) , m_point(point) @@ -95,7 +95,7 @@ Stop::Stop(StopId id, FeatureId featureId, TransferId transferId, bool Stop::IsEqualForTesting(Stop const & stop) const { double constexpr kPointsEqualEpsilon = 1e-6; - return m_id == stop.m_id && m_featureId == stop.m_featureId && + return m_id == stop.m_id && m_osmId == stop.m_osmId && m_transferId == stop.m_transferId && m_lineIds == stop.m_lineIds && my::AlmostEqualAbs(m_point, stop.m_point, kPointsEqualEpsilon) && m_titleAnchors == stop.m_titleAnchors; @@ -125,7 +125,7 @@ bool SingleMwmSegment::IsValid() const // Gate ------------------------------------------------------------------------------------------- Gate::Gate(FeatureId featureId, bool entrance, bool exit, double weight, std::vector const & stopIds, m2::PointD const & point) - : m_featureId(featureId) + : m_osmId(featureId) , m_entrance(entrance) , m_exit(exit) , m_weight(weight) @@ -136,7 +136,7 @@ Gate::Gate(FeatureId featureId, bool entrance, bool exit, double weight, bool Gate::IsEqualForTesting(Gate const & gate) const { - return m_featureId == gate.m_featureId && m_entrance == gate.m_entrance && + return m_osmId == gate.m_osmId && m_entrance == gate.m_entrance && m_exit == gate.m_exit && my::AlmostEqualAbs(m_weight, gate.m_weight, kWeightEqualEpsilon) && m_stopIds == gate.m_stopIds && diff --git a/routing_common/transit_types.hpp b/routing_common/transit_types.hpp index 965f5cc7f3..f24d7439a4 100644 --- a/routing_common/transit_types.hpp +++ b/routing_common/transit_types.hpp @@ -78,6 +78,26 @@ public: static_assert(sizeof(TransitHeader) == 32, "Wrong header size of transit section."); +class OsmId +{ +public: + OsmId() = default; + explicit OsmId(FeatureId featureId) : m_featureId(featureId) {} + + bool operator==(OsmId const & rhs) const { return m_featureId == rhs.m_featureId; } + bool IsEqualForTesting(OsmId const & osmId) const { return *this == osmId; } + bool IsValid() const { return m_featureId != kInvalidFeatureId; } + + FeatureId GetFeatureId() const { return m_featureId; } + +private: + DECLARE_TRANSIT_TYPE_FRIENDS + DECLARE_VISITOR_AND_DEBUG_PRINT(OsmId, visitor(m_featureId, "feature_id")) + + // |m_featureId| is a feature id corresponding to osm id which presents the class. + FeatureId m_featureId = kInvalidFeatureId; +}; + class TitleAnchor { public: @@ -111,7 +131,7 @@ public: bool IsValid() const; StopId GetId() const { return m_id; } - FeatureId GetFeatureId() const { return m_featureId; } + FeatureId GetFeatureId() const { return m_osmId.GetFeatureId(); } TransferId GetTransferId() const { return m_transferId; } std::vector const & GetLineIds() const { return m_lineIds; } m2::PointD const & GetPoint() const { return m_point; } @@ -119,13 +139,13 @@ public: private: DECLARE_TRANSIT_TYPE_FRIENDS - DECLARE_VISITOR_AND_DEBUG_PRINT(Stop, visitor(m_id, "id"), visitor(m_featureId, "osm_id"), + DECLARE_VISITOR_AND_DEBUG_PRINT(Stop, visitor(m_id, "id"), visitor(m_osmId, "osm_id"), visitor(m_transferId, "transfer_id"), visitor(m_lineIds, "line_ids"), visitor(m_point, "point"), visitor(m_titleAnchors, "title_anchors")) StopId m_id = kInvalidStopId; - FeatureId m_featureId = kInvalidFeatureId; + OsmId m_osmId; TransferId m_transferId = kInvalidTransferId; std::vector m_lineIds; m2::PointD m_point; @@ -165,7 +185,7 @@ public: bool IsValid() const; void SetBestPedestrianSegment(SingleMwmSegment const & s) { m_bestPedestrianSegment = s; }; - FeatureId GetFeatureId() const { return m_featureId; } + FeatureId GetFeatureId() const { return m_osmId.GetFeatureId(); } SingleMwmSegment const & GetBestPedestrianSegment() const { return m_bestPedestrianSegment; } bool GetEntrance() const { return m_entrance; } bool GetExit() const { return m_exit; } @@ -175,14 +195,14 @@ public: private: DECLARE_TRANSIT_TYPE_FRIENDS - DECLARE_VISITOR_AND_DEBUG_PRINT(Gate, visitor(m_featureId, "osm_id"), + DECLARE_VISITOR_AND_DEBUG_PRINT(Gate, visitor(m_osmId, "osm_id"), visitor(m_bestPedestrianSegment, "best_pedestrian_segment"), visitor(m_entrance, "entrance"), visitor(m_exit, "exit"), visitor(m_weight, "weight"), visitor(m_stopIds, "stop_ids"), visitor(m_point, "point")) - // |m_featureId| is feature id of a point feature which represents gates. - FeatureId m_featureId = kInvalidFeatureId; + // |m_osmId| contains feature id of a feature which represents gates. Usually it's a point feature. + OsmId m_osmId; // |m_bestPedestrianSegment| is a segment which can be used for pedestrian routing to leave and enter the gate. // The segment may be invalid because of map date. If so there's no pedestrian segment which can be used // to reach the gate.