[generator] Optimize preprocessor stage: move osm element fields for intermediate data

This commit is contained in:
Anatoly Serdtcev 2019-10-30 14:40:31 +03:00 committed by Sergey Yershov
parent d906330912
commit eefe68e58e
4 changed files with 40 additions and 38 deletions

View file

@ -30,7 +30,7 @@ using namespace generator;
using namespace std;
using namespace std::literals;
using OsmFormatParser = std::function<void(SourceReader &, function<void(OsmElement *)>)>;
using OsmFormatParser = std::function<void(SourceReader &, function<void(OsmElement &&)>)>;
UNIT_TEST(Intermediate_Data_empty_way_element_save_load_test)
{
@ -130,10 +130,10 @@ std::vector<OsmElement> ReadOsmElements(
auto stream = std::fstream{filename};
SourceReader reader(stream);
parser(reader, [&elements, type](OsmElement * e)
parser(reader, [&elements, type](OsmElement && e)
{
if (e->m_type == type)
elements.push_back(*e);
if (e.m_type == type)
elements.push_back(std::move(e));
});
return elements;

View file

@ -19,9 +19,9 @@ UNIT_TEST(Source_To_Element_create_from_xml_test)
SourceReader reader(ss);
std::vector<OsmElement> elements;
ProcessOsmElementsFromXML(reader, [&elements](OsmElement * e)
ProcessOsmElementsFromXML(reader, [&elements](OsmElement && e)
{
elements.push_back(*e);
elements.push_back(std::move(e));
});
TEST_EQUAL(elements.size(), 10, (elements));
@ -34,9 +34,9 @@ UNIT_TEST(Source_To_Element_create_from_o5m_test)
SourceReader reader(ss);
std::vector<OsmElement> elements;
ProcessOsmElementsFromO5M(reader, [&elements](OsmElement * e)
ProcessOsmElementsFromO5M(reader, [&elements](OsmElement && e)
{
elements.push_back(*e);
elements.push_back(std::move(e));
});
TEST_EQUAL(elements.size(), 11, (elements));
@ -49,9 +49,9 @@ UNIT_TEST(Source_To_Element_check_equivalence)
SourceReader readerXML(ss1);
std::vector<OsmElement> elementsXML;
ProcessOsmElementsFromXML(readerXML, [&elementsXML](OsmElement * e)
ProcessOsmElementsFromXML(readerXML, [&elementsXML](OsmElement && e)
{
elementsXML.push_back(*e);
elementsXML.push_back(std::move(e));
});
std::string src(std::begin(relation_o5m_data), std::end(relation_o5m_data));
@ -59,9 +59,9 @@ UNIT_TEST(Source_To_Element_check_equivalence)
SourceReader readerO5M(ss2);
std::vector<OsmElement> elementsO5M;
ProcessOsmElementsFromO5M(readerO5M, [&elementsO5M](OsmElement * e)
ProcessOsmElementsFromO5M(readerO5M, [&elementsO5M](OsmElement && e)
{
elementsO5M.push_back(*e);
elementsO5M.push_back(std::move(e));
});
TEST_EQUAL(elementsXML.size(), elementsO5M.size(), ());

View file

@ -49,29 +49,29 @@ uint64_t SourceReader::Read(char * buffer, uint64_t bufferSize)
// Functions ---------------------------------------------------------------------------------------
void BuildIntermediateNode(OsmElement const & element, NodeElement & node)
void BuildIntermediateNode(OsmElement && element, NodeElement & node)
{
auto position = MercatorBounds::FromLatLon(element.m_lat, element.m_lon);
node = {element.m_id, position.y, position.x};
}
bool BuildIntermediateWay(OsmElement const & element, WayElement & way)
bool BuildIntermediateWay(OsmElement && element, WayElement & way)
{
way.m_wayOsmId = element.m_id;
way.nodes = element.Nodes();
way.nodes = std::move(element.Nodes());
return way.IsValid();
}
bool BuildIntermediateRelation(OsmElement const & element, RelationElement & relation)
bool BuildIntermediateRelation(OsmElement && element, RelationElement & relation)
{
for (auto const & member : element.Members())
for (auto & member : element.Members())
{
switch (member.m_type) {
case OsmElement::EntityType::Node:
relation.nodes.emplace_back(member.m_ref, string(member.m_role));
relation.nodes.emplace_back(member.m_ref, std::move(member.m_role));
break;
case OsmElement::EntityType::Way:
relation.ways.emplace_back(member.m_ref, string(member.m_role));
relation.ways.emplace_back(member.m_ref, std::move(member.m_role));
break;
case OsmElement::EntityType::Relation:
// we just ignore type == "relation"
@ -81,37 +81,39 @@ bool BuildIntermediateRelation(OsmElement const & element, RelationElement & rel
}
}
for (auto const & tag : element.Tags())
relation.tags.emplace(tag.m_key, tag.m_value);
for (auto & tag : element.Tags())
relation.tags.emplace(std::move(tag.m_key), std::move(tag.m_value));
return relation.IsValid();
}
void AddElementToCache(cache::IntermediateDataWriter & cache, OsmElement & element)
void AddElementToCache(cache::IntermediateDataWriter & cache, OsmElement && element)
{
switch (element.m_type)
{
case OsmElement::EntityType::Node:
{
NodeElement node;
BuildIntermediateNode(element, node);
BuildIntermediateNode(std::move(element), node);
cache.AddNode(node.m_nodeOsmId, node.m_lat, node.m_lon);
break;
}
case OsmElement::EntityType::Way:
{
// Store way.
WayElement way(element.m_id);
if (BuildIntermediateWay(element, way))
cache.AddWay(element.m_id, way);
auto const id = element.m_id;
WayElement way(id);
if (BuildIntermediateWay(std::move(element), way))
cache.AddWay(id, way);
break;
}
case OsmElement::EntityType::Relation:
{
// store relation
auto const id = element.m_id;
RelationElement relation;
if (BuildIntermediateRelation(element, relation))
cache.AddRelation(element.m_id, relation);
if (BuildIntermediateRelation(std::move(element), relation))
cache.AddRelation(id, relation);
break;
}
default:
@ -127,7 +129,7 @@ void BuildIntermediateDataFromXML(SourceReader & stream, cache::IntermediateData
while (processorOsmElementsFromXml.TryRead(element))
{
towns.CheckElement(element);
AddElementToCache(cache, element);
AddElementToCache(cache, std::move(element));
}
}
@ -138,20 +140,20 @@ void BuildIntermediateDataFromXML(
BuildIntermediateDataFromXML(reader, cache, towns);
}
void ProcessOsmElementsFromXML(SourceReader & stream, function<void(OsmElement *)> processor)
void ProcessOsmElementsFromXML(SourceReader & stream, function<void(OsmElement &&)> processor)
{
ProcessorOsmElementsFromXml processorOsmElementsFromXml(stream);
OsmElement element;
while (processorOsmElementsFromXml.TryRead(element))
processor(&element);
processor(std::move(element));
}
void BuildIntermediateDataFromO5M(SourceReader & stream, cache::IntermediateDataWriter & cache,
TownsDumper & towns)
{
auto processor = [&](OsmElement * element) {
towns.CheckElement(*element);
AddElementToCache(cache, *element);
auto processor = [&](OsmElement && element) {
towns.CheckElement(element);
AddElementToCache(cache, std::move(element));
};
// Use only this function here, look into ProcessOsmElementsFromO5M
@ -177,13 +179,13 @@ void BuildIntermediateDataFromO5M(
BuildIntermediateDataFromO5M(reader, cache, towns);
}
void ProcessOsmElementsFromO5M(SourceReader & stream, function<void(OsmElement *)> processor)
void ProcessOsmElementsFromO5M(SourceReader & stream, function<void(OsmElement &&)> processor)
{
ProcessorOsmElementsFromO5M processorOsmElementsFromO5M(stream);
OsmElement element;
while (processorOsmElementsFromO5M.TryRead(element))
processor(&element);
processor(std::move(element));
}
ProcessorOsmElementsFromO5M::ProcessorOsmElementsFromO5M(SourceReader & stream)

View file

@ -45,8 +45,8 @@ public:
bool GenerateIntermediateData(feature::GenerateInfo & info);
void ProcessOsmElementsFromO5M(SourceReader & stream, std::function<void(OsmElement *)> processor);
void ProcessOsmElementsFromXML(SourceReader & stream, std::function<void(OsmElement *)> processor);
void ProcessOsmElementsFromO5M(SourceReader & stream, std::function<void(OsmElement &&)> processor);
void ProcessOsmElementsFromXML(SourceReader & stream, std::function<void(OsmElement &&)> processor);
class ProcessorOsmElementsInterface
{