// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
-// This file was modified by Oracle on 2020.
-// Modifications copyright (c) 2020 Oracle and/or its affiliates.
+// This file was modified by Oracle on 2020-2021.
+// Modifications copyright (c) 2020-2021 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
#include <boost/version.hpp>
#include <boost/range/adaptor/reversed.hpp>
+#include <boost/geometry/core/closure.hpp>
+#include <boost/geometry/core/point_order.hpp>
#include <boost/geometry/core/ring_type.hpp>
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/core/tags.hpp>
+#include <boost/geometry/util/order_as_direction.hpp>
+
#include <boost/geometry/views/identity_view.hpp>
namespace boost { namespace geometry
{
-/*!
-\brief Flag for iterating a reversible_view in forward or reverse direction
-\ingroup views
-*/
-enum iterate_direction { iterate_forward, iterate_reverse };
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+
+template
+<
+ typename Range,
+ order_selector Order = geometry::point_order<Range>::value
+>
+struct clockwise_view
+ : identity_view<Range>
+{
+ explicit inline clockwise_view(Range& r)
+ : identity_view<Range>(r)
+ {}
+};
+
+template <typename Range>
+struct clockwise_view<Range, counterclockwise>
+ : boost::reversed_range<Range>
+{
+ explicit inline clockwise_view(Range& r)
+ : boost::reversed_range<Range>(r)
+ {}
+};
+
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
/*!
\brief View on a range, reversing direction if necessary
struct reversible_view {};
-
#ifndef DOXYGEN_NO_SPECIALIZATIONS
template <typename Range>
struct reversible_view<Range, iterate_forward>
{
- typedef identity_view<Range> type;
+ using type = identity_view<Range>;
};
template <typename Range>
struct reversible_view<Range, iterate_reverse>
{
-#if BOOST_VERSION > 104500
- typedef boost::reversed_range<Range> type;
-#else
- // For older versions of Boost
- typedef boost::range_detail::reverse_range<Range> type;
-#endif
+ using type = boost::reversed_range<Range>;
};
#endif // DOXYGEN_NO_SPECIALIZATIONS
+#ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+namespace traits
+{
+
+
+template <typename Range, order_selector Order>
+struct tag<detail::clockwise_view<Range, Order> >
+ : geometry::tag<Range>
+{};
+
+template <typename Range, order_selector Order>
+struct point_order<detail::clockwise_view<Range, Order> >
+{
+ static const order_selector value = clockwise;
+};
+
+template <typename Range, order_selector Order>
+struct closure<detail::clockwise_view<Range, Order> >
+ : geometry::closure<Range>
+{};
+
+
+} // namespace traits
+#endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+
}} // namespace boost::geometry