Passing OsmIdToFeatureIdsMap by const ref.

This commit is contained in:
Vladimir Byko-Ianko 2017-10-19 14:18:49 +03:00 committed by Tatiana Yan
parent 163fb8b2f6
commit c67098ae70
3 changed files with 28 additions and 36 deletions

View file

@ -17,7 +17,7 @@ using namespace std;
namespace
{
template <typename Obj>
void TestDeserializerFromJson(string const & jsonBuffer, shared_ptr<OsmIdToFeatureIdsMap> const & osmIdToFeatureIds,
void TestDeserializerFromJson(string const & jsonBuffer, OsmIdToFeatureIdsMap const & osmIdToFeatureIds,
string const & name, vector<Obj> const & expected)
{
my::Json root(jsonBuffer.c_str());
@ -44,7 +44,7 @@ UNIT_TEST(DeserializerFromJson_TitleAnchors)
vector<TitleAnchor> expected = {TitleAnchor(11 /* min zoom */, 4 /* anchor */),
TitleAnchor(14 /* min zoom */, 6 /* anchor */)};
TestDeserializerFromJson(jsonBuffer, make_shared<OsmIdToFeatureIdsMap>(), "title_anchors", expected);
TestDeserializerFromJson(jsonBuffer, OsmIdToFeatureIdsMap(), "title_anchors", expected);
}
UNIT_TEST(DeserializerFromJson_Stops)
@ -90,9 +90,9 @@ UNIT_TEST(DeserializerFromJson_Stops)
{19213568, 19213569} /* lineIds */, {27.5227942, 64.25206634443111} /* point */,
{TitleAnchor(12 /* min zoom */, 0 /* anchor */), TitleAnchor(15, 9)})};
auto mapping = make_shared<OsmIdToFeatureIdsMap>();
(*mapping)[osm::Id(1234)] = vector<FeatureId>({1});
(*mapping)[osm::Id(2345)] = vector<FeatureId>({2});
OsmIdToFeatureIdsMap mapping;
mapping[osm::Id(1234)] = vector<FeatureId>({1});
mapping[osm::Id(2345)] = vector<FeatureId>({2});
TestDeserializerFromJson(jsonBuffer, mapping, "stops", expected);
}
@ -131,10 +131,10 @@ UNIT_TEST(DeserializerFromJson_Gates)
Gate(2 /* feature id */, true /* entrance */, true /* exit */, 60.0 /* weight */,
{442018465} /* stop ids */, {43.9290544, 68.41120791512581} /* point */)};
auto mapping = make_shared<OsmIdToFeatureIdsMap>();
(*mapping)[osm::Id(46116860)] = vector<FeatureId>({0});
OsmIdToFeatureIdsMap mapping;
mapping[osm::Id(46116860)] = vector<FeatureId>({0});
// Note. std::numeric_limits<uint64_t>::max() == 18446744073709551615
(*mapping)[osm::Id(18446744073709551615U)] = vector<FeatureId>({2});
mapping[osm::Id(18446744073709551615U)] = vector<FeatureId>({2});
TestDeserializerFromJson(jsonBuffer, mapping, "gates", expected);
}
@ -166,7 +166,7 @@ UNIT_TEST(DeserializerFromJson_Edges)
Edge(442018445 /* stop 1 id */, 442018446 /* stop 2 id */, 345.6 /* weight */,
72551680 /* line id */, false /* transfer */, {} /* shape ids */)};
TestDeserializerFromJson(jsonBuffer, make_shared<OsmIdToFeatureIdsMap>(), "edges", expected);
TestDeserializerFromJson(jsonBuffer, OsmIdToFeatureIdsMap(), "edges", expected);
}
UNIT_TEST(DeserializerFromJson_Transfers)
@ -191,7 +191,7 @@ UNIT_TEST(DeserializerFromJson_Transfers)
Transfer(922337203 /* stop id */, {27.5619844, 64.24325959173672} /* point */,
{209186416, 277039518} /* stopIds */, {} /* anchors */)};
TestDeserializerFromJson(jsonBuffer, make_shared<OsmIdToFeatureIdsMap>(), "transfers", expected);
TestDeserializerFromJson(jsonBuffer, OsmIdToFeatureIdsMap(), "transfers", expected);
}
UNIT_TEST(DeserializerFromJson_Lines)
@ -239,7 +239,7 @@ UNIT_TEST(DeserializerFromJson_Lines)
{246659391, 246659390, 209191855, 209191854, 209191853,
209191852, 209191851} /* stop ids */)};
TestDeserializerFromJson(jsonBuffer, make_shared<OsmIdToFeatureIdsMap>(), "lines", expected);
TestDeserializerFromJson(jsonBuffer, OsmIdToFeatureIdsMap(), "lines", expected);
}
UNIT_TEST(DeserializerFromJson_Shapes)
@ -296,7 +296,7 @@ UNIT_TEST(DeserializerFromJson_Shapes)
{m2::PointD(27.554025800000002, 64.250591911669844),
m2::PointD(27.553906184631536, 64.250633404586054)} /* polyline */)};
TestDeserializerFromJson(jsonBuffer, make_shared<OsmIdToFeatureIdsMap>(), "shapes", expected);
TestDeserializerFromJson(jsonBuffer, OsmIdToFeatureIdsMap(), "shapes", expected);
}
UNIT_TEST(DeserializerFromJson_Networks)
@ -311,6 +311,6 @@ UNIT_TEST(DeserializerFromJson_Networks)
]})";
vector<Network> const expected = {Network(2 /* network id */, "Минский метрополитен" /* title */)};
TestDeserializerFromJson(jsonBuffer, make_shared<OsmIdToFeatureIdsMap>(), "networks", expected);
TestDeserializerFromJson(jsonBuffer, OsmIdToFeatureIdsMap(), "networks", expected);
}
} // namespace

View file

@ -85,7 +85,7 @@ string GetFileName(string const & filePath)
template <class Item>
void DeserializeFromJson(my::Json const & root, string const & key,
shared_ptr<OsmIdToFeatureIdsMap> const & osmIdToFeatureIdsMap, vector<Item> & items)
OsmIdToFeatureIdsMap const & osmIdToFeatureIdsMap, vector<Item> & items)
{
items.clear();
DeserializerFromJson deserializer(root.get(), osmIdToFeatureIdsMap);
@ -93,7 +93,7 @@ void DeserializeFromJson(my::Json const & root, string const & key,
}
void DeserializeGatesFromJson(my::Json const & root, string const & mwmDir, string const & countryId,
shared_ptr<OsmIdToFeatureIdsMap> const & osmIdToFeatureIdsMap, vector<Gate> & gates)
OsmIdToFeatureIdsMap const & osmIdToFeatureIdsMap, vector<Gate> & gates)
{
DeserializeFromJson(root, "gates", osmIdToFeatureIdsMap, gates);
@ -157,7 +157,7 @@ bool IsValid(vector<Item> const & items)
/// \brief Reads from |root| (json) and serializes an array to |serializer|.
template <class Item>
void SerializeObject(my::Json const & root, string const & key,
shared_ptr<OsmIdToFeatureIdsMap> const & osmIdToFeatureIdsMap, Serializer<FileWriter> & serializer)
OsmIdToFeatureIdsMap const & osmIdToFeatureIdsMap, Serializer<FileWriter> & serializer)
{
vector<Item> items;
DeserializeFromJson(root, key, osmIdToFeatureIdsMap, items);
@ -198,6 +198,12 @@ namespace routing
namespace transit
{
// DeserializerFromJson ---------------------------------------------------------------------------
DeserializerFromJson::DeserializerFromJson(json_struct_t* node,
OsmIdToFeatureIdsMap const & osmIdToFeatureIds)
: m_node(node), m_osmIdToFeatureIds(osmIdToFeatureIds)
{
}
void DeserializerFromJson::operator()(m2::PointD & p, char const * name)
{
json_t * pointItem = nullptr;
@ -220,20 +226,13 @@ void DeserializerFromJson::operator()(OsmId & osmId, char const * name)
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(), ());
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<OsmIdToFeatureIdsMap> const & osmIdToFeatureIds)
: m_node(node), m_osmIdToFeatureIds(osmIdToFeatureIds)
{
CHECK(m_osmIdToFeatureIds, ());
}
void BuildTransit(string const & mwmPath, string const & osmIdsToFeatureIdPath,
string const & transitDir)
{
@ -268,17 +267,11 @@ void BuildTransit(string const & mwmPath, string const & osmIdsToFeatureIdPath,
LOG(LCRITICAL, ("Can't open", graphFullPath, ex.what()));
}
// @TODO(bykoianko) If it's necessary to parse an integer jansson parser keeps it in long long value.
// It's not good because osm id and stop id are uint64_t. This should be solved before continue writing
// transit jansson parsing. According to C++ signed long long is not smaller than long and is at least 64 bits.
// So as a variant before saving to json osm id and stop id should be converted to signed long long and
// then after reading at generator they should be converted back.
// @TODO(bykoianko) |osmId| should be converted to feature id while deserialing from json.
my::Json root(jsonBuffer.c_str());
CHECK(root.get() != nullptr, ("Cannot parse the json file:", graphFullPath));
auto mapping = make_shared<OsmIdToFeatureIdsMap>();
FillOsmIdToFeatureIdMap(osmIdsToFeatureIdPath, *mapping);
OsmIdToFeatureIdsMap mapping;
FillOsmIdToFeatureIdMap(osmIdsToFeatureIdPath, mapping);
// Note. |gates| has to be deserialized from json before starting writing transit section to mwm since
// the mwm is used to filled |gates|.

View file

@ -14,7 +14,6 @@
#include <cstdint>
#include <cstring>
#include <map>
#include <memory>
#include <string>
#include <type_traits>
#include <vector>
@ -28,7 +27,7 @@ using OsmIdToFeatureIdsMap = std::map<osm::Id, std::vector<FeatureId>>;
class DeserializerFromJson
{
public:
DeserializerFromJson(json_struct_t* node, std::shared_ptr<OsmIdToFeatureIdsMap> const & osmIdToFeatureIds);
DeserializerFromJson(json_struct_t* node, OsmIdToFeatureIdsMap const & osmIdToFeatureIds);
template<typename T>
typename std::enable_if<std::is_integral<T>::value || std::is_enum<T>::value || std::is_same<T, double>::value>::type
@ -89,7 +88,7 @@ private:
}
json_struct_t * m_node;
std::shared_ptr<OsmIdToFeatureIdsMap> m_osmIdToFeatureIds;
OsmIdToFeatureIdsMap const & m_osmIdToFeatureIds;
};
/// \brief Builds the transit section in the mwm.