Skip to content

Commit f1c58fb

Browse files
tatiana-yanmpimenov
authored andcommitted
[indexer] Disallow copy and move of FeatureType, remove FeatureType::ParseEverything().
1 parent 2bf94c9 commit f1c58fb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+443
-489
lines changed

editor/editable_feature_source.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ FeatureStatus EditableFeatureSource::GetFeatureStatus(uint32_t index) const
88
return editor.GetFeatureStatus(m_handle.GetId(), index);
99
}
1010

11-
bool EditableFeatureSource::GetModifiedFeature(uint32_t index, FeatureType & feature) const
11+
unique_ptr<FeatureType> EditableFeatureSource::GetModifiedFeature(uint32_t index) const
1212
{
1313
osm::Editor & editor = osm::Editor::Instance();
14-
return editor.GetEditedFeature(m_handle.GetId(), index, feature);
14+
return editor.GetEditedFeature(FeatureID(m_handle.GetId(), index));
1515
}
1616

1717
void EditableFeatureSource::ForEachAdditionalFeature(m2::RectD const & rect, int scale,

editor/editable_feature_source.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class EditableFeatureSource final : public FeatureSource
1717

1818
// FeatureSource overrides:
1919
FeatureStatus GetFeatureStatus(uint32_t index) const override;
20-
bool GetModifiedFeature(uint32_t index, FeatureType & feature) const override;
20+
std::unique_ptr<FeatureType> GetModifiedFeature(uint32_t index) const override;
2121
void ForEachAdditionalFeature(m2::RectD const & rect, int scale,
2222
std::function<void(uint32_t)> const & fn) const override;
2323
};

editor/editor_tests/osm_editor_test.cpp

+10-13
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,7 @@ void EditorTest::GetEditedFeatureTest()
249249

250250
{
251251
FeatureID feature;
252-
FeatureType ft;
253-
TEST(!editor.GetEditedFeature(feature, ft), ());
252+
TEST(!editor.GetEditedFeature(feature), ());
254253
}
255254

256255
auto const mwmId = ConstructTestMwm([](TestMwmBuilder & builder)
@@ -259,21 +258,20 @@ void EditorTest::GetEditedFeatureTest()
259258
builder.Add(cafe);
260259
});
261260

262-
ForEachCafeAtPoint(m_dataSource, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft)
263-
{
264-
FeatureType featureType;
265-
TEST(!editor.GetEditedFeature(ft.GetID(), featureType), ());
261+
ForEachCafeAtPoint(m_dataSource, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) {
262+
TEST(!editor.GetEditedFeature(ft.GetID()), ());
266263

267264
SetBuildingLevelsToOne(ft);
268265

269-
TEST(editor.GetEditedFeature(ft.GetID(), featureType), ());
266+
auto featureType = editor.GetEditedFeature(ft.GetID());
267+
TEST(featureType, ());
270268

271269
osm::EditableMapObject savedEmo;
272-
FillEditableMapObject(editor, featureType, savedEmo);
270+
FillEditableMapObject(editor, *featureType, savedEmo);
273271

274272
TEST_EQUAL(savedEmo.GetBuildingLevels(), "1", ());
275273

276-
TEST_EQUAL(ft.GetID(), featureType.GetID(), ());
274+
TEST_EQUAL(ft.GetID(), featureType->GetID(), ());
277275
});
278276
}
279277

@@ -472,11 +470,10 @@ void EditorTest::DeleteFeatureTest()
472470
osm::EditableMapObject emo;
473471
CreateCafeAtPoint({3.0, 3.0}, mwmId, emo);
474472

475-
FeatureType ft;
476-
editor.GetEditedFeature(emo.GetID().m_mwmId, emo.GetID().m_index, ft);
477-
editor.DeleteFeature(ft.GetID());
473+
auto ft = editor.GetEditedFeature(emo.GetID());
474+
editor.DeleteFeature(ft->GetID());
478475

479-
TEST_EQUAL(editor.GetFeatureStatus(ft.GetID()), FeatureStatus::Untouched, ());
476+
TEST_EQUAL(editor.GetFeatureStatus(ft->GetID()), FeatureStatus::Untouched, ());
480477

481478
ForEachCafeAtPoint(m_dataSource, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft)
482479
{

editor/osm_editor.cpp

+4-11
Original file line numberDiff line numberDiff line change
@@ -516,21 +516,14 @@ void Editor::ForEachCreatedFeature(MwmSet::MwmId const & id, FeatureIndexFunctor
516516
}
517517
}
518518

519-
bool Editor::GetEditedFeature(MwmSet::MwmId const & mwmId, uint32_t index,
520-
FeatureType & outFeature) const
519+
unique_ptr<FeatureType> Editor::GetEditedFeature(FeatureID const & fid) const
521520
{
522521
auto const features = m_features.Get();
523-
auto const * featureInfo = GetFeatureTypeInfo(*features, mwmId, index);
522+
auto const * featureInfo = GetFeatureTypeInfo(*features, fid.m_mwmId, fid.m_index);
524523
if (featureInfo == nullptr)
525-
return false;
526-
527-
outFeature = FeatureType::ConstructFromMapObject(featureInfo->m_object);
528-
return true;
529-
}
524+
return {};
530525

531-
bool Editor::GetEditedFeature(FeatureID const & fid, FeatureType & outFeature) const
532-
{
533-
return GetEditedFeature(fid.m_mwmId, fid.m_index, outFeature);
526+
return make_unique<FeatureType>(featureInfo->m_object);
534527
}
535528

536529
bool Editor::GetEditedFeatureStreet(FeatureID const & fid, string & outFeatureStreet) const

editor/osm_editor.hpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,8 @@ class Editor final : public MwmSet::Observer
142142
/// Marks feature as "deleted" from MwM file.
143143
void DeleteFeature(FeatureID const & fid);
144144

145-
/// @returns false if feature wasn't edited.
146-
/// @param outFeature is valid only if true was returned.
147-
bool GetEditedFeature(MwmSet::MwmId const & mwmId, uint32_t index, FeatureType & outFeature) const;
148-
bool GetEditedFeature(FeatureID const & fid, FeatureType & outFeature) const;
145+
/// @returns nullptr if feature wasn't edited.
146+
std::unique_ptr<FeatureType> GetEditedFeature(FeatureID const & fid) const;
149147

150148
/// @returns false if feature wasn't edited.
151149
/// @param outFeatureStreet is valid only if true was returned.

feature_list/feature_list.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,9 @@ int main(int argc, char ** argv)
366366
FeaturesLoaderGuard loader(dataSource, mwmId);
367367
for (uint32_t ftIndex = 0; ftIndex < loader.GetNumFeatures(); ftIndex++)
368368
{
369-
FeatureType ft;
370-
if (loader.GetFeatureByIndex(static_cast<uint32_t>(ftIndex), ft))
371-
doProcess.Process(ft, featureIdToOsmId);
369+
auto ft = loader.GetFeatureByIndex(static_cast<uint32_t>(ftIndex));
370+
if (ft)
371+
doProcess.Process(*ft, featureIdToOsmId);
372372
}
373373
doProcess.ClearCache();
374374
}

generator/search_index_builder.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -347,12 +347,12 @@ bool GetStreetIndex(search::MwmContext & ctx, uint32_t featureID, string const &
347347
bool const hasStreet = !streetName.empty();
348348
if (hasStreet)
349349
{
350-
FeatureType ft;
351-
VERIFY(ctx.GetFeature(featureID, ft), ());
350+
auto ft = ctx.GetFeature(featureID);
351+
CHECK(ft, ());
352352

353353
using TStreet = search::ReverseGeocoder::Street;
354354
vector<TStreet> streets;
355-
search::ReverseGeocoder::GetNearbyStreets(ctx, feature::GetCenter(ft),
355+
search::ReverseGeocoder::GetNearbyStreets(ctx, feature::GetCenter(*ft),
356356
true /* includeSquaresAndSuburbs */, streets);
357357

358358
auto const res = search::ReverseGeocoder::GetMatchedStreetIndex(streetName, streets);

indexer/data_source.cpp

+21-31
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,25 @@ class ReadMWMFunctor
7979

8080
void ReadFeatureType(function<void(FeatureType &)> const & fn, FeatureSource & src, uint32_t index)
8181
{
82-
FeatureType feature;
82+
unique_ptr<FeatureType> ft;
8383
switch (src.GetFeatureStatus(index))
8484
{
8585
case FeatureStatus::Deleted:
8686
case FeatureStatus::Obsolete: return;
8787
case FeatureStatus::Created:
8888
case FeatureStatus::Modified:
8989
{
90-
VERIFY(src.GetModifiedFeature(index, feature), ());
90+
ft = src.GetModifiedFeature(index);
9191
break;
9292
}
9393
case FeatureStatus::Untouched:
9494
{
95-
src.GetOriginalFeature(index, feature);
95+
ft = src.GetOriginalFeature(index);
9696
break;
9797
}
9898
}
99-
fn(feature);
99+
CHECK(ft, ());
100+
fn(*ft);
100101
}
101102
} // namespace
102103

@@ -117,45 +118,33 @@ bool FeaturesLoaderGuard::IsWorld() const
117118
return m_handle.GetValue<MwmValue>()->GetHeader().GetType() == feature::DataHeader::world;
118119
}
119120

120-
unique_ptr<FeatureType> FeaturesLoaderGuard::GetOriginalFeatureByIndex(uint32_t index) const
121-
{
122-
auto feature = make_unique<FeatureType>();
123-
if (GetOriginalFeatureByIndex(index, *feature))
124-
return feature;
125-
126-
return {};
127-
}
128-
129121
unique_ptr<FeatureType> FeaturesLoaderGuard::GetOriginalOrEditedFeatureByIndex(uint32_t index) const
130122
{
131-
auto feature = make_unique<FeatureType>();
132123
if (!m_handle.IsAlive())
133124
return {};
134125

135126
ASSERT_NOT_EQUAL(m_source->GetFeatureStatus(index), FeatureStatus::Created, ());
136-
if (GetFeatureByIndex(index, *feature))
137-
return feature;
138-
139-
return {};
127+
return GetFeatureByIndex(index);
140128
}
141129

142-
WARN_UNUSED_RESULT bool FeaturesLoaderGuard::GetFeatureByIndex(uint32_t index,
143-
FeatureType & ft) const
130+
unique_ptr<FeatureType> FeaturesLoaderGuard::GetFeatureByIndex(uint32_t index) const
144131
{
145132
if (!m_handle.IsAlive())
146-
return false;
133+
return {};
147134

148135
ASSERT_NOT_EQUAL(FeatureStatus::Deleted, m_source->GetFeatureStatus(index),
149136
("Deleted feature was cached. It should not be here. Please review your code."));
150-
if (m_source->GetModifiedFeature(index, ft))
151-
return true;
152-
return GetOriginalFeatureByIndex(index, ft);
137+
138+
auto ft = m_source->GetModifiedFeature(index);
139+
if (ft)
140+
return ft;
141+
142+
return GetOriginalFeatureByIndex(index);
153143
}
154144

155-
WARN_UNUSED_RESULT bool FeaturesLoaderGuard::GetOriginalFeatureByIndex(uint32_t index,
156-
FeatureType & ft) const
145+
unique_ptr<FeatureType> FeaturesLoaderGuard::GetOriginalFeatureByIndex(uint32_t index) const
157146
{
158-
return m_handle.IsAlive() ? m_source->GetOriginalFeature(index, ft) : false;
147+
return m_handle.IsAlive() ? m_source->GetOriginalFeature(index) : nullptr;
159148
}
160149

161150
// DataSource ----------------------------------------------------------------------------------
@@ -310,12 +299,13 @@ void DataSource::ReadFeatures(FeatureCallback const & fn, vector<FeatureID> cons
310299
ASSERT_NOT_EQUAL(
311300
FeatureStatus::Deleted, fts,
312301
("Deleted feature was cached. It should not be here. Please review your code."));
313-
FeatureType featureType;
302+
unique_ptr<FeatureType> ft;
314303
if (fts == FeatureStatus::Modified || fts == FeatureStatus::Created)
315-
VERIFY(src->GetModifiedFeature(fidIter->m_index, featureType), ());
304+
ft = src->GetModifiedFeature(fidIter->m_index);
316305
else
317-
src->GetOriginalFeature(fidIter->m_index, featureType);
318-
fn(featureType);
306+
ft = src->GetOriginalFeature(fidIter->m_index);
307+
CHECK(ft, ());
308+
fn(*ft);
319309
} while (++fidIter != endIter && id == fidIter->m_mwmId);
320310
}
321311
else

indexer/data_source.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,11 @@ class FeaturesLoaderGuard
100100
MwmSet::MwmId const & GetId() const { return m_handle.GetId(); }
101101
std::string GetCountryFileName() const;
102102
bool IsWorld() const;
103+
/// Editor core only method, to get 'untouched', original version of feature.
103104
std::unique_ptr<FeatureType> GetOriginalFeatureByIndex(uint32_t index) const;
104105
std::unique_ptr<FeatureType> GetOriginalOrEditedFeatureByIndex(uint32_t index) const;
105106
/// Everyone, except Editor core, should use this method.
106-
WARN_UNUSED_RESULT bool GetFeatureByIndex(uint32_t index, FeatureType & ft) const;
107-
/// Editor core only method, to get 'untouched', original version of feature.
108-
WARN_UNUSED_RESULT bool GetOriginalFeatureByIndex(uint32_t index, FeatureType & ft) const;
107+
std::unique_ptr<FeatureType> GetFeatureByIndex(uint32_t index) const;
109108
size_t GetNumFeatures() const { return m_source->GetNumFeatures(); }
110109

111110
private:

indexer/feature.cpp

+36-48
Original file line numberDiff line numberDiff line change
@@ -180,67 +180,64 @@ uint8_t ReadByte(TSource & src)
180180
}
181181
} // namespace
182182

183-
// static
184-
FeatureType FeatureType::ConstructFromMapObject(osm::MapObject const & emo)
183+
FeatureType::FeatureType(SharedLoadInfo const * loadInfo, Buffer buffer)
184+
{
185+
CHECK(loadInfo, ());
186+
m_loadInfo = loadInfo;
187+
m_data = buffer;
188+
m_header = Header(m_data);
189+
190+
m_offsets.Reset();
191+
m_ptsSimpMask = 0;
192+
m_limitRect = m2::RectD::GetEmptyRect();
193+
m_parsed.Reset();
194+
m_innerStats.MakeZero();
195+
}
196+
197+
FeatureType::FeatureType(osm::MapObject const & emo)
185198
{
186-
FeatureType ft;
187199
uint8_t const geomType = emo.GetGeomType();
188-
ft.m_limitRect.MakeEmpty();
200+
m_limitRect.MakeEmpty();
189201

190202
switch (geomType)
191203
{
192204
case feature::GEOM_POINT:
193-
ft.m_center = emo.GetMercator();
194-
ft.m_limitRect.Add(ft.m_center);
205+
m_center = emo.GetMercator();
206+
m_limitRect.Add(m_center);
195207
break;
196208
case feature::GEOM_LINE:
197-
ft.m_points = Points(emo.GetPoints().begin(), emo.GetPoints().end());
198-
for (auto const & p : ft.m_points)
199-
ft.m_limitRect.Add(p);
209+
m_points = Points(emo.GetPoints().begin(), emo.GetPoints().end());
210+
for (auto const & p : m_points)
211+
m_limitRect.Add(p);
200212
break;
201213
case feature::GEOM_AREA:
202-
ft.m_triangles = Points(emo.GetTriangesAsPoints().begin(), emo.GetTriangesAsPoints().end());
203-
for (auto const & p : ft.m_triangles)
204-
ft.m_limitRect.Add(p);
214+
m_triangles = Points(emo.GetTriangesAsPoints().begin(), emo.GetTriangesAsPoints().end());
215+
for (auto const & p : m_triangles)
216+
m_limitRect.Add(p);
205217
break;
206218
}
207219

208-
ft.m_parsed.m_points = ft.m_parsed.m_triangles = true;
220+
m_parsed.m_points = m_parsed.m_triangles = true;
209221

210-
ft.m_params.name = emo.GetNameMultilang();
222+
m_params.name = emo.GetNameMultilang();
211223
string const & house = emo.GetHouseNumber();
212224
if (house.empty())
213-
ft.m_params.house.Clear();
225+
m_params.house.Clear();
214226
else
215-
ft.m_params.house.Set(house);
216-
ft.m_parsed.m_common = true;
227+
m_params.house.Set(house);
228+
m_parsed.m_common = true;
217229

218-
ft.m_metadata = emo.GetMetadata();
219-
ft.m_parsed.m_metadata = true;
230+
m_metadata = emo.GetMetadata();
231+
m_parsed.m_metadata = true;
220232

221233
CHECK_LESS_OR_EQUAL(emo.GetTypes().Size(), feature::kMaxTypesCount, ());
222-
copy(emo.GetTypes().begin(), emo.GetTypes().end(), ft.m_types.begin());
234+
copy(emo.GetTypes().begin(), emo.GetTypes().end(), m_types.begin());
223235

224-
ft.m_parsed.m_types = true;
225-
ft.m_header = CalculateHeader(emo.GetTypes().Size(), geomType, ft.m_params);
226-
ft.m_parsed.m_header2 = true;
227-
228-
ft.m_id = emo.GetID();
229-
return ft;
230-
}
231-
232-
void FeatureType::Deserialize(SharedLoadInfo const * loadInfo, Buffer buffer)
233-
{
234-
CHECK(loadInfo, ());
235-
m_loadInfo = loadInfo;
236-
m_data = buffer;
237-
m_header = Header(m_data);
236+
m_parsed.m_types = true;
237+
m_header = CalculateHeader(emo.GetTypes().Size(), geomType, m_params);
238+
m_parsed.m_header2 = true;
238239

239-
m_offsets.Reset();
240-
m_ptsSimpMask = 0;
241-
m_limitRect = m2::RectD::GetEmptyRect();
242-
m_parsed.Reset();
243-
m_innerStats.MakeZero();
240+
m_id = emo.GetID();
244241
}
245242

246243
feature::EGeomType FeatureType::GetFeatureType() const
@@ -322,15 +319,6 @@ int8_t FeatureType::GetLayer()
322319
return m_params.layer;
323320
}
324321

325-
void FeatureType::ParseEverything()
326-
{
327-
// Also calls ParseCommon() and ParseTypes().
328-
ParseHeader2();
329-
ParseGeometry(FeatureType::BEST_GEOMETRY);
330-
ParseTriangles(FeatureType::BEST_GEOMETRY);
331-
ParseMetadata();
332-
}
333-
334322
void FeatureType::ParseHeader2()
335323
{
336324
if (m_parsed.m_header2)

0 commit comments

Comments
 (0)