Added matcher for ugc objects.

This commit is contained in:
VladiMihaylenko 2017-07-10 13:04:17 +03:00 committed by Arsentiy Milchakov
parent 4cddde8283
commit 191d3d497a
26 changed files with 454 additions and 87 deletions

View file

@ -0,0 +1 @@
../../data/ugc_types.csv
1 ../../data/ugc_types.csv

View file

@ -24,6 +24,7 @@ cp ../data/patterns.txt assets/
cp ../data/types.txt assets/
cp ../data/unicode_blocks.txt assets/
cp ../data/opening_hours_how_to_edit.html assets/
cp ../data/ugc_types.csv assets/
cp -r ../data/resources-hdpi_dark/ assets/
cp -r ../data/resources-hdpi_clear/ assets/

View file

@ -24,6 +24,8 @@ set(
compressed_bit_vector.cpp
compressed_bit_vector.hpp
constants.hpp
csv_file_reader.cpp
csv_file_reader.hpp
dd_vector.hpp
diff.hpp
diff_patch_common.hpp

View file

@ -13,6 +13,7 @@ include($$ROOT_DIR/common.pri)
SOURCES += \
base64.cpp \
compressed_bit_vector.cpp \
csv_file_reader.cpp \
file_container.cpp \
file_name_utils.cpp \
file_reader.cpp \
@ -46,6 +47,7 @@ HEADERS += \
coder_util.hpp \
compressed_bit_vector.hpp \
constants.hpp \
csv_file_reader.hpp \
dd_vector.hpp \
diff.hpp \
diff_patch_common.hpp \

View file

@ -10,6 +10,7 @@ set(
coder_test.hpp
coder_util_test.cpp
compressed_bit_vector_test.cpp
csv_reader_test.cpp
dd_vector_test.cpp
diff_test.cpp
elias_coder_test.cpp
@ -49,4 +50,4 @@ set(
omim_add_test(${PROJECT_NAME} ${SRC})
omim_link_libraries(${PROJECT_NAME} coding base geometry minizip succinct ${LIBZ})
omim_link_libraries(${PROJECT_NAME} platform_tests_support platform coding base geometry minizip succinct stats_client ${Qt5Widgets_LIBRARIES} ${LIBZ})

View file

@ -6,7 +6,15 @@ TEMPLATE = app
ROOT_DIR = ../..
DEPENDENCIES = coding base geometry minizip succinct
DEPENDENCIES = platform_tests_support platform coding base geometry minizip succinct stats_client
macx-* {
QT *= gui widgets # needed for QApplication with event loop, to test async events (downloader, etc.)
LIBS *= "-framework IOKit" "-framework QuartzCore" "-framework Cocoa" "-framework SystemConfiguration"
}
win32*|linux* {
QT *= network
}
include($$ROOT_DIR/common.pri)
@ -18,6 +26,7 @@ SOURCES += ../../testing/testingmain.cpp \
bwt_coder_tests.cpp \
coder_util_test.cpp \
compressed_bit_vector_test.cpp \
csv_reader_test.cpp \
dd_vector_test.cpp \
diff_test.cpp \
elias_coder_test.cpp \

View file

@ -0,0 +1,73 @@
#include "testing/testing.hpp"
#include "coding/csv_file_reader.hpp"
#include "platform/platform_tests_support/scoped_file.hpp"
#include <string>
#include <vector>
namespace
{
std::string const kCSV1 = "a,b,c,d\ne,f,g h";
std::string const kCSV2 = "a,b,cd a b, c";
std::string const kCSV3 = "";
} // namespace
using coding::CSVReader;
using Row = std::vector<std::string>;
using File = std::vector<Row>;
UNIT_TEST(CSVReaderSmoke)
{
auto const fileName = "test.csv";
platform::tests_support::ScopedFile sf(fileName, kCSV1);
auto const & filePath = sf.GetFullPath();
CSVReader reader;
reader.ReadFullFile(filePath, [](File const & file) {
TEST_EQUAL(file.size(), 1, ());
TEST_EQUAL(file[0].size(), 3, ());
Row const firstRow = {"e", "f", "g h"};
TEST_EQUAL(file[0], firstRow, ());
});
CSVReader::Params p;
p.m_shouldReadHeader = true;
reader.ReadFullFile(filePath,
[](File const & file) {
TEST_EQUAL(file.size(), 2, ());
Row const headerRow = {"a", "b", "c", "d"};
TEST_EQUAL(file[0], headerRow, ());
},
p);
}
UNIT_TEST(CSVReaderCustomDelimiter)
{
auto const fileName = "test.csv";
platform::tests_support::ScopedFile sf(fileName, kCSV2);
auto const & filePath = sf.GetFullPath();
CSVReader reader;
CSVReader::Params p;
p.m_shouldReadHeader = true;
p.m_delimiter = ' ';
reader.ReadLineByLine(filePath,
[](Row const & row) {
Row const firstRow = {"a,b,cd", "a", "b,", "c"};
TEST_EQUAL(row, firstRow, ());
},
p);
}
UNIT_TEST(CSVReaderEmptyFile)
{
auto const fileName = "test.csv";
platform::tests_support::ScopedFile sf(fileName, kCSV2);
auto const & filePath = sf.GetFullPath();
CSVReader reader;
reader.ReadFullFile(filePath, [](File const & file) { TEST_EQUAL(file.size(), 0, ()); });
}

View file

@ -0,0 +1,45 @@
#include "coding/csv_file_reader.hpp"
#include "base/logging.hpp"
#include "base/string_utils.hpp"
#include <fstream>
#include <sstream>
namespace coding
{
using namespace std;
void CSVReader::ReadLineByLine(string const & filePath, LineByLineCallback const & fn,
Params const & params) const
{
ifstream file(filePath);
if (!file)
{
LOG(LERROR, ("File not found at path: ", filePath));
return;
}
string line;
bool readFirstLine = params.m_shouldReadHeader;
while (getline(file, line))
{
vector<string> splitLine;
strings::ParseCSVRow(line, params.m_delimiter, splitLine);
if (!readFirstLine)
{
readFirstLine = true;
continue;
}
fn(splitLine);
}
}
void CSVReader::ReadFullFile(string const & filePath, FullFileCallback const & fn,
Params const & params) const
{
vector<vector<string>> file;
ReadLineByLine(filePath, [&file](vector<string> const & row) { file.emplace_back(row); }, params);
fn(file);
}
} // namespace coding

View file

@ -0,0 +1,28 @@
#pragma once
#include <functional>
#include <string>
#include <vector>
namespace coding
{
class CSVReader
{
public:
struct Params
{
Params(){};
bool m_shouldReadHeader = false;
char m_delimiter = ',';
};
using LineByLineCallback = std::function<void(std::vector<std::string> const & line)>;
using FullFileCallback = std::function<void(std::vector<std::vector<std::string>> const & file)>;
void ReadLineByLine(std::string const & filePath, LineByLineCallback const & fn,
Params const & params = {}) const;
void ReadFullFile(std::string const & filePath, FullFileCallback const & fn,
Params const & params = {}) const;
};
} // namespace coding

78
data/ugc_types.csv Normal file
View file

@ -0,0 +1,78 @@
OSM tag,Rating,Reviews,Details
aeroway aerodrome,1,1,1
amenity atm,1,1,1
amenity bank,1,1,0
amenity bar,1,1,1
amenity bicycle_rental,1,1,0
amenity biergarten,1,1,1
amenity cafe,1,1,1
amenity cinema,1,1,0
amenity clinic,1,1,0
amenity doctors,1,1,0
amenity drinking_water,1,0,0
amenity driving_school,1,1,0
amenity fast_food,1,1,1
amenity fountain,1,0,0
amenity fuel,1,1,0
amenity hospital,1,1,0
amenity ice_cream,1,1,1
amenity internet_cafe,1,1,0
amenity kindergarten,1,0,0
amenity library,1,1,0
amenity marketplace,1,1,1
amenity motorcycle_parking,1,1,1
amenity nightclub,1,1,1
amenity nursing_home,1,0,0
amenity parking,1,0,0
amenity payment_terminal,1,1,0
amenity pharmacy,1,1,1
amenity place_of_worship,1,0,0
amenity police,1,0,0
amenity post_office,1,1,0
amenity pub,1,1,1
amenity restaurant,1,1,1
amenity school,1,0,0
amenity shower,1,0,0
amenity theatre,1,1,0
amenity toilets,1,0,0
amenity university,1,0,0
amenity water_point,1,0,0
building train_station,1,0,0
historic archaeological_site,1,0,0
historic castle,1,0,0
historic memorial,1,0,0
historic monument,1,0,0
historic ruins,1,0,0
internet_access wlan,1,0,0
landuse cemetery,1,0,0
landuse retail,1,1,1
leisure fitness_centre,1,1,1
leisure fitness_station,1,1,0
leisure garden,1,0,0
leisure golf_course,1,0,0
leisure nature_reserve,1,0,0
leisure park,1,0,0
leisure pitch,1,0,0
leisure playground,1,0,0
leisure sports_centre,1,1,0
leisure stadium,1,0,0
leisure swimming_pool,1,1,0
natural beach,1,0,0
natural cave_entrance,1,0,0
office,1,0,0
place city,1,1,0
place hamlet,1,1,0
place town,1,1,0
place village,1,1,0
shop,1,1,1
tourism artwork,1,0,0
tourism attraction,1,0,0
tourism guest_house,1,1,1
tourism hostel,1,1,1
tourism hotel,1,1,1
tourism information office,1,0,0
tourism motel,1,1,1
tourism museum,1,1,0
tourism viewpoint,1,0,0
tourism zoo,1,1,0
waterway waterfall,1,0,0
1 OSM tag Rating Reviews Details
2 aeroway aerodrome 1 1 1
3 amenity atm 1 1 1
4 amenity bank 1 1 0
5 amenity bar 1 1 1
6 amenity bicycle_rental 1 1 0
7 amenity biergarten 1 1 1
8 amenity cafe 1 1 1
9 amenity cinema 1 1 0
10 amenity clinic 1 1 0
11 amenity doctors 1 1 0
12 amenity drinking_water 1 0 0
13 amenity driving_school 1 1 0
14 amenity fast_food 1 1 1
15 amenity fountain 1 0 0
16 amenity fuel 1 1 0
17 amenity hospital 1 1 0
18 amenity ice_cream 1 1 1
19 amenity internet_cafe 1 1 0
20 amenity kindergarten 1 0 0
21 amenity library 1 1 0
22 amenity marketplace 1 1 1
23 amenity motorcycle_parking 1 1 1
24 amenity nightclub 1 1 1
25 amenity nursing_home 1 0 0
26 amenity parking 1 0 0
27 amenity payment_terminal 1 1 0
28 amenity pharmacy 1 1 1
29 amenity place_of_worship 1 0 0
30 amenity police 1 0 0
31 amenity post_office 1 1 0
32 amenity pub 1 1 1
33 amenity restaurant 1 1 1
34 amenity school 1 0 0
35 amenity shower 1 0 0
36 amenity theatre 1 1 0
37 amenity toilets 1 0 0
38 amenity university 1 0 0
39 amenity water_point 1 0 0
40 building train_station 1 0 0
41 historic archaeological_site 1 0 0
42 historic castle 1 0 0
43 historic memorial 1 0 0
44 historic monument 1 0 0
45 historic ruins 1 0 0
46 internet_access wlan 1 0 0
47 landuse cemetery 1 0 0
48 landuse retail 1 1 1
49 leisure fitness_centre 1 1 1
50 leisure fitness_station 1 1 0
51 leisure garden 1 0 0
52 leisure golf_course 1 0 0
53 leisure nature_reserve 1 0 0
54 leisure park 1 0 0
55 leisure pitch 1 0 0
56 leisure playground 1 0 0
57 leisure sports_centre 1 1 0
58 leisure stadium 1 0 0
59 leisure swimming_pool 1 1 0
60 natural beach 1 0 0
61 natural cave_entrance 1 0 0
62 office 1 0 0
63 place city 1 1 0
64 place hamlet 1 1 0
65 place town 1 1 0
66 place village 1 1 0
67 shop 1 1 1
68 tourism artwork 1 0 0
69 tourism attraction 1 0 0
70 tourism guest_house 1 1 1
71 tourism hostel 1 1 1
72 tourism hotel 1 1 1
73 tourism information office 1 0 0
74 tourism motel 1 1 1
75 tourism museum 1 1 0
76 tourism viewpoint 1 0 0
77 tourism zoo 1 1 0
78 waterway waterfall 1 0 0

View file

@ -70,6 +70,7 @@ set(
features_offsets_table.hpp
features_vector.cpp
features_vector.hpp
ftraits.hpp
ftypes_matcher.cpp
ftypes_matcher.hpp
geometry_coding.cpp
@ -128,7 +129,6 @@ set(
types_mapping.cpp
types_mapping.hpp
unique_index.hpp
wheelchair.hpp
)
set(

139
indexer/ftraits.hpp Normal file
View file

@ -0,0 +1,139 @@
#pragma once
#include "indexer/feature_data.hpp"
#include "indexer/ftypes_mapping.hpp"
#include "coding/csv_file_reader.hpp"
#include "platform/platform.hpp"
#include "base/assert.hpp"
#include "base/logging.hpp"
#include <array>
#include <cstdint>
#include <initializer_list>
#include <sstream>
#include <string>
namespace ftraits
{
template <typename Base, typename Value, Value notFound>
class TraitsBase
{
public:
static Value GetValue(feature::TypesHolder const & types)
{
static Base instance;
auto const it = instance.m_matcher.Find(types);
if (!instance.m_matcher.IsValid(it))
return notFound;
return it->second;
}
protected:
ftypes::HashMapMatcher<uint32_t, Value> m_matcher;
};
enum UGCType
{
UGCTYPE_NONE = 0u,
UGCTYPE_RATING = 1u << 0, // 1
UGCTYPE_REVIEWS = 1u << 1, // 2
UGCTYPE_DETAILS = 1u << 2 // 4
};
using UGCTypeMask = unsigned;
class UGC : public TraitsBase<UGC, UGCTypeMask, UGCTYPE_NONE>
{
friend class TraitsBase;
std::array<UGCType, 3> const m_masks = {{UGCTYPE_RATING, UGCTYPE_REVIEWS, UGCTYPE_DETAILS}};
UGC()
{
coding::CSVReader const reader;
auto const filePath = GetPlatform().ReadPathForFile("ugc_types.csv", "wr");
reader.ReadLineByLine(filePath, [this](std::vector<std::string> const & line) {
auto const lineSize = line.size();
ASSERT_EQUAL(lineSize, 4, ());
ASSERT_EQUAL(lineSize - 1, m_masks.size(), ());
UGCTypeMask maskType = UGCTYPE_NONE;
for (size_t i = 1; i < lineSize; i++)
{
int flag;
if (!strings::to_int(line[i], flag))
{
LOG(LERROR, ("File ugc_types.csv must contain a bit mask of supported ugc traits!"));
return;
}
if (flag)
maskType |= m_masks[i - 1];
}
auto const & typeInfo = line.front();
std::istringstream iss(typeInfo);
std::vector<std::string> types{std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>()};
m_matcher.AppendType(types, maskType);
});
}
public:
static bool IsUGCAvailable(feature::TypesHolder const & types)
{
return GetValue(types) != UGCTYPE_NONE;
}
static bool IsRatingAvailable(feature::TypesHolder const & types)
{
return GetValue(types) & UGCTYPE_RATING;
}
static bool IsReviewsAvailable(feature::TypesHolder const & types)
{
return GetValue(types) & UGCTYPE_REVIEWS;
}
static bool IsDetailsAvailable(feature::TypesHolder const & types)
{
return GetValue(types) & UGCTYPE_DETAILS;
}
};
enum class WheelchairAvailability
{
No,
Yes,
Limited
};
inline std::string DebugPrint(WheelchairAvailability wheelchair)
{
switch (wheelchair)
{
case WheelchairAvailability::No: return "No";
case WheelchairAvailability::Yes: return "Yes";
case WheelchairAvailability::Limited: return "Limited";
}
}
class Wheelchair
: public TraitsBase<Wheelchair, WheelchairAvailability, WheelchairAvailability::No>
{
friend class TraitsBase;
using TypesInitializer = std::initializer_list<std::initializer_list<char const *>>;
Wheelchair()
{
m_matcher.Append<TypesInitializer>({{"wheelchair", "no"}}, WheelchairAvailability::No);
m_matcher.Append<TypesInitializer>({{"wheelchair", "yes"}}, WheelchairAvailability::Yes);
m_matcher.Append<TypesInitializer>({{"wheelchair", "limited"}},
WheelchairAvailability::Limited);
}
};
} // namespace ftraits

View file

@ -44,19 +44,26 @@ public:
{
return IsValid(Find(types));
}
template<typename TypesPaths, typename ... Args>
void Append(TypesPaths const & types, Args const & ... args)
template <typename Type, typename... Args>
void AppendType(Type && type, Args &&... args)
{
for (auto const & type : types)
{
#if defined(DEBUG)
feature::TypesHolder holder;
holder.Assign(classif().GetTypeByPath(type));
ASSERT(Find(holder) == m_mapping.cend(), ("This type already exists", type));
#endif
m_mapping.emplace(classif().GetTypeByPath(type), args...);
}
m_mapping.emplace(classif().GetTypeByPath(std::forward<Type>(type)),
std::forward<Args>(args)...);
}
template <typename TypesPaths, typename... Args>
void Append(TypesPaths && types, Args &&... args)
{
// We mustn't forward args in the loop below because it will be forwarded at first iteration.
for (auto const & type : types)
AppendType(type, args...);
}
private:

View file

@ -6,6 +6,7 @@
#include "base/assert.hpp"
#include "base/buffer_vector.hpp"
#include "base/string_utils.hpp"
#include <algorithm>
#include <map>

View file

@ -97,6 +97,7 @@ HEADERS += \
feature_visibility.hpp \
features_offsets_table.hpp \
features_vector.hpp \
ftraits.hpp \
ftypes_mapping.hpp \
ftypes_matcher.hpp \
geometry_coding.hpp \
@ -135,7 +136,6 @@ HEADERS += \
trie_reader.hpp \
types_mapping.hpp \
unique_index.hpp \
wheelchair.hpp \
OTHER_FILES += drules_struct.proto

View file

@ -2,33 +2,36 @@
#include "indexer/classificator.hpp"
#include "indexer/classificator_loader.hpp"
#include "indexer/wheelchair.hpp"
#include "indexer/ftraits.hpp"
UNIT_TEST(Wheelchair_GetType)
{
classificator::Load();
Classificator const & c = classif();
using ftraits::Wheelchair;
using ftraits::WheelchairAvailability;
feature::TypesHolder holder;
{
holder.Assign(c.GetTypeByPath({"wheelchair", "no"}));
TEST_EQUAL(wheelchair::Matcher::GetType(holder), wheelchair::Type::No, ());
TEST_EQUAL(Wheelchair::GetValue(holder), WheelchairAvailability::No, ());
}
{
holder.Assign(c.GetTypeByPath({"wheelchair", "yes"}));
TEST_EQUAL(wheelchair::Matcher::GetType(holder), wheelchair::Type::Yes, ());
TEST_EQUAL(Wheelchair::GetValue(holder), WheelchairAvailability::Yes, ());
}
{
holder.Assign(c.GetTypeByPath({"wheelchair", "limited"}));
TEST_EQUAL(wheelchair::Matcher::GetType(holder), wheelchair::Type::Limited, ());
TEST_EQUAL(Wheelchair::GetValue(holder), WheelchairAvailability::Limited, ());
}
{
holder.Assign(c.GetTypeByPath({"amenity", "dentist"}));
TEST_EQUAL(wheelchair::Matcher::GetType(holder), wheelchair::Type::No, ());
TEST_EQUAL(Wheelchair::GetValue(holder), WheelchairAvailability::No, ());
}
{
holder.Assign(c.GetTypeByPath({"amenity", "dentist"}));
holder.Add(c.GetTypeByPath({"wheelchair", "yes"}));
TEST_EQUAL(wheelchair::Matcher::GetType(holder), wheelchair::Type::Yes, ());
TEST_EQUAL(Wheelchair::GetValue(holder), WheelchairAvailability::Yes, ());
}
}

View file

@ -198,9 +198,9 @@ string MapObject::GetBuildingLevels() const
return m_metadata.Get(feature::Metadata::FMD_BUILDING_LEVELS);
}
wheelchair::Type MapObject::GetWheelchairType() const
ftraits::WheelchairAvailability MapObject::GetWheelchairType() const
{
return wheelchair::Matcher::GetType(m_types);
return ftraits::Wheelchair::GetValue(m_types);
}
feature::Metadata const & MapObject::GetMetadata() const { return m_metadata; }

View file

@ -3,7 +3,7 @@
#include "indexer/feature_data.hpp"
#include "indexer/feature_decl.hpp"
#include "indexer/feature_meta.hpp"
#include "indexer/wheelchair.hpp"
#include "indexer/ftraits.hpp"
#include "geometry/latlon.hpp"
#include "geometry/mercator.hpp"
@ -89,7 +89,7 @@ public:
string GetWikipediaLink() const;
string GetFlats() const;
string GetBuildingLevels() const;
wheelchair::Type GetWheelchairType() const;
ftraits::WheelchairAvailability GetWheelchairType() const;
// TODO(Vlad, yunikkk): Use Props enum + getters instead of direct metadata access.
// TODO: Remove this method.

View file

@ -1,55 +0,0 @@
#pragma once
#include "indexer/feature.hpp"
#include "indexer/feature_data.hpp"
#include "indexer/ftypes_mapping.hpp"
#include <cstdint>
#include <initializer_list>
#include <string>
namespace wheelchair
{
enum class Type
{
No,
Yes,
Limited
};
inline std::string DebugPrint(Type wheelchair)
{
switch (wheelchair)
{
case Type::No: return "No";
case Type::Yes: return "Yes";
case Type::Limited: return "Limited";
}
}
class Matcher
{
public:
static Type GetType(feature::TypesHolder const & types)
{
static Matcher instance;
auto const it = instance.m_matcher.Find(types);
if (!instance.m_matcher.IsValid(it))
return Type::No;
return it->second;
}
private:
using TypesInitializer = std::initializer_list<std::initializer_list<char const *>>;
Matcher()
{
m_matcher.Append<TypesInitializer>({{"wheelchair", "no"}}, Type::No);
m_matcher.Append<TypesInitializer>({{"wheelchair", "yes"}}, Type::Yes);
m_matcher.Append<TypesInitializer>({{"wheelchair", "limited"}}, Type::Limited);
}
ftypes::HashMapMatcher<uint32_t, Type> m_matcher;
};
} // namespace wheelchair

View file

@ -936,6 +936,7 @@
F63AF5121EA6250F00A1DB98 /* FilterCollectionHolderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F63AF5111EA6250F00A1DB98 /* FilterCollectionHolderCell.swift */; };
F63AF5131EA6250F00A1DB98 /* FilterCollectionHolderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F63AF5111EA6250F00A1DB98 /* FilterCollectionHolderCell.swift */; };
F63AF5141EA6250F00A1DB98 /* FilterCollectionHolderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F63AF5111EA6250F00A1DB98 /* FilterCollectionHolderCell.swift */; };
F642D1231F0F9D1D005E3C25 /* ugc_types.csv in Resources */ = {isa = PBXBuildFile; fileRef = F642D1221F0F9D1D005E3C25 /* ugc_types.csv */; };
F64324771EF81316009296F9 /* MWMUGCCommentCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6C0E62C1EF80F9000A4EFAA /* MWMUGCCommentCell.xib */; };
F64324781EF81317009296F9 /* MWMUGCCommentCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6C0E62C1EF80F9000A4EFAA /* MWMUGCCommentCell.xib */; };
F643247A1EF82AD9009296F9 /* UGCSelectImpressionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F64324791EF82AD9009296F9 /* UGCSelectImpressionCell.swift */; };
@ -1044,6 +1045,8 @@
F6BD33841B6240F200F2CE18 /* MWMNavigationView.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6BD33831B6240F200F2CE18 /* MWMNavigationView.mm */; };
F6BD33871B62412E00F2CE18 /* MWMNavigationDashboardEntity.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6BD33861B62412E00F2CE18 /* MWMNavigationDashboardEntity.mm */; };
F6C0E62D1EF80F9000A4EFAA /* MWMUGCCommentCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6C0E62C1EF80F9000A4EFAA /* MWMUGCCommentCell.xib */; };
F6C269F61F14D76F00EB6519 /* ugc_types.csv in Resources */ = {isa = PBXBuildFile; fileRef = F642D1221F0F9D1D005E3C25 /* ugc_types.csv */; };
F6C269F71F14D76F00EB6519 /* ugc_types.csv in Resources */ = {isa = PBXBuildFile; fileRef = F642D1221F0F9D1D005E3C25 /* ugc_types.csv */; };
F6E2FD4F1E097BA00083EBEC /* MWMMapDownloaderAdsTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FBFF1E097B9F0083EBEC /* MWMMapDownloaderAdsTableViewCell.mm */; };
F6E2FD501E097BA00083EBEC /* MWMMapDownloaderAdsTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FBFF1E097B9F0083EBEC /* MWMMapDownloaderAdsTableViewCell.mm */; };
F6E2FD511E097BA00083EBEC /* MWMMapDownloaderAdsTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FBFF1E097B9F0083EBEC /* MWMMapDownloaderAdsTableViewCell.mm */; };
@ -2113,6 +2116,7 @@
F63AF5091EA6213F00A1DB98 /* FilterRatingCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterRatingCell.swift; sourceTree = "<group>"; };
F63AF50D1EA6215100A1DB98 /* FilterPriceCategoryCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterPriceCategoryCell.swift; sourceTree = "<group>"; };
F63AF5111EA6250F00A1DB98 /* FilterCollectionHolderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterCollectionHolderCell.swift; sourceTree = "<group>"; };
F642D1221F0F9D1D005E3C25 /* ugc_types.csv */ = {isa = PBXFileReference; lastKnownFileType = text; name = ugc_types.csv; path = ../../data/ugc_types.csv; sourceTree = "<group>"; };
F64324791EF82AD9009296F9 /* UGCSelectImpressionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UGCSelectImpressionCell.swift; sourceTree = "<group>"; };
F643247D1EF82B21009296F9 /* UGCSelectImpressionCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UGCSelectImpressionCell.xib; sourceTree = "<group>"; };
F64D9C9D1C899C350063FA30 /* MWMEditorViralAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMEditorViralAlert.h; sourceTree = "<group>"; };
@ -4309,6 +4313,7 @@
FA065FC61286143F00FEA989 /* External Resources */ = {
isa = PBXGroup;
children = (
F642D1221F0F9D1D005E3C25 /* ugc_types.csv */,
450703081E9E6CF000E8C029 /* local_ads_symbols.txt */,
BB7626B41E8559980031D71C /* icudt57l.dat */,
4554B6E81E55F02B0084017F /* drules_proto_vehicle_clear.bin */,
@ -4620,6 +4625,7 @@
F6E2FF501E097BA00083EBEC /* MWMAboutControllerHeader.xib in Resources */,
F6E2FE511E097BA00083EBEC /* MWMActionBarButton.xib in Resources */,
F653CE181C71F62400A453F1 /* MWMAddPlaceNavigationBar.xib in Resources */,
F6C269F61F14D76F00EB6519 /* ugc_types.csv in Resources */,
F64F199A1AB81A00006EAF7E /* MWMAlertViewController.xib in Resources */,
341C2A5B1B720B8A00AD41A1 /* MWMAPIBarView.xib in Resources */,
34EE25A51EFA6AD400F870AB /* ViatorElement.xib in Resources */,
@ -4752,6 +4758,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F642D1231F0F9D1D005E3C25 /* ugc_types.csv in Resources */,
34EE25A21EFA68BC00F870AB /* PPViatorCarouselCell.xib in Resources */,
3495433D1EB22D9600F08F73 /* MPAdBrowserController.xib in Resources */,
F64324771EF81316009296F9 /* MWMUGCCommentCell.xib in Resources */,
@ -4976,6 +4983,7 @@
849CF6641DE842290024A8A5 /* MWMAddPlaceNavigationBar.xib in Resources */,
849CF67B1DE842290024A8A5 /* MWMAlertViewController.xib in Resources */,
849CF6621DE842290024A8A5 /* MWMAPIBarView.xib in Resources */,
F6C269F71F14D76F00EB6519 /* ugc_types.csv in Resources */,
F6E2FE651E097BA00083EBEC /* MWMBookmarkCell.xib in Resources */,
F6E2FD961E097BA00083EBEC /* MWMBookmarkColorViewController.xib in Resources */,
34EE25A71EFA6AD400F870AB /* ViatorElement.xib in Resources */,

View file

@ -110,8 +110,7 @@ using namespace place_page;
[Statistics logEvent:kStatPlacepageTaxiShow withParameters:@{ @"provider" : provider }];
}
// TODO: Implement IsUGCAvailableChecker.
if (false /* Is possible to leave review */)
if (m_info.ShouldShowUGC() /* Is possible to leave review */)
{
m_sections.push_back(Sections::UGC);
[self fillUGCSection];

View file

@ -42,6 +42,10 @@ bool Info::ShouldShowEditPlace() const
!IsMyPosition() && IsFeature();
}
bool Info::ShouldShowUGC() const { return ftraits::UGC::IsUGCAvailable(m_types); }
bool Info::ShouldShowUGCRating() const { return ftraits::UGC::IsRatingAvailable(m_types); }
bool Info::ShouldShowUGCReviews() const { return ftraits::UGC::IsReviewsAvailable(m_types); }
bool Info::ShouldShowUGCDetails() const { return ftraits::UGC::IsDetailsAvailable(m_types); }
bool Info::HasApiUrl() const { return !m_apiUrl.empty(); }
bool Info::HasWifi() const { return GetInternet() == osm::Internet::Wlan; }
@ -129,7 +133,7 @@ string Info::GetSubtitle() const
values.push_back(m_localizedWifiString);
// Wheelchair
if (GetWheelchairType() == wheelchair::Type::Yes)
if (GetWheelchairType() == ftraits::WheelchairAvailability::Yes)
values.push_back(kWheelchairSymbol);
return strings::JoinStrings(values, kSubtitleSeparator);

View file

@ -65,6 +65,11 @@ public:
bool ShouldShowAddBusiness() const;
bool ShouldShowEditPlace() const;
bool ShouldShowUGC() const;
bool ShouldShowUGCRating() const;
bool ShouldShowUGCReviews() const;
bool ShouldShowUGCDetails() const;
/// @returns true if Back API button should be displayed.
bool HasApiUrl() const;

View file

@ -85,10 +85,6 @@ protected:
/// Used in Android only to get corret GUI elements layout.
bool m_isTablet;
/// Internal function to get full path for input file.
/// Uses m_writeableDir [w], m_resourcesDir [r], m_settingsDir [s].
string ReadPathForFile(string const & file, string searchScope = string()) const;
/// Returns last system call error as EError.
static EError ErrnoToError();
@ -108,6 +104,8 @@ public:
void SetWritableDirForTests(string const & path);
/// @return full path to file in user's writable directory
string WritablePathForFile(string const & file) const { return WritableDir() + file; }
/// Uses m_writeableDir [w], m_resourcesDir [r], m_settingsDir [s].
string ReadPathForFile(string const & file, string searchScope = string()) const;
/// @return resource dir (on some platforms it's differ from Writable dir)
string ResourcesDir() const { return m_resourcesDir; }

View file

@ -22,7 +22,6 @@
3949172C1BAC3CAC002A8C4F /* libminizip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 394917281BAC3CAC002A8C4F /* libminizip.a */; };
3949172D1BAC3CAC002A8C4F /* libsuccinct.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 394917291BAC3CAC002A8C4F /* libsuccinct.a */; };
394917301BAC3CC9002A8C4F /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 3949172F1BAC3CC9002A8C4F /* libz.tbd */; };
3D489BB61D3D21510052AA38 /* libplatform.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D489BB51D3D21510052AA38 /* libplatform.a */; };
3D489BC01D3D21A00052AA38 /* succinct_mapper_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D489BBA1D3D217E0052AA38 /* succinct_mapper_test.cpp */; };
3D489BC11D3D21A40052AA38 /* simple_dense_coding_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D489BB91D3D217E0052AA38 /* simple_dense_coding_test.cpp */; };
3D489BC21D3D21AA0052AA38 /* fixed_bits_ddvector_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D489BB81D3D217E0052AA38 /* fixed_bits_ddvector_test.cpp */; };
@ -130,6 +129,11 @@
67E8DB771BBC17490053C5BA /* zip_reader_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 67E8DB2D1BBC16C70053C5BA /* zip_reader_test.cpp */; };
BB537C5F1E8490120074D9D3 /* transliteration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB537C5D1E8490120074D9D3 /* transliteration.cpp */; };
BB537C601E8490120074D9D3 /* transliteration.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BB537C5E1E8490120074D9D3 /* transliteration.hpp */; };
F65AFA361F18B8AB00979A50 /* libplatform_tests_support.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F65AFA351F18B8AB00979A50 /* libplatform_tests_support.a */; };
F65AFA381F18C7A500979A50 /* libplatform.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F65AFA371F18C7A500979A50 /* libplatform.a */; };
F6AFCB721F0D633D00E70373 /* csv_file_reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6AFCB701F0D633D00E70373 /* csv_file_reader.cpp */; };
F6AFCB731F0D633D00E70373 /* csv_file_reader.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6AFCB711F0D633D00E70373 /* csv_file_reader.hpp */; };
F6C269FE1F176FFE00EB6519 /* csv_reader_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6C269FD1F176FFE00EB6519 /* csv_reader_test.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -274,6 +278,11 @@
67E8DB2D1BBC16C70053C5BA /* zip_reader_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = zip_reader_test.cpp; sourceTree = "<group>"; };
BB537C5D1E8490120074D9D3 /* transliteration.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transliteration.cpp; sourceTree = "<group>"; };
BB537C5E1E8490120074D9D3 /* transliteration.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transliteration.hpp; sourceTree = "<group>"; };
F65AFA351F18B8AB00979A50 /* libplatform_tests_support.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libplatform_tests_support.a; path = ../platform/build/Debug/libplatform_tests_support.a; sourceTree = "<group>"; };
F65AFA371F18C7A500979A50 /* libplatform.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libplatform.a; path = "../../../../Library/Developer/Xcode/DerivedData/omim-fbvotunmmtqmjnezabjibwxwryev/Build/Products/Debug/libplatform.a"; sourceTree = "<group>"; };
F6AFCB701F0D633D00E70373 /* csv_file_reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csv_file_reader.cpp; sourceTree = "<group>"; };
F6AFCB711F0D633D00E70373 /* csv_file_reader.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = csv_file_reader.hpp; sourceTree = "<group>"; };
F6C269FD1F176FFE00EB6519 /* csv_reader_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csv_reader_test.cpp; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -281,9 +290,10 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
F65AFA381F18C7A500979A50 /* libplatform.a in Frameworks */,
F65AFA361F18B8AB00979A50 /* libplatform_tests_support.a in Frameworks */,
45C108BA1E9CFF8E000FE1F6 /* libgeometry.a in Frameworks */,
3496AB6E1DC1F53500C5DDBA /* libalohalitics.a in Frameworks */,
3D489BB61D3D21510052AA38 /* libplatform.a in Frameworks */,
394917301BAC3CC9002A8C4F /* libz.tbd in Frameworks */,
3949172B1BAC3CAC002A8C4F /* libbase.a in Frameworks */,
3949172C1BAC3CAC002A8C4F /* libminizip.a in Frameworks */,
@ -305,6 +315,8 @@
3496AB6C1DC1F53500C5DDBA /* Frameworks */ = {
isa = PBXGroup;
children = (
F65AFA371F18C7A500979A50 /* libplatform.a */,
F65AFA351F18B8AB00979A50 /* libplatform_tests_support.a */,
45C108B91E9CFF8E000FE1F6 /* libgeometry.a */,
3496AB6D1DC1F53500C5DDBA /* libalohalitics.a */,
);
@ -327,6 +339,7 @@
67E8DB0D1BBC16C70053C5BA /* compressed_bit_vector_test.cpp */,
67E8DB101BBC16C70053C5BA /* dd_vector_test.cpp */,
67E8DB241BBC16C70053C5BA /* uri_test.cpp */,
F6C269FD1F176FFE00EB6519 /* csv_reader_test.cpp */,
67E8DB111BBC16C70053C5BA /* diff_test.cpp */,
67E8DB121BBC16C70053C5BA /* endianness_test.cpp */,
67E8DB131BBC16C70053C5BA /* file_container_test.cpp */,
@ -451,6 +464,8 @@
675342641A3F588B00A0A8C3 /* reader_writer_ops.hpp */,
675342651A3F588B00A0A8C3 /* reader.cpp */,
675342661A3F588B00A0A8C3 /* reader.hpp */,
F6AFCB701F0D633D00E70373 /* csv_file_reader.cpp */,
F6AFCB711F0D633D00E70373 /* csv_file_reader.hpp */,
675342691A3F588B00A0A8C3 /* streams_common.hpp */,
6753426A1A3F588B00A0A8C3 /* streams_sink.hpp */,
6753426B1A3F588B00A0A8C3 /* streams.hpp */,
@ -499,6 +514,7 @@
675342B51A3F588C00A0A8C3 /* reader_cache.hpp in Headers */,
675342CE1A3F588C00A0A8C3 /* varint.hpp in Headers */,
BB537C601E8490120074D9D3 /* transliteration.hpp in Headers */,
F6AFCB731F0D633D00E70373 /* csv_file_reader.hpp in Headers */,
675342D01A3F588C00A0A8C3 /* writer.hpp in Headers */,
675342CA1A3F588C00A0A8C3 /* var_serial_vector.hpp in Headers */,
347F33391C4540F0009758CC /* fixed_bits_ddvector.hpp in Headers */,
@ -658,6 +674,7 @@
67E8DB601BBC17490053C5BA /* file_sort_test.cpp in Sources */,
67E8DB691BBC17490053C5BA /* reader_test.cpp in Sources */,
3D489BC01D3D21A00052AA38 /* succinct_mapper_test.cpp in Sources */,
F6C269FE1F176FFE00EB6519 /* csv_reader_test.cpp in Sources */,
67E8DB561BBC17490053C5BA /* bit_streams_test.cpp in Sources */,
67E8DB651BBC17490053C5BA /* mem_file_writer_test.cpp in Sources */,
67E8DB761BBC17490053C5BA /* zip_creator_test.cpp in Sources */,
@ -686,6 +703,7 @@
675342C51A3F588C00A0A8C3 /* uri.cpp in Sources */,
675342BB1A3F588C00A0A8C3 /* reader.cpp in Sources */,
670BAACB1D0B0C1E000302DA /* huffman.cpp in Sources */,
F6AFCB721F0D633D00E70373 /* csv_file_reader.cpp in Sources */,
6753429C1A3F588C00A0A8C3 /* file_name_utils.cpp in Sources */,
675342A71A3F588C00A0A8C3 /* hex.cpp in Sources */,
675342A31A3F588C00A0A8C3 /* file_writer.cpp in Sources */,

View file

@ -42,7 +42,6 @@
34AF87E61DBE565F00E5E7DC /* helpers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 34AF87E41DBE565F00E5E7DC /* helpers.hpp */; };
34AF87E71DBE567C00E5E7DC /* libindexer_tests_support.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34AF87D71DBE561400E5E7DC /* libindexer_tests_support.a */; };
34AF87E81DBE570200E5E7DC /* helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34AF87E31DBE565F00E5E7DC /* helpers.cpp */; };
3D452AF61EE6D3A0009EAB9B /* wheelchair.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D452AF51EE6D3A0009EAB9B /* wheelchair.hpp */; };
3D452AFA1EE6D9F5009EAB9B /* wheelchair_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AF71EE6D9F5009EAB9B /* wheelchair_tests.cpp */; };
3D452AFB1EE6D9F5009EAB9B /* feature_names_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AF81EE6D9F5009EAB9B /* feature_names_test.cpp */; };
3D452AFC1EE6D9F5009EAB9B /* centers_table_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AF91EE6D9F5009EAB9B /* centers_table_test.cpp */; };
@ -215,6 +214,7 @@
F6381BFA1CD26C9C004CA943 /* new_feature_categories.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6381BF81CD26C9C004CA943 /* new_feature_categories.hpp */; };
F6DF5F2D1CD0FC9D00A87154 /* categories_index.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6DF5F2C1CD0FC9D00A87154 /* categories_index.cpp */; };
F6DF5F311CD0FD9A00A87154 /* categories_index.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6DF5F301CD0FD9A00A87154 /* categories_index.hpp */; };
F6F1DABE1F13D8B4006A69B7 /* ftraits.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6F1DABD1F13D8B4006A69B7 /* ftraits.hpp */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -268,7 +268,6 @@
34AF87D71DBE561400E5E7DC /* libindexer_tests_support.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libindexer_tests_support.a; sourceTree = BUILT_PRODUCTS_DIR; };
34AF87E31DBE565F00E5E7DC /* helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = helpers.cpp; sourceTree = "<group>"; };
34AF87E41DBE565F00E5E7DC /* helpers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = helpers.hpp; sourceTree = "<group>"; };
3D452AF51EE6D3A0009EAB9B /* wheelchair.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = wheelchair.hpp; sourceTree = "<group>"; };
3D452AF71EE6D9F5009EAB9B /* wheelchair_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wheelchair_tests.cpp; sourceTree = "<group>"; };
3D452AF81EE6D9F5009EAB9B /* feature_names_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = feature_names_test.cpp; sourceTree = "<group>"; };
3D452AF91EE6D9F5009EAB9B /* centers_table_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = centers_table_test.cpp; sourceTree = "<group>"; };
@ -443,6 +442,7 @@
F6381BF81CD26C9C004CA943 /* new_feature_categories.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = new_feature_categories.hpp; sourceTree = "<group>"; };
F6DF5F2C1CD0FC9D00A87154 /* categories_index.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = categories_index.cpp; sourceTree = "<group>"; };
F6DF5F301CD0FD9A00A87154 /* categories_index.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = categories_index.hpp; sourceTree = "<group>"; };
F6F1DABD1F13D8B4006A69B7 /* ftraits.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ftraits.hpp; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -652,7 +652,7 @@
6753409C1A3F53CB00A0A8C3 /* indexer */ = {
isa = PBXGroup;
children = (
3D452AF51EE6D3A0009EAB9B /* wheelchair.hpp */,
F6F1DABD1F13D8B4006A69B7 /* ftraits.hpp */,
456B3FB31EDEEB65009B3D1F /* scales_patch.hpp */,
3D74ABBB1EA67C1E0063A898 /* ftypes_mapping.hpp */,
3D928F651D50F9FE001670E0 /* index_helpers.cpp */,
@ -839,6 +839,7 @@
3D74ABBC1EA67C1E0063A898 /* ftypes_mapping.hpp in Headers */,
670D04AD1B0BA8580013A7AC /* interval_index_101.hpp in Headers */,
67BC92F51D21476500A4A378 /* string_slice.hpp in Headers */,
F6F1DABE1F13D8B4006A69B7 /* ftraits.hpp in Headers */,
675341271A3F540F00A0A8C3 /* features_vector.hpp in Headers */,
6753413D1A3F540F00A0A8C3 /* scale_index_builder.hpp in Headers */,
675341021A3F540F00A0A8C3 /* classificator_loader.hpp in Headers */,
@ -859,7 +860,6 @@
6753414B1A3F540F00A0A8C3 /* tesselator_decl.hpp in Headers */,
F61F83071E4B187500B37B7A /* road_shields_parser.hpp in Headers */,
347F33801C454242009758CC /* trie_reader.hpp in Headers */,
3D452AF61EE6D3A0009EAB9B /* wheelchair.hpp in Headers */,
675341191A3F540F00A0A8C3 /* feature_decl.hpp in Headers */,
674125141B4C02F100A3E828 /* map_style_reader.hpp in Headers */,
675341221A3F540F00A0A8C3 /* feature_utils.hpp in Headers */,