libcarla/include/system/boost/geometry/strategy/relate.hpp

176 lines
4.5 KiB
C++
Raw Permalink Normal View History

2024-10-18 13:19:59 +08:00
// 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