28#include "musx/dom/Fundamentals.h"
47 int gcd = std::gcd(m_numerator, m_denominator);
52 if (m_denominator < 0) {
53 m_numerator = -m_numerator;
54 m_denominator = -m_denominator;
65 Fraction(
int num = 0,
int den = 1) : m_numerator(num), m_denominator(den) {
66 if (m_denominator == 0) {
67 throw std::invalid_argument(
"Denominator cannot be zero.");
93 return m_numerator / m_denominator;
101 return Fraction(m_numerator % m_denominator, m_denominator);
107 return Fraction(m_denominator, m_numerator);
122 m_numerator * other.m_denominator + other.m_numerator * m_denominator,
123 m_denominator * other.m_denominator
134 m_numerator * other.m_denominator - other.m_numerator * m_denominator,
135 m_denominator * other.m_denominator
146 m_numerator * other.m_numerator,
147 m_denominator * other.m_denominator
158 if (other.m_numerator == 0) {
159 throw std::invalid_argument(
"Cannot divide by zero fraction.");
162 m_numerator * other.m_denominator,
163 m_denominator * other.m_numerator
173 *
this = *
this + other;
183 *
this = *
this - other;
193 *
this = *
this * other;
204 *
this = *
this / other;
218 return lhs.m_numerator == rhs.m_numerator && lhs.m_denominator == rhs.m_denominator;
227 return !(*
this == other);
236 double lhs =
static_cast<double>(m_numerator) / m_denominator;
237 double rhs =
static_cast<double>(other.m_numerator) / other.m_denominator;
247 return *
this < other || *
this == other;
256 return !(*
this <= other);
265 return !(*
this < other);
272 explicit operator bool()
const {
273 return m_numerator != 0;
283 os << frac.m_numerator;
284 if (frac.m_denominator != 1) {
285 os <<
"/" << frac.m_denominator;
300 is >> num >> sep >> den;
301 if (sep !=
'/' || den == 0) {
302 throw std::invalid_argument(
"Invalid fraction format or zero m_denominator.");
A class to represent fractions with integer m_numerator and m_denominator, automatically reduced to s...
Definition Fraction.h:37
bool operator<(const Fraction &other) const
Less-than comparison operator.
Definition Fraction.h:235
Fraction remainder() const
Returns the fractional part of the fraction.
Definition Fraction.h:100
int numerator() const
Gets the m_numerator of the fraction.
Definition Fraction.h:80
int quotient() const
Returns the integer (whole number) part of the fraction.
Definition Fraction.h:92
Fraction operator+(const Fraction &other) const
Adds two fractions.
Definition Fraction.h:120
Fraction(int num=0, int den=1)
Constructs a Fraction object.
Definition Fraction.h:65
Fraction reciprocal() const
Returns the reciprocal fraction.
Definition Fraction.h:106
static Fraction fromEdu(int edu)
Constructs a Fraction from edu.
Definition Fraction.cpp:31
bool operator>(const Fraction &other) const
Greater-than comparison operator.
Definition Fraction.h:255
bool operator>=(const Fraction &other) const
Greater-than-or-equal-to comparison operator.
Definition Fraction.h:264
dom::Edu calcEduDuration() const
Calculates duration as a fraction of a whole note.
Definition Fraction.cpp:36
bool operator<=(const Fraction &other) const
Less-than-or-equal-to comparison operator.
Definition Fraction.h:246
bool operator==(const Fraction &other) const
Equality comparison operator.
Definition Fraction.h:213
Fraction & operator+=(const Fraction &other)
Compound addition assignment operator.
Definition Fraction.h:172
Fraction operator*(const Fraction &other) const
Multiplies two fractions.
Definition Fraction.h:144
friend std::ostream & operator<<(std::ostream &os, const Fraction &frac)
Stream output operator.
Definition Fraction.h:282
friend std::istream & operator>>(std::istream &is, Fraction &frac)
Stream input operator.
Definition Fraction.h:297
Fraction & operator*=(const Fraction &other)
Compound multiplication assignment operator.
Definition Fraction.h:192
bool operator!=(const Fraction &other) const
Inequality comparison operator.
Definition Fraction.h:226
Fraction & operator-=(const Fraction &other)
Compound subtraction assignment operator.
Definition Fraction.h:182
Fraction operator-(const Fraction &other) const
Subtracts one fraction from another.
Definition Fraction.h:132
Fraction operator/(const Fraction &other) const
Divides one fraction by another.
Definition Fraction.h:157
Fraction & operator/=(const Fraction &other)
Compound division assignment operator.
Definition Fraction.h:203
int denominator() const
Gets the m_denominator of the fraction.
Definition Fraction.h:86
int32_t Edu
"Enigma Durational Units" value (1024 per quarter note)
Definition Fundamentals.h:61
object model for musx file (enigmaxml)
Definition BaseClasses.h:32