diff --git a/.gitattributes b/.gitattributes index f092cac99e1..c8eeab96823 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,6 +8,10 @@ Algebraic_foundations/doc_tex/Algebraic_foundations/fractions.tex -text Algebraic_foundations/doc_tex/Algebraic_foundations/interoperability.tex -text Algebraic_foundations/doc_tex/Algebraic_foundations/real_embeddable.tex -text Algebraic_foundations/doc_tex/Algebraic_foundations_ref/Fraction.tex -text +Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp -text +Algebraic_foundations/examples/Algebraic_foundations/implicit_interoperable_dispatch.cpp -text +Algebraic_foundations/examples/Algebraic_foundations/integralize.cpp -text +Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp -text Algebraic_kernel_GBRS/config/support/S25-MPFI -text Algebraic_kernel_GBRS/config/support/S27-RS -text Algebraic_kernel_GBRS/include/CGAL/Arr_poly_traits_1.h -text diff --git a/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp b/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp new file mode 100644 index 00000000000..4a884422dfb --- /dev/null +++ b/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp @@ -0,0 +1,34 @@ +//file: examples/Algebraic_foundations/fraction_traits.cpp + +#include +#include + +#ifdef CGAL_USE_GMP +#include +#include +int main(){ + typedef CGAL::Fraction_traits FT; + typedef FT::Numerator_type Numerator_type; + typedef FT::Denominator_type Denominator_type; + + BOOST_STATIC_ASSERT((boost::is_same::value)); + BOOST_STATIC_ASSERT((boost::is_same::value)); + + Numerator_type numerator; + Denominator_type denominator; + CGAL::Gmpq fraction(4,5); + FT::Decompose()(fraction,numerator,denominator); + + CGAL::set_pretty_mode(std::cout); + std::cout << "decompose fraction: "<< std::endl; + std::cout << "fraction : " << fraction << std::endl; + std::cout << "numerator : " << numerator<< std::endl; + std::cout << "denominator: " << denominator << std::endl; + + std::cout << "re-compose fraction: "<< std::endl; + fraction = FT::Compose()(numerator,denominator); + std::cout << "fraction : " << fraction << std::endl; +} +#else +int main(){ std::cout << "This examples needs GMP" << std::endl; } +#endif diff --git a/Algebraic_foundations/examples/Algebraic_foundations/implicit_interoperable_dispatch.cpp b/Algebraic_foundations/examples/Algebraic_foundations/implicit_interoperable_dispatch.cpp new file mode 100644 index 00000000000..ce752114518 --- /dev/null +++ b/Algebraic_foundations/examples/Algebraic_foundations/implicit_interoperable_dispatch.cpp @@ -0,0 +1,48 @@ +//file: examples/Algebraic_foundations/implicit_interoperable_dispatch.cpp + +#include +#include +#include +#include + +// this is the implementation for ExplicitInteroperable types +template +typename CGAL::Coercion_traits::Type +binary_function_(const A& a , const B& b, CGAL::Tag_false){ + std::cout << "Call for ExplicitInteroperable types: " << std::endl; + typedef CGAL::Coercion_traits CT; + typename CT::Cast cast; + return cast(a)*cast(b); +} + +// this is the implementation for ImplicitInteroperable types +template +typename CGAL::Coercion_traits::Type +binary_function_(const A& a , const B& b, CGAL::Tag_true){ + std::cout << "Call for ImpicitInteroperable types: " << std::endl; + return a*b; +} + +// this function selects the correct implementation +template +typename CGAL::Coercion_traits::Type +binary_function(const A& a , const B& b){ + typedef CGAL::Coercion_traits CT; + typedef typename CT::Are_implicit_interoperable Are_implicit_interoperable; + return binary_function_(a,b,Are_implicit_interoperable()); +} + +int main(){ + CGAL::set_pretty_mode(std::cout); + + // Function call for ImplicitInteroperable types + std::cout<< binary_function(double(3), int(5)) << std::endl; + + // Function call for ExplicitInteroperable types + CGAL::Quotient rational(1,3); // == 1/3 + CGAL::Sqrt_extension extension(1,2,3); // == 1+2*sqrt(3) + CGAL::Sqrt_extension,int> result = binary_function(rational, extension); + std::cout<< result << std::endl; + + return 0; +} diff --git a/Algebraic_foundations/examples/Algebraic_foundations/integralize.cpp b/Algebraic_foundations/examples/Algebraic_foundations/integralize.cpp new file mode 100644 index 00000000000..2e5d24c3e58 --- /dev/null +++ b/Algebraic_foundations/examples/Algebraic_foundations/integralize.cpp @@ -0,0 +1,65 @@ +//file: examples/Algebraic_foundations/integralize.cpp + +#include +#include +#include + +template +std::vector::Numerator_type > +integralize( + const std::vector& vec, + typename CGAL::Fraction_traits::Denominator_type& d +) { + typedef CGAL::Fraction_traits FT; + typedef typename FT::Numerator_type Numerator_type; + typedef typename FT::Denominator_type Denominator_type; + typename FT::Decompose decompose; + + std::vector num(vec.size()); + std::vector den(vec.size()); + + // decompose each coefficient into integral part and denominator + for (unsigned int i = 0; i < vec.size(); i++) { + decompose(vec[i], num[i], den[i]); + } + + // compute 'least' common multiple of all denominator + // We would like to use gcd, so let's think of Common_factor as gcd. + typename FT::Common_factor gcd; + d = 1; + for (unsigned int i = 0; i < vec.size(); i++) { + d *= CGAL::integral_division(den[i], gcd(d, den[i])); + } + + // expand each (numerator, denominator) pair to common denominator + for (unsigned int i = 0; i < vec.size(); i++) { + // For simplicity ImplicitInteroperability is expected in this example + num[i] *= CGAL::integral_division(d, den[i]); + } + return num; +} + +#ifdef CGAL_USE_GMP + +#include +#include + +int main(){ + std::vector vec(3); + vec[0]=CGAL::Gmpq(1,4); + vec[1]=CGAL::Gmpq(1,6); + vec[2]=CGAL::Gmpq(1,10); + std::cout<< "compute an integralized vector" << std::endl; + std::cout<<"input vector: [" + << vec[0] << "," << vec[1] << "," << vec[2] << "]" << std::endl; + CGAL::Gmpz d; + std::vector integral_vec = integralize(vec,d); + std::cout<<"output vector: [" + << integral_vec[0] << "," + << integral_vec[1] << "," + << integral_vec[2] << "]" << std::endl; + std::cout<<"denominator : "<< d < +#include + +// this is an implementation for ExplicitInteroperable types +// the result type is determined via Coercion_traits +template +typename CGAL::Coercion_traits::Type +binary_function(const A& a , const B& b){ + typedef CGAL::Coercion_traits CT; + + // check for explicit interoperability + BOOST_STATIC_ASSERT((CT::Are_explicit_interoperable::value)); + + // CT::Cast is used to to convert both types into the coercion type + typename CT::Cast cast; + // all operations are performed in the coercion type + return cast(a)*cast(b); +} + +int main(){ + // Function call for the interoperable types + std::cout<< binary_function(double(3), int(5)) << std::endl; + // Note that Coercion_traits is symmetric + std::cout<< binary_function(int(3), double(5)) << std::endl; + return 0; +}