dust3d/thirdparty/cgal/CGAL-5.1/include/CGAL/Kernel_d/function_objects.h

155 lines
4.2 KiB
C++

// Copyright (c) 1999
// Utrecht University (The Netherlands),
// ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France),
// Max-Planck-Institute Saarbruecken (Germany),
// and Tel-Aviv University (Israel). All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL: https://github.com/CGAL/cgal/blob/v5.1/Kernel_d/include/CGAL/Kernel_d/function_objects.h $
// $Id: function_objects.h 8bb22d5 2020-03-26T14:23:37+01:00 Sébastien Loriot
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Stefan Schirra
#ifndef CGAL_KERNEL_D_FUNCTION_OBJECTS_H
#define CGAL_KERNEL_D_FUNCTION_OBJECTS_H
#include <CGAL/intersections_d.h>
// These functors come from the 2D-3D kernels.
// Since they have changed there, they now need to be copied here.
namespace CGAL {
namespace internal {
template <class ToBeConstructed>
class Construct
{
public:
typedef ToBeConstructed result_type;
template <class ... A>
ToBeConstructed
operator()( A&& ... a) const
{ return ToBeConstructed(std::forward<A>(a)...); }
};
class Call_has_on_positive_side
{
public:
typedef bool result_type;
template <class Cls, class Arg>
bool
operator()( const Cls& c, const Arg& a) const
{ return c.has_on_positive_side(a); }
};
class Call_oriented_side
{
public:
typedef Oriented_side result_type;
template <class Cls, class Arg>
Oriented_side
operator()( const Cls& c, const Arg& a) const
{ return c.oriented_side(a); }
};
template<class R>
class Intersect
{
private:
typedef typename R::Line_d Line_d;
typedef typename R::Point_d Point_d;
typedef typename R::Segment_d Segment_d;
typedef typename R::Ray_d Ray_d;
typedef typename R::Hyperplane_d Hyperplane_d;
public:
template <typename>
struct result;
template <typename F>
struct result<F(Line_d, Line_d)>
{ typedef boost::optional< boost::variant< Point_d, Line_d > > type; };
template <typename F>
struct result<F(Segment_d, Line_d)>
{ typedef boost::optional< boost::variant< Point_d, Segment_d > > type; };
template <typename F>
struct result<F(Line_d, Segment_d)> : result<F(Segment_d, Line_d)>
{ };
template <typename F>
struct result<F(Segment_d, Segment_d)>
{ typedef boost::optional< boost::variant< Point_d, Segment_d > > type; };
template <typename F>
struct result<F(Ray_d, Line_d)>
{ typedef boost::optional< boost::variant< Point_d, Ray_d > > type; };
template <typename F>
struct result<F(Line_d, Ray_d)> : result<F(Ray_d, Line_d)>
{ };
template <typename F>
struct result<F(Ray_d, Segment_d)>
{ typedef boost::optional< boost::variant< Point_d, Segment_d > > type; };
template <typename F>
struct result<F(Segment_d, Ray_d)> : result<F(Ray_d, Segment_d)>
{ };
template <typename F>
struct result<F(Ray_d, Ray_d)>
{ typedef boost::optional< boost::variant< Point_d, Segment_d, Ray_d > > type; };
template <typename F>
struct result<F(Hyperplane_d, Line_d)>
{ typedef boost::optional< boost::variant< Point_d, Line_d > > type; };
template <typename F>
struct result<F(Line_d, Hyperplane_d)> : result<F(Hyperplane_d, Line_d)>
{ };
template <typename F>
struct result<F(Hyperplane_d, Ray_d)>
{ typedef boost::optional< boost::variant< Point_d, Ray_d > > type; };
template <typename F>
struct result<F(Ray_d, Hyperplane_d)> : result<F(Hyperplane_d, Ray_d)>
{ };
template <typename F>
struct result<F(Hyperplane_d, Segment_d)>
{ typedef boost::optional< boost::variant< Point_d, Segment_d > > type; };
template <typename F>
struct result<F(Segment_d, Hyperplane_d)> : result<F(Hyperplane_d, Segment_d)>
{ };
template <class T1, class T2>
typename result<Intersect(T1,T2)>::type
operator()(const T1& t1, const T2& t2) const
{ return Intersections::internal::intersection(t1, t2, R()); }
};
template<class R>
class Do_intersect
{
public:
typedef bool result_type;
template <class T1, class T2>
bool
operator()(const T1& t1, const T2& t2) const
{ return CGAL::Intersections::internal::do_intersect(t1, t2, R()); }
};
} // end namespace internal
} //namespace CGAL
#endif // CGAL_KERNEL_D_FUNCTION_OBJECTS_H