diff options
author | Alex Zolotarev <deathbaba@gmail.com> | 2011-04-01 06:05:53 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:14:36 +0300 |
commit | 06c612827e830562514452e9b79b4bc3a7c8863b (patch) | |
tree | b773fbba9f7220a253026670b5aeb24532424ca2 | |
parent | 454c6d0afeca9406b93a8088f5591228f24a4821 (diff) |
Added serialization code for m2::Rect, m2::Point and m2::Region
-rw-r--r-- | coding/streams_sink.hpp | 16 | ||||
-rw-r--r-- | geometry/point2d.hpp | 16 | ||||
-rw-r--r-- | geometry/rect2d.hpp | 25 | ||||
-rw-r--r-- | geometry/region2d.hpp | 23 |
4 files changed, 79 insertions, 1 deletions
diff --git a/coding/streams_sink.hpp b/coding/streams_sink.hpp index 85f7dc22ad..23ecad90f3 100644 --- a/coding/streams_sink.hpp +++ b/coding/streams_sink.hpp @@ -61,6 +61,14 @@ namespace stream detail::ReadString(*this, t); return *this; } + + SinkReaderStream & operator >> (double & t) + { + STATIC_ASSERT(sizeof(double) == sizeof(int64_t)); + operator>>(reinterpret_cast<int64_t &>(t)); + return *this; + } + }; template <class TWriter> class SinkWriterStream @@ -118,5 +126,13 @@ namespace stream return *this; } + SinkWriterStream & operator << (double t) + { + STATIC_ASSERT(sizeof(double) == sizeof(int64_t)); + int64_t tInt = *reinterpret_cast<int64_t const *>(&t); + operator<<(tInt); + return (*this); + } + }; } diff --git a/geometry/point2d.hpp b/geometry/point2d.hpp index 2b071485ec..d2b4c5e8bc 100644 --- a/geometry/point2d.hpp +++ b/geometry/point2d.hpp @@ -222,6 +222,22 @@ namespace m2 return my::AlmostEqual(a.x, b.x) && my::AlmostEqual(a.y, b.y); } + template <class TArchive, class PointT> + TArchive & operator >> (TArchive & ar, m2::Point<PointT> & pt) + { + ar >> pt.x; + ar >> pt.y; + return ar; + } + + template <class TArchive, class PointT> + TArchive & operator << (TArchive & ar, m2::Point<PointT> const & pt) + { + ar << pt.x; + ar << pt.y; + return ar; + } + typedef Point<float> PointF; typedef Point<double> PointD; typedef Point<uint32_t> PointU; diff --git a/geometry/rect2d.hpp b/geometry/rect2d.hpp index 36fcc701ee..896935b56d 100644 --- a/geometry/rect2d.hpp +++ b/geometry/rect2d.hpp @@ -31,6 +31,11 @@ namespace m2 template <typename T> class Rect { + template <class TArchive, class TPoint> + friend TArchive & operator << (TArchive & ar, Rect<TPoint> const & rect); + template <class TArchive, class TPoint> + friend TArchive & operator >> (TArchive & ar, Rect<TPoint> & rect); + enum { IsSigned = numeric_limits<T>::is_signed }; T m_minX, m_minY, m_maxX, m_maxY; @@ -297,6 +302,26 @@ namespace m2 ); } + template <class TArchive, class PointT> + TArchive & operator >> (TArchive & ar, m2::Rect<PointT> & rect) + { + ar >> rect.m_minX; + ar >> rect.m_minY; + ar >> rect.m_maxX; + ar >> rect.m_maxY; + return ar; + } + + template <class TArchive, class PointT> + TArchive & operator << (TArchive & ar, m2::Rect<PointT> const & rect) + { + ar << rect.m_minX; + ar << rect.m_minY; + ar << rect.m_maxX; + ar << rect.m_maxY; + return ar; + } + typedef Rect<float> RectF; typedef Rect<double> RectD; typedef Rect<unsigned> RectU; diff --git a/geometry/region2d.hpp b/geometry/region2d.hpp index 8a24cde225..639092964a 100644 --- a/geometry/region2d.hpp +++ b/geometry/region2d.hpp @@ -54,7 +54,12 @@ namespace m2 template <class PointT> class Region - { + { + template <class TArchive, class TPoint> + friend TArchive & operator << (TArchive & ar, Region<TPoint> const & region); + template <class TArchive, class TPoint> + friend TArchive & operator >> (TArchive & ar, Region<TPoint> & region); + public: typedef PointT value_type; typedef typename PointT::value_type coord_type; @@ -167,6 +172,22 @@ namespace m2 m2::Rect<coord_type> m_rect; }; + template <class TArchive, class PointT> + TArchive & operator >> (TArchive & ar, m2::Region<PointT> & region) + { + ar >> region.m_rect; + ar >> region.m_points; + return ar; + } + + template <class TArchive, class PointT> + TArchive & operator << (TArchive & ar, m2::Region<PointT> const & region) + { + ar << region.m_rect; + ar << region.m_points; + return ar; + } + typedef Region<m2::PointD> RegionD; typedef Region<m2::PointI> RegionI; typedef Region<m2::PointU> RegionU; |