summaryrefslogtreecommitdiffstats
path: root/sigcore/Fraction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sigcore/Fraction.cpp')
-rw-r--r--sigcore/Fraction.cpp177
1 files changed, 177 insertions, 0 deletions
diff --git a/sigcore/Fraction.cpp b/sigcore/Fraction.cpp
new file mode 100644
index 00000000..f5e5e3a3
--- /dev/null
+++ b/sigcore/Fraction.cpp
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2007-2008 Ben Boeckel <MathStuf@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file sigcore/Fraction.cpp
+ */
+
+// Header include
+#include "Fraction.h"
+
+Sigcore::Fraction::Fraction(const int numerator, const int denominator)
+{
+ set(numerator, denominator);
+}
+
+Sigcore::Fraction::Fraction(const Fraction& fraction)
+{
+ set(fraction.numerator(), fraction.denominator());
+}
+
+void Sigcore::Fraction::set(const int numerator, const int denominator)
+{
+ m_numerator = numerator;
+ m_denominator = denominator;
+ normalize();
+}
+
+void Sigcore::Fraction::setNumerator(const int numerator)
+{
+ set(numerator, m_denominator);
+}
+
+void Sigcore::Fraction::setDenominator(const int denominator)
+{
+ set(m_numerator, denominator);
+}
+
+int Sigcore::Fraction::numerator() const
+{
+ return m_numerator;
+}
+
+int Sigcore::Fraction::denominator() const
+{
+ return m_denominator;
+}
+
+void Sigcore::Fraction::reduce()
+{
+ if (!m_numerator || !m_denominator)
+ return;
+ int i = m_numerator;
+ int j = m_denominator;
+ if (i < 0)
+ i = -i;
+ while (i - j)
+ (i > j) ? (i -= j) : (j -= i);
+ m_numerator /= i;
+ m_denominator /= i;
+}
+
+bool Sigcore::Fraction::poll() const
+{
+ return (qrand() % m_denominator) < m_numerator;
+}
+
+bool Sigcore::Fraction::poll(const int numerator, const int denominator)
+{
+ return (qrand() % denominator) < numerator;
+}
+
+Sigcore::Fraction& Sigcore::Fraction::operator=(const Fraction& rhs)
+{
+ if (this == &rhs)
+ return *this;
+ m_numerator = rhs.m_numerator;
+ m_denominator = rhs.m_denominator;
+ return *this;
+}
+
+Sigcore::Fraction::operator double() const
+{
+ return (double(m_numerator) / m_denominator);
+}
+
+Sigcore::Fraction Sigcore::Fraction::operator+(const Fraction& rhs) const
+{
+ return Fraction((m_numerator * rhs.m_denominator) + (m_denominator * rhs.m_numerator), m_denominator * rhs.m_denominator);
+}
+
+Sigcore::Fraction Sigcore::Fraction::operator-(const Fraction& rhs) const
+{
+ return Fraction((m_numerator * rhs.m_denominator) - (m_denominator * rhs.m_numerator), m_denominator * rhs.m_denominator);
+}
+
+Sigcore::Fraction Sigcore::Fraction::operator*(const Fraction& rhs) const
+{
+ return Fraction(m_numerator * rhs.m_numerator, m_denominator * rhs.m_denominator);
+}
+
+Sigcore::Fraction Sigcore::Fraction::operator/(const Fraction& rhs) const
+{
+ return Fraction(m_numerator * rhs.m_denominator, m_denominator * rhs.m_numerator);
+}
+
+Sigcore::Fraction& Sigcore::Fraction::operator+=(const Fraction& rhs)
+{
+ return *this = *this + rhs;
+}
+
+Sigcore::Fraction& Sigcore::Fraction::operator-=(const Fraction& rhs)
+{
+ return *this = *this - rhs;
+}
+
+Sigcore::Fraction& Sigcore::Fraction::operator*=(const Fraction& rhs)
+{
+ return *this = *this * rhs;
+}
+
+Sigcore::Fraction& Sigcore::Fraction::operator/=(const Fraction& rhs)
+{
+ return *this = *this / rhs;
+}
+
+bool Sigcore::Fraction::operator==(const Fraction& rhs) const
+{
+ return ((m_numerator * rhs.m_denominator) == (m_denominator * rhs.m_numerator));
+}
+
+bool Sigcore::Fraction::operator!=(const Fraction& rhs) const
+{
+ return !(*this == rhs);
+}
+
+bool Sigcore::Fraction::operator<(const Fraction& rhs) const
+{
+ return ((m_numerator * rhs.m_denominator) < (m_denominator * rhs.m_numerator));
+}
+
+bool Sigcore::Fraction::operator<=(const Fraction& rhs) const
+{
+ return ((m_numerator * rhs.m_denominator) <= (m_denominator * rhs.m_numerator));
+}
+
+bool Sigcore::Fraction::operator>(const Fraction& rhs) const
+{
+ return !(*this <= rhs);
+}
+
+bool Sigcore::Fraction::operator>=(const Fraction& rhs) const
+{
+ return !(*this < rhs);
+}
+
+void Sigcore::Fraction::normalize()
+{
+ if (m_denominator < 0)
+ {
+ m_denominator = -m_denominator;
+ m_numerator = -m_numerator;
+ }
+}