From 648552f5e182c4b4819117610ef1be5d2453af27 Mon Sep 17 00:00:00 2001 From: Maxim Pimenov Date: Thu, 20 Jun 2019 13:58:03 +0300 Subject: [PATCH] [indexer] Interface for the FeatureId <-> OsmId map. Better encoding, versioning, etc. will come later. --- base/CMakeLists.txt | 1 + base/base_tests/CMakeLists.txt | 1 + base/base_tests/bidirectional_map_tests.cpp | 16 ++++ base/bidirectional_map.hpp | 84 ++++++++++++++++++ defines.hpp | 1 + generator/CMakeLists.txt | 33 +++---- generator/cities_boundaries_builder.cpp | 5 +- generator/cities_fid_bimap_builder.cpp | 71 +++++++++++++++ generator/cities_fid_bimap_builder.hpp | 13 +++ generator/generator_tool/generator_tool.cpp | 10 +++ indexer/CMakeLists.txt | 26 +++--- indexer/fid_bimap.cpp | 73 +++++++++++++++ indexer/fid_bimap.hpp | 88 +++++++++++++++++++ indexer/indexer_tests/CMakeLists.txt | 1 + indexer/indexer_tests/fid_bimap_tests.cpp | 62 +++++++++++++ xcode/base/base.xcodeproj/project.pbxproj | 20 +++-- .../generator.xcodeproj/project.pbxproj | 8 ++ .../indexer/indexer.xcodeproj/project.pbxproj | 12 +++ 18 files changed, 490 insertions(+), 35 deletions(-) create mode 100644 base/base_tests/bidirectional_map_tests.cpp create mode 100644 base/bidirectional_map.hpp create mode 100644 generator/cities_fid_bimap_builder.cpp create mode 100644 generator/cities_fid_bimap_builder.hpp create mode 100644 indexer/fid_bimap.cpp create mode 100644 indexer/fid_bimap.hpp create mode 100644 indexer/indexer_tests/fid_bimap_tests.cpp diff --git a/base/CMakeLists.txt b/base/CMakeLists.txt index 665598bcdc..eb86eba0ab 100644 --- a/base/CMakeLists.txt +++ b/base/CMakeLists.txt @@ -8,6 +8,7 @@ set( base.cpp base.hpp beam.hpp + bidirectional_map.hpp bits.hpp buffer_vector.hpp bwt.cpp diff --git a/base/base_tests/CMakeLists.txt b/base/base_tests/CMakeLists.txt index 20f17b1e9a..1b69fab526 100644 --- a/base/base_tests/CMakeLists.txt +++ b/base/base_tests/CMakeLists.txt @@ -6,6 +6,7 @@ set( SRC assert_test.cpp beam_tests.cpp + bidirectional_map_tests.cpp bits_test.cpp buffer_vector_test.cpp bwt_tests.cpp diff --git a/base/base_tests/bidirectional_map_tests.cpp b/base/base_tests/bidirectional_map_tests.cpp new file mode 100644 index 0000000000..fb710b9242 --- /dev/null +++ b/base/base_tests/bidirectional_map_tests.cpp @@ -0,0 +1,16 @@ +#include "testing/testing.hpp" + +#include "base/bidirectional_map.hpp" + +#include + +using namespace base; +using namespace std; + +UNIT_TEST(BidirectionalMap_Smoke) +{ + BidirectionalMap m; + m.Add(1, "a"); + TEST_EQUAL(m.MustGetValue(1), "a", ()); + TEST_EQUAL(m.MustGetKey("a"), 1, ()); +} diff --git a/base/bidirectional_map.hpp b/base/bidirectional_map.hpp new file mode 100644 index 0000000000..61651df91b --- /dev/null +++ b/base/bidirectional_map.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include "base/assert.hpp" +#include "base/logging.hpp" + +#include +#include + +namespace base +{ +template +class BidirectionalMap +{ +public: + BidirectionalMap() = default; + + size_t Size() const { return m_kToV.size(); } + void Clear() + { + m_kToV.clear(); + m_vToK.clear(); + } + + void Add(K const & k, V const & v) + { + auto const resKV = m_kToV.emplace(k, v); + if (!resKV.second) + { + LOG(LWARNING, + ("Duplicate key in a BidirectionalMap:", k, "old value:", m_kToV.at(k), "new value:", v)); + } + + auto const resVK = m_vToK.emplace(v, k); + if (!resVK.second) + { + LOG(LWARNING, + ("Duplicate value in a BidirectionalMap:", v, "old key:", m_vToK.at(v), "new key:", k)); + } + } + + template + void ForEachEntry(Fn && fn) const + { + for (auto const & e : m_kToV) + fn(e.first, e.second); + } + + bool GetValue(K const & key, V & value) const + { + auto const it = m_kToV.find(key); + if (it == m_kToV.end()) + return false; + value = it->second; + return true; + } + + bool GetKey(V const & value, K & key) const + { + auto const it = m_vToK.find(value); + if (it == m_vToK.end()) + return false; + key = it->second; + return true; + } + + V MustGetValue(K const & key) const + { + V result; + CHECK(GetValue(key, result), ()); + return result; + } + + K MustGetKey(V const & value) const + { + K result; + CHECK(GetKey(value, result), ()); + return result; + } + +private: + std::unordered_map m_kToV; + std::unordered_map m_vToK; +}; +} // namespace base diff --git a/defines.hpp b/defines.hpp index 22dfc9807e..9d1fa59a27 100644 --- a/defines.hpp +++ b/defines.hpp @@ -30,6 +30,7 @@ #define SEARCH_INDEX_FILE_TAG "sdx" #define SEARCH_ADDRESS_FILE_TAG "addr" #define CITIES_BOUNDARIES_FILE_TAG "cities_boundaries" +#define CITIES_FID_BIMAP_FILE_TAG "cities_fid_bimap" #define HEADER_FILE_TAG "header" #define VERSION_FILE_TAG "version" #define METADATA_FILE_TAG "meta" diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt index 40c1ab5a97..fe18ad8dbd 100644 --- a/generator/CMakeLists.txt +++ b/generator/CMakeLists.txt @@ -5,7 +5,8 @@ include_directories( ${OMIM_ROOT}/3party/jansson/src ) -set(SRC +set( + SRC altitude_generator.cpp altitude_generator.hpp booking_dataset.cpp @@ -26,6 +27,8 @@ set(SRC cities_boundaries_builder.hpp cities_boundaries_checker.cpp cities_boundaries_checker.hpp + cities_fid_bimap_builder.cpp + cities_fid_bimap_builder.hpp city_boundary_processor.cpp city_boundary_processor.hpp city_roads_generator.cpp @@ -87,13 +90,13 @@ set(SRC filter_planet.hpp gen_mwm_info.hpp generate_info.hpp - geometry_holder.hpp - geo_objects/geo_objects.cpp - geo_objects/geo_objects.hpp geo_objects/geo_object_info_getter.cpp geo_objects/geo_object_info_getter.hpp + geo_objects/geo_objects.cpp + geo_objects/geo_objects.hpp geo_objects/geo_objects_filter.cpp geo_objects/geo_objects_filter.hpp + geometry_holder.hpp holes.cpp holes.hpp intermediate_data.cpp @@ -127,23 +130,19 @@ set(SRC osm_o5m_source.hpp osm_source.cpp osm_xml_source.hpp - polygonizer.hpp - popularity.cpp - popularity.hpp - popular_places_section_builder.cpp - popular_places_section_builder.hpp - place.hpp place.cpp + place.hpp place_node.hpp platform_helpers.cpp platform_helpers.hpp + polygonizer.hpp + popular_places_section_builder.cpp + popular_places_section_builder.hpp + popularity.cpp + popularity.hpp promo_catalog_cities.hpp ratings_section_builder.cpp ratings_section_builder.hpp - relation_tags.cpp - relation_tags.hpp - relation_tags_enricher.cpp - relation_tags_enricher.hpp region_meta.cpp region_meta.hpp regions/collector_region_info.cpp @@ -170,6 +169,10 @@ set(SRC regions/regions_fixer.hpp regions/specs/rus.cpp regions/specs/rus.hpp + relation_tags.cpp + relation_tags.hpp + relation_tags_enricher.cpp + relation_tags_enricher.hpp restriction_collector.cpp restriction_collector.hpp restriction_generator.cpp @@ -243,8 +246,8 @@ set(SRC unpack_mwm.hpp utils.cpp utils.hpp - ways_merger.hpp ways_merger.cpp + ways_merger.hpp wiki_url_dumper.cpp wiki_url_dumper.hpp world_map_generator.hpp diff --git a/generator/cities_boundaries_builder.cpp b/generator/cities_boundaries_builder.cpp index fb587e30be..6bf87db6cc 100644 --- a/generator/cities_boundaries_builder.cpp +++ b/generator/cities_boundaries_builder.cpp @@ -63,9 +63,9 @@ CBV GetLocalities(string const & dataPath) auto const result = dataSource.Register(platform::LocalCountryFile::MakeTemporary(dataPath)); CHECK_EQUAL(result.second, MwmSet::RegResult::Success, ("Can't register", dataPath)); - search::MwmContext context(dataSource.GetMwmHandleById(result.first)); + MwmContext context(dataSource.GetMwmHandleById(result.first)); ::base::Cancellable const cancellable; - return search::CategoriesCache(LocalitiesSource{}, cancellable).Get(context); + return CategoriesCache(LocalitiesSource{}, cancellable).Get(context); } template @@ -107,6 +107,7 @@ bool BuildCitiesBoundaries(string const & dataPath, string const & osmToFeatureP return BuildCitiesBoundaries(dataPath, table, [&]() -> unique_ptr { Mapping mapping; + // todo(@m) Use osmToFeaturePath? if (!ParseFeatureIdToOsmIdMapping(dataPath + OSM2FEATURE_FILE_EXTENSION, mapping)) { LOG(LERROR, ("Can't parse feature id to osm id mapping.")); diff --git a/generator/cities_fid_bimap_builder.cpp b/generator/cities_fid_bimap_builder.cpp new file mode 100644 index 0000000000..df18f664ae --- /dev/null +++ b/generator/cities_fid_bimap_builder.cpp @@ -0,0 +1,71 @@ +#include "generator/cities_fid_bimap_builder.hpp" + +#include "generator/utils.hpp" + +#include "indexer/classificator_loader.hpp" + +#include "search/categories_cache.hpp" +#include "search/cbv.hpp" +#include "search/localities_source.hpp" +#include "search/mwm_context.hpp" + +#include "coding/file_container.hpp" +#include "coding/file_writer.hpp" + +#include "base/cancellable.hpp" +#include "base/checked_cast.hpp" + +#include + +#include "defines.hpp" + +namespace +{ +// todo(@m) Borrowed from CitiesBoundariesBuilder. Either factor out or get rid of. +search::CBV GetLocalities(std::string const & dataPath) +{ + FrozenDataSource dataSource; + auto const result = dataSource.Register(platform::LocalCountryFile::MakeTemporary(dataPath)); + CHECK_EQUAL(result.second, MwmSet::RegResult::Success, ("Can't register", dataPath)); + + search::MwmContext context(dataSource.GetMwmHandleById(result.first)); + ::base::Cancellable const cancellable; + return search::CategoriesCache(search::LocalitiesSource{}, cancellable).Get(context); +} +} // namespace + +namespace generator +{ +// todo(@m) This should be built only for World.mwm. +bool BuildCitiesFidBimap(std::string const & dataPath, std::string const & osmToFeaturePath) +{ + classificator::Load(); + + std::unordered_map mapping; + if (!ParseFeatureIdToOsmIdMapping(osmToFeaturePath, mapping)) + { + LOG(LERROR, ("Can't parse feature id to osm id mapping.")); + return false; + } + + indexer::FeatureIdToGeoObjectIdBimapBuilder builder; + + auto const localities = GetLocalities(dataPath); + localities.ForEach([&](uint64_t fid) { + auto it = mapping.find(base::checked_cast(fid)); + if (it != mapping.end()) + builder.Add(it->first, it->second); + }); + + FilesContainerW container(dataPath, FileWriter::OP_WRITE_EXISTING); + FileWriter sink = container.GetWriter(CITIES_FID_BIMAP_FILE_TAG); + auto const pos0 = sink.Pos(); + builder.Serialize(sink); + auto const pos1 = sink.Pos(); + + LOG(LINFO, + ("Serialized fid bimap. Number of entries:", builder.Size(), "Size in bytes:", pos1 - pos0)); + + return true; +} +} // namespace generator diff --git a/generator/cities_fid_bimap_builder.hpp b/generator/cities_fid_bimap_builder.hpp new file mode 100644 index 0000000000..79ea1be17b --- /dev/null +++ b/generator/cities_fid_bimap_builder.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "indexer/fid_bimap.hpp" + +#include + +namespace generator +{ +// Takes the FeatureID <-> base::GeoObjectId bidirectional map for features +// corresponding to cities from |osmToFeaturePath| and serializes it +// as a section in the mwm file at |dataPath|. +bool BuildCitiesFidBimap(std::string const & dataPath, std::string const & osmToFeaturePath); +} // namespace generator diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index 07427cf95f..635ce6c7d1 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -4,6 +4,7 @@ #include "generator/centers_table_builder.hpp" #include "generator/check_model.hpp" #include "generator/cities_boundaries_builder.hpp" +#include "generator/cities_fid_bimap_builder.hpp" #include "generator/city_roads_generator.hpp" #include "generator/descriptions_section_builder.hpp" #include "generator/dumper.hpp" @@ -134,6 +135,8 @@ DEFINE_bool(dump_cities_boundaries, false, "Dump cities boundaries to a file"); DEFINE_bool(generate_cities_boundaries, false, "Generate cities boundaries section"); DEFINE_string(cities_boundaries_data, "", "File with cities boundaries"); +DEFINE_bool(generate_cities_fid_bimap, false, "Generate cities fid bimap, todo(@m)"); + DEFINE_bool(generate_world, false, "Generate separate world file."); DEFINE_bool(split_by_polygons, false, "Use countries borders to split planet by regions and countries."); @@ -589,6 +592,13 @@ int GeneratorToolMain(int argc, char ** argv) LOG(LCRITICAL, ("Error generating cities boundaries.")); } + if (FLAGS_generate_cities_fid_bimap) + { + LOG(LINFO, ("Generating cities fid bimap for", datFile)); + if (!generator::BuildCitiesFidBimap(datFile, osmToFeatureFilename)) + LOG(LCRITICAL, ("Error generating cities fid bimap.")); + } + if (!FLAGS_srtm_path.empty()) routing::BuildRoadAltitudes(datFile, FLAGS_srtm_path); diff --git a/indexer/CMakeLists.txt b/indexer/CMakeLists.txt index 33ded896ca..9a8a0bf5f7 100644 --- a/indexer/CMakeLists.txt +++ b/indexer/CMakeLists.txt @@ -25,9 +25,9 @@ set( cities_boundaries_serdes.hpp city_boundary.hpp classificator.cpp + classificator.hpp classificator_loader.cpp classificator_loader.hpp - classificator.hpp cuisines.cpp cuisines.hpp data_factory.cpp @@ -43,16 +43,18 @@ set( drawing_rules.cpp drawing_rules.hpp drules_include.hpp - drules_selector_parser.cpp - drules_selector_parser.hpp drules_selector.cpp drules_selector.hpp + drules_selector_parser.cpp + drules_selector_parser.hpp drules_struct.pb.cc drules_struct.pb.h editable_map_object.cpp editable_map_object.hpp fake_feature_ids.cpp fake_feature_ids.hpp + feature.cpp + feature.hpp feature_algo.cpp feature_algo.hpp feature_altitude.hpp @@ -73,12 +75,12 @@ set( feature_utils.hpp feature_visibility.cpp feature_visibility.hpp - feature.cpp - feature.hpp features_offsets_table.cpp features_offsets_table.hpp features_vector.cpp features_vector.hpp + fid_bimap.cpp + fid_bimap.hpp ftraits.hpp ftypes_matcher.cpp ftypes_matcher.hpp @@ -86,19 +88,19 @@ set( ftypes_sponsored.hpp index_builder.cpp index_builder.hpp - interval_index_builder.hpp interval_index.hpp + interval_index_builder.hpp locality_index.hpp - locality_index_builder.hpp locality_index_builder.cpp - locality_object.hpp + locality_index_builder.hpp locality_object.cpp + locality_object.hpp map_object.cpp map_object.hpp - map_style_reader.cpp - map_style_reader.hpp map_style.cpp map_style.hpp + map_style_reader.cpp + map_style_reader.hpp mwm_set.cpp mwm_set.hpp postcodes_matcher.cpp # it's in indexer due to editor which is in indexer and depends on postcodes_marcher @@ -107,8 +109,8 @@ set( rank_table.hpp road_shields_parser.cpp road_shields_parser.hpp - scale_index_builder.hpp scale_index.hpp + scale_index_builder.hpp scales.cpp scales.hpp scales_patch.hpp @@ -124,9 +126,9 @@ set( succinct_trie_builder.hpp succinct_trie_reader.hpp tree_structure.hpp + trie.hpp trie_builder.hpp trie_reader.hpp - trie.hpp types_mapping.cpp types_mapping.hpp unique_index.hpp diff --git a/indexer/fid_bimap.cpp b/indexer/fid_bimap.cpp new file mode 100644 index 0000000000..a3365933bc --- /dev/null +++ b/indexer/fid_bimap.cpp @@ -0,0 +1,73 @@ +#include "indexer/fid_bimap.hpp" + +#include "search/utils.hpp" + +#include "indexer/data_source.hpp" +#include "indexer/mwm_set.hpp" + +#include "coding/reader.hpp" + +#include "base/macros.hpp" + +#include "defines.hpp" + +namespace indexer +{ +FeatureIdToGeoObjectIdBimap::FeatureIdToGeoObjectIdBimap(DataSource const & dataSource) + : m_dataSource(dataSource) +{ +} + +bool FeatureIdToGeoObjectIdBimap::Load() +{ + auto handle = search::FindWorld(m_dataSource); + if (!handle.IsAlive()) + { + LOG(LWARNING, ("Can't find World map file.")); + return false; + } + + if (handle.GetId() == m_mwmId) + return true; + + auto const & cont = handle.GetValue()->m_cont; + + if (!cont.IsExist(CITIES_FID_BIMAP_FILE_TAG)) + { + LOG(LWARNING, ("No cities fid bimap in the world map.")); + return false; + } + + try + { + auto reader = cont.GetReader(CITIES_FID_BIMAP_FILE_TAG); + ReaderSource> source(reader); + Deserialize(source); + } + catch (Reader::Exception const & e) + { + LOG(LERROR, ("Can't read cities fid bimap from the world map:", e.Msg())); + return false; + } + + m_mwmId = handle.GetId(); + return true; +} + +bool FeatureIdToGeoObjectIdBimap::GetGeoObjectId(FeatureID const & fid, base::GeoObjectId & id) +{ + if (fid.m_mwmId != m_mwmId) + { + LOG(LWARNING, ("Wrong mwm: feature has", fid.m_mwmId, "expected:", m_mwmId)); + return false; + } + + return m_map.GetValue(fid.m_index, id); +} + +bool FeatureIdToGeoObjectIdBimap::GetFeatureID(base::GeoObjectId const & id, FeatureID & fid) +{ + NOTIMPLEMENTED(); + return false; +} +} // namespace indexer diff --git a/indexer/fid_bimap.hpp b/indexer/fid_bimap.hpp new file mode 100644 index 0000000000..9242027cd9 --- /dev/null +++ b/indexer/fid_bimap.hpp @@ -0,0 +1,88 @@ +#pragma once + +#include "indexer/data_source.hpp" +#include "indexer/feature_decl.hpp" + +#include "coding/varint.hpp" + +#include "base/bidirectional_map.hpp" +#include "base/checked_cast.hpp" +#include "base/geo_object_id.hpp" + +#include +#include + +class DataSource; + +namespace indexer +{ +// A serializable bidirectional map of FeatureIds from a single +// mwm of a fixed version to GeoObjectIds. +// Currently, only World.mwm of the latest version is supported. +class FeatureIdToGeoObjectIdBimap +{ +public: + explicit FeatureIdToGeoObjectIdBimap(DataSource const & dataSource); + + bool Load(); + + bool GetGeoObjectId(FeatureID const & fid, base::GeoObjectId & id); + + bool GetFeatureID(base::GeoObjectId const & id, FeatureID & fid); + + // todo(@m) Rename to ForEachEntryForTesting or, better yet, remove. + template + void ForEachEntry(Fn && fn) const + { + m_map.ForEachEntry(std::forward(fn)); + } + + template + void Deserialize(Source & src) + { + m_map.Clear(); + auto const numEntries = ReadPrimitiveFromSource(src); + for (size_t i = 0; i < numEntries; ++i) + { + auto const fid = ReadVarUint(src); + auto const gid = ReadVarUint(src); + m_map.Add(fid, base::GeoObjectId(gid)); + } + } + +private: + DataSource const & m_dataSource; + MwmSet::MwmId m_mwmId; + + base::BidirectionalMap m_map; +}; + +class FeatureIdToGeoObjectIdBimapBuilder +{ +public: + void Add(FeatureID const & fid, base::GeoObjectId const & gid) { m_map.Add(fid.m_index, gid); } + + void Add(uint32_t fid, base::GeoObjectId const & gid) { m_map.Add(fid, gid); } + + template + void Serialize(Sink & sink) + { + WriteToSink(sink, base::checked_cast(m_map.Size())); + m_map.ForEachEntry([&sink](uint32_t const fid, base::GeoObjectId gid) { + WriteVarUint(sink, fid); + WriteVarUint(sink, gid.GetEncodedId()); + }); + } + + size_t Size() const { return m_map.Size(); } + + template + void ForEachEntry(Fn && fn) const + { + m_map.ForEachEntry(std::forward(fn)); + } + +private: + base::BidirectionalMap m_map; +}; +} // namespace indexer diff --git a/indexer/indexer_tests/CMakeLists.txt b/indexer/indexer_tests/CMakeLists.txt index d3baac2840..c667ae7206 100644 --- a/indexer/indexer_tests/CMakeLists.txt +++ b/indexer/indexer_tests/CMakeLists.txt @@ -19,6 +19,7 @@ set( feature_names_test.cpp features_offsets_table_test.cpp features_vector_test.cpp + fid_bimap_tests.cpp index_builder_test.cpp interval_index_test.cpp locality_index_test.cpp diff --git a/indexer/indexer_tests/fid_bimap_tests.cpp b/indexer/indexer_tests/fid_bimap_tests.cpp new file mode 100644 index 0000000000..a63234d383 --- /dev/null +++ b/indexer/indexer_tests/fid_bimap_tests.cpp @@ -0,0 +1,62 @@ +#include "testing/testing.hpp" + +#include "indexer/feature_decl.hpp" +#include "indexer/fid_bimap.hpp" + +#include "platform/mwm_version.hpp" + +#include "coding/reader.hpp" +#include "coding/writer.hpp" + +#include "base/geo_object_id.hpp" + +#include +#include +#include +#include +#include + +using namespace indexer; +using namespace std; + +namespace +{ +using Entries = vector>; + +template +Entries GetEntries(Cont const & cont) +{ + Entries res; + cont.ForEachEntry([&res](uint32_t const fid, base::GeoObjectId const & gid) { + res.emplace_back(make_pair(fid, gid)); + }); + sort(res.begin(), res.end()); + return res; +}; +} // namespace + +UNIT_TEST(FeatureIdToGeoObjectIdBimap_Smoke) +{ + FrozenDataSource dataSource; + + FeatureIdToGeoObjectIdBimapBuilder origM; + origM.Add(FeatureID(), base::MakeOsmWay(123)); + + vector buf; + { + MemWriter writer(buf); + origM.Serialize(writer); + } + + FeatureIdToGeoObjectIdBimap deserM(dataSource); + { + MemReader reader(buf.data(), buf.size()); + ReaderSource src(reader); + deserM.Deserialize(src); + } + + Entries expectedEntries = GetEntries(origM); + Entries actualEntries = GetEntries(deserM); + TEST(!expectedEntries.empty(), ()); + TEST_EQUAL(expectedEntries, actualEntries, ()); +} diff --git a/xcode/base/base.xcodeproj/project.pbxproj b/xcode/base/base.xcodeproj/project.pbxproj index a2a155b84f..f67005eaba 100644 --- a/xcode/base/base.xcodeproj/project.pbxproj +++ b/xcode/base/base.xcodeproj/project.pbxproj @@ -38,6 +38,10 @@ 3917FA6A211E010400937DF4 /* control_flow_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39B89C391FD1898A001104AF /* control_flow_tests.cpp */; }; 3917FA6B211E010400937DF4 /* small_set_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 67E40EC71E4DC0D500A6D200 /* small_set_test.cpp */; }; 395FEB3521492F350036395C /* stl_helpers_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 395FEB3321492F320036395C /* stl_helpers_tests.cpp */; }; + 397DC50D22BB8EBF007126DB /* bidirectional_map.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 397DC50B22BB8EBF007126DB /* bidirectional_map.hpp */; }; + 397DC50E22BB8EBF007126DB /* non_intersecting_intervals.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 397DC50C22BB8EBF007126DB /* non_intersecting_intervals.hpp */; }; + 397DC51122BB8ED2007126DB /* bidirectional_map_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397DC50F22BB8ECD007126DB /* bidirectional_map_tests.cpp */; }; + 397DC51222BB8ED2007126DB /* non_intersecting_intervals_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F61B9796229BFDF1000E878B /* non_intersecting_intervals_tests.cpp */; }; 39BC0FD01FD057FA00B6C276 /* control_flow.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 39BC0FCF1FD057F900B6C276 /* control_flow.hpp */; }; 39F1E52F21C961A900D961DC /* beam.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 39F1E52E21C961A800D961DC /* beam.hpp */; }; 39F1E53121C961B800D961DC /* beam_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39F1E53021C961B800D961DC /* beam_tests.cpp */; }; @@ -78,7 +82,6 @@ 3D74EF151F8B902C0081202C /* bwt.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D74EF0F1F8B902C0081202C /* bwt.hpp */; }; 3D7815731F3A145F0068B6AC /* task_loop.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D7815711F3A145F0068B6AC /* task_loop.hpp */; }; 3D78157B1F3D89EC0068B6AC /* waiter.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D78157A1F3D89EC0068B6AC /* waiter.hpp */; }; - 4443DC3422789787000C8E32 /* not_intersecting_intervals.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 4443DC3322789786000C8E32 /* not_intersecting_intervals.hpp */; }; 564BB445206E89ED00BDD211 /* fifo_cache.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 564BB444206E89ED00BDD211 /* fifo_cache.hpp */; }; 56B1A0741E69DE4D00395022 /* random.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 56B1A0711E69DE4D00395022 /* random.cpp */; }; 56B1A0751E69DE4D00395022 /* random.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 56B1A0721E69DE4D00395022 /* random.hpp */; }; @@ -152,7 +155,6 @@ E1B7FFC221FA19FE00F094DC /* thread_pool_delayed.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E1B7FFBE21FA19FD00F094DC /* thread_pool_delayed.hpp */; }; E1B7FFC321FA19FE00F094DC /* thread_utils.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E1B7FFBF21FA19FD00F094DC /* thread_utils.hpp */; }; E1B7FFC421FA19FE00F094DC /* thread_pool_delayed.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1B7FFC021FA19FE00F094DC /* thread_pool_delayed.cpp */; }; - F61B9797229BFDF2000E878B /* non_intersecting_intervals_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F61B9796229BFDF1000E878B /* non_intersecting_intervals_tests.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -179,6 +181,9 @@ 3917FA5E211E00C300937DF4 /* suffix_array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = suffix_array.hpp; sourceTree = ""; }; 3917FA60211E00F100937DF4 /* geo_object_id_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = geo_object_id_tests.cpp; sourceTree = ""; }; 395FEB3321492F320036395C /* stl_helpers_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stl_helpers_tests.cpp; sourceTree = ""; }; + 397DC50B22BB8EBF007126DB /* bidirectional_map.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bidirectional_map.hpp; sourceTree = ""; }; + 397DC50C22BB8EBF007126DB /* non_intersecting_intervals.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = non_intersecting_intervals.hpp; sourceTree = ""; }; + 397DC50F22BB8ECD007126DB /* bidirectional_map_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bidirectional_map_tests.cpp; sourceTree = ""; }; 39B89C391FD1898A001104AF /* control_flow_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = control_flow_tests.cpp; sourceTree = ""; }; 39BC0FCF1FD057F900B6C276 /* control_flow.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = control_flow.hpp; sourceTree = ""; }; 39BC707420F55B6700A6EC20 /* clustering_map_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = clustering_map_tests.cpp; sourceTree = ""; }; @@ -229,7 +234,6 @@ 3D74EF0F1F8B902C0081202C /* bwt.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bwt.hpp; sourceTree = ""; }; 3D7815711F3A145F0068B6AC /* task_loop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = task_loop.hpp; sourceTree = ""; }; 3D78157A1F3D89EC0068B6AC /* waiter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = waiter.hpp; sourceTree = ""; }; - 4443DC3322789786000C8E32 /* not_intersecting_intervals.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = not_intersecting_intervals.hpp; sourceTree = ""; }; 564BB444206E89ED00BDD211 /* fifo_cache.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fifo_cache.hpp; sourceTree = ""; }; 564BB446206E8A4D00BDD211 /* fifo_cache_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fifo_cache_test.cpp; sourceTree = ""; }; 56B1A0711E69DE4D00395022 /* random.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = random.cpp; sourceTree = ""; }; @@ -334,6 +338,7 @@ 39FD26C71CC659D200AFF551 /* base_tests */ = { isa = PBXGroup; children = ( + 397DC50F22BB8ECD007126DB /* bidirectional_map_tests.cpp */, F61B9796229BFDF1000E878B /* non_intersecting_intervals_tests.cpp */, 390F1C0F2294299A00EA58E3 /* file_name_utils_tests.cpp */, E1B7FFC521FA1A2100F094DC /* thread_pool_computational_tests.cpp */, @@ -407,9 +412,10 @@ 675341791A3F57BF00A0A8C3 /* base */ = { isa = PBXGroup; children = ( + 397DC50B22BB8EBF007126DB /* bidirectional_map.hpp */, + 397DC50C22BB8EBF007126DB /* non_intersecting_intervals.hpp */, 390F1C0C2294298E00EA58E3 /* file_name_utils.cpp */, 390F1C0B2294298E00EA58E3 /* file_name_utils.hpp */, - 4443DC3322789786000C8E32 /* not_intersecting_intervals.hpp */, E1B7FFBD21FA19FD00F094DC /* thread_pool_computational.hpp */, E1B7FFC021FA19FE00F094DC /* thread_pool_delayed.cpp */, E1B7FFBE21FA19FD00F094DC /* thread_pool_delayed.hpp */, @@ -572,6 +578,7 @@ 390F1C0D2294298E00EA58E3 /* file_name_utils.hpp in Headers */, E1B7FFC121FA19FE00F094DC /* thread_pool_computational.hpp in Headers */, 675342071A3F57E400A0A8C3 /* thread_pool.hpp in Headers */, + 397DC50D22BB8EBF007126DB /* bidirectional_map.hpp in Headers */, 3446C6711DDCA96300146687 /* dfa_helpers.hpp in Headers */, 6753420C1A3F57E400A0A8C3 /* threaded_list.hpp in Headers */, 3917FA59211E009700937DF4 /* get_time.hpp in Headers */, @@ -599,11 +606,11 @@ 3917FA5D211E00BB00937DF4 /* pprof.hpp in Headers */, 672DD4BE1E0425600078E13C /* cancellable.hpp in Headers */, 675341CB1A3F57E400A0A8C3 /* array_adapters.hpp in Headers */, - 4443DC3422789787000C8E32 /* not_intersecting_intervals.hpp in Headers */, 3446C6751DDCA96300146687 /* uni_string_dfa.hpp in Headers */, 6753420B1A3F57E400A0A8C3 /* threaded_container.hpp in Headers */, E1B7FFC321FA19FE00F094DC /* thread_utils.hpp in Headers */, 672DD4C21E0425600078E13C /* condition.hpp in Headers */, + 397DC50E22BB8EBF007126DB /* non_intersecting_intervals.hpp in Headers */, 672DD4C41E0425600078E13C /* newtype.hpp in Headers */, 564BB445206E89ED00BDD211 /* fifo_cache.hpp in Headers */, 672DD4C31E0425600078E13C /* mem_trie.hpp in Headers */, @@ -722,6 +729,7 @@ 39FD272C1CC65AD000AFF551 /* range_iterator_test.cpp in Sources */, 39FD27261CC65AD000AFF551 /* containers_test.cpp in Sources */, 3917FA67211E010400937DF4 /* bwt_tests.cpp in Sources */, + 397DC51122BB8ED2007126DB /* bidirectional_map_tests.cpp in Sources */, 390F1C12229429A700EA58E3 /* thread_pool_computational_tests.cpp in Sources */, 3446C6821DDCAA7400146687 /* newtype_test.cpp in Sources */, 39FD27231CC65AD000AFF551 /* collection_cast_test.cpp in Sources */, @@ -736,6 +744,7 @@ 39FD27211CC65AD000AFF551 /* buffer_vector_test.cpp in Sources */, 3917FA64211E010400937DF4 /* suffix_array_tests.cpp in Sources */, 3917FA62211E010400937DF4 /* geo_object_id_tests.cpp in Sources */, + 397DC51222BB8ED2007126DB /* non_intersecting_intervals_tests.cpp in Sources */, 39FD27241CC65AD000AFF551 /* condition_test.cpp in Sources */, 39FD27221CC65AD000AFF551 /* cache_test.cpp in Sources */, 39FD272D1CC65AD000AFF551 /* regexp_test.cpp in Sources */, @@ -757,7 +766,6 @@ 390F1C0E2294298E00EA58E3 /* file_name_utils.cpp in Sources */, 6753453D1A3F6F6A00A0A8C3 /* message.cpp in Sources */, 675342081A3F57E400A0A8C3 /* thread.cpp in Sources */, - F61B9797229BFDF2000E878B /* non_intersecting_intervals_tests.cpp in Sources */, 675342061A3F57E400A0A8C3 /* thread_pool.cpp in Sources */, 670E39441C46C76900E9C0A6 /* sunrise_sunset.cpp in Sources */, 6753420E1A3F57E400A0A8C3 /* timer.cpp in Sources */, diff --git a/xcode/generator/generator.xcodeproj/project.pbxproj b/xcode/generator/generator.xcodeproj/project.pbxproj index 5b7070c67b..6296cf95a8 100644 --- a/xcode/generator/generator.xcodeproj/project.pbxproj +++ b/xcode/generator/generator.xcodeproj/project.pbxproj @@ -29,6 +29,8 @@ 39711416229D7E01003915E5 /* key_value_storage.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3971140F229D7E01003915E5 /* key_value_storage.hpp */; }; 39711417229D7E01003915E5 /* translator_streets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39711410229D7E01003915E5 /* translator_streets.cpp */; }; 39711418229D7E01003915E5 /* translator_streets.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 39711411229D7E01003915E5 /* translator_streets.hpp */; }; + 397DC51B22BB8F13007126DB /* cities_fid_bimap_builder.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 397DC51922BB8F13007126DB /* cities_fid_bimap_builder.hpp */; }; + 397DC51C22BB8F13007126DB /* cities_fid_bimap_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397DC51A22BB8F13007126DB /* cities_fid_bimap_builder.cpp */; }; 39B2B9781FB468CC00AB85A1 /* cities_boundaries_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39B2B9761FB468CC00AB85A1 /* cities_boundaries_builder.cpp */; }; 39B2B9791FB468CC00AB85A1 /* cities_boundaries_builder.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 39B2B9771FB468CC00AB85A1 /* cities_boundaries_builder.hpp */; }; 39F7E3AA20E1023400DA7A14 /* test_with_classificator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39F7E3A520E1022E00DA7A14 /* test_with_classificator.cpp */; }; @@ -292,6 +294,8 @@ 3971140F229D7E01003915E5 /* key_value_storage.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = key_value_storage.hpp; sourceTree = ""; }; 39711410229D7E01003915E5 /* translator_streets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = translator_streets.cpp; sourceTree = ""; }; 39711411229D7E01003915E5 /* translator_streets.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = translator_streets.hpp; sourceTree = ""; }; + 397DC51922BB8F13007126DB /* cities_fid_bimap_builder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cities_fid_bimap_builder.hpp; sourceTree = ""; }; + 397DC51A22BB8F13007126DB /* cities_fid_bimap_builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cities_fid_bimap_builder.cpp; sourceTree = ""; }; 39B2B9761FB468CC00AB85A1 /* cities_boundaries_builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cities_boundaries_builder.cpp; sourceTree = ""; }; 39B2B9771FB468CC00AB85A1 /* cities_boundaries_builder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cities_boundaries_builder.hpp; sourceTree = ""; }; 39F7E3A220E1022E00DA7A14 /* test_with_custom_mwms.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_with_custom_mwms.hpp; sourceTree = ""; }; @@ -605,6 +609,8 @@ 6753401D1A3F2A1B00A0A8C3 /* generator */ = { isa = PBXGroup; children = ( + 397DC51A22BB8F13007126DB /* cities_fid_bimap_builder.cpp */, + 397DC51922BB8F13007126DB /* cities_fid_bimap_builder.hpp */, 671C2D7522AFD995008B2B8B /* geo_object_info_getter.cpp */, 671C2D7322AFD994008B2B8B /* geo_object_info_getter.hpp */, 671C2D7422AFD994008B2B8B /* geo_objects_filter.cpp */, @@ -900,6 +906,7 @@ 675340881A3F2A7400A0A8C3 /* unpack_mwm.hpp in Headers */, 56037E4E219AF97200C2193D /* osm_element_helpers.hpp in Headers */, E1EC1456211C5F9100B53061 /* emitter_interface.hpp in Headers */, + 397DC51B22BB8F13007126DB /* cities_fid_bimap_builder.hpp in Headers */, 6753407F1A3F2A7400A0A8C3 /* osm2type.hpp in Headers */, 67C79BB21E2CEEAB00C40034 /* restriction_generator.hpp in Headers */, 401E3187225C97D100DE7EB8 /* boost_helpers.hpp in Headers */, @@ -1203,6 +1210,7 @@ 4032E735225D151D00D33617 /* feature_maker_base.cpp in Sources */, 56A1B7B021A82C3F00246F8C /* maxspeeds_parser.cpp in Sources */, 4032E72E225D151D00D33617 /* filter_collection.cpp in Sources */, + 397DC51C22BB8F13007126DB /* cities_fid_bimap_builder.cpp in Sources */, 670E7BB51EF9812B00A8E9ED /* road_access_generator.cpp in Sources */, 671C2D6A22AFD983008B2B8B /* streets_builder.cpp in Sources */, 34F558871DBF4C9600A4FC11 /* opentable_dataset.cpp in Sources */, diff --git a/xcode/indexer/indexer.xcodeproj/project.pbxproj b/xcode/indexer/indexer.xcodeproj/project.pbxproj index a16d427b04..f15e26b472 100644 --- a/xcode/indexer/indexer.xcodeproj/project.pbxproj +++ b/xcode/indexer/indexer.xcodeproj/project.pbxproj @@ -38,6 +38,9 @@ 3496ABAC1DC1FA9E00C5DDBA /* countries_obsolete.txt in Resources */ = {isa = PBXBuildFile; fileRef = 3496ABA71DC1FA9E00C5DDBA /* countries_obsolete.txt */; }; 3496ABAD1DC1FA9E00C5DDBA /* countries.txt in Resources */ = {isa = PBXBuildFile; fileRef = 3496ABA81DC1FA9E00C5DDBA /* countries.txt */; }; 3496ABAF1DC1FAC900C5DDBA /* minsk-pass.mwm in Resources */ = {isa = PBXBuildFile; fileRef = 3496ABAE1DC1FAC900C5DDBA /* minsk-pass.mwm */; }; + 397DC51522BB8EEC007126DB /* fid_bimap.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 397DC51322BB8EEC007126DB /* fid_bimap.hpp */; }; + 397DC51622BB8EEC007126DB /* fid_bimap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397DC51422BB8EEC007126DB /* fid_bimap.cpp */; }; + 397DC51822BB8EF7007126DB /* fid_bimap_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 397DC51722BB8EF7007126DB /* fid_bimap_tests.cpp */; }; 39F376C0207D32450058E8E0 /* cities_boundaries_serdes_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39F376BE207D32410058E8E0 /* cities_boundaries_serdes_tests.cpp */; }; 39F376C3207D32510058E8E0 /* scale_index_reading_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39F376C1207D324E0058E8E0 /* scale_index_reading_tests.cpp */; }; 3D12E3D72111B4BE0015A9A9 /* caching_rank_table_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D12E3D52111B4BD0015A9A9 /* caching_rank_table_loader.cpp */; }; @@ -261,6 +264,9 @@ 3496ABAE1DC1FAC900C5DDBA /* minsk-pass.mwm */ = {isa = PBXFileReference; lastKnownFileType = file; name = "minsk-pass.mwm"; path = "../../data/minsk-pass.mwm"; sourceTree = ""; }; 34AF87D11DBE540700E5E7DC /* common-debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-debug.xcconfig"; path = "../common-debug.xcconfig"; sourceTree = ""; }; 34AF87D21DBE540700E5E7DC /* common-release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-release.xcconfig"; path = "../common-release.xcconfig"; sourceTree = ""; }; + 397DC51322BB8EEC007126DB /* fid_bimap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fid_bimap.hpp; sourceTree = ""; }; + 397DC51422BB8EEC007126DB /* fid_bimap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fid_bimap.cpp; sourceTree = ""; }; + 397DC51722BB8EF7007126DB /* fid_bimap_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fid_bimap_tests.cpp; sourceTree = ""; }; 39F376BE207D32410058E8E0 /* cities_boundaries_serdes_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cities_boundaries_serdes_tests.cpp; sourceTree = ""; }; 39F376C1207D324E0058E8E0 /* scale_index_reading_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scale_index_reading_tests.cpp; sourceTree = ""; }; 3D12E3D52111B4BD0015A9A9 /* caching_rank_table_loader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = caching_rank_table_loader.cpp; sourceTree = ""; }; @@ -564,6 +570,7 @@ 670C60F81AB0657700C38A8C /* indexer_tests */ = { isa = PBXGroup; children = ( + 397DC51722BB8EF7007126DB /* fid_bimap_tests.cpp */, 406970A121AEF2F10024DDB2 /* brands_tests.cpp */, 406B37F6207FBAC7000F3648 /* borders_test.cpp */, 40C3C090205BF9F400CED188 /* bounds.hpp */, @@ -632,6 +639,8 @@ 6753409C1A3F53CB00A0A8C3 /* indexer */ = { isa = PBXGroup; children = ( + 397DC51422BB8EEC007126DB /* fid_bimap.cpp */, + 397DC51322BB8EEC007126DB /* fid_bimap.hpp */, 3D12E3D52111B4BD0015A9A9 /* caching_rank_table_loader.cpp */, 3D12E3D62111B4BD0015A9A9 /* caching_rank_table_loader.hpp */, 34664CEE1D49FEC1003D7096 /* altitude_loader.cpp */, @@ -827,6 +836,7 @@ 40009065201F5CB000963E18 /* locality_object.hpp in Headers */, 6758AED41BB4413000C26E27 /* drules_selector.hpp in Headers */, 6753412F1A3F540F00A0A8C3 /* index_builder.hpp in Headers */, + 397DC51522BB8EEC007126DB /* fid_bimap.hpp in Headers */, 456E1B1A1F90E5B7009C32E1 /* ftypes_sponsored.hpp in Headers */, 675B562420D25C9800A521D2 /* feature_source.hpp in Headers */, 4088CE2021AE993F00E2702A /* brands_holder.hpp in Headers */, @@ -1004,6 +1014,7 @@ 6758AED31BB4413000C26E27 /* drules_selector.cpp in Sources */, 6753411A1A3F540F00A0A8C3 /* feature_impl.cpp in Sources */, 56C74C1C1C749E4700B71B9F /* categories_holder_loader.cpp in Sources */, + 397DC51822BB8EF7007126DB /* fid_bimap_tests.cpp in Sources */, 3D74EF241F8F559D0081202C /* ugc_types_test.cpp in Sources */, 406B37F4207FBABB000F3648 /* borders.cpp in Sources */, 40DF582D2174979200E4E0FC /* classificator_tests.cpp in Sources */, @@ -1047,6 +1058,7 @@ 675341141A3F540F00A0A8C3 /* feature_covering.cpp in Sources */, 4088CE2121AE993F00E2702A /* brands_holder.cpp in Sources */, 406970A221AEF2F20024DDB2 /* brands_tests.cpp in Sources */, + 397DC51622BB8EEC007126DB /* fid_bimap.cpp in Sources */, 56C74C1D1C749E4700B71B9F /* categories_holder.cpp in Sources */, 675341371A3F540F00A0A8C3 /* mwm_set.cpp in Sources */, 675341181A3F540F00A0A8C3 /* feature_decl.cpp in Sources */,