diff --git a/generator/osm_source.cpp b/generator/osm_source.cpp index 03371b029f..d9e43bec2f 100644 --- a/generator/osm_source.cpp +++ b/generator/osm_source.cpp @@ -256,7 +256,7 @@ public: } }; -class MainFeaturesEmitter +class MainFeaturesEmitter : public EmitterBase { using TWorldGenerator = WorldMapGenerator; using TCountriesGenerator = CountryMapGenerator>; @@ -324,7 +324,7 @@ public: m_world.reset(new TWorldGenerator(info)); } - void operator()(FeatureBuilder1 & fb) + void operator()(FeatureBuilder1 & fb) override { static uint32_t const placeType = classif().GetTypeByPath({"place"}); uint32_t const type = fb.GetParams().FindType(placeType, 1); @@ -343,7 +343,7 @@ public: } /// @return false if coasts are not merged and FLAG_fail_on_coasts is set - bool Finish() + bool Finish() override { m_places.ForEach([this](Place const & p) { @@ -402,7 +402,7 @@ public: return true; } - inline void GetNames(vector & names) const + void GetNames(vector & names) const override { if (m_countries) names = m_countries->Parent().Names(); @@ -451,6 +451,10 @@ private: }; } // anonymous namespace +unique_ptr MakeMainFeatureEmitter(feature::GenerateInfo const & info) +{ + return make_unique(info); +} template void AddElementToCache(TCache & cache, TElement const & em) @@ -597,7 +601,7 @@ void ProcessOsmElementsFromO5M(SourceReader & stream, function -bool GenerateFeaturesImpl(feature::GenerateInfo & info) +bool GenerateFeaturesImpl(feature::GenerateInfo & info, EmitterBase & emitter) { try { @@ -607,9 +611,9 @@ bool GenerateFeaturesImpl(feature::GenerateInfo & info) TDataCache cache(nodes, info); cache.LoadIndex(); - MainFeaturesEmitter bucketer(info); - OsmToFeatureTranslator parser( - bucketer, cache, info.m_makeCoasts ? classif().GetCoastType() : 0, + // TODO(mgsergio): Get rid of EmitterBase template parameter. + OsmToFeatureTranslator parser( + emitter, cache, info.m_makeCoasts ? classif().GetCoastType() : 0, info.GetAddressesFileName()); TagAdmixer tagAdmixer(info.GetIntermediateFileName("ways", ".csv"), @@ -670,10 +674,10 @@ bool GenerateFeaturesImpl(feature::GenerateInfo & info) } // Stop if coasts are not merged and FLAG_fail_on_coasts is set - if (!bucketer.Finish()) + if (!emitter.Finish()) return false; - bucketer.GetNames(info.m_bucketNames); + emitter.GetNames(info.m_bucketNames); } catch (Reader::Exception const & ex) { @@ -718,16 +722,17 @@ bool GenerateIntermediateDataImpl(feature::GenerateInfo & info) return true; } -bool GenerateFeatures(feature::GenerateInfo & info) +bool GenerateFeatures(feature::GenerateInfo & info, EmitterFactory factory) { + auto emitter = factory(info); switch (info.m_nodeStorageType) { case feature::GenerateInfo::NodeStorageType::File: - return GenerateFeaturesImpl>(info); + return GenerateFeaturesImpl>(info, *emitter); case feature::GenerateInfo::NodeStorageType::Index: - return GenerateFeaturesImpl>(info); + return GenerateFeaturesImpl>(info, *emitter); case feature::GenerateInfo::NodeStorageType::Memory: - return GenerateFeaturesImpl>(info); + return GenerateFeaturesImpl>(info, *emitter); } return false; } diff --git a/generator/osm_source.hpp b/generator/osm_source.hpp index 08f85790ce..90dea9e702 100644 --- a/generator/osm_source.hpp +++ b/generator/osm_source.hpp @@ -30,11 +30,24 @@ public: uint64_t Read(char * buffer, uint64_t bufferSize); }; +class FeatureBuilder1; +class EmitterBase +{ +public: + virtual ~EmitterBase() = default; + virtual void operator()(FeatureBuilder1 & fb) = 0; + virtual bool Finish() { return true; } + virtual void GetNames(vector & names) const = 0; +}; -bool GenerateFeatures(feature::GenerateInfo & info); +unique_ptr MakeMainFeatureEmitter(feature::GenerateInfo const & info); + +using EmitterFactory = function(feature::GenerateInfo const &)>; + +bool GenerateFeatures(feature::GenerateInfo & info, + EmitterFactory factory = MakeMainFeatureEmitter); bool GenerateIntermediateData(feature::GenerateInfo & info); void ProcessOsmElementsFromO5M(SourceReader & stream, function processor); void ProcessOsmElementsFromXML(SourceReader & stream, function processor); - diff --git a/generator/osm_translator.hpp b/generator/osm_translator.hpp index 5f2e49992d..a0b171da11 100644 --- a/generator/osm_translator.hpp +++ b/generator/osm_translator.hpp @@ -484,7 +484,7 @@ public: public: OsmToFeatureTranslator(TEmitter & emitter, TCache & holder, - uint32_t coastType, string const & addrFilePath) + uint32_t coastType, string const & addrFilePath = {}) : m_emitter(emitter), m_holder(holder), m_coastType(coastType) { if (!addrFilePath.empty())