diff options
26 files changed, 454 insertions, 87 deletions
diff --git a/android/assets/ugc_types.csv b/android/assets/ugc_types.csv new file mode 120000 index 0000000000..840ffa236b --- /dev/null +++ b/android/assets/ugc_types.csv @@ -0,0 +1 @@ +../../data/ugc_types.csv
\ No newline at end of file diff --git a/android/script/replace_links.bat b/android/script/replace_links.bat index 1f67247bc5..c42217cab9 100644 --- a/android/script/replace_links.bat +++ b/android/script/replace_links.bat @@ -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/ diff --git a/coding/CMakeLists.txt b/coding/CMakeLists.txt index 246bb52086..4bf68cbf1f 100644 --- a/coding/CMakeLists.txt +++ b/coding/CMakeLists.txt @@ -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 diff --git a/coding/coding.pro b/coding/coding.pro index 6acb942504..3efe6e381b 100644 --- a/coding/coding.pro +++ b/coding/coding.pro @@ -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 \ diff --git a/coding/coding_tests/CMakeLists.txt b/coding/coding_tests/CMakeLists.txt index 5171fd00cf..7c4589c2c8 100644 --- a/coding/coding_tests/CMakeLists.txt +++ b/coding/coding_tests/CMakeLists.txt @@ -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}) diff --git a/coding/coding_tests/coding_tests.pro b/coding/coding_tests/coding_tests.pro index 5e4ad89056..90b45fc6cf 100644 --- a/coding/coding_tests/coding_tests.pro +++ b/coding/coding_tests/coding_tests.pro @@ -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 \ diff --git a/coding/coding_tests/csv_reader_test.cpp b/coding/coding_tests/csv_reader_test.cpp new file mode 100644 index 0000000000..92a92ffd18 --- /dev/null +++ b/coding/coding_tests/csv_reader_test.cpp @@ -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, ()); }); +} diff --git a/coding/csv_file_reader.cpp b/coding/csv_file_reader.cpp new file mode 100644 index 0000000000..d5984d424b --- /dev/null +++ b/coding/csv_file_reader.cpp @@ -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 diff --git a/coding/csv_file_reader.hpp b/coding/csv_file_reader.hpp new file mode 100644 index 0000000000..f225942ad5 --- /dev/null +++ b/coding/csv_file_reader.hpp @@ -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 diff --git a/data/ugc_types.csv b/data/ugc_types.csv new file mode 100644 index 0000000000..d22713fec4 --- /dev/null +++ b/data/ugc_types.csv @@ -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 diff --git a/indexer/CMakeLists.txt b/indexer/CMakeLists.txt index 0cc3afb483..943505c0e1 100644 --- a/indexer/CMakeLists.txt +++ b/indexer/CMakeLists.txt @@ -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( diff --git a/indexer/ftraits.hpp b/indexer/ftraits.hpp new file mode 100644 index 0000000000..d4a6133921 --- /dev/null +++ b/indexer/ftraits.hpp @@ -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 diff --git a/indexer/ftypes_mapping.hpp b/indexer/ftypes_mapping.hpp index 32dfb36008..d21553be1b 100644 --- a/indexer/ftypes_mapping.hpp +++ b/indexer/ftypes_mapping.hpp @@ -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: diff --git a/indexer/ftypes_matcher.cpp b/indexer/ftypes_matcher.cpp index 8bf229a034..87466d0123 100644 --- a/indexer/ftypes_matcher.cpp +++ b/indexer/ftypes_matcher.cpp @@ -6,6 +6,7 @@ #include "base/assert.hpp" #include "base/buffer_vector.hpp" +#include "base/string_utils.hpp" #include <algorithm> #include <map> diff --git a/indexer/indexer.pro b/indexer/indexer.pro index 306648bf39..eaf272d32f 100644 --- a/indexer/indexer.pro +++ b/indexer/indexer.pro @@ -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 diff --git a/indexer/indexer_tests/wheelchair_tests.cpp b/indexer/indexer_tests/wheelchair_tests.cpp index 642955596f..921f9452dd 100644 --- a/indexer/indexer_tests/wheelchair_tests.cpp +++ b/indexer/indexer_tests/wheelchair_tests.cpp @@ -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, ()); } } diff --git a/indexer/map_object.cpp b/indexer/map_object.cpp index 3db6a7e40c..34dac74c6b 100644 --- a/indexer/map_object.cpp +++ b/indexer/map_object.cpp @@ -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; } diff --git a/indexer/map_object.hpp b/indexer/map_object.hpp index b144baa8b2..b3b969c38c 100644 --- a/indexer/map_object.hpp +++ b/indexer/map_object.hpp @@ -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. diff --git a/indexer/wheelchair.hpp b/indexer/wheelchair.hpp deleted file mode 100644 index 815094f186..0000000000 --- a/indexer/wheelchair.hpp +++ /dev/null @@ -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 diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 06459b5b24..8d311cc055 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -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 */, diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm index 3379f334a6..a2b1fa7d0d 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm @@ -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]; diff --git a/map/place_page_info.cpp b/map/place_page_info.cpp index c363a428a0..7005266697 100644 --- a/map/place_page_info.cpp +++ b/map/place_page_info.cpp @@ -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); diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index 154a926d05..b320fcbe9c 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -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; diff --git a/platform/platform.hpp b/platform/platform.hpp index 28b8291808..25c31816cf 100644 --- a/platform/platform.hpp +++ b/platform/platform.hpp @@ -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; } diff --git a/xcode/coding/coding.xcodeproj/project.pbxproj b/xcode/coding/coding.xcodeproj/project.pbxproj index 2b1431e0d7..832c5d4dc6 100644 --- a/xcode/coding/coding.xcodeproj/project.pbxproj +++ b/xcode/coding/coding.xcodeproj/project.pbxproj @@ -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 */, diff --git a/xcode/indexer/indexer.xcodeproj/project.pbxproj b/xcode/indexer/indexer.xcodeproj/project.pbxproj index b392a3b768..197054f8e6 100644 --- a/xcode/indexer/indexer.xcodeproj/project.pbxproj +++ b/xcode/indexer/indexer.xcodeproj/project.pbxproj @@ -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 */, |