jaulib v1.3.0
Jau Support Library (C++, Java, ..)
Namespaces | Classes | Typedefs | Functions
Fraction Arithmetic and Time

Fraction type and arithmetic support inclusive its utilization for time without loss of precision nor range. More...

Namespaces

namespace  jau::fraction_tv
 
namespace  jau::fractions_i64
 fractions namespace to provide fraction constants using int64_t as underlying integral integer type.
 
namespace  jau::fractions_i64_literals
 

Classes

class  jau::fraction< Int_type, >
 Fraction template type using integral values, evaluated at runtime. More...
 
struct  jau::fraction_timespec
 Timespec structure using int64_t for its components in analogy to struct timespec_t on 64-bit platforms. More...
 

Typedefs

typedef fraction< int64_t > jau::fraction_i64
 fraction using int64_t as integral type More...
 
typedef fraction< uint64_t > jau::fraction_u64
 fraction using uint64_t as integral type More...
 
typedef ordered_atomic< jau::fraction_i64, std::memory_order_relaxed > jau::relaxed_atomic_fraction_i64
 Relaxed non-SC atomic integral scalar jau::fraction_i64. More...
 
typedef ordered_atomic< jau::fraction_u64, std::memory_order_relaxed > jau::relaxed_atomic_fraction_u64
 Relaxed non-SC atomic integral scalar jau::fraction_u64. More...
 
typedef ordered_atomic< jau::fraction_i64, std::memory_order_seq_cst > jau::sc_atomic_fraction_i64
 SC atomic integral scalar jau::fraction_i64. More...
 
typedef ordered_atomic< jau::fraction_u64, std::memory_order_seq_cst > jau::sc_atomic_fraction_u64
 SC atomic integral scalar jau::fraction_u64. More...
 

Functions

template<typename int_type >
constexpr fraction< int_type > jau::abs (const fraction< int_type > &rhs) noexcept
 Returns the absolute fraction. More...
 
constexpr fraction_timespec jau::abs (const fraction_timespec &rhs) noexcept
 Returns the absolute fraction_timespec. More...
 
fraction_timespec jau::getMonotonicTime () noexcept
 Returns current monotonic time since Unix Epoch 00:00:00 UTC on 1970-01-01. More...
 
fraction_timespec jau::getWallClockTime () noexcept
 Returns current wall-clock real-time since Unix Epoch 00:00:00 UTC on 1970-01-01. More...
 
template<typename int_type >
constexpr const fraction< int_type > & jau::max (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 Return the maximum of the two given fractions. More...
 
constexpr const fraction_timespecjau::max (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Return the maximum of the two given fraction_timespec. More...
 
template<typename int_type >
constexpr const fraction< int_type > & jau::min (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 Return the minimum of the two given fractions. More...
 
constexpr const fraction_timespecjau::min (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Return the minimum of the two given fraction_timespec. More...
 
template<typename int_type >
constexpr bool jau::operator!= (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
constexpr bool jau::operator!= (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 
template<typename int_type >
constexpr fraction< int_type > jau::operator* (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 Returns product of two fraction. More...
 
template<typename int_type >
constexpr fraction< int_type > jau::operator* (const fraction< int_type > &lhs, const int_type &rhs) noexcept
 Returns multiplication of fraction with scalar. More...
 
template<typename int_type >
constexpr fraction< int_type > jau::operator* (const int_type &lhs, const fraction< int_type > &rhs) noexcept
 Returns multiplication of fraction with scalar. More...
 
template<typename int_type >
constexpr fraction< int_type > jau::operator+ (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 Returns sum of two fraction. More...
 
constexpr fraction_timespec jau::operator+ (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Returns sum of two fraction_timespec. More...
 
template<typename int_type >
constexpr fraction< int_type > jau::operator- (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 Returns difference of two fraction. More...
 
constexpr fraction_timespec jau::operator- (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Returns difference of two fraction_timespec. More...
 
template<typename int_type >
constexpr fraction< int_type > jau::operator/ (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 Returns division of two fraction. More...
 
template<typename int_type >
constexpr fraction< int_type > jau::operator/ (const fraction< int_type > &lhs, const int_type &rhs) noexcept
 Returns division of fraction with scalar. More...
 
template<typename int_type >
constexpr fraction< int_type > jau::operator/ (const int_type &lhs, const fraction< int_type > &rhs) noexcept
 Returns division of fraction with scalar. More...
 
template<typename int_type >
constexpr bool jau::operator< (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
constexpr bool jau::operator< (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 
template<typename int_type >
constexpr bool jau::operator<= (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
constexpr bool jau::operator<= (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 
template<typename int_type >
constexpr bool jau::operator== (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
constexpr bool jau::operator== (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 
template<typename int_type >
constexpr bool jau::operator> (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
constexpr bool jau::operator> (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 
template<typename int_type >
constexpr bool jau::operator>= (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
constexpr bool jau::operator>= (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 
template<typename int_type >
constexpr snsize_t jau::sign (const fraction< int_type > &rhs) noexcept
 Returns the value of the sign function applied to numerator. More...
 
constexpr snsize_t jau::sign (const fraction_timespec &rhs) noexcept
 Returns the value of the sign function applied to tv_sec. More...
 
bool jau::to_fraction_i64 (fraction_i64 &result, const std::string &value, const fraction_i64 &min_allowed, const fraction_i64 &max_allowed) noexcept
 Stores the fraction_i64 value of the given string value in format <num>/<denom>, which may contain whitespace. More...
 
template<typename int_type >
std::string jau::to_string (const fraction< int_type > &v) noexcept
 
std::string jau::to_string (const fraction_timespec &v) noexcept
 

Detailed Description

Fraction type and arithmetic support inclusive its utilization for time without loss of precision nor range.

Adds support for Concurrency with general time functionality like sleep_until(), sleep_for(), wait_until() and wait_for(), completed with getMonotonicTime() and getWallClockTime().

Typedef Documentation

◆ fraction_i64

typedef fraction<int64_t> jau::fraction_i64

fraction using int64_t as integral type

Definition at line 746 of file fraction_type.hpp.

◆ fraction_u64

typedef fraction<uint64_t> jau::fraction_u64

fraction using uint64_t as integral type

Definition at line 768 of file fraction_type.hpp.

◆ sc_atomic_fraction_i64

typedef ordered_atomic<jau::fraction_i64, std::memory_order_seq_cst> jau::sc_atomic_fraction_i64

SC atomic integral scalar jau::fraction_i64.

Memory-Model (MM) guaranteed sequential consistency (SC) between acquire (read) and release (write). Requires libatomic with libstdc++10.

Definition at line 1140 of file fraction_type.hpp.

◆ relaxed_atomic_fraction_i64

Relaxed non-SC atomic integral scalar jau::fraction_i64.

Memory-Model (MM) only guarantees the atomic value, no sequential consistency (SC) between acquire (read) and release (write). Requires libatomic with libstdc++10.

Definition at line 1143 of file fraction_type.hpp.

◆ sc_atomic_fraction_u64

typedef ordered_atomic<jau::fraction_u64, std::memory_order_seq_cst> jau::sc_atomic_fraction_u64

SC atomic integral scalar jau::fraction_u64.

Memory-Model (MM) guaranteed sequential consistency (SC) between acquire (read) and release (write). Requires libatomic with libstdc++10.

Definition at line 1146 of file fraction_type.hpp.

◆ relaxed_atomic_fraction_u64

Relaxed non-SC atomic integral scalar jau::fraction_u64.

Memory-Model (MM) only guarantees the atomic value, no sequential consistency (SC) between acquire (read) and release (write). Requires libatomic with libstdc++10.

Definition at line 1149 of file fraction_type.hpp.

Function Documentation

◆ getMonotonicTime()

fraction_timespec jau::getMonotonicTime ( )
noexcept

Returns current monotonic time since Unix Epoch 00:00:00 UTC on 1970-01-01.

See http://man7.org/linux/man-pages/man2/clock_gettime.2.html

Returned fraction_timespec is passing machine precision and range of the underlying API.

See fraction_timespec::to_fraction_i64() of how to measure duration in high range and precision:

  fraction_timespec t0 = getMonotonicTime();
  // do something

  // Exact duration
  fraction_timespec td_1 = getMonotonicTime() - t0;

  // or for durations <= 292 years
  fraction_i64 td_2 = (getMonotonicTime() - t0).to_fraction_i64();

This is in stark contract to counting nanoseconds in int64_t which only lasts until 2262-04-12, since INT64_MAX is 9'223'372'036'854'775'807 for 9'223'372'036 seconds or 292 years.

Monotonic time shall be used for high-performance measurements of durations, since the underlying OS shall support fast calls.

See also
fraction_timespec
fraction_timespec::to_fraction_i64()
getWallClockTime()

Regarding avoiding kernel via VDSO, see http://man7.org/linux/man-pages/man7/vdso.7.html, clock_gettime seems to be well supported at least on kernel >= 4.4. Only bfin and sh are missing, while ia64 seems to be complicated.

Definition at line 52 of file basic_types.cpp.

Here is the caller graph for this function:

◆ getWallClockTime()

fraction_timespec jau::getWallClockTime ( )
noexcept

Returns current wall-clock real-time since Unix Epoch 00:00:00 UTC on 1970-01-01.

Returned fraction_timespec is passing machine precision and range of the underlying API.

Wall-Clock time shall be used for accurate measurements of the actual time only, since the underlying OS unlikely supports fast calls.

See also
fraction_timespec
fraction_timespec::to_fraction_i64()
getMonotonicTime()

Definition at line 58 of file basic_types.cpp.

Here is the caller graph for this function:

◆ to_string() [1/2]

template<typename int_type >
std::string jau::to_string ( const fraction< int_type > &  v)
inlinenoexcept

Definition at line 556 of file fraction_type.hpp.

◆ operator!=() [1/2]

template<typename int_type >
constexpr bool jau::operator!= ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Definition at line 559 of file fraction_type.hpp.

◆ operator==() [1/2]

template<typename int_type >
constexpr bool jau::operator== ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Definition at line 564 of file fraction_type.hpp.

◆ operator>() [1/2]

template<typename int_type >
constexpr bool jau::operator> ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Definition at line 569 of file fraction_type.hpp.

◆ operator>=() [1/2]

template<typename int_type >
constexpr bool jau::operator>= ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Definition at line 574 of file fraction_type.hpp.

◆ operator<() [1/2]

template<typename int_type >
constexpr bool jau::operator< ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Definition at line 579 of file fraction_type.hpp.

◆ operator<=() [1/2]

template<typename int_type >
constexpr bool jau::operator<= ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Definition at line 584 of file fraction_type.hpp.

◆ max() [1/2]

template<typename int_type >
constexpr const fraction< int_type > & jau::max ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Return the maximum of the two given fractions.

Definition at line 590 of file fraction_type.hpp.

◆ min() [1/2]

template<typename int_type >
constexpr const fraction< int_type > & jau::min ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Return the minimum of the two given fractions.

Definition at line 596 of file fraction_type.hpp.

◆ sign() [1/2]

template<typename int_type >
constexpr snsize_t jau::sign ( const fraction< int_type > &  rhs)
constexprnoexcept

Returns the value of the sign function applied to numerator.

-1 for numerator < 0
 0 for numerator = 0
 1 for numerator > 0
Returns
function result

Definition at line 610 of file fraction_type.hpp.

◆ abs() [1/2]

template<typename int_type >
constexpr fraction< int_type > jau::abs ( const fraction< int_type > &  rhs)
constexprnoexcept

Returns the absolute fraction.

Definition at line 618 of file fraction_type.hpp.

◆ operator*() [1/3]

template<typename int_type >
constexpr fraction< int_type > jau::operator* ( const fraction< int_type > &  lhs,
const int_type &  rhs 
)
constexprnoexcept

Returns multiplication of fraction with scalar.

Operation may set the overflow flag in the returned instance, if occurring.

Template Parameters
int_typeintegral type
Parameters
lhsthe fraction
rhsthe scalar
Returns
resulting new fraction, reduced

Definition at line 635 of file fraction_type.hpp.

◆ operator*() [2/3]

template<typename int_type >
constexpr fraction< int_type > jau::operator* ( const int_type &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Returns multiplication of fraction with scalar.

Operation may set the overflow flag in the returned instance, if occurring.

Template Parameters
int_typeintegral type
Parameters
lhsthe scalar
rhsthe fraction
Returns
resulting new fraction, reduced

Definition at line 650 of file fraction_type.hpp.

◆ operator/() [1/3]

template<typename int_type >
constexpr fraction< int_type > jau::operator/ ( const fraction< int_type > &  lhs,
const int_type &  rhs 
)
constexprnoexcept

Returns division of fraction with scalar.

Template Parameters
int_typeintegral type
Parameters
lhsthe fraction
rhsthe scalar
Returns
resulting new fraction, reduced

Definition at line 662 of file fraction_type.hpp.

◆ operator/() [2/3]

template<typename int_type >
constexpr fraction< int_type > jau::operator/ ( const int_type &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Returns division of fraction with scalar.

Template Parameters
int_typeintegral type
Parameters
lhsthe scalar
rhsthe fraction
Returns
resulting new fraction, reduced

Definition at line 675 of file fraction_type.hpp.

◆ operator+() [1/2]

template<typename int_type >
constexpr fraction< int_type > jau::operator+ ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Returns sum of two fraction.

Operation may set the overflow flag in the returned instance, if occurring.

Template Parameters
int_typeintegral type
Parameters
lhsa fraction
rhsa fraction
Returns
resulting new fraction, reduced

Definition at line 691 of file fraction_type.hpp.

◆ operator-() [1/2]

template<typename int_type >
constexpr fraction< int_type > jau::operator- ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Returns difference of two fraction.

Operation may set the overflow flag in the returned instance, if occurring.

Template Parameters
int_typeintegral type
Parameters
lhsa fraction
rhsa fraction
Returns
resulting new fraction, reduced

Definition at line 708 of file fraction_type.hpp.

◆ operator*() [3/3]

template<typename int_type >
constexpr fraction< int_type > jau::operator* ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Returns product of two fraction.

Operation may set the overflow flag in the returned instance, if occurring.

Template Parameters
int_typeintegral type
Parameters
lhsa fraction
rhsa fraction
Returns
resulting new fraction, reduced

Definition at line 725 of file fraction_type.hpp.

◆ operator/() [3/3]

template<typename int_type >
constexpr fraction< int_type > jau::operator/ ( const fraction< int_type > &  lhs,
const fraction< int_type > &  rhs 
)
constexprnoexcept

Returns division of two fraction.

Template Parameters
int_typeintegral type
Parameters
lhsa fraction
rhsa fraction
Returns
resulting new fraction, reduced

Definition at line 739 of file fraction_type.hpp.

◆ to_fraction_i64()

bool jau::to_fraction_i64 ( fraction_i64 result,
const std::string &  value,
const fraction_i64 min_allowed,
const fraction_i64 max_allowed 
)
noexcept

Stores the fraction_i64 value of the given string value in format <num>/<denom>, which may contain whitespace.

It the given string value does not conform with the format or exceeds the given value range, false is being returned.

If the given string value has been accepted, it is stored in the result reference and true is being returned.

Parameters
resultstorage for result is value is parsed successfully and within range.
valuethe string value
min_allowedthe minimum allowed value
max_allowedthe maximum allowed value
Returns
true if value has been accepted, otherwise false

Definition at line 591 of file basic_types.cpp.

Here is the caller graph for this function:

◆ to_string() [2/2]

std::string jau::to_string ( const fraction_timespec v)
inlinenoexcept

Definition at line 1044 of file fraction_type.hpp.

Here is the caller graph for this function:

◆ operator!=() [2/2]

constexpr bool jau::operator!= ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Definition at line 1047 of file fraction_type.hpp.

◆ operator==() [2/2]

constexpr bool jau::operator== ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Definition at line 1051 of file fraction_type.hpp.

◆ operator>() [2/2]

constexpr bool jau::operator> ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Definition at line 1055 of file fraction_type.hpp.

◆ operator>=() [2/2]

constexpr bool jau::operator>= ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Definition at line 1059 of file fraction_type.hpp.

◆ operator<() [2/2]

constexpr bool jau::operator< ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Definition at line 1063 of file fraction_type.hpp.

◆ operator<=() [2/2]

constexpr bool jau::operator<= ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Definition at line 1067 of file fraction_type.hpp.

◆ max() [2/2]

constexpr const fraction_timespec & jau::max ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Return the maximum of the two given fraction_timespec.

Definition at line 1072 of file fraction_type.hpp.

Here is the caller graph for this function:

◆ min() [2/2]

constexpr const fraction_timespec & jau::min ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Return the minimum of the two given fraction_timespec.

Definition at line 1077 of file fraction_type.hpp.

Here is the caller graph for this function:

◆ sign() [2/2]

constexpr snsize_t jau::sign ( const fraction_timespec rhs)
constexprnoexcept

Returns the value of the sign function applied to tv_sec.

-1 for numerator < 0
 0 for numerator = 0
 1 for numerator > 0
Returns
function result

Definition at line 1090 of file fraction_type.hpp.

◆ abs() [2/2]

constexpr fraction_timespec jau::abs ( const fraction_timespec rhs)
constexprnoexcept

Returns the absolute fraction_timespec.

Definition at line 1097 of file fraction_type.hpp.

◆ operator+() [2/2]

constexpr fraction_timespec jau::operator+ ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Returns sum of two fraction_timespec.

Parameters
lhsa fraction_timespec
rhsa fraction_timespec
Returns
resulting new fraction_timespec, each component reduced and both fraction_timespec::normalize() 'ed

Definition at line 1111 of file fraction_type.hpp.

◆ operator-() [2/2]

constexpr fraction_timespec jau::operator- ( const fraction_timespec lhs,
const fraction_timespec rhs 
)
constexprnoexcept

Returns difference of two fraction_timespec.

See fraction_timespec::to_fraction_i64().

Parameters
lhsa fraction_timespec
rhsa fraction_timespec
Returns
resulting new fraction_timespec, each component reduced and both fraction_timespec::normalize() 'ed

Definition at line 1126 of file fraction_type.hpp.