Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--defines.hpp5
-rw-r--r--generator/coastlines_generator.cpp2
-rw-r--r--generator/data_generator.cpp16
-rw-r--r--generator/data_generator.hpp2
-rw-r--r--generator/feature_builder.cpp4
-rw-r--r--generator/feature_builder.hpp4
-rw-r--r--generator/feature_generator.cpp26
-rw-r--r--generator/feature_generator.hpp2
-rw-r--r--generator/feature_sorter.cpp42
-rw-r--r--generator/feature_sorter.hpp2
-rw-r--r--generator/generator_tool/generator_tool.cpp6
-rw-r--r--generator/osm2type.cpp6
-rw-r--r--generator/tesselator.cpp2
-rw-r--r--generator/xml_element.cpp10
-rw-r--r--generator/xml_element.hpp2
-rw-r--r--indexer/feature.cpp12
-rw-r--r--indexer/feature.hpp6
-rw-r--r--indexer/feature_data.cpp2
-rw-r--r--indexer/feature_data.hpp29
-rw-r--r--indexer/feature_loader.cpp37
-rw-r--r--indexer/feature_loader.hpp1
-rw-r--r--indexer/feature_loader_base.cpp10
-rw-r--r--indexer/feature_loader_base.hpp3
-rw-r--r--indexer/old/feature_loader_101.hpp2
24 files changed, 166 insertions, 67 deletions
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 <class TNodesHolder>
-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<holder_t> 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<points_in_file_light>(dir, osm_filename);
+ return GenerateImpl<points_in_file_light>(dir, osmFileName);
else
- return GenerateImpl<points_in_file>(dir, osm_filename);
+ return GenerateImpl<points_in_file>(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<buffer_t> 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<m2::PointD> & 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 <class TNodesHolder>
- bool GenerateImpl(GenerateInfo & info, std::string const &osm_filename=std::string())
+template <class NodesHolderT>
+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<TNodesHolder> holder_t;
- holder_t holder(nodes, info.m_tmpDir);
+ typedef FileHolder<NodesHolderT> HolderT;
+ HolderT holder(nodes, info.m_tmpDir);
holder.LoadIndex();
MainFeaturesEmitter bucketer(info);
- SecondPassParser<MainFeaturesEmitter, holder_t> parser(
+ SecondPassParser<MainFeaturesEmitter, HolderT> 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 <class TNodesHolder>
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<points_in_map>(info, osm_filename);
+ return GenerateImpl<points_in_map>(info, osmFileName);
else
- return GenerateImpl<points_in_file>(info, osm_filename);
+ return GenerateImpl<points_in_file>(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<uint64_t, uint64_t> TCellAndOffset;
+ typedef pair<uint64_t, uint64_t> CellAndOffsetT;
class CalculateMidPoints
{
@@ -39,7 +41,7 @@ namespace
{
}
- std::vector<TCellAndOffset> m_vec;
+ vector<CellAndOffsetT> 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<FileWriter*> m_geoFile, m_trgFile;
+ unique_ptr<FileWriter> m_AdditionalInfoWriter;
+
+ vector<pair<uint32_t, uint32_t>> 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<uint32_t>(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<uint8_t>(e.first | last_key_mark), numeric_limits<uint8_t>::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<double>::max();
+ return numeric_limits<double>::max();
}
return m2::DistanceToLineSquare<m2::PointD>::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 <class TCont>
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<m2::PointD, static_buffer> 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<uint8_t, std::string> additional_info_type;
- additional_info_type m_additional_info;
+
+ typedef map<uint8_t, string> AdditionalInfoT;
+ AdditionalInfoT m_additional_info;
typedef vector<uint32_t> 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 <class TSink> void Write(TSink & sink, bool need_store_additional_info = true) const
+ template <class SinkT> 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 <class TSrc> void Read(TSrc & src, bool need_read_additional_info = true)
+ template <class SrcT> 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<uint32_t>(src)));
- if( need_read_additional_info )
+ if (needReadAdditionalInfo)
{
uint8_t const ait_size = ReadPrimitiveFromSource<uint8_t>(src);
- for(size_t i=0; i<ait_size; ++i)
+ for (size_t i=0; i < ait_size; ++i)
{
uint8_t const key = ReadPrimitiveFromSource<uint8_t>(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<uint32_t, uint32_t> IdxElementT;
+ DDVector<IdxElementT, FilesContainerR::ReaderT> 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<uint8_t>::max()] = {0};
+ ReaderSource<FilesContainerR::ReaderT> 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
+
};
}
}