From 8e7bed8e6de6f0b3313c4ca13401c54ab313ca0b Mon Sep 17 00:00:00 2001 From: Michael Hemmer Date: Wed, 15 Oct 2008 08:38:34 +0000 Subject: [PATCH] added PT::Construct_cofficient_const_iterator_range added PT::Construct_innermost_coefficient_const_iterator_range rm according functors _begin/_end --- .../CGAL/Polynomial/modular_gcd_utcf_dfai.h | 5 +- .../CGAL/Polynomial/square_free_factorize.h | 13 ++-- Polynomial/include/CGAL/Polynomial_traits_d.h | 70 ++++++++++--------- .../test/Polynomial/Polynomial_traits_d.cpp | 45 ++++++------ 4 files changed, 70 insertions(+), 63 deletions(-) diff --git a/Polynomial/include/CGAL/Polynomial/modular_gcd_utcf_dfai.h b/Polynomial/include/CGAL/Polynomial/modular_gcd_utcf_dfai.h index 542f28d5cbc..9896cf10bcb 100644 --- a/Polynomial/include/CGAL/Polynomial/modular_gcd_utcf_dfai.h +++ b/Polynomial/include/CGAL/Polynomial/modular_gcd_utcf_dfai.h @@ -79,8 +79,7 @@ Polynomial modular_gcd_utcf_dfai( typedef typename PT::Innermost_coefficient_type IC; typename Coercion_traits::Cast ictp; - typename PT::Innermost_coefficient_const_begin begin; - typename PT::Innermost_coefficient_const_end end; + typename PT::Construct_innermost_coefficient_const_iterator_range range; typename PT::Innermost_leading_coefficient ilcoeff; typedef Algebraic_extension_traits ANT; @@ -131,7 +130,7 @@ Polynomial modular_gcd_utcf_dfai( IC denom; { Poly tmp = F1+F2; - denom = dfai(begin(tmp),end(tmp)); + denom = dfai(range(tmp).first, range(tmp).second); } denom *= nfac(denom); diff --git a/Polynomial/include/CGAL/Polynomial/square_free_factorize.h b/Polynomial/include/CGAL/Polynomial/square_free_factorize.h index ae27b1e0240..68bd65ae112 100644 --- a/Polynomial/include/CGAL/Polynomial/square_free_factorize.h +++ b/Polynomial/include/CGAL/Polynomial/square_free_factorize.h @@ -156,11 +156,10 @@ inline int square_free_factorize_for_regular_polynomial_ typedef Polynomial POLY; typedef Polynomial_traits_d PT; - typedef typename Polynomial_traits_d::Innermost_coefficient_type IC; - typename Polynomial_traits_d::Innermost_leading_coefficient ilcoeff; - //typename Polynomial_traits_d::Innermost_coefficient_to_polynomial ictp; - typename Polynomial_traits_d::Innermost_coefficient_const_begin begin; - typename Polynomial_traits_d::Innermost_coefficient_const_end end; + typedef typename PT::Innermost_coefficient_type IC; + typename PT::Innermost_leading_coefficient ilcoeff; + //typename PT::Innermost_coefficient_to_polynomial ictp; + typename PT::Construct_innermost_coefficient_const_iterator_range range; typename Algebraic_extension_traits::Denominator_for_algebraic_integers dfai; typename Algebraic_extension_traits::Normalization_factor nfac; typename Scalar_factor_traits::Scalar_factor sfac; @@ -186,7 +185,7 @@ inline int square_free_factorize_for_regular_polynomial_ // integers, which comes out from c=gcd(a,b), such that a and b are // divisible by c IC lcoeff = ilcoeff(c); - IC denom = dfai(begin(c), end(c)); + IC denom = dfai(range(c).first, range(c).second); lcoeff *= denom * nfac(denom); POLY w = (a * POLY(lcoeff)) / c; POLY y = (b * POLY(lcoeff)) / c; @@ -209,7 +208,7 @@ inline int square_free_factorize_for_regular_polynomial_ } i++; lcoeff = ilcoeff(g); // same as above - denom =dfai(begin(c), end(c)); + denom =dfai(range(c).first, range(c).second); lcoeff *= denom * nfac(denom); w = (w * POLY(lcoeff)) / g; y = (z * POLY(lcoeff)) / g; diff --git a/Polynomial/include/CGAL/Polynomial_traits_d.h b/Polynomial/include/CGAL/Polynomial_traits_d.h index 1a7d66b537d..7deed679c58 100644 --- a/Polynomial/include/CGAL/Polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Polynomial_traits_d.h @@ -54,7 +54,16 @@ Innermost_coefficient_const_iterator; \ \ typedef typename Polynomial_d::const_iterator \ - Coefficient_const_iterator; + Coefficient_const_iterator; \ + \ + typedef std::pair \ + Innermost_coefficient_const_iterator_range; \ + \ + typedef std::pair \ + Coefficient_const_iterator_range; \ + CGAL_BEGIN_NAMESPACE; @@ -98,9 +107,8 @@ public: operator()(const Polynomial_d& p) const { typedef Innermost_coefficient_const_iterator IT; Innermost_coefficient_type content(0); - for (IT it = typename PT::Innermost_coefficient_const_begin()(p); - it != typename PT::Innermost_coefficient_const_end()(p); - it++){ + typename PT::Construct_innermost_coefficient_const_iterator_range range; + for (IT it = range(p).first; it != range(p).second; it++){ content = CGAL::gcd(content, *it); if(CGAL::is_one(content)) break; } @@ -437,6 +445,14 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, typedef typename Coefficient_const_flattening::Recursive_flattening_iterator Innermost_coefficient_const_iterator; typedef typename Polynomial_d::const_iterator Coefficient_const_iterator; + + typedef std::pair + Innermost_coefficient_const_iterator_range; + + typedef std::pair + Coefficient_const_iterator_range; // We use our own Strict Weak Ordering predicate in order to avoid @@ -966,35 +982,26 @@ public: typedef typename ::boost::mpl::if_::type Compare; - - // This is going to be in PolynomialToolBox - struct Coefficient_const_begin - : public std::unary_function< Polynomial_d, Coefficient_const_iterator > { - Coefficient_const_iterator - operator () (const Polynomial_d& p) { return p.begin(); } - }; - struct Coefficient_const_end - : public std::unary_function< Polynomial_d, Coefficient_const_iterator > { - Coefficient_const_iterator - operator () (const Polynomial_d& p) { return p.end(); } - }; - - struct Innermost_coefficient_const_begin - : public std::unary_function< Polynomial_d, Innermost_coefficient_const_iterator > { - Innermost_coefficient_const_iterator +struct Construct_coefficient_const_iterator_range + : public std::unary_function< Polynomial_d, + Coefficient_const_iterator_range> { + Coefficient_const_iterator_range operator () (const Polynomial_d& p) { - return typename Coefficient_const_flattening::Flatten()(p.end(),p.begin()); + return make_pair( p.begin(), p.end() ); + } +}; + + struct Construct_innermost_coefficient_const_iterator_range + : public std::unary_function< Polynomial_d, + Innermost_coefficient_const_iterator_range> { + Innermost_coefficient_const_iterator_range + operator () (const Polynomial_d& p) { + return make_pair( + typename Coefficient_const_flattening::Flatten()(p.end(),p.begin()), + typename Coefficient_const_flattening::Flatten()(p.end(),p.end())); } }; - struct Innermost_coefficient_const_end - : public std::unary_function< Polynomial_d, Innermost_coefficient_const_iterator > { - Innermost_coefficient_const_iterator - operator () (const Polynomial_d& p) { - return typename Coefficient_const_flattening::Flatten()(p.end(),p.end()); - } - }; - struct Is_square_free : public std::unary_function< Polynomial_d, bool >{ bool operator()( const Polynomial_d& p ) const { @@ -1101,8 +1108,7 @@ public: typename PT::Construct_polynomial construct; typename PT::Innermost_leading_coefficient ilcoeff; - typename PT::Innermost_coefficient_const_begin begin; - typename PT::Innermost_coefficient_const_end end; + typename PT::Construct_innermost_coefficient_const_iterator_range range; typedef Algebraic_extension_traits AET; typename AET::Denominator_for_algebraic_integers dfai; typename AET::Normalization_factor nfac; @@ -1110,7 +1116,7 @@ public: IC ilcoeff_q = ilcoeff(q); // this factor is needed in case IC is an Algebraic extension - IC dfai_q = dfai(begin(q), end(q)); + IC dfai_q = dfai(range(q).first, range(q).second); // make dfai_q a 'scalar' ilcoeff_q *= dfai_q * nfac(dfai_q); diff --git a/Polynomial/test/Polynomial/Polynomial_traits_d.cpp b/Polynomial/test/Polynomial/Polynomial_traits_d.cpp index cc126ee87f2..98495427ab7 100644 --- a/Polynomial/test/Polynomial/Polynomial_traits_d.cpp +++ b/Polynomial/test/Polynomial/Polynomial_traits_d.cpp @@ -1507,19 +1507,19 @@ void test_coefficient_const_iterator(const PT&) { typedef typename PT::Coefficient_type Coefficient; typedef typename PT::Coefficient_const_iterator CCIterator; - typename PT::Coefficient_const_begin begin; - typename PT::Coefficient_const_end end; + typename PT::Construct_coefficient_const_iterator_range coeff_range; typename PT::Degree degree; typename PT::Get_coefficient coeff; Polynomial_d p = generate_sparse_random_polynomial(); - - CCIterator it = begin(p); + + + CCIterator it = coeff_range(p).first; for(int i = 0; i <= degree(p); i++){ assert(*it == coeff(p,i)); it++; } - assert(end(p) == it); + assert(coeff_range(p).second == it); } @@ -1556,25 +1556,28 @@ void test_innermost_coefficient_const_iterator(const PT&) { Polynomial_3 r(q1, q2, q3); int i; - typename PT_1::Innermost_coefficient_const_iterator it1; (void) it1; - typename PT_1::Innermost_coefficient_const_begin begin1; (void) begin1; - typename PT_1::Innermost_coefficient_const_end end1; (void) end1; - typename PT_2::Innermost_coefficient_const_iterator it2; (void) it2; - typename PT_2::Innermost_coefficient_const_begin begin2; (void) begin2; - typename PT_2::Innermost_coefficient_const_end end2; (void) end2; - typename PT_3::Innermost_coefficient_const_iterator it3; (void) it3; - typename PT_3::Innermost_coefficient_const_begin begin3; (void) begin3; - typename PT_3::Innermost_coefficient_const_end end3; (void) end3; - for (i = 1, it1 = begin1(p1); i <= 3; ++i, ++it1) + + typename PT_1::Innermost_coefficient_const_iterator it1; (void) it1; + typename PT_1::Construct_innermost_coefficient_const_iterator_range range1; + typename PT_2::Innermost_coefficient_const_iterator it2; (void) it2; + typename PT_2::Construct_innermost_coefficient_const_iterator_range range2; + typename PT_3::Innermost_coefficient_const_iterator it3; (void) it3; + typename PT_3::Construct_innermost_coefficient_const_iterator_range range3; + + (void) range1; + (void) range2; + (void) range3; + + for (i = 1, it1 = (range1(p1).first); i <= 3; ++i, ++it1) assert(*it1 == i); - assert(it1 == end1(p1)); - for (i = 1, it2 = begin2(q1); i <= 9; ++i, ++it2) + assert(it1 == range1(p1).second); + for (i = 1, it2 = range2(q1).first; i <= 9; ++i, ++it2) assert(*it2 == i); - assert(it2 == end2(q1)); - for (i = 1, it3 = begin3(r); i <= 27; ++i, ++it3) + assert(it2 == range2(q1).second); + for (i = 1, it3 = range3(r).first; i <= 27; ++i, ++it3) assert(*it3 == i); - assert(it3 == end3(r)); + assert(it3 == range3(r).second); } @@ -1774,7 +1777,7 @@ int main(){ #ifdef CGAL_USE_CORE { typedef CGAL::CORE_arithmetic_kernel AT; - test_AT(); + //test_AT(); } #endif