diff --git a/doc/doxy/Doxyfile b/doc/doxy/Doxyfile
index 4c9aa41d34..aab8e217bd 100644
--- a/doc/doxy/Doxyfile
+++ b/doc/doxy/Doxyfile
@@ -211,6 +211,7 @@ INPUT = . .. ../../../../boost/geometry/core \
../../../../boost/geometry/strategies/agnostic \
../../../../boost/geometry/strategies/cartesian \
../../../../boost/geometry/strategies/spherical \
+ ../../../../boost/geometry/strategies/geographic \
../../../../boost/geometry/strategies/transform \
../../../../boost/geometry/util \
../../../../boost/geometry/views \
diff --git a/doc/index/rtree/query.qbk b/doc/index/rtree/query.qbk
index 0cf80acc78..75f40ec293 100644
--- a/doc/index/rtree/query.qbk
+++ b/doc/index/rtree/query.qbk
@@ -1,7 +1,7 @@
[/============================================================================
Boost.Geometry Index
- Copyright (c) 2011-2013 Adam Wulkiewicz.
+ Copyright (c) 2011-2017 Adam Wulkiewicz.
Use, modification and distribution is subject to the Boost Software License,
Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -57,7 +57,7 @@ Query iterators returned by free functions
__box__ box_region(...);
std::copy(bgi::qbegin(rt, bgi::intersects(box_region)), bgi::qend(rt), std::back_inserter(returned_values));
-[h4 Spatial predicates]
+[h4 Spatial queries]
Queries using spatial predicates returns `__value__`s which are related somehow to some Geometry - box, polygon, etc.
Names of spatial predicates correspond to names of __boost_geometry__ algorithms (boolean operations).
@@ -129,6 +129,9 @@ The same way different query Geometries can be used:
Segment seg(/*...*/);
rt.query(bgi::nearest(seg, k), std::back_inserter(returned_values));
+[note In case of k-NN queries performed with `query()` function it's not guaranteed that the returned values will be sorted according to the distance.
+ It's different in case of k-NN queries performed with query iterator returned by `qbegin()` function which guarantees the iteration over the closest `__value__`s first. ]
+
[h4 User-defined unary predicate]
The user may pass a `UnaryPredicate` - function, function object or lambda expression taking const reference to Value and returning bool.
@@ -175,7 +178,7 @@ may use `index::satisfies()` function like on the example below:
rt.query(index::intersects(box) && !index::satisfies(is_not_red),
std::back_inserter(result));
-[h4 Passing a set of predicates]
+[h4 Passing set of predicates]
It's possible to use some number of predicates in one query by connecting them with `operator&&` e.g. `Pred1 && Pred2 && Pred3 && ...`.
@@ -190,7 +193,7 @@ left-to-right so placing most restrictive predicates first should accelerate the
rt.query(index::intersects(box1) && !index::within(box2) && index::overlaps(box3),
std::back_inserter(result));
-Of course it's possible to connect different types of predicates together.
+It's possible to connect different types of predicates together.
index::query(rt, index::nearest(pt, k) && index::within(b), std::back_inserter(returned_values));
@@ -211,13 +214,11 @@ or may be stopped at some point, when all interesting values were gathered. The
break;
}
-[note In the case of iterative k-NN queries it's guaranteed to iterate over the closest `__value__`s first. ]
-
[warning The modification of the `rtree`, e.g. insertion or removal of `__value__`s may invalidate the iterators. ]
-[h4 Inserting query results into the other R-tree]
+[h4 Inserting query results into another R-tree]
-There are several ways of inserting Values returned by a query to the other R-tree container.
+There are several ways of inserting Values returned by a query into another R-tree container.
The most basic way is creating a temporary container for Values and insert them later.
namespace bgi = boost::geometry::index;
@@ -231,14 +232,13 @@ The most basic way is creating a temporary container for Values and insert them
rt1.query(bgi::intersects(Box(/*...*/)), std::back_inserter(result));
RTree rt2(result.begin(), result.end());
-However there are better ways. One of these methods is mentioned in the "Creation and modification" section.
+However there are other ways. One of these methods is mentioned in the "Creation and modification" section.
The insert iterator may be passed directly into the query.
RTree rt3;
rt1.query(bgi::intersects(Box(/*...*/))), bgi::inserter(rt3));
-If you're a user of Boost.Range you'll appreciate the third option. You may pass the result Range directly into the
-constructor or `insert()` member function.
+You may also pass the resulting Range directly into the constructor or `insert()` member function using Boost.Range adaptor syntax.
RTree rt4(rt1 | bgi::adaptors::queried(bgi::intersects(Box(/*...*/)))));
diff --git a/doc/make_qbk.py b/doc/make_qbk.py
index db6cc0ab94..184e422230 100755
--- a/doc/make_qbk.py
+++ b/doc/make_qbk.py
@@ -4,6 +4,7 @@
# Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
# Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
# Copyright (c) 2009-2012 Mateusz Loskot (mateusz@loskot.net), London, UK
+# Copyright (c) 2017 Adam Wulkiewicz, Lodz, Poland
#
# Use, modification and distribution is subject to the Boost Software License,
# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -123,7 +124,8 @@ def cs_to_quickbook(section):
, "distance::cross_track", "distance::cross_track_point_box"
, "distance::projected_point"
, "within::winding", "within::franklin", "within::crossings_multiply"
- , "area::surveyor", "area::huiller"
+ , "area::surveyor", "area::spherical"
+ #, "area::geographic"
, "buffer::point_circle", "buffer::point_square"
, "buffer::join_round", "buffer::join_miter"
, "buffer::end_round", "buffer::end_flat"
diff --git a/doc/quickref.xml b/doc/quickref.xml
index 5b095811af..755fdd255c 100644
--- a/doc/quickref.xml
+++ b/doc/quickref.xml
@@ -10,10 +10,10 @@
Copyright (c) 2009-2015 Bruno Lalande, Paris, France.
Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
- This file was modified by Oracle on 2014, 2015.
- Modifications copyright (c) 2014-2015, Oracle and/or its affiliates.
-
+ This file was modified by Oracle on 2014, 2015, 2017.
+ Modifications copyright (c) 2014-2017, Oracle and/or its affiliates.
Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+ 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
@@ -521,7 +521,8 @@
Area
strategy::area::surveyor
-
+ strategy::area::spherical
+
diff --git a/doc/reference.qbk b/doc/reference.qbk
index f730601816..e84115ece3 100644
--- a/doc/reference.qbk
+++ b/doc/reference.qbk
@@ -99,7 +99,9 @@
[include generated/crosses.qbk]
[endsect]
+[section:difference difference]
[include generated/difference.qbk]
+[endsect]
[section:disjoint disjoint]
[include generated/disjoint.qbk]
@@ -125,9 +127,9 @@
[include generated/for_each.qbk]
[endsect]
-[/section:intersection intersection]
+[section:intersection intersection]
[include generated/intersection.qbk]
-[/endsect]
+[endsect]
[section:intersects intersects]
[include generated/intersects.qbk]
@@ -135,7 +137,9 @@
[include generated/is_empty.qbk]
+[section:is_simple is_simple]
[include generated/is_simple.qbk]
+[endsect]
[section:is_valid is_valid]
[include generated/is_valid.qbk]
@@ -176,9 +180,9 @@
[include generated/simplify.qbk]
[endsect]
-[/section:sym_difference sym_difference]
+[section:sym_difference sym_difference]
[include generated/sym_difference.qbk]
-[/endsect]
+[endsect]
[section:touches touches]
[include generated/touches.qbk]
@@ -188,9 +192,9 @@
[include generated/transform.qbk]
[endsect]
-[/section:union union]
+[section:union_ union_]
[include generated/union.qbk]
-[/endsect]
+[endsect]
[include generated/unique.qbk]
@@ -333,7 +337,8 @@
[include generated/distance_cross_track.qbk]
[include generated/distance_cross_track_point_box.qbk]
[include generated/area_surveyor.qbk]
-[/include generated/area_huiller.qbk]
+[include generated/area_spherical.qbk]
+[/include generated/area_geographic.qbk]
[include generated/buffer_join_round.qbk]
[include generated/buffer_join_miter.qbk]
[include generated/buffer_end_round.qbk]
diff --git a/doc/release_notes.qbk b/doc/release_notes.qbk
index 95d580be19..a640ab0e98 100644
--- a/doc/release_notes.qbk
+++ b/doc/release_notes.qbk
@@ -29,6 +29,8 @@
[*Breaking changes]
* ublas_transformer is renamed to matrix_transformer
+* explicit modifier is added to constructors of rtree index::dynamic_* parameters
+* strategy::area::huiller replaced by strategy::area::spherical
[*Solved issues]
diff --git a/doc/src/examples/algorithms/append.cpp b/doc/src/examples/algorithms/append.cpp
index f5a3085b5b..fd90a6a04d 100644
--- a/doc/src/examples/algorithms/append.cpp
+++ b/doc/src/examples/algorithms/append.cpp
@@ -12,12 +12,12 @@
#include
-#include
-
#include
#include
#include
+#include /*< At the end to avoid conflicts with Boost.QVM >*/
+
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
int main()
diff --git a/doc/src/examples/core/tag.cpp b/doc/src/examples/core/tag.cpp
index bb5b765ec8..5e4c706879 100644
--- a/doc/src/examples/core/tag.cpp
+++ b/doc/src/examples/core/tag.cpp
@@ -12,13 +12,13 @@
#include
-#include
-
#include
#include
#include
#include
+#include /*< At the end to avoid conflicts with Boost.QVM >*/
+
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
template struct dispatch {};
diff --git a/doc/src/examples/geometries/adapted/boost_range/sliced.cpp b/doc/src/examples/geometries/adapted/boost_range/sliced.cpp
index bdfd74c629..45cab8195a 100644
--- a/doc/src/examples/geometries/adapted/boost_range/sliced.cpp
+++ b/doc/src/examples/geometries/adapted/boost_range/sliced.cpp
@@ -12,13 +12,13 @@
#include
-#include
-
#include
#include
#include
#include
+#include /*< At the end to avoid conflicts with Boost.QVM >*/
+
int main()
{
diff --git a/doc/src/examples/geometries/adapted/boost_range/strided.cpp b/doc/src/examples/geometries/adapted/boost_range/strided.cpp
index 8b9dc68657..1ed9b5ecc5 100644
--- a/doc/src/examples/geometries/adapted/boost_range/strided.cpp
+++ b/doc/src/examples/geometries/adapted/boost_range/strided.cpp
@@ -12,13 +12,13 @@
#include
-#include
-
#include
#include
#include
#include
+#include /*< At the end to avoid conflicts with Boost.QVM >*/
+
int main()
{
diff --git a/doc/src/examples/quick_start.cpp b/doc/src/examples/quick_start.cpp
index f77c8909b7..41d3beb32a 100644
--- a/doc/src/examples/quick_start.cpp
+++ b/doc/src/examples/quick_start.cpp
@@ -19,6 +19,8 @@
//#pragma warning( disable : 4244 )
#endif // defined(_MSC_VER)
+#include
+
//[quickstart_include
#include
diff --git a/include/boost/geometry/algorithms/area.hpp b/include/boost/geometry/algorithms/area.hpp
index 4751d4e742..18aea24036 100644
--- a/include/boost/geometry/algorithms/area.hpp
+++ b/include/boost/geometry/algorithms/area.hpp
@@ -4,6 +4,10 @@
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// This file was modified by Oracle on 2017.
+// Modifications copyright (c) 2017 Oracle and/or its affiliates.
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
@@ -303,7 +307,8 @@ inline typename default_area_result::type area(Geometry const& geometr
[heading Available Strategies]
\* [link geometry.reference.strategies.strategy_area_surveyor Surveyor (cartesian)]
-\* [link geometry.reference.strategies.strategy_area_huiller Huiller (spherical)]
+\* [link geometry.reference.strategies.strategy_area_spherical Spherical]
+[/link geometry.reference.strategies.strategy_area_geographic Geographic]
}
*/
template
diff --git a/include/boost/geometry/algorithms/detail/intersection/interface.hpp b/include/boost/geometry/algorithms/detail/intersection/interface.hpp
index ddf49ad031..0efc9731b5 100644
--- a/include/boost/geometry/algorithms/detail/intersection/interface.hpp
+++ b/include/boost/geometry/algorithms/detail/intersection/interface.hpp
@@ -15,12 +15,14 @@
#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_INTERFACE_HPP
-// TODO: those headers probably may be removed
-#include
-#include
+#include
+#include
+#include
#include
#include
+#include
+#include
namespace boost { namespace geometry
@@ -98,19 +100,74 @@ struct intersection
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
-
+
+namespace resolve_strategy {
+
+struct intersection
+{
+ template
+ <
+ typename Geometry1,
+ typename Geometry2,
+ typename RobustPolicy,
+ typename GeometryOut,
+ typename Strategy
+ >
+ static inline bool apply(Geometry1 const& geometry1,
+ Geometry2 const& geometry2,
+ RobustPolicy const& robust_policy,
+ GeometryOut & geometry_out,
+ Strategy const& strategy)
+ {
+ return dispatch::intersection
+ <
+ Geometry1,
+ Geometry2
+ >::apply(geometry1, geometry2, robust_policy, geometry_out,
+ strategy);
+ }
+
+ template
+ <
+ typename Geometry1,
+ typename Geometry2,
+ typename RobustPolicy,
+ typename GeometryOut
+ >
+ static inline bool apply(Geometry1 const& geometry1,
+ Geometry2 const& geometry2,
+ RobustPolicy const& robust_policy,
+ GeometryOut & geometry_out,
+ default_strategy)
+ {
+ typedef typename strategy::relate::services::default_strategy
+ <
+ Geometry1, Geometry2
+ >::type strategy_type;
+
+ return dispatch::intersection
+ <
+ Geometry1,
+ Geometry2
+ >::apply(geometry1, geometry2, robust_policy, geometry_out,
+ strategy_type());
+ }
+};
+
+} // resolve_strategy
+
+
namespace resolve_variant
{
template
struct intersection
{
- template
- static inline bool
- apply(
- const Geometry1& geometry1,
- const Geometry2& geometry2,
- GeometryOut& geometry_out)
+ template
+ static inline bool apply(Geometry1 const& geometry1,
+ Geometry2 const& geometry2,
+ GeometryOut& geometry_out,
+ Strategy const& strategy)
{
concepts::check();
concepts::check();
@@ -125,17 +182,11 @@ struct intersection
= geometry::get_rescale_policy(geometry1,
geometry2);
- typedef typename strategy::relate::services::default_strategy
- <
- Geometry1, Geometry2
- >::type strategy_type;
-
- return dispatch::intersection
- <
- Geometry1,
- Geometry2
- >::apply(geometry1, geometry2, robust_policy, geometry_out,
- strategy_type());
+ return resolve_strategy::intersection::apply(geometry1,
+ geometry2,
+ robust_policy,
+ geometry_out,
+ strategy);
}
};
@@ -143,40 +194,43 @@ struct intersection
template
struct intersection, Geometry2>
{
- template
+ template
struct visitor: static_visitor
{
Geometry2 const& m_geometry2;
GeometryOut& m_geometry_out;
+ Strategy const& m_strategy;
visitor(Geometry2 const& geometry2,
- GeometryOut& geometry_out)
+ GeometryOut& geometry_out,
+ Strategy const& strategy)
: m_geometry2(geometry2)
, m_geometry_out(geometry_out)
+ , m_strategy(strategy)
{}
template
- result_type operator()(Geometry1 const& geometry1) const
+ bool operator()(Geometry1 const& geometry1) const
{
return intersection
- <
- Geometry1,
- Geometry2
- >::template apply
- <
- GeometryOut
- >
- (geometry1, m_geometry2, m_geometry_out);
+ <
+ Geometry1,
+ Geometry2
+ >::apply(geometry1, m_geometry2, m_geometry_out, m_strategy);
}
};
- template
+ template
static inline bool
apply(variant const& geometry1,
Geometry2 const& geometry2,
- GeometryOut& geometry_out)
+ GeometryOut& geometry_out,
+ Strategy const& strategy)
{
- return boost::apply_visitor(visitor(geometry2, geometry_out), geometry1);
+ return boost::apply_visitor(visitor(geometry2,
+ geometry_out,
+ strategy),
+ geometry1);
}
};
@@ -184,40 +238,43 @@ struct intersection, Geometry2>
template
struct intersection >
{
- template
+ template
struct visitor: static_visitor
{
Geometry1 const& m_geometry1;
GeometryOut& m_geometry_out;
+ Strategy const& m_strategy;
visitor(Geometry1 const& geometry1,
- GeometryOut& geometry_out)
+ GeometryOut& geometry_out,
+ Strategy const& strategy)
: m_geometry1(geometry1)
, m_geometry_out(geometry_out)
+ , m_strategy(strategy)
{}
template
- result_type operator()(Geometry2 const& geometry2) const
+ bool operator()(Geometry2 const& geometry2) const
{
return intersection
- <
- Geometry1,
- Geometry2
- >::template apply
- <
- GeometryOut
- >
- (m_geometry1, geometry2, m_geometry_out);
+ <
+ Geometry1,
+ Geometry2
+ >::apply(m_geometry1, geometry2, m_geometry_out, m_strategy);
}
};
- template
+ template
static inline bool
apply(Geometry1 const& geometry1,
- const variant& geometry2,
- GeometryOut& geometry_out)
+ variant const& geometry2,
+ GeometryOut& geometry_out,
+ Strategy const& strategy)
{
- return boost::apply_visitor(visitor(geometry1, geometry_out), geometry2);
+ return boost::apply_visitor(visitor(geometry1,
+ geometry_out,
+ strategy),
+ geometry2);
}
};
@@ -225,38 +282,39 @@ struct intersection >
template
struct intersection, variant >
{
- template
+ template
struct visitor: static_visitor
{
GeometryOut& m_geometry_out;
+ Strategy const& m_strategy;
- visitor(GeometryOut& geometry_out)
+ visitor(GeometryOut& geometry_out, Strategy const& strategy)
: m_geometry_out(geometry_out)
+ , m_strategy(strategy)
{}
template
- result_type operator()(Geometry1 const& geometry1,
- Geometry2 const& geometry2) const
+ bool operator()(Geometry1 const& geometry1,
+ Geometry2 const& geometry2) const
{
return intersection
- <
- Geometry1,
- Geometry2
- >::template apply
- <
- GeometryOut
- >
- (geometry1, geometry2, m_geometry_out);
+ <
+ Geometry1,
+ Geometry2
+ >::apply(geometry1, geometry2, m_geometry_out, m_strategy);
}
};
- template
+ template
static inline bool
- apply(const variant& geometry1,
- const variant& geometry2,
- GeometryOut& geometry_out)
+ apply(variant const& geometry1,
+ variant const& geometry2,
+ GeometryOut& geometry_out,
+ Strategy const& strategy)
{
- return boost::apply_visitor(visitor(geometry_out), geometry1, geometry2);
+ return boost::apply_visitor(visitor(geometry_out,
+ strategy),
+ geometry1, geometry2);
}
};
@@ -271,32 +329,66 @@ struct intersection, variant
inline bool intersection(Geometry1 const& geometry1,
- Geometry2 const& geometry2,
- GeometryOut& geometry_out)
+ Geometry2 const& geometry2,
+ GeometryOut& geometry_out,
+ Strategy const& strategy)
{
return resolve_variant::intersection
<
- Geometry1,
- Geometry2
- >::template apply
+ Geometry1,
+ Geometry2
+ >::apply(geometry1, geometry2, geometry_out, strategy);
+}
+
+
+/*!
+\brief \brief_calc2{intersection}
+\ingroup intersection
+\details \details_calc2{intersection, spatial set theoretic intersection}.
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam GeometryOut Collection of geometries (e.g. std::vector, std::deque, boost::geometry::multi*) of which
+ the value_type fulfills a \p_l_or_c concept, or it is the output geometry (e.g. for a box)
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param geometry_out The output geometry, either a multi_point, multi_polygon,
+ multi_linestring, or a box (for intersection of two boxes)
+
+\qbk{[include reference/algorithms/intersection.qbk]}
+*/
+template
+<
+ typename Geometry1,
+ typename Geometry2,
+ typename GeometryOut
+>
+inline bool intersection(Geometry1 const& geometry1,
+ Geometry2 const& geometry2,
+ GeometryOut& geometry_out)
+{
+ return resolve_variant::intersection
<
- GeometryOut
- >
- (geometry1, geometry2, geometry_out);
+ Geometry1,
+ Geometry2
+ >::apply(geometry1, geometry2, geometry_out, default_strategy());
}
diff --git a/include/boost/geometry/algorithms/detail/is_simple/always_simple.hpp b/include/boost/geometry/algorithms/detail/is_simple/always_simple.hpp
index 91e2ef76bd..5cec5e1924 100644
--- a/include/boost/geometry/algorithms/detail/is_simple/always_simple.hpp
+++ b/include/boost/geometry/algorithms/detail/is_simple/always_simple.hpp
@@ -1,8 +1,9 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
@@ -27,7 +28,8 @@ namespace detail { namespace is_simple
template
struct always_simple
{
- static inline bool apply(Geometry const&)
+ template
+ static inline bool apply(Geometry const&, Strategy const&)
{
return true;
}
diff --git a/include/boost/geometry/algorithms/detail/is_simple/areal.hpp b/include/boost/geometry/algorithms/detail/is_simple/areal.hpp
index a2322e4831..d4d6db9bce 100644
--- a/include/boost/geometry/algorithms/detail/is_simple/areal.hpp
+++ b/include/boost/geometry/algorithms/detail/is_simple/areal.hpp
@@ -1,8 +1,9 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
@@ -37,6 +38,12 @@ namespace detail { namespace is_simple
template
struct is_simple_ring
{
+ template
+ static inline bool apply(Ring const& ring, Strategy const&)
+ {
+ return apply(ring);
+ }
+
static inline bool apply(Ring const& ring)
{
simplicity_failure_policy policy;
@@ -69,6 +76,12 @@ class is_simple_polygon
}
public:
+ template
+ static inline bool apply(Polygon const& polygon, Strategy const&)
+ {
+ return apply(polygon);
+ }
+
static inline bool apply(Polygon const& polygon)
{
return
@@ -119,7 +132,8 @@ struct is_simple
template
struct is_simple
{
- static inline bool apply(MultiPolygon const& multipolygon)
+ template
+ static inline bool apply(MultiPolygon const& multipolygon, Strategy const&)
{
return
detail::check_iterator_range
diff --git a/include/boost/geometry/algorithms/detail/is_simple/interface.hpp b/include/boost/geometry/algorithms/detail/is_simple/interface.hpp
index 6d425232b0..af0127dc75 100644
--- a/include/boost/geometry/algorithms/detail/is_simple/interface.hpp
+++ b/include/boost/geometry/algorithms/detail/is_simple/interface.hpp
@@ -1,8 +1,9 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
@@ -17,46 +18,106 @@
#include
#include
+#include
+#include
+#include
namespace boost { namespace geometry
{
+namespace resolve_strategy
+{
+
+struct is_simple
+{
+ template
+ static inline bool apply(Geometry const& geometry,
+ Strategy const& strategy)
+ {
+ return dispatch::is_simple::apply(geometry, strategy);
+ }
+
+ template
+ static inline bool apply(Geometry const& geometry,
+ default_strategy)
+ {
+ // NOTE: Currently the strategy is only used for Linear geometries
+ typedef typename strategy::intersection::services::default_strategy
+ <
+ typename cs_tag::type
+ >::type strategy_type;
+
+ return dispatch::is_simple::apply(geometry, strategy_type());
+ }
+};
-namespace resolve_variant {
+} // namespace resolve_strategy
+
+namespace resolve_variant
+{
template
struct is_simple
{
- static inline bool apply(Geometry const& geometry)
+ template
+ static inline bool apply(Geometry const& geometry, Strategy const& strategy)
{
concepts::check();
- return dispatch::is_simple::apply(geometry);
+
+ return resolve_strategy::is_simple::apply(geometry, strategy);
}
};
template
struct is_simple >
{
+ template
struct visitor : boost::static_visitor
{
+ Strategy const& m_strategy;
+
+ visitor(Strategy const& strategy)
+ : m_strategy(strategy)
+ {}
+
template
bool operator()(Geometry const& geometry) const
{
- return is_simple::apply(geometry);
+ return is_simple::apply(geometry, m_strategy);
}
};
+ template
static inline bool
- apply(boost::variant const& geometry)
+ apply(boost::variant const& geometry,
+ Strategy const& strategy)
{
- return boost::apply_visitor(visitor(), geometry);
+ return boost::apply_visitor(visitor(strategy), geometry);
}
};
} // namespace resolve_variant
+/*!
+\brief \brief_check{is simple}
+\ingroup is_simple
+\tparam Geometry \tparam_geometry
+\tparam Strategy \tparam_strategy{Is_simple}
+\param geometry \param_geometry
+\param strategy \param_strategy{is_simple}
+\return \return_check{is simple}
+
+\qbk{distinguish,with strategy}
+\qbk{[include reference/algorithms/is_simple.qbk]}
+*/
+template
+inline bool is_simple(Geometry const& geometry, Strategy const& strategy)
+{
+ return resolve_variant::is_simple::apply(geometry, strategy);
+}
+
/*!
\brief \brief_check{is simple}
@@ -70,7 +131,7 @@ struct is_simple >
template
inline bool is_simple(Geometry const& geometry)
{
- return resolve_variant::is_simple::apply(geometry);
+ return resolve_variant::is_simple::apply(geometry, default_strategy());
}
diff --git a/include/boost/geometry/algorithms/detail/is_simple/linear.hpp b/include/boost/geometry/algorithms/detail/is_simple/linear.hpp
index 6c469f07f7..52b9d9d1c8 100644
--- a/include/boost/geometry/algorithms/detail/is_simple/linear.hpp
+++ b/include/boost/geometry/algorithms/detail/is_simple/linear.hpp
@@ -189,8 +189,8 @@ class is_acceptable_turn
};
-template
-inline bool has_self_intersections(Linear const& linear)
+template
+inline bool has_self_intersections(Linear const& linear, Strategy const& strategy)
{
typedef typename point_type::type point_type;
@@ -217,16 +217,11 @@ inline bool has_self_intersections(Linear const& linear)
is_acceptable_turn
> interrupt_policy(predicate);
- typedef typename strategy::intersection::services::default_strategy
- <
- typename cs_tag::type
- >::type strategy_type;
-
detail::self_get_turn_points::get_turns
<
turn_policy
>::apply(linear,
- strategy_type(),
+ strategy,
detail::no_rescale_policy(),
turns,
interrupt_policy);
@@ -252,8 +247,19 @@ struct is_simple_linestring
&& ! detail::is_valid::has_spikes
<
Linestring, closed
- >::apply(linestring, policy)
- && ! (CheckSelfIntersections && has_self_intersections(linestring));
+ >::apply(linestring, policy);
+ }
+};
+
+template
+struct is_simple_linestring
+{
+ template
+ static inline bool apply(Linestring const& linestring,
+ Strategy const& strategy)
+ {
+ return is_simple_linestring::apply(linestring)
+ && ! has_self_intersections(linestring, strategy);
}
};
@@ -261,7 +267,9 @@ struct is_simple_linestring
template
struct is_simple_multilinestring
{
- static inline bool apply(MultiLinestring const& multilinestring)
+ template
+ static inline bool apply(MultiLinestring const& multilinestring,
+ Strategy const& strategy)
{
// check each of the linestrings for simplicity
// but do not compute self-intersections yet; these will be
@@ -281,7 +289,7 @@ struct is_simple_multilinestring
return false;
}
- return ! has_self_intersections(multilinestring);
+ return ! has_self_intersections(multilinestring, strategy);
}
};
diff --git a/include/boost/geometry/algorithms/detail/is_simple/multipoint.hpp b/include/boost/geometry/algorithms/detail/is_simple/multipoint.hpp
index f9f43d1cdb..61f0bc9130 100644
--- a/include/boost/geometry/algorithms/detail/is_simple/multipoint.hpp
+++ b/include/boost/geometry/algorithms/detail/is_simple/multipoint.hpp
@@ -1,8 +1,9 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
@@ -38,7 +39,8 @@ namespace detail { namespace is_simple
template
struct is_simple_multipoint
{
- static inline bool apply(MultiPoint const& multipoint)
+ template
+ static inline bool apply(MultiPoint const& multipoint, Strategy const&)
{
if (boost::empty(multipoint))
{
diff --git a/include/boost/geometry/algorithms/detail/is_valid/box.hpp b/include/boost/geometry/algorithms/detail/is_valid/box.hpp
index 863ce625fe..69a4d4e78e 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/box.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/box.hpp
@@ -1,6 +1,6 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
@@ -71,8 +71,8 @@ struct has_valid_corners
template
struct is_valid_box
{
- template
- static inline bool apply(Box const& box, VisitPolicy& visitor)
+ template
+ static inline bool apply(Box const& box, VisitPolicy& visitor, Strategy const&)
{
return
! has_invalid_coordinate::apply(box, visitor)
diff --git a/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp b/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp
index 9f278ac041..b91dc6a697 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp
@@ -48,11 +48,6 @@ class has_valid_self_turns
private:
typedef typename point_type::type point_type;
- typedef typename strategy::intersection::services::default_strategy
- <
- typename cs_tag::type
- >::type intersection_strategy_type;
-
typedef typename geometry::rescale_policy_type
<
point_type
@@ -75,15 +70,14 @@ class has_valid_self_turns
> turn_type;
// returns true if all turns are valid
- template
+ template
static inline bool apply(Geometry const& geometry,
Turns& turns,
- VisitPolicy& visitor)
+ VisitPolicy& visitor,
+ Strategy const& strategy)
{
boost::ignore_unused(visitor);
- intersection_strategy_type intersection_strategy;
-
rescale_policy_type robust_policy
= geometry::get_rescale_policy(geometry);
@@ -93,7 +87,7 @@ class has_valid_self_turns
> interrupt_policy;
geometry::self_turns(geometry,
- intersection_strategy,
+ strategy,
robust_policy,
turns,
interrupt_policy);
@@ -110,11 +104,11 @@ class has_valid_self_turns
}
// returns true if all turns are valid
- template
- static inline bool apply(Geometry const& geometry, VisitPolicy& visitor)
+ template
+ static inline bool apply(Geometry const& geometry, VisitPolicy& visitor, Strategy const& strategy)
{
std::vector turns;
- return apply(geometry, turns, visitor);
+ return apply(geometry, turns, visitor, strategy);
}
};
diff --git a/include/boost/geometry/algorithms/detail/is_valid/interface.hpp b/include/boost/geometry/algorithms/detail/is_valid/interface.hpp
index 5a04a92824..ee013377c4 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/interface.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/interface.hpp
@@ -1,8 +1,9 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
@@ -23,48 +24,88 @@
#include
#include
#include
+#include
+#include
namespace boost { namespace geometry
{
+
+namespace resolve_strategy
+{
+
+struct is_valid
+{
+ template
+ static inline bool apply(Geometry const& geometry,
+ VisitPolicy& visitor,
+ Strategy const& strategy)
+ {
+ return dispatch::is_valid::apply(geometry, visitor, strategy);
+ }
+
+ template
+ static inline bool apply(Geometry const& geometry,
+ VisitPolicy& visitor,
+ default_strategy)
+ {
+ // NOTE: Currently the strategy is only used for Areal geometries
+ typedef typename strategy::intersection::services::default_strategy
+ <
+ typename cs_tag::type
+ >::type strategy_type;
+
+ return dispatch::is_valid::apply(geometry, visitor, strategy_type());
+ }
+};
+} // namespace resolve_strategy
-namespace resolve_variant {
+namespace resolve_variant
+{
template
struct is_valid
{
- template
- static inline bool apply(Geometry const& geometry, VisitPolicy& visitor)
+ template
+ static inline bool apply(Geometry const& geometry,
+ VisitPolicy& visitor,
+ Strategy const& strategy)
{
concepts::check();
- return dispatch::is_valid::apply(geometry, visitor);
+
+ return resolve_strategy::is_valid::apply(geometry, visitor, strategy);
}
};
template
struct is_valid >
{
- template
+ template
struct visitor : boost::static_visitor
{
- visitor(VisitPolicy& policy) : m_policy(policy) {}
+ visitor(VisitPolicy& policy, Strategy const& strategy)
+ : m_policy(policy)
+ , m_strategy(strategy)
+ {}
template
bool operator()(Geometry const& geometry) const
{
- return is_valid::apply(geometry, m_policy);
+ return is_valid::apply(geometry, m_policy, m_strategy);
}
VisitPolicy& m_policy;
+ Strategy const& m_strategy;
};
- template
+ template
static inline bool
apply(boost::variant const& geometry,
- VisitPolicy& policy_visitor)
+ VisitPolicy& policy_visitor,
+ Strategy const& strategy)
{
- return boost::apply_visitor(visitor(policy_visitor),
+ return boost::apply_visitor(visitor(policy_visitor, strategy),
geometry);
}
};
@@ -73,13 +114,38 @@ struct is_valid >
// Undocumented for now
-template
-inline bool is_valid(Geometry const& geometry, VisitPolicy& visitor)
+template
+inline bool is_valid(Geometry const& geometry,
+ VisitPolicy& visitor,
+ Strategy const& strategy)
{
- return resolve_variant::is_valid::apply(geometry, visitor);
+ return resolve_variant::is_valid::apply(geometry, visitor, strategy);
}
+/*!
+\brief \brief_check{is valid (in the OGC sense)}
+\ingroup is_valid
+\tparam Geometry \tparam_geometry
+\tparam Strategy \tparam_strategy{Is_valid}
+\param geometry \param_geometry
+\param strategy \param_strategy{is_valid}
+\return \return_check{is valid (in the OGC sense);
+furthermore, the following geometries are considered valid:
+multi-geometries with no elements,
+linear geometries containing spikes,
+areal geometries with duplicate (consecutive) points}
+
+\qbk{distinguish,with strategy}
+\qbk{[include reference/algorithms/is_valid.qbk]}
+*/
+template
+inline bool is_valid(Geometry const& geometry, Strategy const& strategy)
+{
+ is_valid_default_policy<> visitor;
+ return resolve_variant::is_valid::apply(geometry, visitor, strategy);
+}
+
/*!
\brief \brief_check{is valid (in the OGC sense)}
\ingroup is_valid
@@ -96,11 +162,37 @@ inline bool is_valid(Geometry const& geometry, VisitPolicy& visitor)
template
inline bool is_valid(Geometry const& geometry)
{
- is_valid_default_policy<> policy_visitor;
- return geometry::is_valid(geometry, policy_visitor);
+ return is_valid(geometry, default_strategy());
}
+/*!
+\brief \brief_check{is valid (in the OGC sense)}
+\ingroup is_valid
+\tparam Geometry \tparam_geometry
+\tparam Strategy \tparam_strategy{Is_valid}
+\param geometry \param_geometry
+\param failure An enumeration value indicating that the geometry is
+ valid or not, and if not valid indicating the reason why
+\param strategy \param_strategy{is_valid}
+\return \return_check{is valid (in the OGC sense);
+ furthermore, the following geometries are considered valid:
+ multi-geometries with no elements,
+ linear geometries containing spikes,
+ areal geometries with duplicate (consecutive) points}
+
+\qbk{distinguish,with failure value and strategy}
+\qbk{[include reference/algorithms/is_valid_with_failure.qbk]}
+*/
+template
+inline bool is_valid(Geometry const& geometry, validity_failure_type& failure, Strategy const& strategy)
+{
+ failure_type_policy<> visitor;
+ bool result = resolve_variant::is_valid::apply(geometry, visitor, strategy);
+ failure = visitor.failure();
+ return result;
+}
+
/*!
\brief \brief_check{is valid (in the OGC sense)}
\ingroup is_valid
@@ -120,10 +212,7 @@ inline bool is_valid(Geometry const& geometry)
template
inline bool is_valid(Geometry const& geometry, validity_failure_type& failure)
{
- failure_type_policy<> policy_visitor;
- bool result = geometry::is_valid(geometry, policy_visitor);
- failure = policy_visitor.failure();
- return result;
+ return is_valid(geometry, failure, default_strategy());
}
@@ -131,28 +220,52 @@ inline bool is_valid(Geometry const& geometry, validity_failure_type& failure)
\brief \brief_check{is valid (in the OGC sense)}
\ingroup is_valid
\tparam Geometry \tparam_geometry
+\tparam Strategy \tparam_strategy{Is_valid}
\param geometry \param_geometry
\param message A string containing a message stating if the geometry
is valid or not, and if not valid a reason why
+\param strategy \param_strategy{is_valid}
\return \return_check{is valid (in the OGC sense);
furthermore, the following geometries are considered valid:
multi-geometries with no elements,
linear geometries containing spikes,
areal geometries with duplicate (consecutive) points}
-\qbk{distinguish,with message}
+\qbk{distinguish,with message and strategy}
\qbk{[include reference/algorithms/is_valid_with_message.qbk]}
*/
-template
-inline bool is_valid(Geometry const& geometry, std::string& message)
+template
+inline bool is_valid(Geometry const& geometry, std::string& message, Strategy const& strategy)
{
std::ostringstream stream;
- failing_reason_policy<> policy_visitor(stream);
- bool result = geometry::is_valid(geometry, policy_visitor);
+ failing_reason_policy<> visitor(stream);
+ bool result = resolve_variant::is_valid::apply(geometry, visitor, strategy);
message = stream.str();
return result;
}
+/*!
+\brief \brief_check{is valid (in the OGC sense)}
+\ingroup is_valid
+\tparam Geometry \tparam_geometry
+\param geometry \param_geometry
+\param message A string containing a message stating if the geometry
+ is valid or not, and if not valid a reason why
+\return \return_check{is valid (in the OGC sense);
+ furthermore, the following geometries are considered valid:
+ multi-geometries with no elements,
+ linear geometries containing spikes,
+ areal geometries with duplicate (consecutive) points}
+
+\qbk{distinguish,with message}
+\qbk{[include reference/algorithms/is_valid_with_message.qbk]}
+*/
+template
+inline bool is_valid(Geometry const& geometry, std::string& message)
+{
+ return is_valid(geometry, message, default_strategy());
+}
+
}} // namespace boost::geometry
diff --git a/include/boost/geometry/algorithms/detail/is_valid/linear.hpp b/include/boost/geometry/algorithms/detail/is_valid/linear.hpp
index a49e077237..6bc6b86cf8 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/linear.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/linear.hpp
@@ -1,6 +1,6 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
@@ -77,6 +77,14 @@ struct is_valid_linestring
}
return ! has_spikes::apply(linestring, visitor);
}
+
+ template
+ static inline bool apply(Linestring const& linestring,
+ VisitPolicy& visitor,
+ Strategy const&)
+ {
+ return apply(linestring, visitor);
+ }
};
@@ -142,9 +150,10 @@ class is_valid
};
public:
- template
+ template
static inline bool apply(MultiLinestring const& multilinestring,
- VisitPolicy& visitor)
+ VisitPolicy& visitor,
+ Strategy const&)
{
if (BOOST_GEOMETRY_CONDITION(
AllowEmptyMultiGeometries && boost::empty(multilinestring)))
diff --git a/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp b/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp
index eafe07841a..84dacc57f1 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/multipolygon.hpp
@@ -237,23 +237,28 @@ class is_valid_multipolygon
}
- template
+ template
struct per_polygon
{
- per_polygon(VisitPolicy& policy) : m_policy(policy) {}
+ per_polygon(VisitPolicy& policy, Strategy const& strategy)
+ : m_policy(policy)
+ , m_strategy(strategy)
+ {}
template
inline bool apply(Polygon const& polygon) const
{
- return base::apply(polygon, m_policy);
+ return base::apply(polygon, m_policy, m_strategy);
}
VisitPolicy& m_policy;
+ Strategy const& m_strategy;
};
public:
- template
+ template
static inline bool apply(MultiPolygon const& multipolygon,
- VisitPolicy& visitor)
+ VisitPolicy& visitor,
+ Strategy const& strategy)
{
typedef debug_validity_phase debug_phase;
@@ -268,11 +273,11 @@ class is_valid_multipolygon
if (! detail::check_iterator_range
<
- per_polygon,
+ per_polygon,
false // do not check for empty multipolygon (done above)
>::apply(boost::begin(multipolygon),
boost::end(multipolygon),
- per_polygon(visitor)))
+ per_polygon(visitor, strategy)))
{
return false;
}
@@ -285,7 +290,7 @@ class is_valid_multipolygon
std::deque turns;
bool has_invalid_turns =
- ! has_valid_turns::apply(multipolygon, turns, visitor);
+ ! has_valid_turns::apply(multipolygon, turns, visitor, strategy);
debug_print_turns(turns.begin(), turns.end());
if (has_invalid_turns)
diff --git a/include/boost/geometry/algorithms/detail/is_valid/pointlike.hpp b/include/boost/geometry/algorithms/detail/is_valid/pointlike.hpp
index 51035f7a73..f77f7a35eb 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/pointlike.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/pointlike.hpp
@@ -1,6 +1,6 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
@@ -36,8 +36,8 @@ namespace dispatch
template
struct is_valid
{
- template
- static inline bool apply(Point const& point, VisitPolicy& visitor)
+ template
+ static inline bool apply(Point const& point, VisitPolicy& visitor, Strategy const&)
{
boost::ignore_unused(visitor);
return ! detail::is_valid::has_invalid_coordinate
@@ -56,9 +56,10 @@ struct is_valid
template
struct is_valid
{
- template
+ template
static inline bool apply(MultiPoint const& multipoint,
- VisitPolicy& visitor)
+ VisitPolicy& visitor,
+ Strategy const&)
{
boost::ignore_unused(multipoint, visitor);
diff --git a/include/boost/geometry/algorithms/detail/is_valid/polygon.hpp b/include/boost/geometry/algorithms/detail/is_valid/polygon.hpp
index 182571c567..f7e22fb8d2 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/polygon.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/polygon.hpp
@@ -1,8 +1,9 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
@@ -74,10 +75,13 @@ class is_valid_polygon
protected:
typedef debug_validity_phase debug_phase;
- template
+ template
struct per_ring
{
- per_ring(VisitPolicy& policy) : m_policy(policy) {}
+ per_ring(VisitPolicy& policy, Strategy const& strategy)
+ : m_policy(policy)
+ , m_strategy(strategy)
+ {}
template
inline bool apply(Ring const& ring) const
@@ -85,30 +89,34 @@ class is_valid_polygon
return detail::is_valid::is_valid_ring
<
Ring, false, true
- >::apply(ring, m_policy);
+ >::apply(ring, m_policy, m_strategy);
}
VisitPolicy& m_policy;
+ Strategy const& m_strategy;
};
- template
+ template
static bool has_valid_interior_rings(InteriorRings const& interior_rings,
- VisitPolicy& visitor)
+ VisitPolicy& visitor,
+ Strategy const& strategy)
{
return
detail::check_iterator_range
<
- per_ring,
+ per_ring,
true // allow for empty interior ring range
>::apply(boost::begin(interior_rings),
boost::end(interior_rings),
- per_ring(visitor));
+ per_ring(visitor, strategy));
}
struct has_valid_rings
{
- template
- static inline bool apply(Polygon const& polygon, VisitPolicy& visitor)
+ template
+ static inline bool apply(Polygon const& polygon,
+ VisitPolicy& visitor,
+ Strategy const& strategy)
{
typedef typename ring_type::type ring_type;
@@ -119,7 +127,7 @@ class is_valid_polygon
<
ring_type,
false // do not check self intersections
- >::apply(exterior_ring(polygon), visitor))
+ >::apply(exterior_ring(polygon), visitor, strategy))
{
return false;
}
@@ -128,7 +136,8 @@ class is_valid_polygon
debug_phase::apply(2);
return has_valid_interior_rings(geometry::interior_rings(polygon),
- visitor);
+ visitor,
+ strategy);
}
};
@@ -344,10 +353,12 @@ class is_valid_polygon
};
public:
- template
- static inline bool apply(Polygon const& polygon, VisitPolicy& visitor)
+ template
+ static inline bool apply(Polygon const& polygon,
+ VisitPolicy& visitor,
+ Strategy const& strategy)
{
- if (! has_valid_rings::apply(polygon, visitor))
+ if (! has_valid_rings::apply(polygon, visitor, strategy))
{
return false;
}
@@ -364,7 +375,7 @@ class is_valid_polygon
std::deque turns;
bool has_invalid_turns
- = ! has_valid_turns::apply(polygon, turns, visitor);
+ = ! has_valid_turns::apply(polygon, turns, visitor, strategy);
debug_print_turns(turns.begin(), turns.end());
if (has_invalid_turns)
diff --git a/include/boost/geometry/algorithms/detail/is_valid/ring.hpp b/include/boost/geometry/algorithms/detail/is_valid/ring.hpp
index 925c03a472..9ab68fdc48 100644
--- a/include/boost/geometry/algorithms/detail/is_valid/ring.hpp
+++ b/include/boost/geometry/algorithms/detail/is_valid/ring.hpp
@@ -1,6 +1,6 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+// Copyright (c) 2014-2017, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
@@ -101,26 +101,21 @@ struct ring_area_predicate
template
struct is_properly_oriented
{
- typedef typename point_type::type point_type;
-
- typedef typename strategy::area::services::default_strategy
- <
- typename cs_tag::type,
- point_type
- >::type strategy_type;
+ template
+ static inline bool apply(Ring const& ring, VisitPolicy& visitor,
+ Strategy const& strategy)
+ {
+ boost::ignore_unused(visitor);
- typedef detail::area::ring_area
- <
- order_as_direction::value>::value,
- geometry::closure::value
- > ring_area_type;
+ typedef typename point_type::type point_type;
- typedef typename default_area_result::type area_result_type;
+ typedef detail::area::ring_area
+ <
+ order_as_direction::value>::value,
+ geometry::closure::value
+ > ring_area_type;
- template
- static inline bool apply(Ring const& ring, VisitPolicy& visitor)
- {
- boost::ignore_unused(visitor);
+ typedef typename default_area_result::type area_result_type;
typename ring_area_predicate
<
@@ -128,8 +123,11 @@ struct is_properly_oriented
>::type predicate;
// Check area
- area_result_type const zero = area_result_type();
- if (predicate(ring_area_type::apply(ring, strategy_type()), zero))
+ area_result_type const zero = 0;
+ area_result_type const area
+ = ring_area_type::apply(ring,
+ strategy.template get_area_strategy