TSDuck v3.40-4033
MPEG Transport Stream Toolkit
|
Template representation of fractional numbers. More...
#include <tsFraction.h>
Public Types | |
using | int_t = INT_T |
The underlying integer type. | |
Public Member Functions | |
Fraction ()=default | |
Default constructor, implicitly initialized to zero. | |
template<typename INT1 > requires std::integral<INT1> | |
Fraction (INT1 numerator) | |
Constructor from an integer value. | |
template<typename INT1 , typename INT2 > requires std::integral<INT1> && std::integral<INT2> | |
Fraction (INT1 numerator, INT2 denominator) | |
Constructor from integer values. | |
Fraction | abs () const |
Get the absolute value. | |
int_t | denominator () const |
Get the denominator part of the fraction. | |
virtual ts::UString | description () const override |
Get a textual description of the values of that type. | |
bool | divOverflow (const Fraction &x) const |
Check if this Fraction generates an overflow when divided by another Fraction. | |
virtual bool | fromString (const UString &str, UChar separator=COMMA, UChar decimal_dot=FULL_STOP) override |
Parse a string and interpret it as a number. | |
virtual bool | inRange (int64_t min, int64_t max) const override |
Check if the value of the number is within a range of integer value. | |
Fraction | max (const Fraction &x) const |
Get the maximum value of two fractions. | |
Fraction | min (const Fraction &x) const |
Get the minimum value of two fractions. | |
bool | mulOverflow (const Fraction &x) const |
Check if this Fraction generates an overflow when multiplied by another Fraction. | |
template<typename INT1 > requires std::integral<INT1> | |
bool | mulOverflow (INT1 x) const |
Check if this Fraction generates an overflow when multiplied by an integer. | |
int_t | numerator () const |
Get the numerator part of the fraction. | |
int_t | proper () |
Converts to a proper fraction (a fraction that is less than 1). | |
virtual double | toDouble () const override |
Conversion to double value. | |
int_t | toInt () const |
Conversion to integral value. | |
virtual int64_t | toInt64 () const override |
Conversion to a 64-bit signed integer value. | |
virtual UString | toString (size_t min_width=0, bool right_justified=true, UChar separator=COMMA, bool force_sign=false, size_t decimals=NPOS, bool force_decimals=false, UChar decimal_dot=FULL_STOP, UChar pad=SPACE) const override |
Convert the number to a string object. | |
Static Public Attributes | |
static const AbstractNumber *const | INVALID |
Pointer to an invalid instance of AbstractNumber. | |
static const Fraction | MAX |
The maximum representable value of this fraction type. | |
static const Fraction | MIN |
The minimum representable value of this fraction type. | |
Static Protected Member Functions | |
static void | Deformat (UString &str, UChar separator, UChar decimal_dot) |
Static common utility to deformat a string containing a number. | |
static void | Format (UString &str, size_t min_width, bool right_justified, UChar separator, bool add_plus_sign, size_t decimals, bool force_decimals, UChar decimal_dot, UChar pad) |
Static common utility to format a string containing a number with or without decimal part. | |
Template representation of fractional numbers.
Fraction are always reduced so that the numerator and denominator have no common divisor other than 1. For signed integer types, the signed is carried by the numerator and the denominator is always positive.
All arithmetic and comparison operators are defined between fraction values and between a fraction value and an integer value, both directions.
In debug mode (when the macro DEBUG
is defined), the arithmetic operators throw an exception in case of overflow. Without debug mode, the arithmetic overflow are ignored, which may lead to inconsistent values after a large number of operations (typically additions and substractions with distinct denominators).
INT_T | The integer type for numerator and denominator. |
ts::Fraction< INT_T >::Fraction | ( | INT1 | numerator | ) |
Constructor from an integer value.
INT1 | Some other integer type (signed or unsigned). |
[in] | numerator | Initial numerator value. |
std::overflow_error | When numerator is out of range. |
ts::Fraction< INT_T >::Fraction | ( | INT1 | numerator, |
INT2 | denominator | ||
) |
Constructor from integer values.
INT1 | Some other integer type (signed or unsigned). |
INT2 | Some other integer type (signed or unsigned). |
[in] | numerator | Initial numerator value. |
[in] | denominator | Initial denominator value. |
std::underflow_error | When denominator is zero. |
std::overflow_error | When numerator or denominator are out of range. |
|
overridevirtual |
Get a textual description of the values of that type.
This is typically used in help texts.
Implements ts::AbstractNumber.
|
overridevirtual |
Check if the value of the number is within a range of integer value.
[in] | min | Minimum integer value (inclusive). |
[in] | max | Maximum integer value (inclusive). |
Implements ts::AbstractNumber.
|
overridevirtual |
Conversion to a 64-bit signed integer value.
Implements ts::AbstractNumber.
|
overridevirtual |
|
overridevirtual |
Parse a string and interpret it as a number.
The content of this object is updated from the parsed string.
[in] | str | A string to parse, representing this object. |
[in] | separator | Separator character for groups of thousands, a comma by default. |
[in] | decimal_dot | The decimal separator, a dot by default. |
Implements ts::AbstractNumber.
|
overridevirtual |
Convert the number to a string object.
[in] | min_width | Minimum width of the returned string. Padded with pad characters if larger than the number of characters in the formatted number. |
[in] | right_justified | If true (the default), return a right-justified string. When false, return a left-justified string. Ignored if min_width is lower than the number of characters in the formatted number. |
[in] | separator | Separator character for groups of thousands, a comma by default. CHAR_NULL means no separator. |
[in] | force_sign | If true, force a '+' sign for positive values. |
[in] | decimals | Precision to use after the decimal point. NPOS means default. |
[in] | force_decimals | If true, with positive precision, force a decimal dot and the number of decimal digits of the precision. By default, skip non significant decimal digits. |
[in] | decimal_dot | The decimal separator, a dot by default. |
[in] | pad | The padding character to adjust the width. |
Implements ts::AbstractNumber.
|
inline |
Get the numerator part of the fraction.
|
inline |
Get the denominator part of the fraction.
|
inline |
Conversion to integral value.
|
inline |
Get the absolute value.
int_t ts::Fraction< INT_T >::proper | ( | ) |
Converts to a proper fraction (a fraction that is less than 1).
The previous integer part is returned. This means that:
|
inline |
Get the maximum value of two fractions.
[in] | x | Another fraction. |
|
inline |
Get the minimum value of two fractions.
[in] | x | Another fraction. |
bool ts::Fraction< INT_T >::mulOverflow | ( | INT1 | x | ) | const |
bool ts::Fraction< INT_T >::mulOverflow | ( | const Fraction< INT_T > & | x | ) | const |
bool ts::Fraction< INT_T >::divOverflow | ( | const Fraction< INT_T > & | x | ) | const |
|
staticprotectedinherited |
Static common utility to format a string containing a number with or without decimal part.
[in,out] | str | String to format. |
[in] | min_width | Minimum width of the string. |
[in] | right_justified | If true (the default), return a right-justified string. |
[in] | separator | Separator character for groups of thousands. |
[in] | add_plus_sign | If true, force a '+' sign before the number. |
[in] | decimals | Precision to use after the decimal point. NPOS not allowed. |
[in] | force_decimals | If true, force a decimal dot and the number of decimal digits. For integer types, use force_decimals == true and decimals == 0. |
[in] | decimal_dot | The decimal separator. |
[in] | pad | The padding character to adjust the width. |
|
staticprotectedinherited |
Static common utility to deformat a string containing a number.
[in,out] | str | String to deformat. |
[in] | separator | Separator character for groups of thousands. |
[in] | decimal_dot | The decimal separator. |
|
staticinherited |
Pointer to an invalid instance of AbstractNumber.
Its toString() method always return an empty string.