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:
l---------android/assets/ugc_types.csv1
-rw-r--r--android/script/replace_links.bat1
-rw-r--r--coding/CMakeLists.txt2
-rw-r--r--coding/coding.pro2
-rw-r--r--coding/coding_tests/CMakeLists.txt3
-rw-r--r--coding/coding_tests/coding_tests.pro11
-rw-r--r--coding/coding_tests/csv_reader_test.cpp73
-rw-r--r--coding/csv_file_reader.cpp45
-rw-r--r--coding/csv_file_reader.hpp28
-rw-r--r--data/ugc_types.csv78
-rw-r--r--indexer/CMakeLists.txt2
-rw-r--r--indexer/ftraits.hpp139
-rw-r--r--indexer/ftypes_mapping.hpp17
-rw-r--r--indexer/ftypes_matcher.cpp1
-rw-r--r--indexer/indexer.pro2
-rw-r--r--indexer/indexer_tests/wheelchair_tests.cpp15
-rw-r--r--indexer/map_object.cpp4
-rw-r--r--indexer/map_object.hpp4
-rw-r--r--indexer/wheelchair.hpp55
-rw-r--r--iphone/Maps/Maps.xcodeproj/project.pbxproj8
-rw-r--r--iphone/Maps/UI/PlacePage/MWMPlacePageData.mm3
-rw-r--r--map/place_page_info.cpp6
-rw-r--r--map/place_page_info.hpp5
-rw-r--r--platform/platform.hpp6
-rw-r--r--xcode/coding/coding.xcodeproj/project.pbxproj22
-rw-r--r--xcode/indexer/indexer.xcodeproj/project.pbxproj8
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 */,