123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- // Boost.Geometry
- // Unit Test
- // Copyright (c) 2017, Oracle and/or its affiliates.
- // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
- // Use, modification and distribution is subject to the Boost Software License,
- // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_GEOMETRY_TEST_SRS_CHECK_GEOMETRY_HPP
- #define BOOST_GEOMETRY_TEST_SRS_CHECK_GEOMETRY_HPP
- #include <geometry_test_common.hpp>
- #include <boost/geometry/core/access.hpp>
- #include <boost/geometry/core/coordinate_type.hpp>
- #include <boost/geometry/core/tag.hpp>
- #include <boost/geometry/core/tags.hpp>
- #include <boost/geometry/io/wkt/read.hpp>
- #include <boost/geometry/views/detail/indexed_point_view.hpp>
- #include <boost/range/begin.hpp>
- #include <boost/range/end.hpp>
- #include <boost/range/size.hpp>
- #include <boost/range/value_type.hpp>
- namespace test
- {
- struct check_point
- {
- template <typename Point, typename T>
- static void apply(Point const& point1, Point const& point2, T tol)
- {
- typename bg::coordinate_type<Point>::type
- x1 = bg::get<0>(point1),
- y1 = bg::get<1>(point1),
- x2 = bg::get<0>(point2),
- y2 = bg::get<1>(point2);
- BOOST_CHECK_CLOSE(x1, x2, tol);
- BOOST_CHECK_CLOSE(y1, y2, tol);
- }
- };
- template <typename Policy = check_point>
- struct check_range
- {
- template <typename Range, typename T>
- static void apply(Range const& range1, Range const& range2, T tol)
- {
- size_t range1_count = boost::size(range1);
- size_t range2_count = boost::size(range2);
- BOOST_CHECK_EQUAL(range1_count, range2_count);
- if (range1_count == range2_count)
- {
- apply(boost::begin(range1), boost::end(range1),
- boost::begin(range2), tol);
- }
- }
- template <typename It, typename T>
- static void apply(It first1, It last1, It first2, T tol)
- {
- for ( ; first1 != last1 ; ++first1, ++first2)
- Policy::apply(*first1, *first2, tol);
- }
- };
- template <typename Geometry, typename Tag = typename bg::tag<Geometry>::type>
- struct check_geometry_impl
- {};
- template <typename Point>
- struct check_geometry_impl<Point, bg::point_tag>
- : check_point
- {};
- template <typename Segment>
- struct check_geometry_impl<Segment, bg::segment_tag>
- {
- template <typename T>
- static void apply(Segment const& g1, Segment const& g2, T tol)
- {
- bg::detail::indexed_point_view<Segment const, 0> p1(g1);
- bg::detail::indexed_point_view<Segment const, 1> p2(g1);
- bg::detail::indexed_point_view<Segment const, 0> q1(g2);
- bg::detail::indexed_point_view<Segment const, 1> q2(g2);
- check_point::apply(p1, q1, tol);
- check_point::apply(p2, q2, tol);
- }
- };
- template <typename MultiPoint>
- struct check_geometry_impl<MultiPoint, bg::multi_point_tag>
- : check_range<>
- {};
- template <typename Linestring>
- struct check_geometry_impl<Linestring, bg::linestring_tag>
- : check_range<>
- {};
- template <typename MultiLinestring>
- struct check_geometry_impl<MultiLinestring, bg::multi_linestring_tag>
- : check_range< check_range<> >
- {};
- template <typename Ring>
- struct check_geometry_impl<Ring, bg::ring_tag>
- : check_range<>
- {};
- template <typename Polygon>
- struct check_geometry_impl<Polygon, bg::polygon_tag>
- {
- template <typename T>
- static void apply(Polygon const& g1, Polygon const& g2, T tol)
- {
- check_range<>::apply(bg::exterior_ring(g1), bg::exterior_ring(g2), tol);
- check_range< check_range<> >::apply(bg::interior_rings(g1), bg::interior_rings(g2), tol);
- }
- };
- template <typename MultiPolygon>
- struct check_geometry_impl<MultiPolygon, bg::multi_polygon_tag>
- : check_range
- <
- check_geometry_impl
- <
- typename boost::range_value<MultiPolygon>::type,
- bg::polygon_tag
- >
- >
- {};
- template <typename Geometry, typename T>
- inline void check_geometry(Geometry const& g1, Geometry const& g2, T tol)
- {
- check_geometry_impl<Geometry>::apply(g1, g2, tol);
- }
- template <typename Geometry, typename T>
- inline void check_geometry(Geometry const& g1, std::string const& wkt2, T tol)
- {
- Geometry g2;
- bg::read_wkt(wkt2, g2);
- check_geometry_impl<Geometry>::apply(g1, g2, tol);
- }
- } // namespace test
- #endif // BOOST_GEOMETRY_TEST_SRS_CHECK_GEOMETRY_HPP
|