forked from organicmaps/organicmaps
Any class from transit types may be present as json dictionary (object).
This commit is contained in:
parent
500cefe59f
commit
a5dec24c52
2 changed files with 22 additions and 22 deletions
|
@ -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]);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue