diff --git a/map/gps_track.cpp b/map/gps_track.cpp index dcba7a21a4..6234d1ab00 100644 --- a/map/gps_track.cpp +++ b/map/gps_track.cpp @@ -69,7 +69,7 @@ GpsTrack::~GpsTrack() void GpsTrack::AddPoint(location::GpsInfo const & point) { { - lock_guard lg(m_dataGuard); + std::lock_guard lg(m_dataGuard); m_points.emplace_back(point); } ScheduleTask(); @@ -78,7 +78,7 @@ void GpsTrack::AddPoint(location::GpsInfo const & point) void GpsTrack::AddPoints(vector const & points) { { - lock_guard lg(m_dataGuard); + std::lock_guard lg(m_dataGuard); m_points.insert(m_points.end(), points.begin(), points.end()); } ScheduleTask(); @@ -87,19 +87,26 @@ void GpsTrack::AddPoints(vector const & points) void GpsTrack::Clear() { { - lock_guard lg(m_dataGuard); + std::lock_guard lg(m_dataGuard); m_points.clear(); m_needClear = true; } ScheduleTask(); } +bool GpsTrack::IsEmpty() const +{ + if (!m_collection) + return true; + return m_collection->IsEmpty(); +} + void GpsTrack::SetDuration(hours duration) { ASSERT_GREATER(duration.count(), 0, ()); { - lock_guard lg(m_dataGuard); + std::lock_guard lg(m_dataGuard); if (m_duration == duration) return; m_duration = duration; @@ -110,7 +117,7 @@ void GpsTrack::SetDuration(hours duration) hours GpsTrack::GetDuration() const { - lock_guard lg(m_dataGuard); + std::lock_guard lg(m_dataGuard); return m_duration; } @@ -223,7 +230,7 @@ void GpsTrack::ProcessPoints() bool needClear; // Steal data for processing { - lock_guard lg(m_dataGuard); + std::lock_guard lg(m_dataGuard); originPoints.swap(m_points); duration = m_duration; needClear = m_needClear; diff --git a/map/gps_track.hpp b/map/gps_track.hpp index 17949fa552..f80682723a 100644 --- a/map/gps_track.hpp +++ b/map/gps_track.hpp @@ -38,6 +38,8 @@ public: /// @note Callback is called with 'toRemove' points, if some points were removed. void Clear(); + bool IsEmpty() const; + /// Sets tracking duration in hours. /// @note Callback is called with 'toRemove' points, if some points were removed. /// By default, duration is 24h. @@ -61,6 +63,12 @@ public: /// next time callbacks it receives only modifications. It simplifies getter/callback model. void SetCallback(TGpsTrackDiffCallback callback); + template + void ForEachPoint(F && f) const + { + m_collection->ForEach(std::move(f)); + } + private: DISALLOW_COPY_AND_MOVE(GpsTrack); diff --git a/map/gps_tracker.cpp b/map/gps_tracker.cpp index ee619e23fa..fea2a0da9a 100644 --- a/map/gps_tracker.cpp +++ b/map/gps_tracker.cpp @@ -9,7 +9,6 @@ #include "defines.hpp" -using namespace std; using namespace std::chrono; namespace @@ -21,7 +20,7 @@ uint32_t constexpr kDefaultDurationHours = 24; size_t constexpr kMaxItemCount = 100000; // > 24h with 1point/s -inline string GetFilePath() +inline std::string GetFilePath() { return base::JoinPath(GetPlatform().WritableDir(), GPS_TRACK_FILENAME); } @@ -63,7 +62,7 @@ GpsTracker & GpsTracker::Instance() GpsTracker::GpsTracker() : m_enabled(GetSettingsIsEnabled()) - , m_track(GetFilePath(), kMaxItemCount, GetSettingsDuration(), make_unique()) + , m_track(GetFilePath(), kMaxItemCount, GetSettingsDuration(), std::make_unique()) { } @@ -95,6 +94,11 @@ hours GpsTracker::GetDuration() const return m_track.GetDuration(); } +bool GpsTracker::IsEmpty() const +{ + return m_track.IsEmpty(); +} + void GpsTracker::Connect(TGpsTrackDiffCallback const & fn) { m_track.SetCallback(fn); @@ -111,3 +115,9 @@ void GpsTracker::OnLocationUpdated(location::GpsInfo const & info) return; m_track.AddPoint(info); } + +void GpsTracker::ForEachTrackPoint(GpsTrackCallback const & callback) const +{ + CHECK(callback != nullptr, ("Callback should be provided")); + m_track.ForEachPoint(callback); +} diff --git a/map/gps_tracker.hpp b/map/gps_tracker.hpp index 567cbece71..72afb4e0ed 100644 --- a/map/gps_tracker.hpp +++ b/map/gps_tracker.hpp @@ -17,6 +17,8 @@ public: void SetEnabled(bool enabled); std::chrono::hours GetDuration() const; + bool IsEmpty() const; + void SetDuration(std::chrono::hours duration); using TGpsTrackDiffCallback = @@ -28,6 +30,9 @@ public: void OnLocationUpdated(location::GpsInfo const & info); + using GpsTrackCallback = std::function; + void ForEachTrackPoint(GpsTrackCallback const & callback) const; + private: GpsTracker();