TSDuck v3.38-3696
MPEG Transport Stream Toolkit
Loading...
Searching...
No Matches
ts::FixedPoint< INT_T, PREC, type > Class Template Reference

Template representation of fixed-precision numbers. More...

#include <tsFixedPoint.h>

Inheritance diagram for ts::FixedPoint< INT_T, PREC, type >:
Collaboration diagram for ts::FixedPoint< INT_T, PREC, type >:

Public Types

using int_t = INT_T
 The underlying signed integer type.
 

Public Member Functions

 FixedPoint ()=default
 Default constructor, implicitly initialized to zero.
 
template<typename INT2 , typename std::enable_if< std::is_integral< INT2 >::value, int >::type = 0>
 FixedPoint (INT2 i)
 Constructor.
 
 FixedPoint (int_t i, bool raw)
 Constructor.
 
FixedPoint abs () const
 Get the absolute value.
 
virtual ts::UString description () const override
 Get a textual description of the values of that type.
 
bool divOverflow (const FixedPoint &x) const
 Check if this fixed-point number generates an overflow when divided by another fixed-point.
 
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.
 
FixedPoint max (const FixedPoint &x) const
 Get the maximum value of two fixed-point numbers.
 
FixedPoint min (const FixedPoint &x) const
 Get the minimum value of two fixed-point numbers.
 
bool mulOverflow (const FixedPoint &x) const
 Check if this fixed-point number generates an overflow when multiplied by another fixed-point.
 
template<typename INT2 , typename std::enable_if< std::is_integral< INT2 >::value, int >::type = 0>
bool mulOverflow (INT2 x) const
 Check if this fixed-point number generates an overflow when multiplied by an integer.
 
int_t raw () const
 Get the internal unconverted integer value.
 
virtual double toDouble () const override
 Conversion to double value.
 
int_t toInt () const
 Conversion to integral units.
 
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 constexpr int_t FACTOR = ts::static_power10<int_t, PRECISION>::value
 The factor to convert between FixedPoint and int_t (10**PRECISION).
 
static const AbstractNumber *const INVALID
 Pointer to an invalid instance of AbstractNumber.
 
static const FixedPoint MAX
 The maximum representable value of this fixed-point type.
 
static const FixedPoint MIN
 The minimum representable value of this fixed-point type.
 
static constexpr size_t PRECISION = PREC
 The precision of the fixed number type (number of decimal digits).
 

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.
 

Detailed Description

template<typename INT_T, const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
class ts::FixedPoint< INT_T, PREC, type >

Template representation of fixed-precision numbers.

A fixed-precision number is internally represented by an integer but with a different representation of a "unit". This concept is inspired by "fixed" types in Ada.

All arithmetic and comparison operators are defined between fixed-point type values and between a fixed-point value and an integer value, both directions.

Template Parameters
INT_TThe underlying signed integer type.
PRECThe decimal precision in digits.

Constructor & Destructor Documentation

◆ FixedPoint() [1/2]

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
template<typename INT2 , typename std::enable_if< std::is_integral< INT2 >::value, int >::type = 0>
ts::FixedPoint< INT_T, PREC, type >::FixedPoint ( INT2  i)
inline

Constructor.

Template Parameters
INT2Some other integer type (signed or unsigned).
Parameters
[in]iInitial value in integral number of units which is converted into the fixed-precision representation.

◆ FixedPoint() [2/2]

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
ts::FixedPoint< INT_T, PREC, type >::FixedPoint ( int_t  i,
bool  raw 
)
inline

Constructor.

Parameters
[in]iInitial value. Interpreted according to raw.
[in]rawIf true, the value i is a raw underlying internal value, without conversion. If false, the value i is an integral number of units which is converted into the fixed-precision representation.

Member Function Documentation

◆ description()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type N>
ts::UString ts::FixedPoint< INT_T, PREC, N >::description ( ) const
overridevirtual

Get a textual description of the values of that type.

This is typically used in help texts.

Returns
A textual description of the values of that type.

Implements ts::AbstractNumber.

◆ inRange()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type N>
bool ts::FixedPoint< INT_T, PREC, N >::inRange ( int64_t  min,
int64_t  max 
) const
overridevirtual

Check if the value of the number is within a range of integer value.

Parameters
[in]minMinimum integer value (inclusive).
[in]maxMaximum integer value (inclusive).
Returns
True if this number is within the range min to max, inclusive.

Implements ts::AbstractNumber.

◆ toInt64()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type N>
int64_t ts::FixedPoint< INT_T, PREC, N >::toInt64 ( ) const
overridevirtual

Conversion to a 64-bit signed integer value.

Returns
The value in integral units. Underflow or overflow rounding is applied when necessary.

Implements ts::AbstractNumber.

◆ toDouble()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type N>
double ts::FixedPoint< INT_T, PREC, N >::toDouble ( ) const
overridevirtual

Conversion to double value.

Returns
The value as a double.

Implements ts::AbstractNumber.

◆ fromString()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type N>
bool ts::FixedPoint< INT_T, PREC, N >::fromString ( const UString str,
UChar  separator = COMMA,
UChar  decimal_dot = FULL_STOP 
)
overridevirtual

Parse a string and interpret it as a number.

The content of this object is updated from the parsed string.

Parameters
[in]strA string to parse, representing this object.
[in]separatorSeparator character for groups of thousands, a comma by default.
[in]decimal_dotThe decimal separator, a dot by default.
Returns
True if the str is valid, false otherwise. In case of parsing error, the content of this object is undefined.

Implements ts::AbstractNumber.

◆ toString()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type N>
ts::UString ts::FixedPoint< INT_T, PREC, N >::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
overridevirtual

Convert the number to a string object.

Parameters
[in]min_widthMinimum width of the returned string. Padded with pad characters if larger than the number of characters in the formatted number.
[in]right_justifiedIf 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]separatorSeparator character for groups of thousands, a comma by default. CHAR_NULL means no separator.
[in]force_signIf true, force a '+' sign for positive values.
[in]decimalsPrecision to use after the decimal point. NPOS means default.
[in]force_decimalsIf 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_dotThe decimal separator, a dot by default.
[in]padThe padding character to adjust the width.
Returns
The formatted string.

Implements ts::AbstractNumber.

◆ toInt()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
int_t ts::FixedPoint< INT_T, PREC, type >::toInt ( ) const
inline

Conversion to integral units.

Returns
The value in integral units. Underflow or overflow rounding is applied when necessary.

◆ raw()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
int_t ts::FixedPoint< INT_T, PREC, type >::raw ( ) const
inline

Get the internal unconverted integer value.

Returns
The internal unconverted integer value.

◆ abs()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
FixedPoint ts::FixedPoint< INT_T, PREC, type >::abs ( ) const
inline

Get the absolute value.

Returns
The absolute value of this fixed-point number.

◆ max()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
FixedPoint ts::FixedPoint< INT_T, PREC, type >::max ( const FixedPoint< INT_T, PREC, type > &  x) const
inline

Get the maximum value of two fixed-point numbers.

Parameters
[in]xAnother fixed-point number.
Returns
The maximum value of this fixed-point number and x.

◆ min()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
FixedPoint ts::FixedPoint< INT_T, PREC, type >::min ( const FixedPoint< INT_T, PREC, type > &  x) const
inline

Get the minimum value of two fixed-point numbers.

Parameters
[in]xAnother fixed-point number.
Returns
The minimum value of this fixed-point number and x.

◆ mulOverflow() [1/2]

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
template<typename INT2 , typename std::enable_if< std::is_integral< INT2 >::value, int >::type = 0>
bool ts::FixedPoint< INT_T, PREC, type >::mulOverflow ( INT2  x) const
inline

Check if this fixed-point number generates an overflow when multiplied by an integer.

Template Parameters
INT2Another integer type.
Parameters
[in]xAn integer of type INT2.
Returns
True if this fixed-point number generates an overflow when multiplied by x.

◆ mulOverflow() [2/2]

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
bool ts::FixedPoint< INT_T, PREC, type >::mulOverflow ( const FixedPoint< INT_T, PREC, type > &  x) const
inline

Check if this fixed-point number generates an overflow when multiplied by another fixed-point.

Parameters
[in]xAnother fixed-point number.
Returns
True if this fixed-point number generates an overflow when multiplied by x.

◆ divOverflow()

template<typename INT_T , const size_t PREC, typename std::enable_if< std::is_integral< INT_T >::value &&std::is_signed< INT_T >::value, int >::type = 0>
bool ts::FixedPoint< INT_T, PREC, type >::divOverflow ( const FixedPoint< INT_T, PREC, type > &  x) const
inline

Check if this fixed-point number generates an overflow when divided by another fixed-point.

Parameters
[in]xAnother fixed-point.
Returns
True if this fixed-point generates an overflow when divided by x.

◆ Format()

static void ts::AbstractNumber::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 
)
staticprotectedinherited

Static common utility to format a string containing a number with or without decimal part.

Parameters
[in,out]strString to format.
[in]min_widthMinimum width of the string.
[in]right_justifiedIf true (the default), return a right-justified string.
[in]separatorSeparator character for groups of thousands.
[in]add_plus_signIf true, force a '+' sign before the number.
[in]decimalsPrecision to use after the decimal point. NPOS not allowed.
[in]force_decimalsIf true, force a decimal dot and the number of decimal digits. For integer types, use force_decimals == true and decimals == 0.
[in]decimal_dotThe decimal separator.
[in]padThe padding character to adjust the width.

◆ Deformat()

static void ts::AbstractNumber::Deformat ( UString str,
UChar  separator,
UChar  decimal_dot 
)
staticprotectedinherited

Static common utility to deformat a string containing a number.

Parameters
[in,out]strString to deformat.
[in]separatorSeparator character for groups of thousands.
[in]decimal_dotThe decimal separator.

Member Data Documentation

◆ INVALID

const AbstractNumber* const ts::AbstractNumber::INVALID
staticinherited

Pointer to an invalid instance of AbstractNumber.

Its toString() method always return an empty string.


The documentation for this class was generated from the following file: