From 0ddda96e69eefbc284f5678c08644b46525ad853 Mon Sep 17 00:00:00 2001 From: Henning Brinkmann Date: Tue, 17 Aug 2010 11:17:52 +0200 Subject: writerfilter09: new class Fraction --- writerfilter/inc/resourcemodel/Fraction.hxx | 53 +++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 writerfilter/inc/resourcemodel/Fraction.hxx (limited to 'writerfilter/inc/resourcemodel/Fraction.hxx') diff --git a/writerfilter/inc/resourcemodel/Fraction.hxx b/writerfilter/inc/resourcemodel/Fraction.hxx new file mode 100644 index 000000000000..1916bd433651 --- /dev/null +++ b/writerfilter/inc/resourcemodel/Fraction.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef INCLUDED_FRACTION_HXX +#define INCLUDED_FRACTION_HXX + +#include + +namespace writerfilter { +namespace resourcemodel { + +class Fraction +{ + explicit Fraction(sal_Int32 nNumerator, sal_Int32 nDenominator = 1); + virtual ~Fraction(); + + Fraction operator=(const Fraction & rFraction) const; + Fraction operator+(const Fraction & rFraction) const; + Fraction operator-(const Fraction & rFraction) const; + Fraction operator*(const Fraction & rFraction) const; + Fraction operator/(const Fraction & rFraction) const; + operator sal_Int32() const; + operator float() const; + +private: + sal_Int32 mnNumerator; + sal_Int32 mnDenominator; +}; +}} +#endif // INCLUDED_FRACTION_HXX -- cgit v1.2.3 From 1fd3d9c3074b80f59279189d1b06f138990d8075 Mon Sep 17 00:00:00 2001 From: Henning Brinkmann Date: Tue, 17 Aug 2010 16:44:32 +0200 Subject: writerfilter09: Fraction: constructor from Fractions, init, assign, inverse, operator= --- writerfilter/inc/resourcemodel/Fraction.hxx | 9 +++++- writerfilter/source/resourcemodel/Fraction.cxx | 40 +++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) (limited to 'writerfilter/inc/resourcemodel/Fraction.hxx') diff --git a/writerfilter/inc/resourcemodel/Fraction.hxx b/writerfilter/inc/resourcemodel/Fraction.hxx index 1916bd433651..a038d25c98f1 100644 --- a/writerfilter/inc/resourcemodel/Fraction.hxx +++ b/writerfilter/inc/resourcemodel/Fraction.hxx @@ -34,10 +34,17 @@ namespace resourcemodel { class Fraction { +public: explicit Fraction(sal_Int32 nNumerator, sal_Int32 nDenominator = 1); + explicit Fraction(const Fraction & a, const Fraction & b); virtual ~Fraction(); - Fraction operator=(const Fraction & rFraction) const; + void init(sal_Int32 nNumerator, sal_Int32 nDenominator); + void assign(const Fraction & rFraction); + + Fraction inverse() const; + + Fraction operator=(const Fraction & rFraction); Fraction operator+(const Fraction & rFraction) const; Fraction operator-(const Fraction & rFraction) const; Fraction operator*(const Fraction & rFraction) const; diff --git a/writerfilter/source/resourcemodel/Fraction.cxx b/writerfilter/source/resourcemodel/Fraction.cxx index 2fea20772878..98892a759bfb 100644 --- a/writerfilter/source/resourcemodel/Fraction.cxx +++ b/writerfilter/source/resourcemodel/Fraction.cxx @@ -53,7 +53,7 @@ sal_uInt32 gcd(sal_uInt32 a, sal_uInt32 b) if (a < b) { - a -= b; + b -= a; } else { @@ -71,19 +71,39 @@ sal_uInt32 gcd(sal_uInt32 a, sal_uInt32 b) sal_uInt32 lcm(sal_Int32 a, sal_Int32 b) { - return abs(a * b) / gcd(a, b); + return abs(a * b) / gcd(abs(a), abs(b)); } Fraction::Fraction(sal_Int32 nNumerator, sal_Int32 nDenominator) +{ + init(nNumerator, nDenominator); +} + +Fraction::Fraction(const Fraction & a, const Fraction & b) +{ + init(a.mnNumerator * b.mnDenominator, a.mnDenominator * b.mnNumerator); +} + +Fraction::~Fraction() +{ +} + +void Fraction::init(sal_Int32 nNumerator, sal_Int32 nDenominator) { sal_uInt32 nGCD = gcd(nNumerator, nDenominator); - mnNumerator = nNumerator / nGCD; + mnNumerator = nNumerator/ nGCD; mnDenominator = nDenominator / nGCD; } -Fraction::~Fraction() +void Fraction::assign(const Fraction & rFraction) { + init(rFraction.mnNumerator, rFraction.mnDenominator); +} + +Fraction Fraction::inverse() const +{ + return Fraction(mnDenominator, mnNumerator); } Fraction Fraction::operator + (const Fraction & rFraction) const @@ -105,6 +125,18 @@ Fraction Fraction::operator * (const Fraction & rFraction) const return Fraction(mnNumerator * rFraction.mnNumerator, mnDenominator * rFraction.mnDenominator); } +Fraction Fraction::operator / (const Fraction & rFraction) const +{ + return *this * rFraction.inverse(); +} + +Fraction Fraction::operator = (const Fraction & rFraction) +{ + assign(rFraction); + + return *this; +} + Fraction::operator sal_Int32() const { return mnNumerator / mnDenominator; -- cgit v1.2.3