tools/source/generic/fract.cxx | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)
New commits: commit 3ff957b0a45a1c7a2666103a6a6783e69de3446c Author: Caolán McNamara <caol...@redhat.com> Date: Tue Mar 21 10:35:55 2017 +0000 duplicate rational::operator*= into tools for modification, no logic changed intended in this step Change-Id: Ib41051a83bc9e37677d765e51e9f56cede0efb3e diff --git a/tools/source/generic/fract.cxx b/tools/source/generic/fract.cxx index c79b24bbf3a3..068a2b6429a8 100644 --- a/tools/source/generic/fract.cxx +++ b/tools/source/generic/fract.cxx @@ -170,6 +170,24 @@ Fraction& Fraction::operator -= ( const Fraction& rVal ) return *this; } +namespace +{ + template<typename T> void multiply_by(boost::rational<T>& i, const boost::rational<T>& r) + { + // Protect against self-modification + T num = r.numerator(); + T den = r.denominator(); + + // Avoid overflow and preserve normalization + T gcd1 = boost::integer::gcd(i.numerator(), den); + T gcd2 = boost::integer::gcd(num, i.denominator()); + num = (i.numerator() / gcd1) * (num / gcd2); + den = (i.denominator() / gcd2) * (den / gcd1); + + i.assign(num, den); + } +} + Fraction& Fraction::operator *= ( const Fraction& rVal ) { if ( !rVal.mpImpl->valid ) @@ -181,9 +199,9 @@ Fraction& Fraction::operator *= ( const Fraction& rVal ) return *this; } - mpImpl->value *= rVal.mpImpl->value; + multiply_by(mpImpl->value, rVal.mpImpl->value); - if ( HasOverflowValue() ) + if (HasOverflowValue()) { mpImpl->valid = false; }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits