// Copyright (c) 2007 Fernando Luis Cacciola Carballal. 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 // 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$ // SPDX-License-Identifier: GPL-3.0+ // // Author(s) : Fernando Cacciola #ifndef CGAL_STRAIGHT_SKELETON_DEBUG_H #define CGAL_STRAIGHT_SKELETON_DEBUG_H 1 #include #include #ifdef CGAL_USE_CORE # include #endif #if defined(CGAL_STRAIGHT_SKELETON_ENABLE_TRACE) \ || defined(CGAL_POLYGON_OFFSET_ENABLE_TRACE) \ || defined(CGAL_STRAIGHT_SKELETON_TRAITS_ENABLE_TRACE) \ || defined(CGAL_STRAIGHT_SKELETON_ENABLE_VALIDITY_TRACE) \ || defined(CGAL_STRAIGHT_SKELETON_ENABLE_INTRINSIC_TESTING) # # define CGAL_STSKEL_TRACE_ON # # include # include # include # include # define CGAL_STSKEL_TRACE(m) \ { \ std::ostringstream ss ; \ ss << m ; \ std::string s = ss.str(); \ Straight_skeleton_external_trace(s); \ } #include #include template inline std::string o2str( boost::optional const& o ) { std::ostringstream ss ; ss << std::setprecision(19) ; if ( o ) ss << *o ; else ss << "·NONE·" ; return ss.str(); } template inline std::string ptr2str( boost::intrusive_ptr const& ptr ) { std::ostringstream ss ; ss << std::setprecision(19) ; if ( ptr ) ss << *ptr ; else ss << "·NULL·" ; return ss.str(); } template inline std::string n2str( N const& n ) { std::ostringstream ss ; ss << std::setprecision(19) ; ss << CGAL_NTS to_double(n) ; return ss.str(); } #if 0 //CGAL_USE_CORE inline CORE::BigFloat to_big_float( CGAL::MP_Float const& n ) { return n.to_rational() ; } inline CORE::BigFloat to_big_float( CGAL::Quotient const& q ) { CORE::BigFloat n = to_big_float(q.numerator ()) ; CORE::BigFloat d = to_big_float(q.denominator()) ; if ( !d.isZeroIn()) return n / d ; else return CORE::BigFloat(std::numeric_limits::infinity()); } template inline CORE::BigFloat to_big_float( NT const& n ) { return CORE::BigFloat( CGAL_NTS to_double(n) ) ; } inline std::string n2str( CGAL::MP_Float const& n ) { std::ostringstream ss ; ss << to_big_float(n) ; return ss.str(); } inline std::string n2str( CGAL::Quotient< CGAL::MP_Float > const& n ) { std::ostringstream ss ; ss << to_big_float(n) ; return ss.str(); } #else inline std::string n2str( CGAL::MP_Float const& n ) { std::ostringstream ss ; ss << std::setprecision(19) ; ss << CGAL_NTS to_double(n) ; return ss.str(); } inline std::string n2str( CGAL::Quotient< CGAL::MP_Float > const& n ) { std::ostringstream ss ; ss << std::setprecision(19) ; ss << CGAL_NTS to_double(n) ; return ss.str(); } #endif template inline std::string xy2str( XY const& xy ) { std::ostringstream ss ; ss << "(" << n2str(xy.x()) << "," << n2str(xy.y()) << ")" ; return ss.str(); } template inline std::string dir2str( D const& d ) { std::ostringstream ss ; ss << "(" << n2str(d.dx()) << "," << n2str(d.dy()) << ")" ; return ss.str(); } template inline std::string p2str( P const& p ) { std::ostringstream ss ; ss << "(" << n2str(p.x()) << "," << n2str(p.y()) << ")" ; return ss.str(); } template inline std::string op2str( OP const& op ) { return op ? p2str(*op) : std::string("·NONE·"); } template inline std::string v2str( V const& v ) { std::ostringstream ss ; ss << std::setprecision(19) ; ss << "V" << v.id() << " " << p2str(v.point()) << " [" << v.time() << "]" ; return ss.str(); } template inline std::string vh2str( VH const& vh ) { VH null ; return vh != null ? v2str(*vh) : "NULL_VERTEX_HANDLE" ; } template inline std::string s2str( P const& s, P const& t ) { std::ostringstream ss ; ss << "{" << p2str(s) << "-" << p2str(t) << "}" ; return ss.str(); } template inline std::string s2str( S const& seg ) { return s2str(seg.source(),seg.target()); } template inline std::string e2str( E const& e ) { std::ostringstream ss ; ss << std::setprecision(19) ; if ( e.is_bisector() ) { ss << "B" << e.id() << "[E" << e.defining_contour_edge()->id() << ",E" << e.opposite()->defining_contour_edge()->id() << "]" << " (/" << ( e.slope() == CGAL::ZERO ? "·" : ( e.slope() == CGAL::NEGATIVE ? "-" : "+" ) ) << " " << e.opposite()->vertex()->time() << "->" << e.vertex()->time() << ")" ; } else { ss << "E" << e.id() ; } ss << " " << s2str(e.opposite()->vertex()->point(),e.vertex()->point()) ; return ss.str(); } template inline std::string eh2str( EH const& eh ) { EH null ; return eh != null ? e2str(*eh) : "NULL_HALFEDGE_HANDLE" ; } template inline std::string newb2str( char const* name, BH const& b ) { std::ostringstream ss ; ss << "New Bisector " << name << " is B" << b->id() << " [E" << b->defining_contour_edge()->id() << ",E" << b->opposite()->defining_contour_edge()->id() << "] {B" << b->prev()->id() << "->N" << b->prev()->vertex()->id() << "->B" << b->id() << "->N" << b->vertex()->id() << "->B" << b->next()->id() << "}" ; return ss.str(); } template inline std::string newn2str( char const* name, VH const& v, Triedge const& aTriedge ) { std::ostringstream ss ; ss << "New Node " << name <<" is N" << v->id() << " at " << v->point() << " [E" << aTriedge.e0()->id() << ",E" << aTriedge.e1()->id() << ",E" << aTriedge.e2()->id() << "] incident halfedge: B" << v->halfedge()->id() << " primary bisector: B" << v->primary_bisector()->id() ; return ss.str(); } #endif #ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE # define CGAL_STSKEL_DEBUG_CODE(code) code # define CGAL_STSKEL_BUILDER_TRACE(l,m) if ( l <= CGAL_STRAIGHT_SKELETON_ENABLE_TRACE ) CGAL_STSKEL_TRACE(m) # define CGAL_STSKEL_BUILDER_TRACE_IF(c,l,m) if ( (c) && l <= CGAL_STRAIGHT_SKELETON_ENABLE_TRACE ) CGAL_STSKEL_TRACE(m) #else # define CGAL_STSKEL_DEBUG_CODE(code) # define CGAL_STSKEL_BUILDER_TRACE(l,m) # define CGAL_STSKEL_BUILDER_TRACE_IF(c,l,m) #endif #ifdef CGAL_POLYGON_OFFSET_ENABLE_TRACE # define CGAL_POLYOFFSET_DEBUG_CODE(code) code # define CGAL_POLYOFFSET_TRACE(l,m) if ( l <= CGAL_POLYGON_OFFSET_ENABLE_TRACE ) CGAL_STSKEL_TRACE(m) #else # define CGAL_POLYOFFSET_DEBUG_CODE(code) # define CGAL_POLYOFFSET_TRACE(l,m) #endif #ifdef CGAL_STRAIGHT_SKELETON_TRAITS_ENABLE_TRACE bool sEnableTraitsTrace = false ; # define CGAL_STSKEL_TRAITS_ENABLE_TRACE sEnableTraitsTrace = true ; # define CGAL_STSKEL_TRAITS_ENABLE_TRACE_IF(cond) if ((cond)) sEnableTraitsTrace = true ; # define CGAL_STSKEL_TRAITS_DISABLE_TRACE sEnableTraitsTrace = false; # define CGAL_STSKEL_TRAITS_TRACE(m) \ if ( sEnableTraitsTrace ) \ { \ std::ostringstream ss ; \ ss << m ; \ std::string s = ss.str(); \ Straight_skeleton_traits_external_trace(s); \ } #else # define CGAL_STSKEL_TRAITS_ENABLE_TRACE # define CGAL_STSKEL_TRAITS_ENABLE_TRACE_IF(cond) # define CGAL_STSKEL_TRAITS_DISABLE_TRACE # define CGAL_STSKEL_TRAITS_TRACE(m) #endif #ifdef CGAL_STRAIGHT_SKELETON_ENABLE_VALIDITY_TRACE # define CGAL_STSKEL_VALIDITY_TRACE(m) CGAL_STSKEL_TRACE(m) # define CGAL_STSKEL_VALIDITY_TRACE_IF(cond,m) if ( cond ) CGAL_STSKEL_VALIDITY_TRACE(m) #else # define CGAL_STSKEL_VALIDITY_TRACE(m) # define CGAL_STSKEL_VALIDITY_TRACE_IF(cond,m) #endif #ifdef CGAL_STRAIGHT_SKELETON_PROFILING_ENABLED // Reserved use. DO NOT define this macro switch # include # include # include namespace CGAL { namespace CGAL_STRAIGHT_SKELETON_i_profiling { template char const* kernel_type() { return typeid(NT).name() ; } template<> char const* kernel_type () { return "double" ; } template<> char const* kernel_type() { return "Interval" ; } template<> char const* kernel_type< Quotient >() { return "MP_Float" ; } template<> char const* kernel_type () { return "Expr" ; } } // CGAL_STRAIGHT_SKELETON_i_profiling } // end namespace CGAL #define CGAL_STSKEL_ASSERT_PREDICATE_RESULT(expr,K,pred,error) \ { \ std::ostringstream predss ; \ predss << CGAL_STRAIGHT_SKELETON_i_profiling::kernel_type< typename K::FT >() << " . " << pred ; \ std::string preds = predss.str(); \ if ( ! is_certain((expr)) ) \ { \ std::ostringstream errss ; errss << error ; std::string errs = errss.str(); \ register_predicate_failure(preds,errs); \ } \ else register_predicate_success(preds); \ } #define CGAL_STSKEL_ASSERT_CONSTRUCTION_RESULT(expr,K,cons,error) \ { \ std::ostringstream consss ; \ consss << CGAL_STRAIGHT_SKELETON_i_profiling::kernel_type< typename K::FT >() << " . " << cons ; \ std::string conss = consss.str(); \ if ( !(expr) ) \ { \ std::ostringstream errss ; errss << error ; std::string errs = errss.str(); \ register_construction_failure(conss,errs); \ } \ else register_construction_success(conss); \ } #else #define CGAL_STSKEL_ASSERT_PREDICATE_RESULT(expr,K,pred,error) #define CGAL_STSKEL_ASSERT_CONSTRUCTION_RESULT(expr,K,cons,error) #endif #undef CGAL_STSKEL_ENABLE_TRACE #endif // CGAL_STRAIGHT_SKELETON_DEBUG_H // // EOF //