#pragma once #include "point2d.hpp" #include "rect2d.hpp" #include "../base/internal/message.hpp" #include "../std/vector.hpp" namespace m2 { template class PolylineT { vector > m_points; public: PolylineT() {} explicit PolylineT(vector > const & points) : m_points(points) { ASSERT_GREATER(m_points.size(), 1, ()); } template PolylineT(IterT beg, IterT end) : m_points(beg, end) { ASSERT_GREATER(m_points.size(), 1, ()); } double GetLength() const { // @todo add cached value and lazy init double dist = 0; for (size_t i = 1; i < m_points.size(); ++i) dist += m_points[i-1].Length(m_points[i]); return dist; } Rect GetLimitRect() const { // @todo add cached value and lazy init m2::Rect rect; for (size_t i = 0; i < m_points.size(); ++i) rect.Add(m_points[i]); return rect; } void Clear() { m_points.clear(); } void Add(Point const & pt) { m_points.push_back(pt); } void Swap(PolylineT & rhs) { m_points.swap(rhs.m_points); } size_t GetSize() const { return m_points.size(); } typedef typename vector >::const_iterator IterT; IterT Begin() const { return m_points.begin(); } IterT End() const { return m_points.end(); } friend string DebugPrint(PolylineT const & p) { return ::DebugPrint(p.m_points); } }; typedef PolylineT PolylineD; }