Remove some useless enum_cast<>.

Optimize some sign(a*b) to sign(a)*sign(b).
This commit is contained in:
Sylvain Pion 2008-03-20 16:28:35 +00:00
parent edab7e2433
commit c825d8c774
2 changed files with 38 additions and 46 deletions

View File

@ -576,7 +576,7 @@ namespace HomogeneousKernelFunctors {
if ( 0 < y_sign1 * y_sign2 ) if ( 0 < y_sign1 * y_sign2 )
{ {
return enum_cast<Comparison_result>(orientation(origin, p2, p1)); return orientation(origin, p2, p1);
// Precondition on the enums: // Precondition on the enums:
// COUNTERCLOCKWISE == LARGER ( == 1 ) // COUNTERCLOCKWISE == LARGER ( == 1 )
@ -647,7 +647,7 @@ namespace HomogeneousKernelFunctors {
- 2 * rhw * ( phx*rhx + phy*rhy ) - 2 * rhw * ( phx*rhx + phy*rhy )
); );
return enum_cast<Comparison_result>(CGAL_NTS sign(dosd)); return CGAL_NTS sign(dosd);
} }
}; };
@ -702,7 +702,7 @@ namespace HomogeneousKernelFunctors {
- 2 * rhw * ( phx*rhx + phy*rhy + phz*rhz ) - 2 * rhw * ( phx*rhx + phy*rhy + phz*rhz )
); );
return enum_cast<Comparison_result>(CGAL_NTS sign(dosd)); return CGAL_NTS sign(dosd);
} }
}; };
@ -737,10 +737,10 @@ namespace HomogeneousKernelFunctors {
typedef typename K::RT RT; typedef typename K::RT RT;
if (l1.is_horizontal()) if (l1.is_horizontal())
return l2.is_vertical() ? return l2.is_vertical() ?
SMALLER : enum_cast<Comparison_result>(CGAL_NTS sign(l2.a() * l2.b())); SMALLER : CGAL_NTS sign(l2.a()) * CGAL_NTS sign(l2.b());
if (l2.is_horizontal()) if (l2.is_horizontal())
return l1.is_vertical() ? return l1.is_vertical() ?
LARGER : enum_cast<Comparison_result>(- CGAL_NTS sign(l1.a() * l1.b())); LARGER : - CGAL_NTS sign(l1.a()) * CGAL_NTS sign(l1.b());
if (l1.is_vertical()) return l2.is_vertical() ? EQUAL : LARGER; if (l1.is_vertical()) return l2.is_vertical() ? EQUAL : LARGER;
if (l2.is_vertical()) return SMALLER; if (l2.is_vertical()) return SMALLER;
int l1_sign = CGAL_NTS sign(-l1.a() * l1.b()); int l1_sign = CGAL_NTS sign(-l1.a() * l1.b());
@ -770,9 +770,8 @@ namespace HomogeneousKernelFunctors {
if (cmp_x2 == EQUAL) return SMALLER; if (cmp_x2 == EQUAL) return SMALLER;
FT s_hw = s2.source().hw(); FT s_hw = s2.source().hw();
FT t_hw = s2.target().hw(); FT t_hw = s2.target().hw();
return enum_cast<Comparison_result>( return - CGAL_NTS sign(s2.source().hy()*t_hw - s2.target().hy()*s_hw) *
- CGAL_NTS sign((s2.source().hy()*t_hw - s2.target().hy()*s_hw) * CGAL_NTS sign(s2.source().hx()*t_hw - s2.target().hx()*s_hw);
(s2.source().hx()*t_hw - s2.target().hx()*s_hw)) );
} }
typename K::Comparison_result cmp_y2 = compare_y(s2.source(), s2.target()); typename K::Comparison_result cmp_y2 = compare_y(s2.source(), s2.target());
@ -783,9 +782,8 @@ namespace HomogeneousKernelFunctors {
if (cmp_x1 == EQUAL) return LARGER; if (cmp_x1 == EQUAL) return LARGER;
FT s_hw = s1.source().hw(); FT s_hw = s1.source().hw();
FT t_hw = s1.target().hw(); FT t_hw = s1.target().hw();
return enum_cast<Comparison_result>( return CGAL_NTS sign(s1.source().hy()*t_hw - s1.target().hy()*s_hw) *
CGAL_NTS sign((s1.source().hy()*t_hw - s1.target().hy()*s_hw) * CGAL_NTS sign(s1.source().hx()*t_hw - s1.target().hx()*s_hw);
(s1.source().hx()*t_hw - s1.target().hx()*s_hw)) );
} }
typename K::Comparison_result cmp_x1 = compare_x(s1.source(), s1.target()); typename K::Comparison_result cmp_x1 = compare_x(s1.source(), s1.target());
@ -810,13 +808,11 @@ namespace HomogeneousKernelFunctors {
if (s1_sign > s2_sign) return LARGER; if (s1_sign > s2_sign) return LARGER;
if (s1_sign > 0) if (s1_sign > 0)
return enum_cast<Comparison_result>( return CGAL_NTS sign(CGAL_NTS abs(s1_ydiff * s2_xdiff) -
CGAL_NTS sign ( CGAL_NTS abs(s1_ydiff * s2_xdiff) - CGAL_NTS abs(s2_ydiff * s1_xdiff));
CGAL_NTS abs(s2_ydiff * s1_xdiff)) );
return enum_cast<Comparison_result>( return CGAL_NTS sign(CGAL_NTS abs(s2_ydiff * s1_xdiff) -
CGAL_NTS sign ( CGAL_NTS abs(s2_ydiff * s1_xdiff) - CGAL_NTS abs(s1_ydiff * s2_xdiff));
CGAL_NTS abs(s1_ydiff * s2_xdiff)) );
} }
}; };
@ -836,7 +832,7 @@ namespace HomogeneousKernelFunctors {
CGAL_kernel_precondition( ! h.is_horizontal() ); CGAL_kernel_precondition( ! h.is_horizontal() );
typename K::Oriented_side ors = h.oriented_side( p ); typename K::Oriented_side ors = h.oriented_side( p );
if ( h.a() < RT(0) ) if ( h.a() < RT(0) )
ors = opposite( ors ); ors = -ors;
if ( ors == ON_POSITIVE_SIDE ) if ( ors == ON_POSITIVE_SIDE )
return LARGER; return LARGER;
return ( ors == ON_NEGATIVE_SIDE ) ? SMALLER : EQUAL; return ( ors == ON_NEGATIVE_SIDE ) ? SMALLER : EQUAL;
@ -1058,8 +1054,8 @@ namespace HomogeneousKernelFunctors {
CGAL_kernel_precondition( ! h.is_vertical() ); CGAL_kernel_precondition( ! h.is_vertical() );
typename K::Oriented_side ors = h.oriented_side( p ); typename K::Oriented_side ors = h.oriented_side( p );
if ( h.b() < 0 ) if ( h.b() < 0 )
ors = opposite( ors ); ors = -ors;
return enum_cast<Comparison_result>(ors); return ors;
} // FIXME } // FIXME
result_type result_type
@ -1137,12 +1133,11 @@ namespace HomogeneousKernelFunctors {
FT s1stx = s1sx-s1tx; FT s1stx = s1sx-s1tx;
FT s2stx = s2sx-s2tx; FT s2stx = s2sx-s2tx;
return enum_cast<Comparison_result>( return CGAL_NTS compare(s1sx, s1tx) *
CGAL_NTS compare(s1sx, s1tx) * CGAL_NTS compare(s2sx, s2tx) *
CGAL_NTS compare(s2sx, s2tx) * CGAL_NTS compare(-(s1sx-px)*(s1sy-s1ty)*s2stx,
CGAL_NTS compare(-(s1sx-px)*(s1sy-s1ty)*s2stx, (s2sy-s1sy)*s2stx*s1stx
(s2sy-s1sy)*s2stx*s1stx -(s2sx-px)*(s2sy-s2ty)*s1stx);
-(s2sx-px)*(s2sy-s2ty)*s1stx ));
} }
else { else {
if (s1sx == s1tx) { // s1 is vertical if (s1sx == s1tx) { // s1 is vertical
@ -1158,7 +1153,7 @@ namespace HomogeneousKernelFunctors {
c3 = compare_y_at_x(s2.source(), s1); c3 = compare_y_at_x(s2.source(), s1);
c4 = compare_y_at_x(s2.target(), s1); c4 = compare_y_at_x(s2.target(), s1);
if (c3 == c4) if (c3 == c4)
return opposite(c3); return -c3;
return EQUAL; return EQUAL;
} }
} // FIXME } // FIXME
@ -4292,14 +4287,14 @@ namespace HomogeneousKernelFunctors {
RT C = qhx*rhw - qhw*rhx; RT C = qhx*rhw - qhw*rhx;
RT D = qhy*rhw - qhw*rhy; RT D = qhy*rhw - qhw*rhy;
return enum_cast<Orientation>(CGAL_NTS compare(A*D, B*C)); return CGAL_NTS compare(A*D, B*C);
} }
result_type result_type
operator()(const Vector_2& u, const Vector_2& v) const operator()(const Vector_2& u, const Vector_2& v) const
{ {
return enum_cast<Orientation>(sign_of_determinant2x2(u.hx(), u.hy(), return sign_of_determinant2x2(u.hx(), u.hy(),
v.hx(), v.hy())); v.hx(), v.hy());
} }
result_type result_type
@ -4325,20 +4320,18 @@ namespace HomogeneousKernelFunctors {
const Point_3& r, const Point_3& s) const const Point_3& r, const Point_3& s) const
{ {
// Two rows are switched, because of the homogeneous column. // Two rows are switched, because of the homogeneous column.
return enum_cast<Orientation>( return sign_of_determinant4x4( p.hx(), p.hy(), p.hz(), p.hw(),
sign_of_determinant4x4( p.hx(), p.hy(), p.hz(), p.hw(), r.hx(), r.hy(), r.hz(), r.hw(),
r.hx(), r.hy(), r.hz(), r.hw(), q.hx(), q.hy(), q.hz(), q.hw(),
q.hx(), q.hy(), q.hz(), q.hw(), s.hx(), s.hy(), s.hz(), s.hw());
s.hx(), s.hy(), s.hz(), s.hw()));
} }
result_type result_type
operator()( const Vector_3& u, const Vector_3& v, const Vector_3& w) const operator()( const Vector_3& u, const Vector_3& v, const Vector_3& w) const
{ {
return enum_cast<Orientation>( return sign_of_determinant3x3( u.hx(), u.hy(), u.hz(),
sign_of_determinant3x3( u.hx(), u.hy(), u.hz(), v.hx(), v.hy(), v.hz(),
v.hx(), v.hy(), v.hz(), w.hx(), w.hy(), w.hz());
w.hx(), w.hy(), w.hz()));
} }
result_type result_type
@ -4376,7 +4369,7 @@ namespace HomogeneousKernelFunctors {
{ {
CGAL_kernel_precondition( ! l.is_degenerate() ); CGAL_kernel_precondition( ! l.is_degenerate() );
RT v = l.a()*p.hx() + l.b()*p.hy() + l.c()*p.hw(); RT v = l.a()*p.hx() + l.b()*p.hy() + l.c()*p.hw();
return enum_cast<Oriented_side>(CGAL_NTS sign(v)); return CGAL_NTS sign(v);
} }
result_type result_type
@ -4624,7 +4617,7 @@ namespace HomogeneousKernelFunctors {
+ i * ( b*(g*p - h*o) + f*(d*o - c*p) + n*(c*h - d*g) ) + i * ( b*(g*p - h*o) + f*(d*o - c*p) + n*(c*h - d*g) )
- m * ( b*(g*l - h*k) + f*(d*k - c*l) + j*(c*h - d*g) ); - m * ( b*(g*l - h*k) + f*(d*k - c*l) + j*(c*h - d*g) );
return enum_cast<Oriented_side>(CGAL_NTS sign(det)); return CGAL_NTS sign(det);
} }
}; };
@ -4678,7 +4671,7 @@ namespace HomogeneousKernelFunctors {
rhx*rhw, rhy*rhw, rhz*rhw, rhx*rhx + rhy*rhy + rhz*rhz, rhw2, rhx*rhw, rhy*rhw, rhz*rhw, rhx*rhx + rhy*rhy + rhz*rhz, rhw2,
shx*shw, shy*shw, shz*shw, shx*shx + shy*shy + shz*shz, shw2, shx*shw, shy*shw, shz*shw, shx*shx + shy*shy + shz*shz, shw2,
thx*thw, thy*thw, thz*thw, thx*thx + thy*thy + thz*thz, thw2); thx*thw, thy*thw, thz*thw, thx*thx + thy*thy + thz*thz, thw2);
return enum_cast<Oriented_side>(- CGAL_NTS sign(det)); return - CGAL_NTS sign(det);
} }
}; };

View File

@ -36,10 +36,9 @@ orientationH2( const RT& phx, const RT& phy, const RT& phw,
const RT& qhx, const RT& qhy, const RT& qhw, const RT& qhx, const RT& qhy, const RT& qhw,
const RT& rhx, const RT& rhy, const RT& rhw ) const RT& rhx, const RT& rhy, const RT& rhw )
{ {
return enum_cast<Orientation>( return sign_of_determinant3x3(phx,phy,phw,
sign_of_determinant3x3(phx,phy,phw, qhx,qhy,qhw,
qhx,qhy,qhw, rhx,rhy,rhw);
rhx,rhy,rhw));
} }
CGAL_END_NAMESPACE CGAL_END_NAMESPACE