// Copyright (c) 2013 GeometryFactory (France). All rights reserved. // All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // $URL$ // $Id$ // // // Author(s) : Philipp Möller and Sebastien Loriot #ifndef CGAL_CIRCULAR_KERNEL_2_INTERSECTION_TRAITS_H #define CGAL_CIRCULAR_KERNEL_2_INTERSECTION_TRAITS_H //this include is needed to know the value of CGAL_INTERSECTION_VERSION #include #if !(CGAL_INTERSECTION_VERSION < 2) #include namespace CGAL { template struct CK2_Intersection_traits {}; // Intersection_traits for the circular kernel template struct CK2_Intersection_traits { typedef typename boost::variant< typename CK::Circle_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits { typedef typename boost::variant< typename CK::Circular_arc_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits { typedef typename boost::variant< typename CK::Line_arc_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits { typedef typename boost::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits : public CK2_Intersection_traits {}; template struct CK2_Intersection_traits { typedef typename boost::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits : public CK2_Intersection_traits {}; template struct CK2_Intersection_traits { typedef typename boost::variant< typename CK::Line_arc_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits : public CK2_Intersection_traits {}; template struct CK2_Intersection_traits { typedef typename boost::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits : public CK2_Intersection_traits {}; // Circular_arc_2 Circle_2 simply aliases template struct CK2_Intersection_traits : public CK2_Intersection_traits {}; template struct CK2_Intersection_traits : public CK2_Intersection_traits {}; // !!! undocumented !!! // // Line_2 Circle_2 template struct CK2_Intersection_traits { typedef typename boost::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > > type; }; template struct CK2_Intersection_traits : public CK2_Intersection_traits {}; } //end of namespace CGAL #else #include template struct CK2_Intersection_traits { typedef CGAL::Object type; }; #endif namespace CGAL{ namespace internal{ // this function is used to call either make_object or a // CK2_Intersection_traits::result_type constructor to create return // values. The Object version takes some dummy template arguments // that are needed for the return of the Intersection_traits. In // theory a one parameter variant could be returned, but this // _could_ come with conversion overhead and so we rather go for // the real type. // Overloads for empty returns are also provided. #if CGAL_INTERSECTION_VERSION < 2 #if defined(CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE) template inline CGAL::Object ck2_intersection_return(const T& t) { return CGAL::make_object(t); } #else template inline CGAL::Object ck2_intersection_return(T&& t) { return CGAL::make_object(std::forward(t)); } #endif // CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE template inline CGAL::Object ck2_intersection_return() { return CGAL::Object(); } #else #if defined(CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE) template inline RT ck2_intersection_return(const T& t) { return RT(t); } #else template inline RT ck2_intersection_return(T&& t) { return RT(std::forward(t)); } #endif // CGAL_CFG_NO_CPP0X_RVALUE_REFERENCE template inline RT ck2_intersection_return() { return RT(); } #endif // CGAL_INTERSECTION_VERSION < 2 } } //end of namespace CGAL::internal #endif // CGAL_CIRCULAR_KERNEL_2_INTERSECTION_TRAITS_H