From cd0aeff6a07dbc2a1700d93d80c8cbd3f8bb704f Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 6 Dec 2017 17:53:24 +0300 Subject: [PATCH] Fixed crash in SetCreatedUserMarks. --- map/user_mark_container.cpp | 31 +++++++++++++++++++++++++------ map/user_mark_container.hpp | 5 +++-- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/map/user_mark_container.cpp b/map/user_mark_container.cpp index 2bc5ce429c..c53b617fe4 100644 --- a/map/user_mark_container.cpp +++ b/map/user_mark_container.cpp @@ -155,7 +155,7 @@ UserMark * UserMarkContainer::CreateUserMark(m2::PointD const & ptOrg) // Push front an user mark. SetDirty(); m_userMarks.push_front(unique_ptr(AllocateUserMark(ptOrg))); - m_createdMarks.m_marksID.push_back(m_userMarks.front()->GetId()); + m_createdMarks.insert(m_userMarks.front()->GetId()); return m_userMarks.front().get(); } @@ -185,6 +185,13 @@ UserMark * UserMarkContainer::GetUserMarkForEdit(size_t index) void UserMarkContainer::Clear() { SetDirty(); + + for (auto const & mark : m_userMarks) + { + if (m_createdMarks.find(mark->GetId()) == m_createdMarks.end()) + m_removedMarks.insert(mark->GetId()); + } + m_createdMarks.clear(); m_userMarks.clear(); } @@ -227,7 +234,12 @@ void UserMarkContainer::DeleteUserMark(size_t index) ASSERT_LESS(index, m_userMarks.size(), ()); if (index < m_userMarks.size()) { - m_removedMarks.m_marksID.push_back(m_userMarks[index]->GetId()); + auto const markId = m_userMarks[index]->GetId(); + auto const it = m_createdMarks.find(markId); + if (it != m_createdMarks.end()) + m_createdMarks.erase(it); + else + m_removedMarks.insert(markId); m_userMarks.erase(m_userMarks.begin() + index); } else @@ -239,11 +251,18 @@ void UserMarkContainer::DeleteUserMark(size_t index) void UserMarkContainer::AcceptChanges(df::MarkIDCollection & createdMarks, df::MarkIDCollection & removedMarks) { - std::swap(m_createdMarks, createdMarks); - m_createdMarks.Clear(); + createdMarks.Clear(); + removedMarks.Clear(); - std::swap(m_removedMarks, removedMarks); - m_removedMarks.Clear(); + createdMarks.m_marksID.reserve(m_createdMarks.size()); + for (auto const & markId : m_createdMarks) + createdMarks.m_marksID.push_back(markId); + m_createdMarks.clear(); + + removedMarks.m_marksID.reserve(m_removedMarks.size()); + for (auto const & markId : m_removedMarks) + removedMarks.m_marksID.push_back(markId); + m_removedMarks.clear(); m_isDirty = false; } diff --git a/map/user_mark_container.hpp b/map/user_mark_container.hpp index c523bea5d2..1f4c68a114 100644 --- a/map/user_mark_container.hpp +++ b/map/user_mark_container.hpp @@ -14,6 +14,7 @@ #include #include #include +#include class UserMarksController { @@ -90,8 +91,8 @@ private: double m_layerDepth; TUserMarksList m_userMarks; UserMark::Type m_type; - df::MarkIDCollection m_createdMarks; - df::MarkIDCollection m_removedMarks; + std::set m_createdMarks; + std::set m_removedMarks; bool m_isDirty = false; DISALLOW_COPY_AND_MOVE(UserMarkContainer);