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;
214 return m_numerator == other.m_numerator && m_denominator == other.m_denominator;
223 return !(*
this == other);
232 double lhs =
static_cast<double>(m_numerator) / m_denominator;
233 double rhs =
static_cast<double>(other.m_numerator) / other.m_denominator;
243 return *
this < other || *
this == other;
252 return !(*
this <= other);
261 return !(*
this < other);
268 explicit operator bool()
const {
269 return m_numerator != 0;
279 os << frac.m_numerator;
280 if (frac.m_denominator != 1) {
281 os <<
"/" << frac.m_denominator;
296 is >> num >> sep >> den;
297 if (sep !=
'/' || den == 0) {
298 throw std::invalid_argument(
"Invalid fraction format or zero m_denominator.");
308#ifndef DOXYGEN_SHOULD_IGNORE_THIS
312 struct hash<
musx::util::Fraction>
317 size_t seed = std::hash<int>{}(frac.numerator());
318 seed ^= std::hash<int>{}(frac.denominator()) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
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:231
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:251
bool operator>=(const Fraction &other) const
Greater-than-or-equal-to comparison operator.
Definition Fraction.h:260
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:242
bool operator==(const Fraction &other) const
Equality comparison operator. (This depends on the fact that instances of Fraction are always reduced...
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:278
friend std::istream & operator>>(std::istream &is, Fraction &frac)
Stream input operator.
Definition Fraction.h:293
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:222
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:35