diff --git a/geometry/spline.cpp b/geometry/spline.cpp index b80e22a50d..8ce22440fe 100644 --- a/geometry/spline.cpp +++ b/geometry/spline.cpp @@ -3,26 +3,20 @@ #include "base/logging.hpp" #include +#include using namespace std; namespace m2 { - Spline::Spline(vector const & path) { - ASSERT(path.size() > 1, ("Wrong path size!")); - m_position.assign(path.begin(), path.end()); - size_t cnt = m_position.size() - 1; - m_direction = vector(cnt); - m_length = vector(cnt); + Init(path); +} - for(size_t i = 0; i < cnt; ++i) - { - m_direction[i] = path[i + 1] - path[i]; - m_length[i] = m_direction[i].Length(); - m_direction[i] = m_direction[i].Normalize(); - } +Spline::Spline(vector && path) +{ + Init(move(path)); } Spline::Spline(size_t reservedSize) @@ -84,6 +78,13 @@ size_t Spline::GetSize() const return m_position.size(); } +void Spline::Clear() +{ + m_position.clear(); + m_direction.clear(); + m_length.clear(); +} + bool Spline::IsEmpty() const { return m_position.empty(); @@ -118,11 +119,21 @@ double Spline::GetLength() const return accumulate(m_length.begin(), m_length.end(), 0.0); } -void Spline::Clear() +template +void Spline::Init(T && path) { - m_position.clear(); - m_direction.clear(); - m_length.clear(); + ASSERT(path.size() > 1, ("Wrong path size!")); + m_position = forward(path); + size_t cnt = m_position.size() - 1; + m_direction = vector(cnt); + m_length = vector(cnt); + + for (size_t i = 0; i < cnt; ++i) + { + m_direction[i] = m_position[i + 1] - m_position[i]; + m_length[i] = m_direction[i].Length(); + m_direction[i] = m_direction[i].Normalize(); + } } Spline::iterator::iterator() @@ -260,8 +271,13 @@ void Spline::iterator::AdvanceForward(double step) } SharedSpline::SharedSpline(vector const & path) + : m_spline(make_shared(path)) +{ +} + +SharedSpline::SharedSpline(vector && path) + : m_spline(make_shared(move(path))) { - m_spline.reset(new Spline(path)); } SharedSpline::SharedSpline(SharedSpline const & other) diff --git a/geometry/spline.hpp b/geometry/spline.hpp index d1a50dc2ad..44af5a0b89 100644 --- a/geometry/spline.hpp +++ b/geometry/spline.hpp @@ -45,9 +45,10 @@ public: }; public: - Spline() {} + Spline() = default; Spline(size_t reservedSize); - Spline(std::vector const & path); + explicit Spline(std::vector const & path); + explicit Spline(std::vector && path); Spline const & operator = (Spline const & spl); void AddPoint(PointD const & pt); @@ -81,6 +82,9 @@ public: double GetLength() const; private: + template + void Init(T && path); + std::vector m_position; std::vector m_direction; std::vector m_length; @@ -89,8 +93,9 @@ private: class SharedSpline { public: - SharedSpline() {} - SharedSpline(std::vector const & path); + SharedSpline() = default; + explicit SharedSpline(std::vector const & path); + explicit SharedSpline(std::vector && path); SharedSpline(SharedSpline const & other); SharedSpline const & operator= (SharedSpline const & spl); diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index b6543df50a..d8ce55c755 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -337,7 +337,7 @@ private: /// Bookmarks /// If not invalid, bookmark is bound to this place page. kml::MarkId m_markId = kml::kInvalidMarkId; - kml::MarkGroupId m_markGroupId = kml::kInvalidMarkGroupId;; + kml::MarkGroupId m_markGroupId = kml::kInvalidMarkGroupId; /// Bookmark category name. Empty, if it's not bookmark; std::string m_bookmarkCategoryName; kml::BookmarkData m_bookmarkData;