diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2017-10-27 09:31:03 +0300 |
---|---|---|
committer | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2017-10-27 16:04:18 +0300 |
commit | a5dec24c5262c806d48f103daf9f76e8fa85b061 (patch) | |
tree | c77e46daa202a596428142b8ba33f2bdf89752cd | |
parent | 500cefe59f84c34318852ac031b46a9a410843db (diff) |
Any class from transit types may be present as json dictionary (object).
-rw-r--r-- | generator/transit_generator.cpp | 19 | ||||
-rw-r--r-- | generator/transit_generator.hpp | 27 |
2 files changed, 23 insertions, 23 deletions
diff --git a/generator/transit_generator.cpp b/generator/transit_generator.cpp index a7ab686d63..130c6be904 100644 --- a/generator/transit_generator.cpp +++ b/generator/transit_generator.cpp @@ -189,12 +189,17 @@ DeserializerFromJson::DeserializerFromJson(json_struct_t* node, void DeserializerFromJson::operator()(m2::PointD & p, char const * name) { - GetTwoParamDict(name, "x", "y", p.x, p.y); -} - -void DeserializerFromJson::operator()(ShapeId & id, char const * name) -{ - GetTwoParamDict(name, "stop1_id", "stop2_id", id.m_stop1Id, id.m_stop2Id); + // @todo(bykoianko) Instead of having a special operator() method for m2::PointD class it's necessary to + // add Point class to transit_types.hpp and process it in DeserializerFromJson with regular method. + json_t * item = nullptr; + if (name == nullptr) + item = m_node; // Array item case + else + item = my::GetJSONObligatoryField(m_node, name); + + CHECK(json_is_object(item), ()); + FromJSONObject(item, "x", p.x); + FromJSONObject(item, "y", p.y); } void DeserializerFromJson::operator()(FeatureIdentifiers & id, char const * name) @@ -207,7 +212,7 @@ void DeserializerFromJson::operator()(FeatureIdentifiers & id, char const * name CHECK(strings::to_uint64(osmIdStr, osmIdNum), ()); osm::Id const osmId(osmIdNum); auto const it = m_osmIdToFeatureIds.find(osmId); - CHECK(it != m_osmIdToFeatureIds.cend(), ()); + CHECK(it != m_osmIdToFeatureIds.cend(), ("osm id:", osmId.EncodedId(), "size of m_osmIdToFeatureIds:", m_osmIdToFeatureIds.size())); CHECK_EQUAL(it->second.size(), 1, ("Osm id:", osmId, "from transit graph doesn't present by a single feature in mwm.")); id.SetFeatureId(it->second[0]); diff --git a/generator/transit_generator.hpp b/generator/transit_generator.hpp index ca57bf3ec7..686f6b690d 100644 --- a/generator/transit_generator.hpp +++ b/generator/transit_generator.hpp @@ -38,7 +38,6 @@ public: void operator()(std::string & s, char const * name = nullptr) { GetField(s, name); } void operator()(m2::PointD & p, char const * name = nullptr); - void operator()(ShapeId & id, char const * name = nullptr); void operator()(FeatureIdentifiers & id, char const * name = nullptr); void operator()(StopIdRanges & rs, char const * name = nullptr); @@ -63,26 +62,22 @@ public: template<typename T> typename std::enable_if<std::is_class<T>::value>::type operator()(T & t, char const * name = nullptr) { + if (name != nullptr && json_is_object(m_node)) + { + json_t * dictNode = my::GetJSONOptionalField(m_node, name); + if (dictNode == nullptr) + return; // No the node in json. + + DeserializerFromJson dict(dictNode, m_osmIdToFeatureIds); + t.Visit(dict); + return; + } + t.Visit(*this); } private: template <typename T> - void GetTwoParamDict(char const * dictName, std::string const & paramName1, - std::string const & paramName2, T & val1, T & val2) - { - json_t * item = nullptr; - if (dictName == nullptr) - item = m_node; // Array item case - else - item = my::GetJSONObligatoryField(m_node, dictName); - - CHECK(json_is_object(item), ()); - FromJSONObject(item, paramName1, val1); - FromJSONObject(item, paramName2, val2); - } - - template <typename T> void GetField(T & t, char const * name = nullptr) { if (name == nullptr) |