From 9a6fa39923e407f55f205c9f35e86b066d591ba9 Mon Sep 17 00:00:00 2001 From: Sebastian Limbach Date: Thu, 15 Mar 2007 13:04:32 +0000 Subject: [PATCH] New file for construct_binary functions, containing the new general function. --- .gitattributes | 1 + .../Algebraic_kernel_d/construct_binary.h | 132 ++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/construct_binary.h diff --git a/.gitattributes b/.gitattributes index 732d741e08b..13a1d93c124 100644 --- a/.gitattributes +++ b/.gitattributes @@ -27,6 +27,7 @@ Algebraic_kernel_GBRS/test/Gbrs_polynomial/parsers.h -text Algebraic_kernel_d/doc_tex/Algebraic_kernel_d_ref/figures/cpvl.eps -text svneol=unset#application/postscript Algebraic_kernel_d/doc_tex/Algebraic_kernel_d_ref/figures/cpvl.fig -text svneol=unset#application/octet-stream Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Descartes.h -text +Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/construct_binary.h -text Algebraic_kernel_d/test/Algebraic_kernel_d/Descartes.cpp -text Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_root_isolator.h -text Alpha_shapes_2/demo/Alpha_shapes_2/alpha_shapes_2.vcproj eol=crlf diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/construct_binary.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/construct_binary.h new file mode 100644 index 00000000000..c59e24a235f --- /dev/null +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/construct_binary.h @@ -0,0 +1,132 @@ +// TODO: Add licence +// +// 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: $ +// +// +// Author(s) : +// +// ============================================================================ + +#ifndef CGAL_ALGEBRAIC_KERNEL_D_CONSTRUCT_BINARY_H +#define CGAL_ALGEBRAIC_KERNEL_D_CONSTRUCT_BINARY_H + +#include +#include + +#ifdef CGAL_USE_LEDA +#include +#include +#endif +#ifdef CGAL_USE_CORE +#include +#include +#endif + +#include + +CGAL_BEGIN_NAMESPACE + +namespace CGALi { + +// Generic construct_binary function, using ipower +template< class Integer > +inline void construct_binary( const Integer& e, Integer& x ) { + CGAL_precondition( e >= 0 ); + Integer exponent(e); + x = Integer(1); + + const Integer max_ipower = (exponent > Integer(std::numeric_limits::max())) ? + INTERN_POLYNOMIAL::ipower( Integer(2), std::numeric_limits::max() ) : + Integer(0); + + while( exponent > Integer(std::numeric_limits::max()) ) { + x *= max_ipower; + exponent -= Integer(std::numeric_limits::max()); + } + + x *= INTERN_POLYNOMIAL::ipower( Integer(2), (int)CGAL::to_double(exponent) ); +} + +template< class Integer, class Rational > +inline void construct_binary( const Integer& m, const Integer& e, Rational& x ) { + Integer den(1), num; + if(e>0) { + construct_binary( e, num ); + num *= m; + } + else { + num = m; + construct_binary( -e, den ); + } + x = Rational(num, den); +} + +// Specialization for LEDA + +#ifdef CGAL_USE_LEDA + + // Constructs 2^e from an integer e. Needed in Descartes + inline void construct_binary(const ::leda::integer& e, ::leda::integer& x) { + typedef ::leda::integer Integer; + x = Integer(1) << e.to_long(); + } + + // Constructs m*2^e from two integers m,e. Needed in Descartes + inline void construct_binary(const ::leda::integer& m, const ::leda::integer& e, + ::leda::rational& x) { + + typedef ::leda::integer Integer; + typedef ::leda::rational Rational; + + Integer den(1); + Integer num(m); + if(e>0) { + num <<= e.to_long(); + } + else { + den <<= (-e).to_long(); + } + x = Rational(num, den); + } + +#endif // CGAL_USE_LEDA + +// Specialization for CORE + +#ifdef CGAL_USE_CORE + + // Constructs 2^e from an integer e. Needed in Descartes + inline void construct_binary(const ::CORE::BigInt& e, ::CORE::BigInt& x) { + typedef ::CORE::BigInt Integer; + x = Integer(1) << ::CORE::ulongValue(e); + } + + // Constructs m*2^e from two integers m,e. Needed in Descardes + inline void construct_binary(const ::CORE::BigInt& m, const ::CORE::BigInt& e, + ::CORE::BigRat& x) { + typedef ::CORE::BigInt Integer; + typedef ::CORE::BigRat Rational; + + Integer den(1); + Integer num(m); + if(e>0) { + num <<= ::CORE::ulongValue(e); + } + else { + den <<= ::CORE::ulongValue(-e); + } + x = Rational(num, den); + } + +#endif // CGAL_USE_CORE + +} // namespace CGALi + +CGAL_END_NAMESPACE + + +#endif // CGAL_ALGEBRAIC_KERNEL_D_CONSTRUCT_BINARY_H