Commits

Anonymous committed 3a9965c

writerfilter09: new class Fraction

Comments (0)

Files changed (3)

writerfilter/inc/resourcemodel/Fraction.hxx

+/*************************************************************************
+ *
+ * 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef INCLUDED_FRACTION_HXX
+#define INCLUDED_FRACTION_HXX
+
+#include <sal/types.h>
+
+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

writerfilter/source/resourcemodel/Fraction.cxx

+/*************************************************************************
+ *
+ * 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <resourcemodel/Fraction.hxx>
+
+namespace writerfilter {
+namespace resourcemodel {
+
+sal_uInt32 gcd(sal_uInt32 a, sal_uInt32 b)
+{
+    if (a == 0 || b == 0)
+        return a | b;
+
+    sal_uInt32 nShift = 0;
+    while (((a | b) & 1) == 0)
+    {
+        a >>= 1;
+        b >>= 1;
+        ++nShift;
+    }
+
+    while ((a & 1) == 0)
+        a >>= 1;
+
+    do 
+    {
+        while ((b & 1) == 0)
+            b >>= 1;
+
+        if (a < b)
+        {
+            a -= b;
+        }
+        else
+        {
+            sal_uInt32 nDiff = a - b;
+            a = b;
+            b = nDiff;
+        }
+
+        b >>= 1;
+    }
+    while (b != 0);
+
+    return a << nShift;
+}
+
+sal_uInt32 lcm(sal_Int32 a, sal_Int32 b)
+{
+    return abs(a * b) / gcd(a, b);
+}
+
+Fraction::Fraction(sal_Int32 nNumerator, sal_Int32 nDenominator)
+{
+    sal_uInt32 nGCD = gcd(nNumerator, nDenominator);
+
+    mnNumerator = nNumerator / nGCD;
+    mnDenominator = nDenominator / nGCD;
+}
+
+Fraction::~Fraction()
+{
+}
+
+Fraction Fraction::operator + (const Fraction & rFraction) const 
+{
+    sal_uInt32 nLCM = lcm(mnDenominator, rFraction.mnDenominator);
+
+    return Fraction(mnNumerator * nLCM / mnDenominator + rFraction.mnNumerator * nLCM / rFraction.mnDenominator, nLCM);
+}
+
+Fraction Fraction::operator - (const Fraction & rFraction) const 
+{
+    sal_uInt32 nLCM = lcm(mnDenominator, rFraction.mnDenominator);
+
+    return Fraction(mnNumerator * nLCM / mnDenominator - rFraction.mnNumerator * nLCM / rFraction.mnDenominator, nLCM);
+}
+
+Fraction Fraction::operator * (const Fraction & rFraction) const 
+{
+    return Fraction(mnNumerator * rFraction.mnNumerator, mnDenominator * rFraction.mnDenominator);
+}
+
+Fraction::operator sal_Int32() const
+{
+    return mnNumerator / mnDenominator;
+}
+
+Fraction::operator float() const
+{
+    return mnNumerator / mnDenominator;
+}
+
+}}

writerfilter/source/resourcemodel/makefile.mk

 	$(SLO)$/qnametostr.obj
 
 SLOFILES= \
+	$(SLO)$/Fraction.obj \
 	$(SLO)$/LoggedResources.obj \
 	$(SLO)$/Protocol.obj \
 	$(SLO)$/ResourceModelHelper.obj \