Any class from transit types may be present as json dictionary (object).

This commit is contained in:
Vladimir Byko-Ianko 2017-10-27 09:31:03 +03:00 committed by Daria Volvenkova
parent 500cefe59f
commit a5dec24c52
2 changed files with 22 additions and 22 deletions

View file

@ -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);
}
// @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);
void DeserializerFromJson::operator()(ShapeId & id, char const * name)
{
GetTwoParamDict(name, "stop1_id", "stop2_id", id.m_stop1Id, id.m_stop2Id);
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]);

View file

@ -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,25 +62,21 @@ 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)
{