diff --git a/defines.hpp b/defines.hpp index 399eb8364a..74defadd37 100644 --- a/defines.hpp +++ b/defines.hpp @@ -12,6 +12,9 @@ #define SEARCH_INDEX_FILE_TAG "sdx" #define HEADER_FILE_TAG "header" #define VERSION_FILE_TAG "version" +#define ADDITIONAL_INFO_FILE_TAG "ainf" +#define ADDITIONAL_INFO_INDEX_FILE_TAG "ainfidx" + #define ROUTING_MATRIX_FILE_TAG "mercedes" #define ROUTING_EDGEDATA_FILE_TAG "daewoo" #define ROUTING_EDGEID_FILE_TAG "infinity" @@ -45,3 +48,5 @@ /// How many langs we're supporting on indexing stage #define MAX_SUPPORTED_LANGUAGES 64 + + diff --git a/generator/coastlines_generator.cpp b/generator/coastlines_generator.cpp index e57dff2467..7e0eea2f7e 100644 --- a/generator/coastlines_generator.cpp +++ b/generator/coastlines_generator.cpp @@ -8,7 +8,7 @@ #include "../base/string_utils.hpp" #include "../base/logging.hpp" -#include "../../3party/gflags/src/gflags/gflags.h" +#include "../3party/gflags/src/gflags/gflags.h" #include "../std/bind.hpp" diff --git a/generator/data_generator.cpp b/generator/data_generator.cpp index afabe00940..003ec30116 100644 --- a/generator/data_generator.cpp +++ b/generator/data_generator.cpp @@ -112,7 +112,7 @@ public: }; template -bool GenerateImpl(string const & dir, std::string const &osm_filename=std::string()) +bool GenerateImpl(string const & dir, string const & osmFileName = string()) { try { @@ -121,14 +121,10 @@ bool GenerateImpl(string const & dir, std::string const &osm_filename=std::strin holder_t holder(nodes, dir); FirstPassParser parser(holder); - if(osm_filename.empty()) - { + if (osmFileName.empty()) ParseXMLFromStdIn(parser); - } else - { - ParseXMLFromFile(parser, osm_filename); - } + ParseXMLFromFile(parser, osmFileName); LOG(LINFO, ("Added points count = ", nodes.GetCount())); @@ -143,12 +139,12 @@ bool GenerateImpl(string const & dir, std::string const &osm_filename=std::strin return true; } -bool GenerateToFile(string const & dir, bool lightNodes, std::string const &osm_filename) +bool GenerateToFile(string const & dir, bool lightNodes, string const & osmFileName) { if (lightNodes) - return GenerateImpl(dir, osm_filename); + return GenerateImpl(dir, osmFileName); else - return GenerateImpl(dir, osm_filename); + return GenerateImpl(dir, osmFileName); } } diff --git a/generator/data_generator.hpp b/generator/data_generator.hpp index 5677bff1cc..f51789d068 100644 --- a/generator/data_generator.hpp +++ b/generator/data_generator.hpp @@ -4,5 +4,5 @@ namespace data { - bool GenerateToFile(string const & dir, bool lightNodes, string const &osm_filename=string()); + bool GenerateToFile(string const & dir, bool lightNodes, string const & osmFileName = string()); } diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index 3c749e0c6c..9fc668017a 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -322,11 +322,11 @@ bool FeatureBuilder1::CheckValid() const return true; } -void FeatureBuilder1::SerializeBase(buffer_t & data, serial::CodingParams const & params, bool need_serialize_additional_info) const +void FeatureBuilder1::SerializeBase(buffer_t & data, serial::CodingParams const & params, bool needSerializeAdditionalInfo) const { PushBackByteSink sink(data); - m_params.Write(sink, need_serialize_additional_info); + m_params.Write(sink, needSerializeAdditionalInfo); if (m_params.GetGeomType() == GEOM_POINT) serial::SavePoint(sink, m_center, params); diff --git a/generator/feature_builder.hpp b/generator/feature_builder.hpp index 4c8f413177..c62e308d7d 100644 --- a/generator/feature_builder.hpp +++ b/generator/feature_builder.hpp @@ -39,6 +39,8 @@ public: void AddPolygon(vector & poly); //@} + inline FeatureParams::AdditionalInfoT const & GetAdditionalInfo() const { return m_params.m_additional_info; } + inline feature::EGeomType GetGeomType() const { return m_params.GetGeomType(); } inline void AddType(uint32_t type) { m_params.AddType(type); } @@ -67,7 +69,7 @@ public: /// @name Serialization. //@{ void Serialize(buffer_t & data) const; - void SerializeBase(buffer_t & data, serial::CodingParams const & params, bool need_searialize_additional_info = true) const; + void SerializeBase(buffer_t & data, serial::CodingParams const & params, bool needSearializeAdditionalInfo = true) const; void Deserialize(buffer_t & data); //@} diff --git a/generator/feature_generator.cpp b/generator/feature_generator.cpp index c41ddc5730..57d1e11008 100644 --- a/generator/feature_generator.cpp +++ b/generator/feature_generator.cpp @@ -418,31 +418,27 @@ public: } -template - bool GenerateImpl(GenerateInfo & info, std::string const &osm_filename=std::string()) +template +bool GenerateImpl(GenerateInfo & info, string const & osmFileName = string()) { try { - TNodesHolder nodes(info.m_tmpDir + NODES_FILE); + NodesHolderT nodes(info.m_tmpDir + NODES_FILE); - typedef FileHolder holder_t; - holder_t holder(nodes, info.m_tmpDir); + typedef FileHolder HolderT; + HolderT holder(nodes, info.m_tmpDir); holder.LoadIndex(); MainFeaturesEmitter bucketer(info); - SecondPassParser parser( + SecondPassParser parser( bucketer, holder, info.m_makeCoasts ? classif().GetCoastType() : 0, info.m_addressFile); - if(osm_filename.empty()) - { + if (osmFileName.empty()) ParseXMLFromStdIn(parser); - } else - { - ParseXMLFromFile(parser, osm_filename); - } + ParseXMLFromFile(parser, osmFileName); // Stop if coasts are not merged and FLAG_fail_on_coasts is set if (!bucketer.Finish()) @@ -458,12 +454,12 @@ template return true; } -bool GenerateFeatures(GenerateInfo & info, bool lightNodes, std::string const &osm_filename) +bool GenerateFeatures(GenerateInfo & info, bool lightNodes, string const & osmFileName) { if (lightNodes) - return GenerateImpl(info, osm_filename); + return GenerateImpl(info, osmFileName); else - return GenerateImpl(info, osm_filename); + return GenerateImpl(info, osmFileName); } } diff --git a/generator/feature_generator.hpp b/generator/feature_generator.hpp index 5eff8e95c2..a607e9c9e0 100644 --- a/generator/feature_generator.hpp +++ b/generator/feature_generator.hpp @@ -14,7 +14,7 @@ namespace feature { struct GenerateInfo; - bool GenerateFeatures(GenerateInfo & info, bool lightNodes, std::string const &osm_filename=std::string()); + bool GenerateFeatures(GenerateInfo & info, bool lightNodes, string const & osmFileName = string()); // Writes features to dat file. class FeaturesCollector diff --git a/generator/feature_sorter.cpp b/generator/feature_sorter.cpp index b599f10683..098648c50c 100644 --- a/generator/feature_sorter.cpp +++ b/generator/feature_sorter.cpp @@ -23,9 +23,11 @@ #include "../base/logging.hpp" + + namespace { - typedef pair TCellAndOffset; + typedef pair CellAndOffsetT; class CalculateMidPoints { @@ -39,7 +41,7 @@ namespace { } - std::vector m_vec; + vector m_vec; void operator() (FeatureBuilder1 const & ft, uint64_t pos) { @@ -74,7 +76,7 @@ namespace m2::PointD GetCenter() const { return m_midAll / m_allCount; } }; - bool SortMidPointsFunc(TCellAndOffset const & c1, TCellAndOffset const & c2) + bool SortMidPointsFunc(CellAndOffsetT const & c1, CellAndOffsetT const & c2) { return c1.first < c2.first; } @@ -88,6 +90,10 @@ namespace feature vector m_geoFile, m_trgFile; + unique_ptr m_AdditionalInfoWriter; + + vector> m_AdditionalInfoIndex; + DataHeader m_header; gen::OsmID2FeatureID m_osm2ft; @@ -96,6 +102,8 @@ namespace feature FeaturesCollector2(string const & fName, DataHeader const & header) : FeaturesCollector(fName + DATA_FILE_TAG), m_writer(fName), m_header(header) { + m_AdditionalInfoWriter.reset(new FileWriter(fName + ADDITIONAL_INFO_FILE_TAG)); + for (size_t i = 0; i < m_header.GetScalesCount(); ++i) { string const postfix = strings::to_string(i); @@ -146,6 +154,12 @@ namespace feature FileWriter::DeleteFileX(trgFile); } + + FileWriter ainf_index = m_writer.GetWriter(ADDITIONAL_INFO_INDEX_FILE_TAG); + ainf_index.Write(m_AdditionalInfoIndex.data(), m_AdditionalInfoIndex.size()*(sizeof(uint32_t)*2)); + m_AdditionalInfoWriter->Flush(); + m_writer.Write(m_AdditionalInfoWriter->GetName(), ADDITIONAL_INFO_FILE_TAG); + m_writer.Finish(); if (m_header.GetType() == DataHeader::country) @@ -512,11 +526,31 @@ namespace feature uint32_t const ftID = WriteFeatureBase(holder.m_buffer.m_buffer, fb); + ProcessFeatureAdditionalInfo(ftID, fb); + uint64_t const osmID = fb.GetWayIDForRouting(); if (osmID != 0) m_osm2ft.Add(make_pair(osmID, ftID)); } } + + void ProcessFeatureAdditionalInfo(uint32_t const ftID, FeatureBuilder2 const & f) + { + FeatureParams::AdditionalInfoT const & ainf = f.GetAdditionalInfo(); + if (ainf.size()) + { + uint64_t offset = m_AdditionalInfoWriter->Pos(); + m_AdditionalInfoIndex.push_back(make_pair(ftID, static_cast(offset))); + for (auto const & e: ainf) + { + uint8_t last_key_mark = (&e == &(*ainf.crbegin())) << 7; /// set high bit (0x80) if it last element + uint8_t elem[2] = {static_cast(e.first | last_key_mark), numeric_limits::max()}; + m_AdditionalInfoWriter->Write(elem, sizeof(elem)); + m_AdditionalInfoWriter->Write(e.second.data(), elem[1]); + } + } + } + }; /// Simplify geometry for the upper scale. @@ -551,7 +585,7 @@ namespace feature ForEachFromDatRawFormat(srcFilePath, midPoints); // sort features by their middle point - std::sort(midPoints.m_vec.begin(), midPoints.m_vec.end(), &SortMidPointsFunc); + sort(midPoints.m_vec.begin(), midPoints.m_vec.end(), &SortMidPointsFunc); // store sorted features { diff --git a/generator/feature_sorter.hpp b/generator/feature_sorter.hpp index 5fad99e023..f7c9419824 100644 --- a/generator/feature_sorter.hpp +++ b/generator/feature_sorter.hpp @@ -49,7 +49,7 @@ namespace feature fabs(p.y - m_rect.minY()) <= m_eps || fabs(p.y - m_rect.maxY()) <= m_eps) { // points near rect should be in a result simplified vector - return std::numeric_limits::max(); + return numeric_limits::max(); } return m2::DistanceToLineSquare::operator()(p); diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index a127c75446..07f2ad409e 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -92,7 +92,7 @@ int main(int argc, char ** argv) Platform & pl = GetPlatform(); - if(!FLAGS_user_resource_path.empty()) + if (!FLAGS_user_resource_path.empty()) { pl.AddOptionalPath(FLAGS_user_resource_path); } @@ -104,7 +104,7 @@ int main(int argc, char ** argv) if (FLAGS_preprocess_xml) { LOG(LINFO, ("Generating intermediate data ....")); - if(!FLAGS_osm_file_name.empty()) + if (!FLAGS_osm_file_name.empty()) { if (!data::GenerateToFile(FLAGS_intermediate_data_path, FLAGS_use_light_nodes, FLAGS_osm_file_name)) return -1; @@ -156,7 +156,7 @@ int main(int argc, char ** argv) if (!FLAGS_address_file_name.empty()) genInfo.m_addressFile = path + FLAGS_address_file_name; - if(!FLAGS_osm_file_name.empty()) + if (!FLAGS_osm_file_name.empty()) { if (!feature::GenerateFeatures(genInfo, FLAGS_use_light_nodes, FLAGS_osm_file_name)) return -1; diff --git a/generator/osm2type.cpp b/generator/osm2type.cpp index 177c3259f8..70358c21fc 100644 --- a/generator/osm2type.cpp +++ b/generator/osm2type.cpp @@ -124,15 +124,15 @@ namespace ftype if (k == "cuisine") { - m_params.AddAdditionalInfo(FeatureParams::ait_cuisine, v); + m_params.AddAdditionalInfo(FeatureParams::AIT_CUISINE, v); } else if (k == "phone") { - m_params.AddAdditionalInfo(FeatureParams::ait_phone_number, v); + m_params.AddAdditionalInfo(FeatureParams::AIT_PHONE_NUMBER, v); } else if (k == "opening_hours") { - m_params.AddAdditionalInfo(FeatureParams::ait_open_hours, v); + m_params.AddAdditionalInfo(FeatureParams::AIT_OPEN_HOURS, v); } return false; } diff --git a/generator/tesselator.cpp b/generator/tesselator.cpp index 3bac0e8215..122d3f2c4b 100644 --- a/generator/tesselator.cpp +++ b/generator/tesselator.cpp @@ -11,7 +11,7 @@ #include "../std/queue.hpp" -#include "../../3party/sgitess/interface.h" +#include "../3party/sgitess/interface.h" namespace tesselator diff --git a/generator/xml_element.cpp b/generator/xml_element.cpp index 6ce91bc19c..b37bf9e199 100644 --- a/generator/xml_element.cpp +++ b/generator/xml_element.cpp @@ -89,11 +89,11 @@ struct StdinReader struct FileReader { - FILE *m_file; + FILE * m_file; - FileReader(std::string const &filename) + FileReader(string const & filename) { - m_file = fopen(filename.c_str(),"rb"); + m_file = fopen(filename.c_str(), "rb"); } ~FileReader() @@ -114,8 +114,8 @@ void ParseXMLFromStdIn(BaseOSMParser & parser) (void)ParseXMLSequence(reader, parser); } -void ParseXMLFromFile(BaseOSMParser & parser, std::string const &osm_filename) +void ParseXMLFromFile(BaseOSMParser & parser, string const & osmFileName) { - FileReader reader(osm_filename); + FileReader reader(osmFileName); (void)ParseXMLSequence(reader, parser); } diff --git a/generator/xml_element.hpp b/generator/xml_element.hpp index 95c547e78d..abbc4a9d9b 100644 --- a/generator/xml_element.hpp +++ b/generator/xml_element.hpp @@ -41,4 +41,4 @@ protected: }; void ParseXMLFromStdIn(BaseOSMParser & parser); -void ParseXMLFromFile(BaseOSMParser & parser, std::string const &osm_filename); +void ParseXMLFromFile(BaseOSMParser & parser, string const & osmFileName); diff --git a/indexer/feature.cpp b/indexer/feature.cpp index f2fa581936..4d2827d98f 100644 --- a/indexer/feature.cpp +++ b/indexer/feature.cpp @@ -82,7 +82,7 @@ void FeatureType::Deserialize(feature::LoaderBase * pLoader, BufferT buffer) m_pLoader->InitFeature(this); - m_bHeader2Parsed = m_bPointsParsed = m_bTrianglesParsed = false; + m_bHeader2Parsed = m_bPointsParsed = m_bTrianglesParsed = m_bAdditionalInfoParsed = false; m_innerStats.MakeZero(); } @@ -137,6 +137,16 @@ uint32_t FeatureType::ParseTriangles(int scale) const return sz; } +void FeatureType::ParseAdditionalInfo() const +{ + if (m_bAdditionalInfoParsed) return; + + m_pLoader->ParseAdditionalInfo(); + m_bAdditionalInfoParsed = true; +} + + + namespace { template diff --git a/indexer/feature.hpp b/indexer/feature.hpp index c42bf7ab06..8db0e00856 100644 --- a/indexer/feature.hpp +++ b/indexer/feature.hpp @@ -163,6 +163,8 @@ public: void ResetGeometry() const; uint32_t ParseGeometry(int scale) const; uint32_t ParseTriangles(int scale) const; + + void ParseAdditionalInfo() const; //@} /// @name Geometry. @@ -259,6 +261,7 @@ public: uint8_t GetRank() const; uint32_t GetPopulation() const; string GetRoadNumber() const; + inline FeatureParams::AdditionalInfoT const & GetAdditionalInfo() const { return m_additional_info; } double GetDistance(m2::PointD const & pt, int scale) const; @@ -308,8 +311,9 @@ private: typedef buffer_vector points_t; mutable points_t m_points, m_triangles; + mutable FeatureParams::AdditionalInfoT m_additional_info; - mutable bool m_bHeader2Parsed, m_bPointsParsed, m_bTrianglesParsed; + mutable bool m_bHeader2Parsed, m_bPointsParsed, m_bTrianglesParsed, m_bAdditionalInfoParsed; mutable inner_geom_stat_t m_innerStats; diff --git a/indexer/feature_data.cpp b/indexer/feature_data.cpp index 586c548691..33843dcb97 100644 --- a/indexer/feature_data.cpp +++ b/indexer/feature_data.cpp @@ -168,7 +168,7 @@ bool FeatureParams::AddHouseName(string const & s) return false; } -bool FeatureParams::AddAdditionalInfo(additional_info_types type, string const &s) +bool FeatureParams::AddAdditionalInfo(additional_info_types type, string const & s) { if (m_additional_info[type].empty()) { diff --git a/indexer/feature_data.hpp b/indexer/feature_data.hpp index 4224e80380..216ee08936 100644 --- a/indexer/feature_data.hpp +++ b/indexer/feature_data.hpp @@ -208,13 +208,14 @@ class FeatureParams : public FeatureParamsBase public: enum additional_info_types { - ait_cuisine = 1, - ait_open_hours, - ait_phone_number, - ait_fax_number + AIT_CUISINE = 1, + AIT_OPEN_HOURS, + AIT_PHONE_NUMBER, + AIT_FAX_NUMBER }; - typedef std::map additional_info_type; - additional_info_type m_additional_info; + + typedef map AdditionalInfoT; + AdditionalInfoT m_additional_info; typedef vector types_t; types_t m_Types; @@ -227,7 +228,7 @@ public: bool AddHouseName(string const & s); bool AddHouseNumber(string const & s); - bool AddAdditionalInfo(additional_info_types type,string const &s); + bool AddAdditionalInfo(additional_info_types type, string const & s); /// @name Used in storing full street address only. //@{ @@ -269,7 +270,7 @@ public: uint8_t GetHeader() const; - template void Write(TSink & sink, bool need_store_additional_info = true) const + template void Write(SinkT & sink, bool needStoreAdditionalInfo = true) const { uint8_t const header = GetHeader(); @@ -278,13 +279,13 @@ public: for (size_t i = 0; i < m_Types.size(); ++i) WriteVarUint(sink, GetIndexForType(m_Types[i])); - if( need_store_additional_info ) + if (needStoreAdditionalInfo) { uint8_t const ait_size = m_additional_info.size(); WriteToSink(sink, ait_size); if (ait_size) { - for(auto &it: m_additional_info) + for(auto & it: m_additional_info) { WriteToSink(sink, uint8_t(it.first)); utils::WriteString(sink, it.second); @@ -295,7 +296,7 @@ public: BaseT::Write(sink, header); } - template void Read(TSrc & src, bool need_read_additional_info = true) + template void Read(SrcT & src, bool needReadAdditionalInfo = true) { using namespace feature; @@ -306,13 +307,13 @@ public: for (size_t i = 0; i < count; ++i) m_Types.push_back(GetTypeForIndex(ReadVarUint(src))); - if( need_read_additional_info ) + if (needReadAdditionalInfo) { uint8_t const ait_size = ReadPrimitiveFromSource(src); - for(size_t i=0; i(src); - std::string value; + string value; utils::ReadString(src, value); m_additional_info.insert(make_pair(key, value)); } diff --git a/indexer/feature_loader.cpp b/indexer/feature_loader.cpp index 4d1ccd491f..b88c63f80a 100644 --- a/indexer/feature_loader.cpp +++ b/indexer/feature_loader.cpp @@ -9,7 +9,10 @@ #include "../geometry/pointu_to_uint64.hpp" #include "../coding/byte_stream.hpp" +#include "../coding/dd_vector.hpp" +#include "../base/logging.hpp" +#include "../defines.hpp" namespace feature { @@ -96,7 +99,7 @@ namespace void LoaderCurrent::ParseHeader2() { - uint8_t ptsCount, ptsMask, trgCount, trgMask; + uint8_t ptsCount = 0, ptsMask = 0, trgCount = 0, trgMask = 0; BitSource bitSource(DataPtr() + m_Header2Offset); @@ -249,6 +252,38 @@ uint32_t LoaderCurrent::ParseTriangles(int scale) return sz; } +void LoaderCurrent::ParseAdditionalInfo() +{ + try + { + typedef pair IdxElementT; + DDVector idx(m_Info.GetAdditionalInfoIndexReader()); + + auto it = lower_bound(idx.begin(), idx.end() + , make_pair(uint32_t(m_pF->m_id.m_offset), uint32_t(0)) + , [](IdxElementT const & v1, IdxElementT const & v2) { return v1.first < v2.first; } + ); + + if (it != idx.end() && m_pF->m_id.m_offset == it->first) + { + uint8_t header[2] = {0}; + char buffer[numeric_limits::max()] = {0}; + ReaderSource reader(m_Info.GetAdditionalInfoReader()); + reader.Skip(it->second); + do + { + reader.Read(header, sizeof(header)); + reader.Read(buffer, header[1]); + m_pF->m_additional_info[uint8_t(header[0] & 0x7F)].assign(buffer, header[1]); + } while (!(header[0] & 0x80)); + } + } + catch(Reader::OpenException & e) + { + // now ignore exception because not all mwm have needed sections + } +} + int LoaderCurrent::GetScaleIndex(int scale) const { int const count = m_Info.GetScalesCount(); diff --git a/indexer/feature_loader.hpp b/indexer/feature_loader.hpp index 59456adbc7..d4165a1a02 100644 --- a/indexer/feature_loader.hpp +++ b/indexer/feature_loader.hpp @@ -28,5 +28,6 @@ namespace feature virtual void ParseHeader2(); virtual uint32_t ParseGeometry(int scale); virtual uint32_t ParseTriangles(int scale); + virtual void ParseAdditionalInfo(); }; } diff --git a/indexer/feature_loader_base.cpp b/indexer/feature_loader_base.cpp index 1a6ebca998..eb127876be 100644 --- a/indexer/feature_loader_base.cpp +++ b/indexer/feature_loader_base.cpp @@ -34,6 +34,16 @@ SharedLoadInfo::ReaderT SharedLoadInfo::GetDataReader() const return m_cont.GetReader(DATA_FILE_TAG); } +SharedLoadInfo::ReaderT SharedLoadInfo::GetAdditionalInfoReader() const +{ + return m_cont.GetReader(ADDITIONAL_INFO_FILE_TAG); +} + +SharedLoadInfo::ReaderT SharedLoadInfo::GetAdditionalInfoIndexReader() const +{ + return m_cont.GetReader(ADDITIONAL_INFO_INDEX_FILE_TAG); +} + SharedLoadInfo::ReaderT SharedLoadInfo::GetGeometryReader(int ind) const { return m_cont.GetReader(GetTagForIndex(GEOMETRY_FILE_TAG, ind)); diff --git a/indexer/feature_loader_base.hpp b/indexer/feature_loader_base.hpp index a0c7fac347..eab6dca536 100644 --- a/indexer/feature_loader_base.hpp +++ b/indexer/feature_loader_base.hpp @@ -30,6 +30,8 @@ namespace feature ~SharedLoadInfo(); ReaderT GetDataReader() const; + ReaderT GetAdditionalInfoReader() const; + ReaderT GetAdditionalInfoIndexReader() const; ReaderT GetGeometryReader(int ind) const; ReaderT GetTrianglesReader(int ind) const; @@ -73,6 +75,7 @@ namespace feature virtual void ParseHeader2() = 0; virtual uint32_t ParseGeometry(int scale) = 0; virtual uint32_t ParseTriangles(int scale) = 0; + virtual void ParseAdditionalInfo() = 0; inline uint32_t GetTypesSize() const { return m_CommonOffset - m_TypesOffset; } diff --git a/indexer/old/feature_loader_101.hpp b/indexer/old/feature_loader_101.hpp index 2d4742daab..a576373df1 100644 --- a/indexer/old/feature_loader_101.hpp +++ b/indexer/old/feature_loader_101.hpp @@ -36,6 +36,8 @@ namespace old_101 { namespace feature virtual void ParseHeader2(); virtual uint32_t ParseGeometry(int scale); virtual uint32_t ParseTriangles(int scale); + virtual void ParseAdditionalInfo() {} /// not supported in this version + }; } }