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

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/UnitTests/jni/mock.cpp2
-rw-r--r--android/jni/com/mapswithme/maps/VideoTimer.hpp2
-rw-r--r--android/src/com/mapswithme/maps/MwmActivity.java5
-rw-r--r--android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java2
-rw-r--r--android/src/com/mapswithme/util/log/ZipLogsTask.java29
-rw-r--r--base/base_tests/thread_pool_tests.cpp2
-rw-r--r--coding/coding_tests/file_container_test.cpp2
-rw-r--r--data/categories.txt184
-rw-r--r--data/countries.txt36
-rw-r--r--drape/vulkan/vulkan_base_context.cpp24
-rw-r--r--drape/vulkan/vulkan_object_manager.cpp4
-rw-r--r--drape/vulkan/vulkan_object_manager.hpp2
-rw-r--r--drape/vulkan/vulkan_texture.cpp14
-rw-r--r--drape_frontend/drape_engine.cpp2
-rwxr-xr-xdrape_frontend/frontend_renderer.cpp97
-rwxr-xr-xdrape_frontend/frontend_renderer.hpp18
-rw-r--r--drape_frontend/selection_shape.hpp1
-rw-r--r--drape_frontend/user_event_stream.cpp18
-rw-r--r--drape_frontend/user_event_stream.hpp7
-rw-r--r--generator/coastlines_generator.cpp2
-rw-r--r--generator/generator_tests/tesselator_test.cpp2
-rw-r--r--generator/statistics.cpp2
-rw-r--r--geocoder/geocoder_tests/geocoder_tests.cpp18
-rw-r--r--geocoder/hierarchy.cpp13
-rw-r--r--geocoder/hierarchy.hpp8
-rw-r--r--geocoder/hierarchy_reader.cpp6
-rw-r--r--geocoder/index.cpp24
-rw-r--r--geometry/screenbase.cpp19
-rw-r--r--geometry/screenbase.hpp1
-rw-r--r--indexer/drawing_rules.cpp15
-rw-r--r--indexer/feature_visibility.cpp2
-rw-r--r--map/benchmark_tool/features_loading.cpp2
-rw-r--r--map/framework.hpp2
-rw-r--r--map/geourl_process.cpp2
-rw-r--r--map/mwm_tests/multithread_mwm_test.cpp2
-rw-r--r--map/routing_manager.cpp2
-rw-r--r--map/style_tests/classificator_tests.cpp2
-rw-r--r--platform/http_request.cpp2
-rw-r--r--platform/location_service.cpp2
-rw-r--r--platform/platform_tests/apk_test.cpp3
-rw-r--r--platform/wifi_location_service.cpp2
-rw-r--r--routing/restrictions_serialization.hpp53
-rw-r--r--search/features_layer_matcher.cpp40
-rw-r--r--search/features_layer_matcher.hpp11
-rw-r--r--search/house_detector.hpp2
-rw-r--r--software_renderer/cpu_drawer.cpp2
-rw-r--r--software_renderer/text_engine.h2
-rwxr-xr-xtools/python/openlr/quality.py31
48 files changed, 440 insertions, 285 deletions
diff --git a/android/UnitTests/jni/mock.cpp b/android/UnitTests/jni/mock.cpp
index 2b48f0102e..8b65b31899 100644
--- a/android/UnitTests/jni/mock.cpp
+++ b/android/UnitTests/jni/mock.cpp
@@ -76,7 +76,7 @@ namespace android_tests
JavaVM * m_Vm;
JNIEnv * m_Env;
public:
- MainThreadScopeGuard(JavaVM * vm) : m_Vm(vm), m_Env(nullptr)
+ explicit MainThreadScopeGuard(JavaVM * vm) : m_Vm(vm), m_Env(nullptr)
{
assert(vm);
m_Vm->AttachCurrentThread(&m_Env, NULL);
diff --git a/android/jni/com/mapswithme/maps/VideoTimer.hpp b/android/jni/com/mapswithme/maps/VideoTimer.hpp
index be4b7dab58..439954329a 100644
--- a/android/jni/com/mapswithme/maps/VideoTimer.hpp
+++ b/android/jni/com/mapswithme/maps/VideoTimer.hpp
@@ -13,7 +13,7 @@ namespace android
public:
- VideoTimer(TFrameFn frameFn);
+ explicit VideoTimer(TFrameFn frameFn);
~VideoTimer();
void SetParentObject(jobject videoTimer);
diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java
index 6850be27ef..fb65c72da8 100644
--- a/android/src/com/mapswithme/maps/MwmActivity.java
+++ b/android/src/com/mapswithme/maps/MwmActivity.java
@@ -1264,13 +1264,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
return;
}
- if (mSearchController.hide())
+ if (mSearchController != null && mSearchController.hide())
{
SearchEngine.INSTANCE.cancelInteractiveSearch();
if (mFilterController != null)
mFilterController.resetFilter();
- if (mSearchController != null)
- mSearchController.clear();
+ mSearchController.clear();
return;
}
diff --git a/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java b/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java
index fd25569527..ba20345f7e 100644
--- a/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java
+++ b/android/src/com/mapswithme/maps/bookmarks/data/CatalogTag.java
@@ -72,7 +72,7 @@ public class CatalogTag implements Parcelable
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CatalogTag that = (CatalogTag) o;
- return mId.equals(that.mId) || mId.equals(that.mId);
+ return mId.equals(that.mId);
}
@Override
diff --git a/android/src/com/mapswithme/util/log/ZipLogsTask.java b/android/src/com/mapswithme/util/log/ZipLogsTask.java
index bf78051e45..58c1759d7d 100644
--- a/android/src/com/mapswithme/util/log/ZipLogsTask.java
+++ b/android/src/com/mapswithme/util/log/ZipLogsTask.java
@@ -55,29 +55,32 @@ class ZipLogsTask implements Runnable
private boolean zipFileAtPath(@NonNull String sourcePath, @NonNull String toLocation)
{
File sourceFile = new File(sourcePath);
- try
+ try(FileOutputStream dest = new FileOutputStream(toLocation, false);
+ ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)))
{
- BufferedInputStream origin;
- FileOutputStream dest = new FileOutputStream(toLocation, false);
- ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
if (sourceFile.isDirectory())
{
zipSubFolder(out, sourceFile, sourceFile.getParent().length());
}
else
{
- byte data[] = new byte[BUFFER_SIZE];
- FileInputStream fi = new FileInputStream(sourcePath);
- origin = new BufferedInputStream(fi, BUFFER_SIZE);
- ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath));
- out.putNextEntry(entry);
- int count;
- while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1)
+ try(FileInputStream fi = new FileInputStream(sourcePath);
+ BufferedInputStream origin = new BufferedInputStream(fi, BUFFER_SIZE);)
{
- out.write(data, 0, count);
+ ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath));
+ out.putNextEntry(entry);
+ byte data[] = new byte[BUFFER_SIZE];
+ int count;
+ while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) {
+ out.write(data, 0, count);
+ }
+ } catch (Exception e)
+ {
+ Log.e(TAG, "Failed to read zip file entry '" + sourcePath +"' to location '"
+ + toLocation + "'", e);
+ return false;
}
}
- out.close();
}
catch (Exception e)
{
diff --git a/base/base_tests/thread_pool_tests.cpp b/base/base_tests/thread_pool_tests.cpp
index 07152758bf..1a94bfa64d 100644
--- a/base/base_tests/thread_pool_tests.cpp
+++ b/base/base_tests/thread_pool_tests.cpp
@@ -92,7 +92,7 @@ namespace
class CancelTestTask : public threads::IRoutine
{
public:
- CancelTestTask(bool isWaitDoCall)
+ explicit CancelTestTask(bool isWaitDoCall)
: m_waitDoCall(isWaitDoCall)
, m_doCalled(false)
{
diff --git a/coding/coding_tests/file_container_test.cpp b/coding/coding_tests/file_container_test.cpp
index 6ffbdb4f60..2eb64205df 100644
--- a/coding/coding_tests/file_container_test.cpp
+++ b/coding/coding_tests/file_container_test.cpp
@@ -240,7 +240,7 @@ UNIT_TEST(FilesMappingContainer_MoveHandle)
class HandleWrapper
{
public:
- HandleWrapper(FilesMappingContainer::Handle && handle) : m_handle(std::move(handle))
+ explicit HandleWrapper(FilesMappingContainer::Handle && handle) : m_handle(std::move(handle))
{
TEST(m_handle.IsValid(), ());
}
diff --git a/data/categories.txt b/data/categories.txt
index eb4624a5e5..54e1a56c53 100644
--- a/data/categories.txt
+++ b/data/categories.txt
@@ -2189,7 +2189,7 @@ ru:^Место для пикника|3Пикник
ar:^مكان نزهة|سياحة|مناظر
cs:3^Piknik|picnic|picnik
da:3^Picnic
-nl:3^Picnicplaats|3picnicweide|3picnictafel
+nl:3^Picknickplaats|picknickweide|picknicktafel
fi:3^Piknikpaikat
fr:3^Terrain de pique-nique|3aire de pique-nique
de:3^Picknickplatz|Grillplatz
@@ -2707,15 +2707,20 @@ fa:خرابه های تاریخی
historic-ship|@tourism
en:^Ship|boat
ru:^Корабль|судно|лодка
+nl:^Schip|boot
+de:^Schiff|Boot
historic-tomb|@tourism
en:^Tomb|grave|memorial
ru:^Гробница|склеп|захоронение|могила|кладбище
+nl:^Tombe|graf|gedenkteken
+de:^Grab|Gedenkstätte
leisure-dog_park
en:3^Dog area|Dog park
ru:^Место для выгула собак|Площадка для собак|4Собачья площадка
cs:3^Psí hřiště
+nl:4^Hondenpark|Hondengebied
de:4^Hundezone|Hundeauslaufzone
fi:Koirapuisto
he:גינת כלבים
@@ -2837,7 +2842,7 @@ it:^Car Sharing
ja:^カーシェアリング
ko:^카셰어링
nb:^Kjøre sammen
-nl:^Autodelen
+nl:3^Carpool|Carpoolen|Auto delen|Autodelen
pl:^Carsharing
pt:^Partilha de carro
pt-BR:^Compartilhamento de carro
@@ -2858,7 +2863,7 @@ ru:4^Прокат авто|3авто|3машина|прокат|авто нап
ar:^تأجير سيارات|سيارة|تأجير|إيجار
cs:3^Půjčovna aut|auto|pronájem|nájemné
da:4^Biludlejning|bil
-nl:3^Autoverhuur|autodelen|auto|huur
+nl:3^Autoverhuur|4huurauto|auto delen|auto|huur
fi:^Autovuokraamo
fr:4^Location de voitures|auto|loueur|location|partage
de:3^Autoverleih|Mietauto|Auto|Fahrzeug Mieten|Verleih|KFZ-Vermietung|Fahrzeugvermietung
@@ -2891,7 +2896,7 @@ ru:^Кинотеатр|3кино
ar:^سينما
cs:3^Kino|biograf
da:3^Biograf
-nl:3^Bioscoop|cinema
+nl:3^Bioscoop|filmtheater|cinema
fi:^Elokuvateatteri
fr:3^Cinéma
de:3^Kino|Cinema|Filmtheater|Lichtspielhaus
@@ -2957,7 +2962,7 @@ ru:3^Ночной клуб|3дискотека|ночной бар|диско|т
ar:^نادي ليلي|رقص
cs:4^Noční klub|3disco|3klub
da:3^Natklub|dans|danseklub
-nl:3^Discotheek|3disco|dansen
+nl:3^Discotheek|3disco|dansen|nachtclub
fi:^Yökerho
fr:3^Discothèque|3boîte de nuit|danse
de:3^Nachtclub|Nachtklub|Nachtbar|Nachtlokal|Disko|Tanzen|Club
@@ -3214,7 +3219,7 @@ ru:4^Больница
ar:^مستشفى
cs:4^Nemocnice
da:4^Hospital
-nl:4^Ziekenhuis
+nl:4^Ziekenhuis|hospitaal
fi:^Sairaala
fr:4^Hôpital
de:4^Krankenhaus
@@ -3248,9 +3253,9 @@ ru:4госпиталь|врач|доктор|медицинский центр|
ar:^عيادة|طبيب|دكتور
cs:klinika|pohotovost|zdravotnické centrum|3lékař|doktor
da:sygehus
-nl:kliniek|hospitaal|tandarts|3dokter
+nl:kliniek|hospitaal|3dokter|3eerste hulp
fr:clinique|3médecin|3docteur
-de:Spital|3Arzt|Doktor|Medizinische Einrichtung|Medizinisches Zentrum|Gesundheitswesen|Ambulanz|Gesundheitsdienstleistungen|Erste Hilfe
+de:Spital|Klinik|3Arzt|Doktor|Medizinische Einrichtung|Medizinisches Zentrum|Gesundheitswesen|Ambulanz|Gesundheitsdienstleistungen|Erste Hilfe
hu:rendelőintézet|3orvos
ja:クリニック|医師|医者|ドクター|救急|診療
ko:의사|의사가
@@ -3274,7 +3279,7 @@ ru:^Поликлиника|клиника|больница|врач|медици
ar:^عيادة|مستشفى|طبيب|دكتور
cs:^Klinika|nemocnice
da:^Klinik|hospital
-nl:^Kliniek|ziekenhuis
+nl:^Kliniek|ziekenhuis|hospitaal
fi:^Klinikka|sairaala
fr:^Clinique|hôpital
de:^Klinik|Krankenhaus|Ambulanz|Arzt|Diagnostik|Gesundheitsdienstleistungen|Doktor
@@ -3306,7 +3311,7 @@ ru:^Врач|больница|клиника|поликлиника
ar:^طبيب|عيادة|مستشفى
cs:^Lékařská ordinace|Klinika|nemocnice
da:^Lægekontor|lægehus|klinik|hospital
-nl:^Huisartsenpost|Kliniek|huisarts|ziekenhuis
+nl:^Huisartsenpost|Kliniek|huisarts|ziekenhuis|dokter
fi:^Lääkärin vastaanotto|Klinikka|sairaala
fr:^Cabinet médical|hôpital
de:^Arztpraxis|Klinik|Krankenhaus
@@ -3369,7 +3374,7 @@ ru:^Охотничья вышка
ar:^منصة صيد
cs:^Lovecké stanoviště|posed
da:^Jagtsted|hochsitz
-nl:^Jaagplek
+nl:^Jachtplaats|jaagplek
fi:^Metsästyspaikka
fr:^Mirador
de:^Hochsitz|Anstand
@@ -3467,9 +3472,9 @@ en:U+1F697|U+1F17F|U+1F698|U+1F699
ru:Автостоянка|парковка
ar:^موقف سيارات
da:3Parkeringsplads
-nl:parking
+nl:3Parkeren|parkeerplaats|parking
fr:3parking
-de:Parking
+de:3Parkplatz|Parking
ja:パーキング|コインパーキング
pt:3Parking
pt-BR:3^Estacionamento
@@ -3520,9 +3525,10 @@ fa:داروخانه
amenity-pharmacy|@pharmacy
en:3drugstore|apothecary|dispensary|U+1F489|U+1F48A
ar:^متجر أدوية|صيدلية
-nl:verdeelstation
+nl:Apotheek|drogist
fi:3Farmasia
fr:dispensaire
+de:Apotheke|Drogerie
ja:ドラッグストア|薬剤師|調剤|薬屋
ko:약물 매장|약종상
pt:3Farmacêutico
@@ -3545,7 +3551,7 @@ da:3^Postboks|3postboks|postkasse|p/o|post
nl:3^Brievenbus|post
fi:^Postilaatikko
fr:3^Boîte aux lettres|courrier
-de:3^Briefkasten|3Postfach
+de:3^Briefkasten|3Postfach|post
hu:3^Postaláda|Levelesláda
id:^Kotak pos
it:3^Casella
@@ -3629,7 +3635,7 @@ ru:^Мусорный контейнер|мусорка
ar:^قمامة|مهملات|سلة مهملات|صندوق قمامة
cs:^Odpadky|koš|popelnice|uložiště odpadu
da:^Bortskaffelse af affald|skraldespand|skrald
-nl:^Uitschot|afval|prullenbak|vuilnis
+nl:^Afvalcontainer|afval|prullenbak|vuilnis
fi:^Roska
fr:^Déchets|poubelle|déchet
de:^Müllcontainer|Mülltonne|Abfälle|Müll
@@ -3662,10 +3668,10 @@ ru:^Приём вторсырья|утиль|сырье|сбор сырья|ст
ar:^مركز إعادة تدوير
cs:^Recyklační středisko
da:^Genbrugsplads
-nl:^Milieustraat
+nl:^Milieustraat|recycling centrum|milieupark|gemeentewerf
fi:^Kierrätyskeskus
fr:^Centre de recyclage
-de:^Recyclinghof
+de:^Recyclinghof|Recyclingzentrum
hu:^Hulladékudvar|Újrahasznosító központ|hulladékgyűjtő központ
id:^TPA
it:^Centro di riciclaggio
@@ -3793,7 +3799,7 @@ ru:3^Туалет
ar:^حمام
cs:3^Záchody
da:3^Toilet
-nl:3^Toilet
+nl:3^Toilet|WC
fi:^WC
fr:3^Toilettes
de:3^Toilette
@@ -3825,7 +3831,7 @@ amenity-toilets|@toilet
en:wc|5restroom|4bathroom|loo|lavatory|U+1F6BD|U+1F6BE|U+1F4A9|U+1F6BB|U+1F6B9|U+1F6BA
ar:^حمام|مرحاض
cs:wc|toalety
-nl:wc
+nl:WC|toilet
fr:wc
de:WC
hu:WC
@@ -4043,7 +4049,7 @@ ru:^Округ|графство
ar:^مقاطعة
cs:^Země
da:^Amt
-nl:^Graafschap
+nl:^Provincie|graafschap
fi:^Lääni
fr:^Comté
de:^Kreis|Bezirk
@@ -4141,7 +4147,7 @@ ru:^Остров
ar:^جزيرة
cs:^Ostrov
da:^Ø
-nl:^Eilandje
+nl:^Eiland|eilandje
fi:^Saari
fr:^Île|ilôt
de:^Insel
@@ -4207,7 +4213,7 @@ ru:^Посёлок|деревня
ar:^قرية صغيرة|قرية
cs:^Vesnička
da:^Landsby|landsby
-nl:^Gehucht|buurschap|dorpje|dorp
+nl:^Gehucht|buurtschap|dorpje|dorp
fi:^Pieni kylä
fr:^Hameau|village
de:^Weiler|Dorf
@@ -4273,7 +4279,7 @@ ru:^Местность|регион
ar:^منطقة مجاورة
cs:^Lokalita
da:^Lokalitet|sted
-nl:^Plaats|localiteit
+nl:^Plaats|streek|localiteit
fi:^Paikkakunta
fr:^Localité
de:^Örtlichkeit|Lokalität|Region|Ort
@@ -4405,7 +4411,7 @@ ru:^Гоночный трек
ar:^مسار سباق
cs:^Závodiště
da:^Væddeløbsbane
-nl:^Racebaan
+nl:^Renbaan|racebaan
fi:^Kilparata
fr:^Circuit
de:^Rennbahn
@@ -4503,7 +4509,7 @@ ru:3^Съезд
ar:^مخرج|تقاطع
cs:^Dopravní uzel|3dálnice
da:2^Motorvejsafkørsel|afkørsel
-nl:3^Afrit|3uitgang|3kruising
+nl:3^Afrit|3afslag|3uitgang|3kruising
fi:^Poistumistie|liittymä
fr:3^Sortie|3bifurcation
de:4^Ausfahrt|Abfahrt
@@ -4888,7 +4894,7 @@ ru:3^Парикмахерская|стрижки|укладки|покрас|с
ar:^مصفف شعر
cs:4^Kadeřnictví|4holičství
da:3^Frisør
-nl:3^Kapper
+nl:3^Kapper|kapsalon|haarsalon|kapperszaak
fi:^Kampaamo
fr:3^Coiffeur|salon de coiffure
de:3^Friseur|Frisiersalon|Frisör|Coiffeur
@@ -4954,7 +4960,7 @@ ru:^Стадион|4спорт|матч|арена|спортивная арен
ar:^استاد|رياضة
cs:^Stadion|4sport
da:^Stadium|sport
-nl:^Stadium|4sport
+nl:^Stadion|stadium|4sport|arena
fi:^Stadion
fr:^Stade|4sport
de:^Stadion|4Sport|Olympiastadion|Sportstadion|Sportkomplex|Arena
@@ -5149,11 +5155,11 @@ fa:استخرشنا
sport-equestrian
en:Equestrian Sports
ru:Конный спорт
-de:Pferdesport
-es:Deportes ecuestres
+nl:Paardensport|ruitersport
fr:Sport équestre
hu:Lovassportok
-nl:Paardensport
+de:Pferdesport
+es:Deportes ecuestres
pt-BR:Esportes equestres
el:Ιππασία
@@ -5162,11 +5168,12 @@ en:^Basketball
ru:^Баскетбол
de:^Basketball
es:^Baloncesto
+nl:^Basketbal
fi:^Koripallo
fr:^Basket-ball
+de:^Basketball
it:^Pallacanestro
hu:^Kosárlabda
-nl:^Basketbal
pt-BR:^Basquetebol
da:^Basketball
fa:بسکتبال
@@ -5175,13 +5182,13 @@ el:Καλαθόσφαιρα
sport-athletics
en:^Athletics
ru:^Лёгкая атлетика
-de:^Leichtathletik
es:^Atletismo
+nl:^Atletiek
fi:^Yleisurheilu
fr:^Athlétisme
+de:^Leichtathletik
it:^Atletica leggera
hu:^Atlétika
-nl:^Atletiek
pt-BR:^Atletismo
el:Στίβος
@@ -5312,7 +5319,7 @@ da:^Bugt|havbugt
nl:^Baai
fi:^Lahti
fr:^Baie
-de:^Bucht|Bay
+de:^Bucht|Bai
hu:^Öböl
id:^Teluk
it:^Baia
@@ -5374,7 +5381,7 @@ ru:3^СТО|3автомастерская|автосервис|авто
ar:^محل صيانة السيارات|محطة خدمات
cs:3^Auto opravna|auto|auta|Půjčení
da:3^Garage|3bilværksted|service station
-nl:3^Auto reparatie|auto|wagen
+nl:3^Auto reparatie|auto|wagen|garage
fi:^Autokorjaamo
fr:3^Réparation d'automobiles|3garage|4station service|voiture|auto
de:3^Autowerkstatt|Kfz|Reparaturwerkstatt|Auto|Werkstatt
@@ -5407,7 +5414,7 @@ ru:4^Кемпинг
ar:^تخييم|مكان التخييم|أرض التخييم
cs:4^Kempování|camping|kemp|camp
da:^Camping|campingplads|teltplads|lejrplads
-nl:4^Camping|kamperen
+nl:4^Camping|kamperen|kampeerplek
fi:^Retkeily
fr:4^Camping|terrain de camping
de:4^Zeltplatz|Zelten|Campingplatz|Camping
@@ -5440,7 +5447,7 @@ ru:4^Автокемпинг|кемпинг|стоянка грузовиков
ar:^موقع البيت المتنقل
cs:^Kemp pro obytné přívěsy
da:^Autocamperplads|husvogn
-nl:^Caravan site|camping
+nl:^Caravan site|camping|woonwagenkamp
fi:^Asuntovaunupaikka|Retkeily
fr:4^Parc caravanier|VR|caravane|camping-car
de:4^Wohnwagenstellplatz|Campingplatz|Wohnwagenplatz|Wohnmobilpark
@@ -5471,7 +5478,7 @@ ru:^Офис|компания|контора|фирма|бизнес|бюро|у
ar:^مكتب|شركة
cs:^Kancelář
da:^Kontor|firma|virksomhed
-nl:^Kantoor|ambt
+nl:^Kantoor|ambt|bedrijf|bedrijfspand|bedrijfskantoor
fi:^Toimisto
fr:^Bureau|compagnie
de:^Büro|Amt|Unternehmen|Agentur|Dienststelle|Firma|Geschäft|Gesellschaft
@@ -5536,7 +5543,7 @@ ru:^Госучреждение|административное учрежден
ar:^مكتب حكومي
cs:^Úřad vlády
da:^Regeringskontor
-nl:^Overheidskantoor|overheidspand
+nl:^Overheidskantoor|overheidspand|regeringskantoor
fi:^Viranomaistoimito
fr:^Administration publique
de:^Regierungsstelle
@@ -5568,7 +5575,7 @@ ru:^Адвокат|нотариус|юрист|право|защита прав|
ar:^مكتب محامي|مكتب محاماة
cs:^Právní kancelář
da:^Advokatkontor
-nl:^Advocatenkantoor
+nl:^Advocatenkantoor|advocaat
fi:^Lakitoimisto
fr:^Cabinet d'avocat
de:^Anwaltsbüro|Anwaltskanzlei|Anwalt|Rechtsanwalt|Jurist|Gerichtsanwalt|Rechtsbeistand|Rechtsberater|Verteidiger
@@ -5599,7 +5606,7 @@ ru:^Мобильный оператор
ar:^شركة اتصالات|شركة محمول
cs:^Mobilní operátor
da:^Mobiloperatør
-nl:^Mobiele provider
+nl:^Mobiele provider|provider
fi:^Matkapuhelinoperaattori
fr:^Opérateur mobile
de:^Mobilbetreiber|Mobilfunkanbieter
@@ -5630,7 +5637,7 @@ ru:^Пивоварня|пивзавод|производство пива|пив
ar:^مصنع جعة
cs:^Pivovar
da:^Bryggeri
-nl:^Brouwerij
+nl:^Brouwerij|bier|ambachtelijk bier|brouwhuis
fi:^Panimo
fr:^Brasserie
de:^Brauerei|Brauhaus|Hausbrauerei|Bier|Bierausschank|Hausbräu
@@ -5661,7 +5668,7 @@ ru:^Столяр|мастерская столяра
ar:^نجار
cs:^Truhlář
da:^Tømrer
-nl:^Timmerman
+nl:^Timmerman|houtbewerker
fi:^Puuseppä
fr:^Menuisier|charpentier
de:^Zimmermann
@@ -5723,10 +5730,10 @@ ru:^Садовник
ar:^مهندس مناظر
cs:^Zahradník
da:^Gartner
-nl:^Tuinarchitect|landschapsarchitect
+nl:^Tuinarchitect|landschapsarchitect|tuinman
fi:^Puutarhuri
fr:^Paysagiste
-de:^Landschaftsgärtner
+de:^Landschaftsgärtner|Gärtner
hu:^Kertész
id:^Tukang kebun
it:^Giardiniere|architetto di esterni
@@ -5754,10 +5761,10 @@ ru:^Кондиционеры
ar:^تكييف|مكيف هواء
cs:^HVAC|montér vzduchotechniky
da:^Blikkenslager|klimaanlæg
-nl:^Airconditioning|luchtbehandeling
+nl:^Airconditioning|luchtbehandeling|airco
fi:^Ilmastointilaite
fr:^Climatiseur
-de:^Heizung|Lüftung|Klima|Installateur
+de:^Heizung|Lüftung|Klima|Installateur|Klimaanlage
hu:^Hűtés-fűtés szerelő|légkondicionáló
id:^Hvac
it:^Impianti HVAC|aria condizionata
@@ -5847,7 +5854,7 @@ ru:^Фотограф|фотоателье
ar:^مصور فوتوغرافي|استوديو تصوير
cs:^Fotograf|fotografické studio
da:^Fotograf|studio
-nl:^Fotograaf
+nl:^Fotograaf|fotografie studio
fi:^Valokuvaaja
fr:^Photographe|studio photographique
de:^Fotograf|Fotostudio
@@ -5882,7 +5889,7 @@ da:^VVS-mand
nl:^Loodgieter
fi:^Putkimies
fr:^Plombier
-de:^Installateur
+de:^Installateur|Klempner
hu:^Vízvezeték-szerelő
id:^Tukang pipa
it:^Idraulico|tubista
@@ -6231,6 +6238,7 @@ ru:^Копировальный центр|печать|полиграфия
ar:^محل نسخ|طباعة
cs:^Kopírovací obchod|Tiskárny
da:^Kopieringsbutik|Trykkeri
+nl:^Copy shop|Kopieerwinkel|printer|drukker
fi:^Painotalo|Tulostaja
fr:^Boutique de photocopies|Imprimerie
de:^Kopierladen|Drucker
@@ -6293,7 +6301,7 @@ ru:^Турагентство|путешествия|туристическое
ar:^وكيل سفريات|جولات
cs:^Cestovní kancelář|cesty
da:^Rejsebureau|rundrejser
-nl:^Reisagentschap|reizen
+nl:^Reisbureau|reisagentschap|reizen
fi:^Matkatoimisto
fr:^Agence de voyages|Voyages organisés
de:^Reisebüro|Reisen|Rundreisen|Reisevermittlung|Reisevermittler|Reiseagentur|Touren|Ausflüge|Urlaub|Touristeninformation|Last-Minute-Tour
@@ -6356,7 +6364,7 @@ ru:^Химчистка
ar:^غسيل جاف|غسيل
cs:^Chemické čištění|čistírna
da:^Renseri|vaskeri
-nl:^Droogkuis|wassen
+nl:^Stomerij|chemisch reinigen|droogkuis|wassen|stomen
fi:^Kuivapesula|pesula
fr:^Nettoyage à sec|Lavage
de:^Chemische Reinigung|Reinigung
@@ -6420,7 +6428,7 @@ ru:^Автомойка
ar:^مغسلة سيارات
cs:^Myčka aut
da:^Bilvask
-nl:^Car wash
+nl:^Car wash|autowasstraat|wasstraat
fi:^Autopesula
fr:^Station de lavage
de:^Autowäsche
@@ -6487,7 +6495,7 @@ da:^Ladestation|opladning
nl:^Oplaadstation|opladen
fi:^Latausasema|lataus
fr:^Station de recharge|Recharge
-de:^Ladestation
+de:^Ladestation|aufladen
hu:^Töltőállomás|töltés
id:^Pusat Pengisian Daya|pengisian daya
it:^Stazione di ricarica|ricarica
@@ -6516,10 +6524,10 @@ ru:^Детская комната|ясли
ar:^حضانة|رعاية أطفال
cs:^Jesle|Péče o děti
da:^Vuggestue|Børnehave
-nl:^Crèche|kinderzorg
+nl:^Crèche|kinderopvang|kinderzorg
fi:^Päivähoito|Lastenhoito
fr:^Garderie|Garde d'enfant
-de:^Kindertagesstätte|Kinderzimmer|Kindergarten|Kinderbetreuung
+de:^Kindertagesstätte|Kindergarten|Kinderbetreuung
hu:^Bölcsőde|Gyermekgondozás|Gyermekfelügyelet
id:^Penitipan Anak|Perawatan Anak
it:^Asilo|cura dell'infanzia
@@ -6612,7 +6620,7 @@ ru:^Телефон для экстренных вызовов
ar:^هاتف الطوارئ
cs:^Tísňového volání
da:^Nødtelefon
-nl:^Praatpaal
+nl:^Praatpaal|4noodtelefoon
fi:^Hätäpuhelin
fr:^Téléphone d'urgence
de:^Notruftelefon|Nottelefon
@@ -6646,7 +6654,7 @@ ru:^Фитнес-клуб|качалка|тренажерный зал|фитн
ar:^مركز للياقة البدنية، نادي رياضي
cs:^Fitness|tělocvična
da:^Trænings- og motionscenter|fitnesscenter
-nl:^Fitnesscentrum|sportschool
+nl:^Fitnesscentrum|sportschool|gym|fitness|workout
fi:^Kuntosali
fr:^Centre fitness|salle de gym
de:^Fitnessstudio|Fitnesscenter|Fitness|Fitnessraum|Fitnessclub|Gesundheitsclub|Training|Trainingsraum|Turnhalle
@@ -6839,7 +6847,7 @@ ru:2^Зоопарк
ar:^حديقة حيوان
cs:^zoologická zahrada
da:^Zoo
-nl:^Dierentuin
+nl:^Dierentuin|zoo
fi:^Eläintarha
fr:^Zoo
de:^Zoo
@@ -6873,7 +6881,7 @@ ru:^Туристический офис
ar:^مكتب سياحة
cs:^Informační centrum
da:^Turistkontor
-nl:^Toeristische informatie
+nl:^VVV|Toeristische informatie
fi:^Turistitoimisto
fr:^Office de tourisme
de:^Fremdenverkehrsamt
@@ -6937,10 +6945,10 @@ ru:^Суд
ar:^محكمة
cs:^Soud
da:^Domhus|retsbygning
-nl:^Rechtbank
+nl:^Rechtban|gerechtsgebouw
fi:^Oikeustalo
fr:^Palais de justice
-de:^Justizgebäude
+de:^Justizgebäude|Gerichtsgebäude
hu:^Bíróság
id:^Gedung pengadilan
it:^Tribunale
@@ -7065,7 +7073,7 @@ ru:^Зона отдыха на трассе
ar:^استراحة
cs:^Odpočívadlo
da:^Rasteplads
-nl:^Parkeerplaats
+nl:^Snelweg rustplaats|Parkeerplaats
fi:^Levähdyspaikka
fr:^Aire de repos
de:^Rastplatz
@@ -7191,7 +7199,7 @@ ru:^Подстанция
ar:^محطة كهرباء فرعية
cs:^Rozvodna
da:^Transformerstation
-nl:^Substation
+nl:^Onderstation
fi:^Muuntoasema
fr:^Sous-station
de:^Umspannwerk
@@ -7254,10 +7262,10 @@ ru:^Рыбный магазин|рыба|морепродукты|рыбная
ar:^سماك
cs:^Prodej ryb
da:^Fiskehandler
-nl:^Visboer
+nl:^Visboer|vismarkt|vis|zeevoedsel|schelpdier
fi:^Kalakauppias
fr:^Poissonnier
-de:^Fischhändler
+de:^Fischhändler|Fischmarkt|Fisch|Meeresfrüchte|Schaltier
hu:^Halüzlet
id:^Penjual Ikan
it:^Pescivendolo
@@ -7286,7 +7294,7 @@ ru:^Билетная касса|билет|театральная касса|б
ar:^مكتب تذاكر
cs:^Prodej vstupenek
da:^Billetkontor
-nl:^Kaartjesverkoop
+nl:^Kaartverkoop|Kaartjesverkoop|kaartjes
fi:^Lippumyymälä
fr:^Billetterie
de:^Fahrkartenschalter|Fahrkartengeschäft|Fahrkarten|Fahrkartenzentrum|Fahrkartenausgabe|Fahrkartenagentur|Fahrkartenhäuschen|Reisecenter|Kassenschalter|Zahlschalter
@@ -7318,10 +7326,10 @@ ru:^Винный магазин
ar:^متجر مشروبات روحية
cs:^Vinařství
da:^Vinhandel
-nl:^Wijn|Slijterij
+nl:^Slijterij|Wijn
fi:^Alkoholimyymälä
fr:^Hors licence
-de:^Wein- und Spirituosengeschäft
+de:^Wein- und Spirituosengeschäft|Weinladen
hu:^Borkereskedés
id:^Toko anggur
it:^Negozio di alcolici
@@ -7447,7 +7455,7 @@ ru:^Карта
ar:^خريطة سياحية
cs:^Turistická mapa
da:^Turistkort
-nl:^Toeristische kaart
+nl:^Toeristische kaart|toeristenkaart
fi:^Turistikartta
fr:^Carte touristique
de:^Touristenkarte
@@ -7510,7 +7518,7 @@ ru:^Вертолётная площадка
ar:^مهبط مروحيات
cs:^Helipad
da:^Helikopterlandingsplads
-nl:^Heliplatform
+nl:^Heliplatform|helikopterplatform|helipad
fi:^Helikopterialusta
fr:^Hélisurface
de:^Hubschrauberlandeplatz
@@ -7542,7 +7550,7 @@ ru:^Паркомат
ar:^ماكينة دفع تذاكر الموقف
cs:^Parkovací automat
da:^Parkeringsbilletmaskine
-nl:^Betaalautomaat parkeergarage
+nl:^Parkeerautomaat|Betaalautomaat parkeergarage
fi:^Pysäköintimaksuautomaatti
fr:^Horodateur
de:^Parkautomat
@@ -7798,7 +7806,7 @@ ru:^Пункт оплаты
ar:^كشك رسوم عبور
cs:^Mýtné
da:^Betalingsstation
-nl:^Tolhokje
+nl:^Tolhuisje|Tolhokje
fi:^Tietulliasema
fr:^Poste de péage
de:^Mautstelle
@@ -7865,7 +7873,7 @@ da:^Vandpark
nl:^Waterpark
fi:^Vesipuisto
fr:^Centre aquatique
-de:^Freizeitbad
+de:^Wasserpark|Freizeitbad
hu:^Strand|Élményfürdő|Aquapark
id:^Taman air
it:^Parco acquatico
@@ -8372,7 +8380,7 @@ ru:^Дом отдыха
ar:^منتج
cs:^Letovisko
da:^Resort
-nl:^Complex
+nl:^Resort|Complex
fi:^Lomakohteet
fr:^Complexe touristique
de:^Resort
@@ -8479,7 +8487,7 @@ it:^Chiosco gelati
ja:^アイスクリーム屋
ko:^아이스크림 스탠드
nb:^Iskrem
-nl:^Ijsstand
+nl:^Ijskraam|Ijsstand
pl:^Stoisko z lodami
pt:^Banca de gelados
pt-BR:^Sorveteria
@@ -8512,7 +8520,7 @@ it:^Internet Cafe
ja:^インターネットカフェ
ko:^인터넷 카페
nb:^Internettkafé
-nl:^Internetcafe
+nl:^Internetcafé
pl:^Kafejka internetowa
pt:^Cibercafé
pt-BR:^Cibercafé
@@ -8545,7 +8553,7 @@ it:^Parcheggio moto
ja:^バイク駐輪場
ko:^오토바이 주차
nb:^Motorsykkelparkering
-nl:^Parking Motorfietsen
+nl:^Motorfiets Parkeerplaats|Parking Motorfietsen
pl:^Parking motocyklowy
pt:^Estacionamento de motos
pt-BR:^Estacionamento de motos
@@ -8578,7 +8586,7 @@ it:^Casa di riposo
ja:^養護施設
ko:^요양원
nb:^Sykehjem
-nl:^Bejaardentehuis
+nl:^Bejaardentehuis|Pleeghuis
pl:^Dom opieki
pt:^Casa de repouso
pt-BR:^Casa de repouso
@@ -8708,7 +8716,7 @@ it:^Defibrillatore
ja:^除細動器
ko:^제세동기
nb:^Hjertestarter
-nl:^Defibrillator
+nl:^AED|Defibrillator
pl:^Defibrylator
pt:^Desfibrilador
pt-BR:^Desfibrilador
@@ -9004,7 +9012,7 @@ it:^Centro massaggi
ja:^マッサージパーラー
ko:^안마 시술소
nb:^Massasjesalong
-nl:^Massagesalon
+nl:^Massagesalon|Massagetherapie|Wellness-Center|Spa|Massage
pl:^Salon masażu
pt:^Centro de massagens
pt-BR:^Massagista
@@ -9070,7 +9078,7 @@ it:^Edicola
ja:^新聞販売店
ko:^신문 가판대
nb:^Aviskiosk
-nl:^Kiosk
+nl:^Kiosk|krant
pl:^Stoisko z prasą
pt:^Banca de jornais
pt-BR:^Banca de jornais|jornaleiro
@@ -9168,7 +9176,7 @@ it:^Studio tatuaggi
ja:^タトゥーパーラー
ko:^문신 시술소
nb:^Tatovør
-nl:^Tattoosalon
+nl:^Tatoeagezaak|Tattoosalon|Tattoo Studio|Tattoo Shop|tatoeage
pl:^Salon tatuażu
pt:^Estúdio de tatuagens
pt-BR:^Estúdio de tatuagens|tatuador
@@ -9192,7 +9200,7 @@ cs:^Smíšené zboží
da:^Småtingsbutik
de:^Billigladen
el:^Παντοπωλείο|Μπακάλικο|Ψιλικατζίδικο
-es:^«Todo a cien»
+es:^Tienda de Variedades
fi:^Halpakauppa
fr:^Bazar
hu:^Vegyesbolt
@@ -9201,7 +9209,7 @@ it:^Negozio di accessori
ja:^雑貨店
ko:^잡화점
nb:^Billigbutikk
-nl:^Bazaar
+nl:^Bazaar|Variety Store
pl:^Sklep z różnościami
pt:^Loja dos 300
pt-BR:^1,99|Loja de variedades
@@ -9252,13 +9260,17 @@ zh-Hant:^山屋
tourism-gallery|@tourism
en:^Gallery|museum
ru:^Галерея|музей|картины|картинная галерея
+de:^Galerie|Museum
+nl:^Galerij|museum
tourism-theme_park|@tourism|@children
en:^Theme park|Amusement park
ru:^Парк развлечений|Парк аттракционов|Тематический парк
+de:^Freizeitpark|Vergnügungspark
fr:^Parc d'attractions|Parc de loisirs
es:^Parque de atracciones
fi:^Huvipuisto
+nl:^Pretpark|Attractiepark
pt:^Parque de diversão
boundary-national_park|@tourism
@@ -9311,7 +9323,7 @@ it:Riserva
ja:自然保護区
ko:천연보호구역
nb:Reservat
-nl:Reserve
+nl:Natuurgebied|reservaat
pl:Rezerwat przyrody
pt:Reserva natural
pt-BR:Reserva Florestal
diff --git a/data/countries.txt b/data/countries.txt
index a5c35a21ce..eac86d8101 100644
--- a/data/countries.txt
+++ b/data/countries.txt
@@ -12360,8 +12360,8 @@
"g": [
{
"id": "South Africa_Western Cape",
- "s": 23826809,
- "sha1_base64": "jIRuCov7rqi2MSS1Xw+9EoPgp8c=",
+ "s": 25355941,
+ "sha1_base64": "QqCRUsWHw5A9WaGDa6jYKeH697U=",
"old": [
"South Africa"
],
@@ -12373,8 +12373,8 @@
},
{
"id": "South Africa_Gauteng",
- "s": 16113854,
- "sha1_base64": "AKn6gGt34hFGI+4EHk3bHt8OqSA=",
+ "s": 16237030,
+ "sha1_base64": "2S/KGVBeEE2UutvIFdSGah9qH9U=",
"old": [
"South Africa"
],
@@ -12385,8 +12385,8 @@
},
{
"id": "South Africa_North West",
- "s": 6108377,
- "sha1_base64": "H8VIodaZ4x0619pTFGetmL6u3Yc=",
+ "s": 6195513,
+ "sha1_base64": "bH87cvnMfmlUhDwBTmSLIN7isXk=",
"old": [
"South Africa"
],
@@ -12397,8 +12397,8 @@
},
{
"id": "South Africa_Free State",
- "s": 7116673,
- "sha1_base64": "F0ptHQBIEwXq6/5ATDhWFW2UBYY=",
+ "s": 7124358,
+ "sha1_base64": "dSfJRReeogwWTd+DacvbNd2NKDs=",
"old": [
"South Africa"
],
@@ -12409,8 +12409,8 @@
},
{
"id": "South Africa_Eastern Cape",
- "s": 12713624,
- "sha1_base64": "CJuKG0PBUQGHPv7ms3b34vKIY/E=",
+ "s": 12884152,
+ "sha1_base64": "XicL3LVXAbO4dkUMC/VEqL+2/4o=",
"old": [
"South Africa"
],
@@ -12421,8 +12421,8 @@
},
{
"id": "South Africa_Northern Cape",
- "s": 8984267,
- "sha1_base64": "DoymmaJgjkj6dIHzP8lfyX7r0xE=",
+ "s": 9000592,
+ "sha1_base64": "8cHhw+xNOoxs/mYYfD9rkNYCMDI=",
"old": [
"South Africa"
],
@@ -12433,8 +12433,8 @@
},
{
"id": "South Africa_Mpumalanga",
- "s": 7327800,
- "sha1_base64": "a50w7deSki4BRgC1dfs9HRhWEGo=",
+ "s": 7359457,
+ "sha1_base64": "2Mff7Zamb8uvTzl48Cnyz8r1364=",
"old": [
"South Africa"
],
@@ -12445,8 +12445,8 @@
},
{
"id": "South Africa_Limpopo",
- "s": 7177527,
- "sha1_base64": "ZI7N+e8QbuDAf92cYmtIzGnzxkk=",
+ "s": 7193263,
+ "sha1_base64": "WeZiMCox9BUFxC2/rOsKpC9xUeE=",
"old": [
"South Africa"
],
@@ -12457,8 +12457,8 @@
},
{
"id": "South Africa_KwaZulu-Natal",
- "s": 21241430,
- "sha1_base64": "NDoRZasth+TjXvSzhxfeRWeJYkA=",
+ "s": 21606493,
+ "sha1_base64": "cNUUOrqu87Yzhx1ueWxx3HeXnwQ=",
"old": [
"South Africa"
],
diff --git a/drape/vulkan/vulkan_base_context.cpp b/drape/vulkan/vulkan_base_context.cpp
index bc49774532..b7d42ea6aa 100644
--- a/drape/vulkan/vulkan_base_context.cpp
+++ b/drape/vulkan/vulkan_base_context.cpp
@@ -177,7 +177,14 @@ bool VulkanBaseContext::BeginRendering()
if (!m_presentAvailable)
return false;
- auto res = vkWaitForFences(m_device, 1, &m_fences[m_inflightFrameIndex], VK_TRUE, UINT64_MAX);
+ // We wait for the fences no longer than kTimeoutNanoseconds. If timer is expired skip
+ // the frame. It helps to prevent freeze on vkWaitForFences in the case of resetting surface.
+ uint64_t constexpr kTimeoutNanoseconds = 2 * 1000 * 1000 * 1000;
+ auto res = vkWaitForFences(m_device, 1, &m_fences[m_inflightFrameIndex], VK_TRUE,
+ kTimeoutNanoseconds);
+ if (res == VK_TIMEOUT)
+ return false;
+
if (res != VK_SUCCESS && res != VK_ERROR_DEVICE_LOST)
CHECK_RESULT_VK_CALL(vkWaitForFences, res);
@@ -199,9 +206,20 @@ bool VulkanBaseContext::BeginRendering()
}
m_frameCounter++;
-
- res = vkAcquireNextImageKHR(m_device, m_swapchain, UINT64_MAX, m_acquireSemaphores[m_inflightFrameIndex],
+
+ // Here we also wait no longer than kTimeoutNanoseconds. In this case we have to
+ // recreate synchronization primitives, because one of fences can be reset.
+ res = vkAcquireNextImageKHR(m_device, m_swapchain, kTimeoutNanoseconds,
+ m_acquireSemaphores[m_inflightFrameIndex],
VK_NULL_HANDLE, &m_imageIndex);
+ if (res == VK_TIMEOUT)
+ {
+ vkDeviceWaitIdle(m_device);
+ DestroySyncPrimitives();
+ CreateSyncPrimitives();
+ return false;
+ }
+
if (res == VK_ERROR_OUT_OF_DATE_KHR || res == VK_SUBOPTIMAL_KHR)
{
RecreateSwapchainAndDependencies();
diff --git a/drape/vulkan/vulkan_object_manager.cpp b/drape/vulkan/vulkan_object_manager.cpp
index 30c69dce35..7823f5cd40 100644
--- a/drape/vulkan/vulkan_object_manager.cpp
+++ b/drape/vulkan/vulkan_object_manager.cpp
@@ -130,7 +130,7 @@ VulkanObject VulkanObjectManager::CreateBuffer(VulkanMemoryManager::ResourceType
return result;
}
-VulkanObject VulkanObjectManager::CreateImage(VkImageUsageFlags usageFlags, VkFormat format,
+VulkanObject VulkanObjectManager::CreateImage(VkImageUsageFlags usageFlags, VkFormat format, VkImageTiling tiling,
VkImageAspectFlags aspectFlags, uint32_t width, uint32_t height)
{
VulkanObject result;
@@ -142,7 +142,7 @@ VulkanObject VulkanObjectManager::CreateImage(VkImageUsageFlags usageFlags, VkFo
imageCreateInfo.mipLevels = 1;
imageCreateInfo.arrayLayers = 1;
imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
- imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
+ imageCreateInfo.tiling = tiling;
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
imageCreateInfo.extent = { width, height, 1 };
diff --git a/drape/vulkan/vulkan_object_manager.hpp b/drape/vulkan/vulkan_object_manager.hpp
index aca03d9fd5..de76b97583 100644
--- a/drape/vulkan/vulkan_object_manager.hpp
+++ b/drape/vulkan/vulkan_object_manager.hpp
@@ -73,7 +73,7 @@ public:
VulkanObject CreateBuffer(VulkanMemoryManager::ResourceType resourceType,
uint32_t sizeInBytes, uint64_t batcherHash);
- VulkanObject CreateImage(VkImageUsageFlags usageFlags, VkFormat format,
+ VulkanObject CreateImage(VkImageUsageFlags usageFlags, VkFormat format, VkImageTiling tiling,
VkImageAspectFlags aspectFlags, uint32_t width, uint32_t height);
DescriptorSetGroup CreateDescriptorSetGroup(ref_ptr<VulkanGpuProgram> program);
diff --git a/drape/vulkan/vulkan_texture.cpp b/drape/vulkan/vulkan_texture.cpp
index b7191123fa..836396341c 100644
--- a/drape/vulkan/vulkan_texture.cpp
+++ b/drape/vulkan/vulkan_texture.cpp
@@ -113,9 +113,12 @@ void VulkanTexture::Create(ref_ptr<dp::GraphicsContext> context, Params const &
}
auto const format = VulkanFormatUnpacker::Unpack(params.m_format);
+
VkFormatProperties formatProperties;
vkGetPhysicalDeviceFormatProperties(vulkanContext->GetPhysicalDevice(), format, &formatProperties);
- CHECK(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, ());
+ VkImageTiling tiling = VK_IMAGE_TILING_LINEAR;
+ if (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
+ tiling = VK_IMAGE_TILING_OPTIMAL;
m_isMutable = params.m_isMutable;
if (params.m_isRenderTarget)
@@ -127,12 +130,12 @@ void VulkanTexture::Create(ref_ptr<dp::GraphicsContext> context, Params const &
params.m_format == TextureFormat::DepthStencil ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
: VK_IMAGE_ASPECT_DEPTH_BIT;
m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
- format, aspect, params.m_width, params.m_height);
+ format, tiling, aspect, params.m_width, params.m_height);
}
else
{
m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
- format, VK_IMAGE_ASPECT_COLOR_BIT,
+ format, tiling, VK_IMAGE_ASPECT_COLOR_BIT,
params.m_width, params.m_height);
}
}
@@ -152,9 +155,8 @@ void VulkanTexture::Create(ref_ptr<dp::GraphicsContext> context, Params const &
m_creationStagingBuffer->Flush();
// Create image.
- m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_SAMPLED_BIT, format,
- VK_IMAGE_ASPECT_COLOR_BIT,
- params.m_width, params.m_height);
+ m_textureObject = m_objectManager->CreateImage(VK_IMAGE_USAGE_SAMPLED_BIT, format, tiling,
+ VK_IMAGE_ASPECT_COLOR_BIT, params.m_width, params.m_height);
}
}
diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp
index 19779b6a2b..7de05e166d 100644
--- a/drape_frontend/drape_engine.cpp
+++ b/drape_frontend/drape_engine.cpp
@@ -199,7 +199,7 @@ void DrapeEngine::SetModelViewRect(m2::RectD const & rect, bool applyRotation, i
void DrapeEngine::SetModelViewAnyRect(m2::AnyRectD const & rect, bool isAnim)
{
- PostUserEvent(make_unique_dp<SetAnyRectEvent>(rect, isAnim));
+ PostUserEvent(make_unique_dp<SetAnyRectEvent>(rect, isAnim, true /* fitInViewport */));
}
void DrapeEngine::ClearUserMarksGroup(kml::MarkGroupId groupId)
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp
index 97d300a941..8cabcd64e3 100755
--- a/drape_frontend/frontend_renderer.cpp
+++ b/drape_frontend/frontend_renderer.cpp
@@ -1244,20 +1244,33 @@ void FrontendRenderer::ProcessSelection(ref_ptr<SelectObjectMessage> msg)
if (msg->IsDismiss())
{
m_selectionShape->Hide();
+ if (!m_myPositionController->IsModeChangeViewport() && m_selectionTrackInfo.is_initialized())
+ {
+ AddUserEvent(make_unique_dp<SetAnyRectEvent>(m_selectionTrackInfo.get().m_startRect, true /* isAnim */,
+ false /* fitInViewport */));
+ }
+ m_selectionTrackInfo.reset();
}
else
{
double offsetZ = 0.0;
- if (m_userEventStream.GetCurrentScreen().isPerspective())
+ auto const & modelView = m_userEventStream.GetCurrentScreen();
+ if (modelView.isPerspective())
{
dp::TOverlayContainer selectResult;
if (m_overlayTree->IsNeedUpdate())
- BuildOverlayTree(m_userEventStream.GetCurrentScreen());
+ BuildOverlayTree(modelView);
m_overlayTree->Select(msg->GetPosition(), selectResult);
for (ref_ptr<dp::OverlayHandle> handle : selectResult)
offsetZ = max(offsetZ, handle->GetPivotZ());
}
m_selectionShape->Show(msg->GetSelectedObject(), msg->GetPosition(), offsetZ, msg->IsAnim());
+ if (!m_myPositionController->IsModeChangeViewport())
+ {
+ m2::PointD startPosition;
+ m_selectionShape->IsVisible(modelView, startPosition);
+ m_selectionTrackInfo = SelectionTrackInfo(modelView.GlobalRect(), startPosition);
+ }
}
}
@@ -1991,13 +2004,15 @@ void FrontendRenderer::OnTouchMapAction(TouchEvent::ETouchType touchType)
// the completion of touch actions. It helps to prevent the creation of redundant checks.
auto const blockTimer = (touchType == TouchEvent::TOUCH_DOWN || touchType == TouchEvent::TOUCH_MOVE);
m_myPositionController->ResetRoutingNotFollowTimer(blockTimer);
+ m_selectionTrackInfo.reset();
}
+
bool FrontendRenderer::OnNewVisibleViewport(m2::RectD const & oldViewport,
m2::RectD const & newViewport, m2::PointD & gOffset)
{
gOffset = m2::PointD(0, 0);
if (m_myPositionController->IsModeChangeViewport() || m_selectionShape == nullptr ||
- oldViewport == newViewport)
+ oldViewport == newViewport || !m_selectionTrackInfo.is_initialized())
{
return false;
}
@@ -2009,43 +2024,63 @@ bool FrontendRenderer::OnNewVisibleViewport(m2::RectD const & oldViewport,
m2::PointD pos;
m2::PointD targetPos;
- if (m_selectionShape->IsVisible(screen, pos) &&
- m_selectionShape->IsVisible(targetScreen, targetPos))
+ if (!m_selectionShape->IsVisible(screen, pos) || !m_selectionShape->IsVisible(targetScreen, targetPos))
+ return false;
+
+ m2::RectD rect(pos, pos);
+ m2::RectD targetRect(targetPos, targetPos);
+
+ if (m_overlayTree->IsNeedUpdate())
+ BuildOverlayTree(screen);
+
+ if (!(m_selectionShape->GetSelectedObject() == SelectionShape::OBJECT_POI &&
+ m_overlayTree->GetSelectedFeatureRect(screen, rect) &&
+ m_overlayTree->GetSelectedFeatureRect(targetScreen, targetRect)))
{
- m2::RectD rect(pos, pos);
- m2::RectD targetRect(targetPos, targetPos);
+ double const r = m_selectionShape->GetRadius();
+ rect.Inflate(r, r);
+ targetRect.Inflate(r, r);
+ }
+ double const ptZ = m_selectionShape->GetPositionZ();
+
+ double const kOffset = 50 * VisualParams::Instance().GetVisualScale();
+ rect.Inflate(kOffset, kOffset);
+ targetRect.Inflate(kOffset, kOffset);
- if (m_overlayTree->IsNeedUpdate())
- BuildOverlayTree(screen);
+ if (newViewport.SizeX() < rect.SizeX() || newViewport.SizeY() < rect.SizeY())
+ return false;
- if (!(m_selectionShape->GetSelectedObject() == SelectionShape::OBJECT_POI &&
- m_overlayTree->GetSelectedFeatureRect(screen, rect) &&
- m_overlayTree->GetSelectedFeatureRect(targetScreen, targetRect)))
+ m2::PointD pOffset(0.0, 0.0);
+ if ((oldViewport.IsIntersect(targetRect) && !newViewport.IsRectInside(rect)) ||
+ (newViewport.IsRectInside(rect) && m_selectionTrackInfo.get().m_snapSides != m2::PointI::Zero()))
+ {
+ // In case the rect of the selection is [partly] hidden, scroll the map to keep it visible.
+ // In case the rect of the selection is visible after the map scrolling,
+ // try to rollback part of that scrolling to return the map to its original position.
+ if (rect.minX() < newViewport.minX() || m_selectionTrackInfo.get().m_snapSides.x < 0)
{
- double const r = m_selectionShape->GetRadius();
- rect.Inflate(r, r);
- targetRect.Inflate(r, r);
+ pOffset.x = std::max(m_selectionTrackInfo.get().m_startPos.x - pos.x, newViewport.minX() - rect.minX());
+ m_selectionTrackInfo.get().m_snapSides.x = -1;
}
-
- if (oldViewport.IsIntersect(targetRect) && !newViewport.IsRectInside(rect))
+ else if (rect.maxX() > newViewport.maxX() || m_selectionTrackInfo.get().m_snapSides.x > 0)
{
- double const kOffset = 50 * VisualParams::Instance().GetVisualScale();
- m2::PointD pOffset(0.0, 0.0);
- if (rect.minX() < newViewport.minX())
- pOffset.x = newViewport.minX() - rect.minX() + kOffset;
- else if (rect.maxX() > newViewport.maxX())
- pOffset.x = newViewport.maxX() - rect.maxX() - kOffset;
-
- if (rect.minY() < newViewport.minY())
- pOffset.y = newViewport.minY() - rect.minY() + kOffset;
- else if (rect.maxY() > newViewport.maxY())
- pOffset.y = newViewport.maxY() - rect.maxY() - kOffset;
+ pOffset.x = std::min(m_selectionTrackInfo.get().m_startPos.x - pos.x, newViewport.maxX() - rect.maxX());
+ m_selectionTrackInfo.get().m_snapSides.x = 1;
+ }
- gOffset = screen.PtoG(screen.P3dtoP(pos + pOffset)) - screen.PtoG(screen.P3dtoP(pos));
- return true;
+ if (rect.minY() < newViewport.minY() || m_selectionTrackInfo.get().m_snapSides.y < 0)
+ {
+ pOffset.y = std::max(m_selectionTrackInfo.get().m_startPos.y - pos.y, newViewport.minY() - rect.minY());
+ m_selectionTrackInfo.get().m_snapSides.y = -1;
+ }
+ else if (rect.maxY() > newViewport.maxY() || m_selectionTrackInfo.get().m_snapSides.y > 0)
+ {
+ pOffset.y = std::min(m_selectionTrackInfo.get().m_startPos.y - pos.y, newViewport.maxY() - rect.maxY());
+ m_selectionTrackInfo.get().m_snapSides.y = 1;
}
}
- return false;
+ gOffset = screen.PtoG(screen.P3dtoP(pos + pOffset, ptZ)) - screen.PtoG(screen.P3dtoP(pos, ptZ));
+ return true;
}
TTilesCollection FrontendRenderer::ResolveTileKeys(ScreenBase const & screen)
diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp
index 479825c613..447d365ab3 100755
--- a/drape_frontend/frontend_renderer.hpp
+++ b/drape_frontend/frontend_renderer.hpp
@@ -39,6 +39,8 @@
#include <unordered_set>
#include <vector>
+#include <boost/optional.hpp>
+
namespace dp
{
class Framebuffer;
@@ -268,7 +270,23 @@ private:
drape_ptr<gui::LayerRenderer> m_guiRenderer;
gui::TWidgetsLayoutInfo m_lastWidgetsLayout;
drape_ptr<MyPositionController> m_myPositionController;
+
drape_ptr<SelectionShape> m_selectionShape;
+ struct SelectionTrackInfo
+ {
+ SelectionTrackInfo() = default;
+
+ SelectionTrackInfo(m2::AnyRectD const & startRect, m2::PointD const & startPos)
+ : m_startRect(startRect)
+ , m_startPos(startPos)
+ {}
+
+ m2::AnyRectD m_startRect;
+ m2::PointD m_startPos;
+ m2::PointI m_snapSides = m2::PointI::Zero();
+ };
+ boost::optional<SelectionTrackInfo> m_selectionTrackInfo;
+
drape_ptr<RouteRenderer> m_routeRenderer;
drape_ptr<TrafficRenderer> m_trafficRenderer;
drape_ptr<TransitSchemeRenderer> m_transitSchemeRenderer;
diff --git a/drape_frontend/selection_shape.hpp b/drape_frontend/selection_shape.hpp
index 757ea08315..afc48a5475 100644
--- a/drape_frontend/selection_shape.hpp
+++ b/drape_frontend/selection_shape.hpp
@@ -44,6 +44,7 @@ public:
bool IsVisible(ScreenBase const & screen, m2::PointD & pxPos) const;
double GetRadius() const { return m_radius; }
+ double GetPositionZ() const { return m_positionZ; }
ESelectedObject GetSelectedObject() const;
diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp
index b67fc6407f..b62be4ea7d 100644
--- a/drape_frontend/user_event_stream.cpp
+++ b/drape_frontend/user_event_stream.cpp
@@ -362,7 +362,7 @@ bool UserEventStream::OnSetScale(ref_ptr<ScaleEvent> scaleEvent)
bool UserEventStream::OnSetAnyRect(ref_ptr<SetAnyRectEvent> anyRectEvent)
{
- return SetRect(anyRectEvent->GetRect(), anyRectEvent->IsAnim());
+ return SetRect(anyRectEvent->GetRect(), anyRectEvent->IsAnim(), anyRectEvent->FitInViewport());
}
bool UserEventStream::OnSetRect(ref_ptr<SetRectEvent> rectEvent)
@@ -455,16 +455,22 @@ bool UserEventStream::SetRect(m2::RectD rect, int zoom, bool applyRotation, bool
CheckMinGlobalRect(rect, kDefault3dScale);
CheckMinMaxVisibleScale(rect, zoom, kDefault3dScale);
m2::AnyRectD targetRect = applyRotation ? ToRotated(m_navigator, rect) : m2::AnyRectD(rect);
- return SetRect(targetRect, isAnim, parallelAnimCreator);
+ return SetRect(targetRect, isAnim, true /* fitInViewport */, parallelAnimCreator);
}
-bool UserEventStream::SetRect(m2::AnyRectD const & rect, bool isAnim,
+bool UserEventStream::SetRect(m2::AnyRectD const & rect, bool isAnim, bool fitInViewport,
TAnimationCreator const & parallelAnimCreator)
{
ScreenBase tmp = GetCurrentScreen();
- tmp.SetFromRects(rect, tmp.PixelRectIn3d());
- tmp.MatchGandP3d(rect.GlobalCenter(), tmp.PixelRectIn3d().Center());
-
+ if (fitInViewport)
+ {
+ tmp.SetFromRects(rect, tmp.PixelRectIn3d());
+ tmp.MatchGandP3d(rect.GlobalCenter(), tmp.PixelRectIn3d().Center());
+ }
+ else
+ {
+ tmp.SetFromRects(rect, tmp.PixelRect());
+ }
return SetScreen(tmp, isAnim, parallelAnimCreator);
}
diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp
index 836c26cc73..ac83bd4c00 100644
--- a/drape_frontend/user_event_stream.hpp
+++ b/drape_frontend/user_event_stream.hpp
@@ -194,19 +194,22 @@ private:
class SetAnyRectEvent : public UserEvent
{
public:
- SetAnyRectEvent(m2::AnyRectD const & rect, bool isAnim)
+ SetAnyRectEvent(m2::AnyRectD const & rect, bool isAnim, bool fitInViewport)
: m_rect(rect)
, m_isAnim(isAnim)
+ , m_fitInViewport(fitInViewport)
{}
EventType GetType() const override { return UserEvent::EventType::SetAnyRect; }
m2::AnyRectD const & GetRect() const { return m_rect; }
bool IsAnim() const { return m_isAnim; }
+ bool FitInViewport() const { return m_fitInViewport; }
private:
m2::AnyRectD m_rect; // destination mercator rect
bool m_isAnim;
+ bool m_fitInViewport;
};
class FollowAndRotateEvent : public UserEvent
@@ -408,7 +411,7 @@ private:
bool SetAngle(double azimuth, TAnimationCreator const & parallelAnimCreator = nullptr);
bool SetRect(m2::RectD rect, int zoom, bool applyRotation, bool isAnim,
TAnimationCreator const & parallelAnimCreator = nullptr);
- bool SetRect(m2::AnyRectD const & rect, bool isAnim,
+ bool SetRect(m2::AnyRectD const & rect, bool isAnim, bool fitInViewport,
TAnimationCreator const & parallelAnimCreator = nullptr);
bool SetScreen(ScreenBase const & screen, bool isAnim,
diff --git a/generator/coastlines_generator.cpp b/generator/coastlines_generator.cpp
index 27ef4032df..1960dc7d7b 100644
--- a/generator/coastlines_generator.cpp
+++ b/generator/coastlines_generator.cpp
@@ -103,7 +103,7 @@ namespace
size_t m_totalNotMergedCoastsPoints;
public:
- DoAddToTree(CoastlineFeaturesGenerator & rMain)
+ explicit DoAddToTree(CoastlineFeaturesGenerator & rMain)
: m_rMain(rMain), m_notMergedCoastsCount(0), m_totalNotMergedCoastsPoints(0) {}
virtual void operator() (FeatureBuilder1 const & fb)
diff --git a/generator/generator_tests/tesselator_test.cpp b/generator/generator_tests/tesselator_test.cpp
index a4719fd6e7..c4d58e67ef 100644
--- a/generator/generator_tests/tesselator_test.cpp
+++ b/generator/generator_tests/tesselator_test.cpp
@@ -14,7 +14,7 @@ namespace
{
size_t & m_count;
public:
- DoDump(size_t & count) : m_count(count)
+ explicit DoDump(size_t & count) : m_count(count)
{
m_count = 0;
}
diff --git a/generator/statistics.cpp b/generator/statistics.cpp
index 9b1f938edb..db4b2d4d9b 100644
--- a/generator/statistics.cpp
+++ b/generator/statistics.cpp
@@ -51,7 +51,7 @@ namespace stats
MapInfo & m_info;
public:
- AccumulateStatistic(MapInfo & info) : m_info(info) {}
+ explicit AccumulateStatistic(MapInfo & info) : m_info(info) {}
void operator() (FeatureType & f, uint32_t)
{
diff --git a/geocoder/geocoder_tests/geocoder_tests.cpp b/geocoder/geocoder_tests/geocoder_tests.cpp
index d8568dcd7c..95ecd182ab 100644
--- a/geocoder/geocoder_tests/geocoder_tests.cpp
+++ b/geocoder/geocoder_tests/geocoder_tests.cpp
@@ -135,11 +135,11 @@ UNIT_TEST(Geocoder_MismatchedLocality)
10 {"properties": {"address": {"locality": "Moscow"}}}
11 {"properties": {"address": {"locality": "Paris"}}}
-21 {"properties": {"address": {"street": "Street", "locality": "Moscow"}}}
-22 {"properties": {"address": {"building": "2", "street": "Street", "locality": "Moscow"}}}
+21 {"properties": {"address": {"street": "Krymskaya", "locality": "Moscow"}}}
+22 {"properties": {"address": {"building": "2", "street": "Krymskaya", "locality": "Moscow"}}}
-31 {"properties": {"address": {"street": "Street", "locality": "Paris"}}}
-32 {"properties": {"address": {"building": "3", "street": "Street", "locality": "Paris"}}}
+31 {"properties": {"address": {"street": "Krymskaya", "locality": "Paris"}}}
+32 {"properties": {"address": {"building": "3", "street": "Krymskaya", "locality": "Paris"}}}
)#";
ScopedFile const regionsJsonFile("regions.jsonl", kData);
@@ -147,10 +147,10 @@ UNIT_TEST(Geocoder_MismatchedLocality)
base::GeoObjectId const building2(22);
- TestGeocoder(geocoder, "Moscow Street 2", {{building2, 1.0}});
+ TestGeocoder(geocoder, "Moscow Krymskaya 2", {{building2, 1.0}});
- // "Street 3" looks almost like a match to "Paris-Street-3" but we should not emit it.
- TestGeocoder(geocoder, "Moscow Street 3", {});
+ // "Krymskaya 3" looks almost like a match to "Paris-Krymskaya-3" but we should not emit it.
+ TestGeocoder(geocoder, "Moscow Krymskaya 3", {});
}
UNIT_TEST(Geocoder_LocalityBuilding)
@@ -160,8 +160,8 @@ UNIT_TEST(Geocoder_LocalityBuilding)
22 {"properties": {"address": {"building": "2", "locality": "Zelenograd"}}}
-31 {"properties": {"address": {"street": "Street", "locality": "Zelenograd"}}}
-32 {"properties": {"address": {"building": "2", "street": "Street", "locality": "Zelenograd"}}}
+31 {"properties": {"address": {"street": "Krymskaya", "locality": "Zelenograd"}}}
+32 {"properties": {"address": {"building": "2", "street": "Krymskaya", "locality": "Zelenograd"}}}
)#";
ScopedFile const regionsJsonFile("regions.jsonl", kData);
diff --git a/geocoder/hierarchy.cpp b/geocoder/hierarchy.cpp
index d606f3459c..abccd07598 100644
--- a/geocoder/hierarchy.cpp
+++ b/geocoder/hierarchy.cpp
@@ -76,6 +76,19 @@ bool Hierarchy::Entry::DeserializeFromJSONImpl(json_t * const root, string const
m_type = static_cast<Type>(i);
}
+ auto const & subregion = m_address[static_cast<size_t>(Type::Subregion)];
+ auto const & locality = m_address[static_cast<size_t>(Type::Locality)];
+ if (m_type == Type::Street && locality.empty() && subregion.empty() /* if locality detection fail */)
+ {
+ ++stats.m_noLocalityStreets;
+ return false;
+ }
+ if (m_type == Type::Building && locality.empty() && subregion.empty() /* if locality detection fail */)
+ {
+ ++stats.m_noLocalityBuildings;
+ return false;
+ }
+
m_nameTokens.clear();
FromJSONObjectOptionalField(properties, "name", m_name);
search::NormalizeAndTokenizeAsUtf8(m_name, m_nameTokens);
diff --git a/geocoder/hierarchy.hpp b/geocoder/hierarchy.hpp
index 8579db75fb..087f694074 100644
--- a/geocoder/hierarchy.hpp
+++ b/geocoder/hierarchy.hpp
@@ -41,6 +41,12 @@ public:
// Number of entries without the name field or with an empty one.
uint64_t m_emptyNames = 0;
+ // Number of street entries without a locality name.
+ uint64_t m_noLocalityStreets = 0;
+
+ // Number of building entries without a locality name.
+ uint64_t m_noLocalityBuildings = 0;
+
// Number of entries whose names do not match the most
// specific parts of their addresses.
// This is expected from POIs but not from regions or streets.
@@ -72,7 +78,7 @@ public:
Type m_type = Type::Count;
// The address fields of this entry, one per Type.
- std::array<Tokens, static_cast<size_t>(Type::Count) + 1> m_address;
+ std::array<Tokens, static_cast<size_t>(Type::Count)> m_address;
};
explicit Hierarchy(std::vector<Entry> && entries, bool sorted);
diff --git a/geocoder/hierarchy_reader.cpp b/geocoder/hierarchy_reader.cpp
index ae734f97ef..f0f5f30c82 100644
--- a/geocoder/hierarchy_reader.cpp
+++ b/geocoder/hierarchy_reader.cpp
@@ -20,7 +20,7 @@ void operator+=(Hierarchy::ParsingStats & accumulator, Hierarchy::ParsingStats &
struct ValidationStats
{
uint64_t m_numLoaded, m_badJsons, m_badOsmIds, m_duplicateOsmIds, m_duplicateAddresses,
- m_emptyAddresses, m_emptyNames, m_mismatchedNames;
+ m_emptyAddresses, m_emptyNames, m_noLocalityStreets, m_noLocalityBuildings, m_mismatchedNames;
};
static_assert(sizeof(Hierarchy::ParsingStats) == sizeof(ValidationStats),
"Hierarchy::ParsingStats has been modified");
@@ -32,6 +32,8 @@ void operator+=(Hierarchy::ParsingStats & accumulator, Hierarchy::ParsingStats &
accumulator.m_duplicateAddresses += stats.m_duplicateAddresses;
accumulator.m_emptyAddresses += stats.m_emptyAddresses;
accumulator.m_emptyNames += stats.m_emptyNames;
+ accumulator.m_noLocalityStreets += stats.m_noLocalityStreets;
+ accumulator.m_noLocalityBuildings += stats.m_noLocalityBuildings;
accumulator.m_mismatchedNames += stats.m_mismatchedNames;
}
} // namespace
@@ -82,6 +84,8 @@ Hierarchy HierarchyReader::Read(unsigned int readersCount)
LOG(LINFO, ("Entries with duplicate address parts:", stats.m_duplicateAddresses));
LOG(LINFO, ("Entries without address:", stats.m_emptyAddresses));
LOG(LINFO, ("Entries without names:", stats.m_emptyNames));
+ LOG(LINFO, ("Street entries without a locality name:", stats.m_noLocalityStreets));
+ LOG(LINFO, ("Building entries without a locality name:", stats.m_noLocalityBuildings));
LOG(LINFO,
("Entries whose names do not match their most specific addresses:", stats.m_mismatchedNames));
LOG(LINFO, ("(End of stats.)"));
diff --git a/geocoder/index.cpp b/geocoder/index.cpp
index 21b30be043..ae47e36e1c 100644
--- a/geocoder/index.cpp
+++ b/geocoder/index.cpp
@@ -8,6 +8,7 @@
#include "base/logging.hpp"
#include "base/string_utils.hpp"
+#include <algorithm>
#include <atomic>
#include <cstddef>
#include <mutex>
@@ -43,7 +44,12 @@ Index::Doc const & Index::GetDoc(DocId const id) const
// static
string Index::MakeIndexKey(Tokens const & tokens)
{
- return strings::JoinStrings(tokens, " ");
+ if (tokens.size() == 1 || is_sorted(begin(tokens), end(tokens)))
+ return strings::JoinStrings(tokens, " ");
+
+ auto indexTokens = tokens;
+ sort(begin(indexTokens), end(indexTokens));
+ return strings::JoinStrings(indexTokens, " ");
}
void Index::AddEntries()
@@ -83,11 +89,25 @@ void Index::AddStreet(DocId const & docId, Index::Doc const & doc)
{
CHECK_EQUAL(doc.m_type, Type::Street, ());
size_t const t = static_cast<size_t>(doc.m_type);
+
+ auto isStreetSynonym = [] (string const & s) {
+ return search::IsStreetSynonym(strings::MakeUniString(s));
+ };
+
+ if (all_of(begin(doc.m_address[t]), end(doc.m_address[t]), isStreetSynonym))
+ {
+ LOG(LDEBUG, ("Undefined proper name in tokens", doc.m_address[t], "of street entry",
+ doc.m_osmId, "(", doc.m_address, ")"));
+ if (doc.m_address[t].size() > 1)
+ m_docIdsByTokens[MakeIndexKey(doc.m_address[t])].emplace_back(docId);
+ return;
+ }
+
m_docIdsByTokens[MakeIndexKey(doc.m_address[t])].emplace_back(docId);
for (size_t i = 0; i < doc.m_address[t].size(); ++i)
{
- if (!search::IsStreetSynonym(strings::MakeUniString(doc.m_address[t][i])))
+ if (!isStreetSynonym(doc.m_address[t][i]))
continue;
auto addr = doc.m_address[t];
addr.erase(addr.begin() + i);
diff --git a/geometry/screenbase.cpp b/geometry/screenbase.cpp
index 1721b3148f..e922aa3bd1 100644
--- a/geometry/screenbase.cpp
+++ b/geometry/screenbase.cpp
@@ -441,6 +441,11 @@ m2::PointD ScreenBase::PtoP3d(m2::PointD const & pt, double ptZ) const
m2::PointD ScreenBase::P3dtoP(m2::PointD const & pt) const
{
+ return P3dtoP(pt, 0.0 /* ptZ */);
+}
+
+m2::PointD ScreenBase::P3dtoP(m2::PointD const & pt, double ptZ) const
+{
if (!m_isPerspective)
return pt;
@@ -448,14 +453,24 @@ m2::PointD ScreenBase::P3dtoP(m2::PointD const & pt) const
double const normalizedY = -2.0 * pt.y / PixelRectIn3d().SizeY() + 1.0;
double normalizedZ = 0.0;
+
if (m_3dAngleX != 0.0)
{
double const halfFOV = m_3dFOV / 2.0;
double const cameraZ = 1.0 / tan(halfFOV);
double const tanX = tan(m_3dAngleX);
- double const cameraDistanceZ =
- cameraZ * (1.0 + (normalizedY + 1.0) * tanX / (cameraZ - normalizedY * tanX));
+ double cameraDistanceZ = cameraZ * (1.0 + (normalizedY + 1.0) * tanX / (cameraZ - normalizedY * tanX));
+
+ if (ptZ != 0.0)
+ {
+ double const t = sqrt(cameraZ * cameraZ + normalizedY * normalizedY);
+ double const cosBeta = cameraZ / t;
+ double const sinBeta = normalizedY / t;
+ double const dz = ptZ * GetZScale() * cosBeta / (cos(m_3dAngleX) * cosBeta - sin(m_3dAngleX) * sinBeta);
+
+ cameraDistanceZ -= dz;
+ }
double const a = (m_3dFarZ + m_3dNearZ) / (m_3dFarZ - m_3dNearZ);
double const b = -2.0 * m_3dFarZ * m_3dNearZ / (m_3dFarZ - m_3dNearZ);
diff --git a/geometry/screenbase.hpp b/geometry/screenbase.hpp
index 2278883134..ffdaa96612 100644
--- a/geometry/screenbase.hpp
+++ b/geometry/screenbase.hpp
@@ -92,6 +92,7 @@ public:
double GetDepth3d() const { return m_3dFarZ - m_3dNearZ; }
m2::PointD P3dtoP(m2::PointD const & pt) const;
+ m2::PointD P3dtoP(m2::PointD const & pt, double ptZ) const;
Matrix3dT const & Pto3dMatrix() const { return m_Pto3d; }
bool isPerspective() const { return m_isPerspective; }
diff --git a/indexer/drawing_rules.cpp b/indexer/drawing_rules.cpp
index c0e29e4cb9..c422d5522c 100644
--- a/indexer/drawing_rules.cpp
+++ b/indexer/drawing_rules.cpp
@@ -217,7 +217,7 @@ namespace
{
LineDefProto m_line;
public:
- Line(LineRuleProto const & r)
+ explicit Line(LineRuleProto const & r)
{
m_line.set_color(r.color());
m_line.set_width(r.width());
@@ -236,7 +236,7 @@ namespace
{
AreaRuleProto m_area;
public:
- Area(AreaRuleProto const & r) : m_area(r) {}
+ explicit Area(AreaRuleProto const & r) : m_area(r) {}
virtual AreaRuleProto const * GetArea() const { return &m_area; }
};
@@ -245,7 +245,7 @@ namespace
{
SymbolRuleProto m_symbol;
public:
- Symbol(SymbolRuleProto const & r) : m_symbol(r)
+ explicit Symbol(SymbolRuleProto const & r) : m_symbol(r)
{
SetType(r.apply_for_type());
}
@@ -261,9 +261,8 @@ namespace
text_type_t m_textTypeSecondary;
public:
- CaptionT(T const & r) : m_caption(r)
- , m_textTypePrimary(text_type_name)
- , m_textTypeSecondary(text_type_name)
+ explicit CaptionT(T const & r)
+ : m_caption(r), m_textTypePrimary(text_type_name), m_textTypeSecondary(text_type_name)
{
if (!m_caption.primary().text().empty())
m_textTypePrimary = GetTextType(m_caption.primary().text());
@@ -305,7 +304,7 @@ namespace
{
ShieldRuleProto m_shield;
public:
- Shield(ShieldRuleProto const & r) : m_shield(r) {}
+ explicit Shield(ShieldRuleProto const & r) : m_shield(r) {}
virtual ShieldRuleProto const * GetShield() const { return &m_shield; }
};
@@ -408,7 +407,7 @@ namespace
}
public:
- DoSetIndex(RulesHolder & holder)
+ explicit DoSetIndex(RulesHolder & holder)
: m_holder(holder) {}
void operator() (ClassifObject * p)
diff --git a/indexer/feature_visibility.cpp b/indexer/feature_visibility.cpp
index a71329769d..51077d6a85 100644
--- a/indexer/feature_visibility.cpp
+++ b/indexer/feature_visibility.cpp
@@ -136,7 +136,7 @@ namespace
int m_scale;
public:
- IsDrawableChecker(int scale) : m_scale(scale) {}
+ explicit IsDrawableChecker(int scale) : m_scale(scale) {}
typedef bool ResultType;
diff --git a/map/benchmark_tool/features_loading.cpp b/map/benchmark_tool/features_loading.cpp
index 5cc42f8015..6851035b60 100644
--- a/map/benchmark_tool/features_loading.cpp
+++ b/map/benchmark_tool/features_loading.cpp
@@ -28,7 +28,7 @@ namespace
int m_scale;
public:
- Accumulator(Result & res) : m_res(res) {}
+ explicit Accumulator(Result & res) : m_res(res) {}
void Reset(int scale)
{
diff --git a/map/framework.hpp b/map/framework.hpp
index c7ef5cc817..7fda4c5469 100644
--- a/map/framework.hpp
+++ b/map/framework.hpp
@@ -265,7 +265,7 @@ protected:
void InitTransliteration();
public:
- Framework(FrameworkParams const & params = {});
+ explicit Framework(FrameworkParams const & params = {});
virtual ~Framework();
/// Get access to booking api helpers
diff --git a/map/geourl_process.cpp b/map/geourl_process.cpp
index ef9721c70b..6f54f6efa2 100644
--- a/map/geourl_process.cpp
+++ b/map/geourl_process.cpp
@@ -111,7 +111,7 @@ namespace url_scheme
};
public:
- LatLonParser(Info & info)
+ explicit LatLonParser(Info & info)
: m_regexp("-?\\d+\\.{1}\\d*, *-?\\d+\\.{1}\\d*")
, m_info(info)
, m_latPriority(-1)
diff --git a/map/mwm_tests/multithread_mwm_test.cpp b/map/mwm_tests/multithread_mwm_test.cpp
index 4b1899a1d2..9825c30fc6 100644
--- a/map/mwm_tests/multithread_mwm_test.cpp
+++ b/map/mwm_tests/multithread_mwm_test.cpp
@@ -36,7 +36,7 @@ namespace
}
public:
- FeaturesLoader(SourceT const & src) : m_src(src) {}
+ explicit FeaturesLoader(SourceT const & src) : m_src(src) {}
virtual void Do()
{
diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp
index 886f048ad1..5b46665725 100644
--- a/map/routing_manager.cpp
+++ b/map/routing_manager.cpp
@@ -619,7 +619,7 @@ void RoutingManager::FollowRoute()
m_transitReadManager->BlockTransitSchemeMode(true /* isBlocked */);
- // Switching on the extrapolatior only for following mode in car and bicycle navigation.
+ // Switching on the extrapolator only for following mode in car and bicycle navigation.
m_extrapolator.Enable(m_currentRouterType == RouterType::Vehicle ||
m_currentRouterType == RouterType::Bicycle);
m_delegate.OnRouteFollow(m_currentRouterType);
diff --git a/map/style_tests/classificator_tests.cpp b/map/style_tests/classificator_tests.cpp
index f930e887d6..181240026d 100644
--- a/map/style_tests/classificator_tests.cpp
+++ b/map/style_tests/classificator_tests.cpp
@@ -32,7 +32,7 @@ namespace
{
Classificator const & m_c;
public:
- DoCheckConsistency(Classificator const & c) : m_c(c) {}
+ explicit DoCheckConsistency(Classificator const & c) : m_c(c) {}
void operator() (ClassifObject const * p, uint32_t type) const
{
if (p->IsDrawableAny() && !m_c.IsTypeValid(type))
diff --git a/platform/http_request.cpp b/platform/http_request.cpp
index f2dece1621..6169c6becf 100644
--- a/platform/http_request.cpp
+++ b/platform/http_request.cpp
@@ -155,7 +155,7 @@ class FileHttpRequest : public HttpRequest, public IHttpThreadCallback
{
int64_t m_pos;
public:
- ThreadByPos(int64_t pos) : m_pos(pos) {}
+ explicit ThreadByPos(int64_t pos) : m_pos(pos) {}
inline bool operator() (ThreadHandleT const & p) const
{
return (p.second == m_pos);
diff --git a/platform/location_service.cpp b/platform/location_service.cpp
index ecffe373f3..52c9e1810e 100644
--- a/platform/location_service.cpp
+++ b/platform/location_service.cpp
@@ -71,7 +71,7 @@ namespace location
}
public:
- DesktopLocationService(LocationObserver & observer)
+ explicit DesktopLocationService(LocationObserver & observer)
: LocationService(observer), m_reportFirstEvent(true)
{
#if defined(OMIM_OS_MAC)
diff --git a/platform/platform_tests/apk_test.cpp b/platform/platform_tests/apk_test.cpp
index 83760b4e24..76f9094a50 100644
--- a/platform/platform_tests/apk_test.cpp
+++ b/platform/platform_tests/apk_test.cpp
@@ -41,9 +41,8 @@ namespace
string const & m_cont;
public:
- ApkTester(string const & cont) : m_cont(cont)
+ explicit ApkTester(string const & cont) : m_cont(cont), m_hashes(COUNT)
{
- m_hashes.resize(COUNT);
}
virtual void Do()
diff --git a/platform/wifi_location_service.cpp b/platform/wifi_location_service.cpp
index 7f80c38add..f3ea900756 100644
--- a/platform/wifi_location_service.cpp
+++ b/platform/wifi_location_service.cpp
@@ -95,7 +95,7 @@ namespace location
}
public:
- WiFiLocationService(LocationObserver & observer) : LocationService(observer)
+ explicit WiFiLocationService(LocationObserver & observer) : LocationService(observer)
{
}
diff --git a/routing/restrictions_serialization.hpp b/routing/restrictions_serialization.hpp
index c942a14de2..59f5df89a1 100644
--- a/routing/restrictions_serialization.hpp
+++ b/routing/restrictions_serialization.hpp
@@ -11,9 +11,10 @@
#include "base/bits.hpp"
#include "base/checked_cast.hpp"
-#include "std/algorithm.hpp"
-#include "std/string.hpp"
-#include "std/vector.hpp"
+#include <algorithm>
+#include <cstdint>
+#include <string>
+#include <vector>
namespace routing
{
@@ -27,7 +28,7 @@ struct Restriction
/// could be split into two categories.
/// * no_left_turn, no_right_turn, no_u_turn and so on go to "No" category.
/// * only_left_turn, only_right_turn and so on go to "Only" category.
- /// That's enough to rememeber if
+ /// That's enough to remember if
/// * there's only way to pass the junction is driving along the restriction (Only)
/// * driving along the restriction is prohibited (No)
enum class Type
@@ -36,21 +37,21 @@ struct Restriction
Only, // Only going according such restriction is permitted
};
- Restriction(Type type, vector<uint32_t> const & links) : m_featureIds(links), m_type(type) {}
+ Restriction(Type type, std::vector<uint32_t> const & links) : m_featureIds(links), m_type(type) {}
bool IsValid() const;
bool operator==(Restriction const & restriction) const;
bool operator<(Restriction const & restriction) const;
// Links of the restriction in feature ids term.
- vector<uint32_t> m_featureIds;
+ std::vector<uint32_t> m_featureIds;
Type m_type;
};
-using RestrictionVec = vector<Restriction>;
+using RestrictionVec = std::vector<Restriction>;
-string ToString(Restriction::Type const & type);
-string DebugPrint(Restriction::Type const & type);
-string DebugPrint(Restriction const & restriction);
+std::string ToString(Restriction::Type const & type);
+std::string DebugPrint(Restriction::Type const & type);
+std::string DebugPrint(Restriction const & restriction);
struct RestrictionHeader
{
@@ -95,8 +96,8 @@ class RestrictionSerializer
public:
template <class Sink>
static void Serialize(RestrictionHeader const & header,
- routing::RestrictionVec::const_iterator begin,
- routing::RestrictionVec::const_iterator end, Sink & sink)
+ RestrictionVec::const_iterator begin,
+ RestrictionVec::const_iterator end, Sink & sink)
{
auto const firstOnlyIt = begin + header.m_noRestrictionCount;
SerializeSingleType(begin, firstOnlyIt, sink);
@@ -105,12 +106,12 @@ public:
template <class Source>
static void Deserialize(RestrictionHeader const & header,
- routing::RestrictionVec & restrictionsNo,
- routing::RestrictionVec & restrictionsOnly, Source & src)
+ RestrictionVec & restrictionsNo,
+ RestrictionVec & restrictionsOnly, Source & src)
{
- DeserializeSingleType(routing::Restriction::Type::No, header.m_noRestrictionCount,
+ DeserializeSingleType(Restriction::Type::No, header.m_noRestrictionCount,
restrictionsNo, src);
- DeserializeSingleType(routing::Restriction::Type::Only, header.m_onlyRestrictionCount,
+ DeserializeSingleType(Restriction::Type::Only, header.m_onlyRestrictionCount,
restrictionsOnly, src);
}
@@ -122,14 +123,14 @@ private:
/// \param end is an iterator to the element after the last element to serialize.
/// \note All restrictions should have the same type.
template <class Sink>
- static void SerializeSingleType(routing::RestrictionVec::const_iterator begin,
- routing::RestrictionVec::const_iterator end, Sink & sink)
+ static void SerializeSingleType(RestrictionVec::const_iterator begin,
+ RestrictionVec::const_iterator end, Sink & sink)
{
if (begin == end)
return;
- CHECK(is_sorted(begin, end), ());
- routing::Restriction::Type const type = begin->m_type;
+ CHECK(std::is_sorted(begin, end), ());
+ Restriction::Type const type = begin->m_type;
uint32_t prevFirstLinkFeatureId = 0;
BitWriter<FileWriter> bits(sink);
@@ -160,8 +161,8 @@ private:
}
template <class Source>
- static bool DeserializeSingleType(routing::Restriction::Type type, uint32_t count,
- routing::RestrictionVec & restrictions, Source & src)
+ static bool DeserializeSingleType(Restriction::Type type, uint32_t count,
+ RestrictionVec & restrictions, Source & src)
{
uint32_t prevFirstLinkFeatureId = 0;
BitReader<Source> bits(src);
@@ -175,7 +176,7 @@ private:
}
size_t const numLinks = biasedLinkNumber + 1 /* number of link is two or more */;
- routing::Restriction restriction(type, {} /* links */);
+ Restriction restriction(type, {} /* links */);
restriction.m_featureIds.resize(numLinks);
auto const biasedFirstFeatureId = coding::DeltaCoder::Decode(bits);
if (biasedFirstFeatureId == 0)
@@ -185,7 +186,7 @@ private:
}
restriction.m_featureIds[0] =
prevFirstLinkFeatureId + base::checked_cast<uint32_t>(biasedFirstFeatureId) - 1;
- for (size_t i = 1; i < numLinks; ++i)
+ for (size_t j = 1; j < numLinks; ++j)
{
auto const biasedDelta = coding::DeltaCoder::Decode(bits);
if (biasedDelta == 0)
@@ -195,8 +196,8 @@ private:
}
uint32_t const delta = base::asserted_cast<uint32_t>(biasedDelta - 1);
- restriction.m_featureIds[i] =
- static_cast<uint32_t>(bits::ZigZagDecode(delta) + restriction.m_featureIds[i - 1]);
+ restriction.m_featureIds[j] =
+ static_cast<uint32_t>(bits::ZigZagDecode(delta) + restriction.m_featureIds[j - 1]);
}
prevFirstLinkFeatureId = restriction.m_featureIds[0];
diff --git a/search/features_layer_matcher.cpp b/search/features_layer_matcher.cpp
index 56d442005b..49ec9d61b1 100644
--- a/search/features_layer_matcher.cpp
+++ b/search/features_layer_matcher.cpp
@@ -53,46 +53,32 @@ void FeaturesLayerMatcher::OnQueryFinished()
uint32_t FeaturesLayerMatcher::GetMatchingStreet(uint32_t houseId)
{
- FeatureType feature;
- return GetMatchingStreetImpl(houseId, feature);
-}
-
-uint32_t FeaturesLayerMatcher::GetMatchingStreet(uint32_t houseId, FeatureType & houseFeature)
-{
- return GetMatchingStreetImpl(houseId, houseFeature);
-}
+ auto entry = m_matchingStreetsCache.Get(houseId);
+ if (!entry.second)
+ return entry.first;
-FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreets(uint32_t featureId)
-{
FeatureType feature;
- return GetNearbyStreetsImpl(featureId, feature);
-}
+ if (!GetByIndex(houseId, feature))
+ return kInvalidId;
-FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreets(uint32_t featureId,
- FeatureType & feature)
-{
- return GetNearbyStreetsImpl(featureId, feature);
+ return GetMatchingStreet(feature);
}
-FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreetsImpl(
- uint32_t featureId, FeatureType & feature)
+FeaturesLayerMatcher::Streets const & FeaturesLayerMatcher::GetNearbyStreets(FeatureType & feature)
{
static FeaturesLayerMatcher::Streets const kEmptyStreets;
- auto entry = m_nearbyStreetsCache.Get(featureId);
+ auto entry = m_nearbyStreetsCache.Get(feature.GetID().m_index);
if (!entry.second)
return entry.first;
- if (!feature.GetID().IsValid() && !GetByIndex(featureId, feature))
- return kEmptyStreets;
-
auto & streets = entry.first;
m_reverseGeocoder.GetNearbyStreets(feature, streets);
return streets;
}
-uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureType & houseFeature)
+uint32_t FeaturesLayerMatcher::GetMatchingStreet(FeatureType & houseFeature)
{
// Check if this feature is modified - the logic will be different.
string streetName;
@@ -100,14 +86,10 @@ uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureTy
osm::Editor::Instance().GetEditedFeatureStreet(houseFeature.GetID(), streetName);
// Check the cached result value.
- auto entry = m_matchingStreetsCache.Get(houseId);
+ auto entry = m_matchingStreetsCache.Get(houseFeature.GetID().m_index);
if (!edited && !entry.second)
return entry.first;
- // Load feature if needed.
- if (!houseFeature.GetID().IsValid() && !GetByIndex(houseId, houseFeature))
- return kInvalidId;
-
uint32_t & result = entry.first;
result = kInvalidId;
@@ -119,7 +101,7 @@ uint32_t FeaturesLayerMatcher::GetMatchingStreetImpl(uint32_t houseId, FeatureTy
}
// Get nearby streets and calculate the resulting index.
- auto const & streets = GetNearbyStreets(houseId, houseFeature);
+ auto const & streets = GetNearbyStreets(houseFeature);
if (edited)
{
diff --git a/search/features_layer_matcher.hpp b/search/features_layer_matcher.hpp
index 97c1dbaef9..574e3119ed 100644
--- a/search/features_layer_matcher.hpp
+++ b/search/features_layer_matcher.hpp
@@ -341,24 +341,21 @@ private:
if (!loaded && !GetByIndex(houseId, feature))
continue;
- if (GetMatchingStreet(houseId, feature) == streetId)
+ if (GetMatchingStreet(feature) == streetId)
fn(houseId, streetId);
}
}
}
- // Returns id of a street feature corresponding to a |houseId|, or
+ // Returns id of a street feature corresponding to a |houseId|/|houseFeature|, or
// kInvalidId if there're not such street.
uint32_t GetMatchingStreet(uint32_t houseId);
- uint32_t GetMatchingStreet(uint32_t houseId, FeatureType & houseFeature);
- uint32_t GetMatchingStreetImpl(uint32_t houseId, FeatureType & houseFeature);
+ uint32_t GetMatchingStreet(FeatureType & houseFeature);
using Street = ReverseGeocoder::Street;
using Streets = std::vector<Street>;
- Streets const & GetNearbyStreets(uint32_t featureId);
- Streets const & GetNearbyStreets(uint32_t featureId, FeatureType & feature);
- Streets const & GetNearbyStreetsImpl(uint32_t featureId, FeatureType & feature);
+ Streets const & GetNearbyStreets(FeatureType & feature);
inline bool GetByIndex(uint32_t id, FeatureType & ft) const
{
diff --git a/search/house_detector.hpp b/search/house_detector.hpp
index bee7dcbf5e..ad03f86502 100644
--- a/search/house_detector.hpp
+++ b/search/house_detector.hpp
@@ -75,7 +75,7 @@ struct HouseProjection : public ProjectionOnStreet
class EqualHouse
{
public:
- EqualHouse(House const * h) : m_house(h) {}
+ explicit EqualHouse(House const * h) : m_house(h) {}
bool operator() (HouseProjection const * p) const { return m_house == p->m_house; }
private:
diff --git a/software_renderer/cpu_drawer.cpp b/software_renderer/cpu_drawer.cpp
index 3309a6042d..0be7ecafea 100644
--- a/software_renderer/cpu_drawer.cpp
+++ b/software_renderer/cpu_drawer.cpp
@@ -119,7 +119,7 @@ class CPUDrawer::CPUOverlayTree
bool m_isIntersect;
public:
- DoPreciseIntersect(CPUDrawer::OverlayWrapper const * oe)
+ explicit DoPreciseIntersect(CPUDrawer::OverlayWrapper const * oe)
: m_elem(oe), m_isIntersect(false)
{
}
diff --git a/software_renderer/text_engine.h b/software_renderer/text_engine.h
index a38d49211e..a69f5273f3 100644
--- a/software_renderer/text_engine.h
+++ b/software_renderer/text_engine.h
@@ -128,7 +128,7 @@ public:
unsigned int charcode;
symbol_holder() : advance(0), angle(0.0), charcode(0) {}
- symbol_holder(unsigned int code) : advance(0), angle(0.0), charcode(code) {}
+ explicit symbol_holder(unsigned int code) : advance(0), angle(0.0), charcode(code) {}
ml::rect_d const & bounds() const { return m_bounds; }
};
diff --git a/tools/python/openlr/quality.py b/tools/python/openlr/quality.py
index f27b2122c1..903b058f31 100755
--- a/tools/python/openlr/quality.py
+++ b/tools/python/openlr/quality.py
@@ -141,12 +141,16 @@ def parse_route(route):
def ignored_segments_number(tree, limit):
ignored_segments = 0
+ ignored_segments_but_matched = 0
segments = islice(tree.findall('.//Segment'), limit)
for s in segments:
ignored = s.find('Ignored')
if ignored is not None and ignored.text == 'true':
ignored_segments += 1
- return ignored_segments
+ route = s.find('Route')
+ if route is not None:
+ ignored_segments_but_matched += 1
+ return ignored_segments, ignored_segments_but_matched
def parse_segments(tree, limit):
segments = islice(tree.findall('.//Segment'), limit)
@@ -184,15 +188,26 @@ def merge(src, dst):
int(s.find('.//ReportSegmentID').text): s.find('GoldenRoute')
for s in src.findall('Segment')
}
+ ignored_routes = {
+ int(s.find('.//ReportSegmentID').text): s.find('Ignored')
+ for s in src.findall('Segment')
+ }
for s in dst.findall('Segment'):
assert not s.find('GoldenRoute')
- golden_route = golden_routes[int(s.find('.//ReportSegmentID').text)]
- if not golden_route:
+ assert not s.find('Ignored')
+
+ reportSegmentID = int(s.find('.//ReportSegmentID').text)
+ golden_route = golden_routes[reportSegmentID]
+ ignored_route = ignored_routes[reportSegmentID]
+
+ if ignored_route is not None and ignored_route.text == 'true':
elem = ET.Element('Ignored')
elem.text = 'true'
s.append(elem)
continue
- s.append(golden_route)
+
+ if golden_route:
+ s.append(golden_route)
if __name__ == '__main__':
import argparse
@@ -242,6 +257,10 @@ if __name__ == '__main__':
'Base' if mean1 - mean2 > 0 else 'New',
mean1 - mean2
))
+ print('Base: {0[1]} matched segments from {0[0]} ignored segments.'.
+ format(ignored_segments_number(assessed, args.limit)))
+ print('New: {0[1]} matched segments from {0[0]} ignored segments.'.
+ format(ignored_segments_number(candidate, args.limit)))
else:
print('{}\t{}'.format(
'segment_id', 'intersection_weight')
@@ -253,4 +272,6 @@ if __name__ == '__main__':
np.mean(list(assessed_scores.values())),
np.std(list(assessed_scores.values()), ddof=1)
))
- print('Ignored segments number: {:d}'.format(ignored_segments_number(assessed, args.limit)))
+
+ print('{0[1]} matched segments from {0[0]} ignored segments.'.
+ format(ignored_segments_number(assessed, args.limit)))