176 lines
4.5 KiB
C++
176 lines
4.5 KiB
C++
|
// Boost.Geometry
|
||
|
|
||
|
// Copyright (c) 2017-2020, 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_STRATEGY_RELATE_HPP
|
||
|
#define BOOST_GEOMETRY_STRATEGY_RELATE_HPP
|
||
|
|
||
|
|
||
|
#include <type_traits>
|
||
|
|
||
|
#include <boost/geometry/core/cs.hpp>
|
||
|
#include <boost/geometry/core/point_type.hpp>
|
||
|
#include <boost/geometry/core/static_assert.hpp>
|
||
|
#include <boost/geometry/core/topological_dimension.hpp>
|
||
|
|
||
|
#include <boost/geometry/strategies/covered_by.hpp>
|
||
|
#include <boost/geometry/strategies/intersection.hpp>
|
||
|
#include <boost/geometry/strategies/within.hpp>
|
||
|
|
||
|
|
||
|
namespace boost { namespace geometry
|
||
|
{
|
||
|
|
||
|
namespace strategy
|
||
|
{
|
||
|
|
||
|
namespace point_in_geometry
|
||
|
{
|
||
|
|
||
|
#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
|
||
|
namespace services
|
||
|
{
|
||
|
|
||
|
template
|
||
|
<
|
||
|
typename Point,
|
||
|
typename Geometry,
|
||
|
typename Tag1 = typename tag<Point>::type,
|
||
|
typename Tag2 = typename tag<Geometry>::type
|
||
|
>
|
||
|
struct default_strategy
|
||
|
: strategy::within::services::default_strategy
|
||
|
<
|
||
|
Point,
|
||
|
Geometry
|
||
|
>
|
||
|
{
|
||
|
typedef typename default_strategy::type within_strategy_type;
|
||
|
|
||
|
typedef typename strategy::covered_by::services::default_strategy
|
||
|
<
|
||
|
Point,
|
||
|
Geometry
|
||
|
>::type covered_by_strategy_type;
|
||
|
|
||
|
static const bool same_strategies = std::is_same<within_strategy_type, covered_by_strategy_type>::value;
|
||
|
BOOST_GEOMETRY_STATIC_ASSERT(same_strategies,
|
||
|
"Default within and covered_by strategies not compatible.",
|
||
|
within_strategy_type, covered_by_strategy_type);
|
||
|
};
|
||
|
|
||
|
template<typename Point, typename Geometry>
|
||
|
struct default_strategy<Point, Geometry, point_tag, point_tag>
|
||
|
: strategy::within::services::default_strategy<Point, Geometry>
|
||
|
{};
|
||
|
|
||
|
template<typename Point, typename Geometry>
|
||
|
struct default_strategy<Point, Geometry, point_tag, multi_point_tag>
|
||
|
: strategy::within::services::default_strategy<Point, Geometry>
|
||
|
{};
|
||
|
|
||
|
|
||
|
} // namespace services
|
||
|
#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
|
||
|
|
||
|
|
||
|
} // namespace point_in_geometry
|
||
|
|
||
|
namespace relate
|
||
|
{
|
||
|
|
||
|
#ifndef DOXYGEN_NO_DETAIL
|
||
|
namespace detail
|
||
|
{
|
||
|
|
||
|
template <typename Geometry>
|
||
|
struct default_intersection_strategy
|
||
|
: strategy::intersection::services::default_strategy
|
||
|
<
|
||
|
typename cs_tag<Geometry>::type
|
||
|
>
|
||
|
{};
|
||
|
|
||
|
template <typename PointLike, typename Geometry>
|
||
|
struct default_point_in_geometry_strategy
|
||
|
: point_in_geometry::services::default_strategy
|
||
|
<
|
||
|
typename point_type<PointLike>::type,
|
||
|
Geometry
|
||
|
>
|
||
|
{};
|
||
|
|
||
|
} // namespace detail
|
||
|
#endif // DOXYGEN_NO_DETAIL
|
||
|
|
||
|
#ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
|
||
|
namespace services
|
||
|
{
|
||
|
|
||
|
template
|
||
|
<
|
||
|
typename Geometry1,
|
||
|
typename Geometry2,
|
||
|
int TopDim1 = geometry::topological_dimension<Geometry1>::value,
|
||
|
int TopDim2 = geometry::topological_dimension<Geometry2>::value
|
||
|
>
|
||
|
struct default_strategy
|
||
|
{
|
||
|
BOOST_GEOMETRY_STATIC_ASSERT_FALSE(
|
||
|
"Not implemented for these types.",
|
||
|
Geometry1, Geometry2);
|
||
|
};
|
||
|
|
||
|
template <typename PointLike1, typename PointLike2>
|
||
|
struct default_strategy<PointLike1, PointLike2, 0, 0>
|
||
|
: detail::default_point_in_geometry_strategy<PointLike1, PointLike2>
|
||
|
{};
|
||
|
|
||
|
template <typename PointLike, typename Geometry, int TopDim2>
|
||
|
struct default_strategy<PointLike, Geometry, 0, TopDim2>
|
||
|
: detail::default_point_in_geometry_strategy<PointLike, Geometry>
|
||
|
{};
|
||
|
|
||
|
template <typename Geometry, typename PointLike, int TopDim1>
|
||
|
struct default_strategy<Geometry, PointLike, TopDim1, 0>
|
||
|
: detail::default_point_in_geometry_strategy<PointLike, Geometry>
|
||
|
{};
|
||
|
|
||
|
template <typename Geometry1, typename Geometry2>
|
||
|
struct default_strategy<Geometry1, Geometry2, 1, 1>
|
||
|
: detail::default_intersection_strategy<Geometry1>
|
||
|
{};
|
||
|
|
||
|
template <typename Geometry1, typename Geometry2>
|
||
|
struct default_strategy<Geometry1, Geometry2, 1, 2>
|
||
|
: detail::default_intersection_strategy<Geometry1>
|
||
|
{};
|
||
|
|
||
|
template <typename Geometry1, typename Geometry2>
|
||
|
struct default_strategy<Geometry1, Geometry2, 2, 1>
|
||
|
: detail::default_intersection_strategy<Geometry1>
|
||
|
{};
|
||
|
|
||
|
template <typename Geometry1, typename Geometry2>
|
||
|
struct default_strategy<Geometry1, Geometry2, 2, 2>
|
||
|
: detail::default_intersection_strategy<Geometry1>
|
||
|
{};
|
||
|
|
||
|
} // namespace services
|
||
|
#endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS
|
||
|
|
||
|
} // namespace relate
|
||
|
|
||
|
} // namespace strategy
|
||
|
|
||
|
|
||
|
}} // namespace boost::geometry
|
||
|
|
||
|
|
||
|
#endif // BOOST_GEOMETRY_STRATEGY_RELATE_HPP
|