jaulib v1.4.0-2-g788cf73
Jau Support Library (C++, Java, ..)
Loading...
Searching...
No Matches
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

struct  jau::FracI64SizeBoolTuple
 Simple pre-defined value pair [fraction_i64, size_t, bool] for structured bindings to multi-values. More...
 
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
 
typedef fraction< uint64_t > jau::fraction_u64
 fraction using uint64_t as integral type
 
typedef ordered_atomic< jau::fraction_i64, std::memory_order_relaxed > jau::relaxed_atomic_fraction_i64
 Relaxed non-SC atomic integral scalar jau::fraction_i64.
 
typedef ordered_atomic< jau::fraction_u64, std::memory_order_relaxed > jau::relaxed_atomic_fraction_u64
 Relaxed non-SC atomic integral scalar jau::fraction_u64.
 
typedef ordered_atomic< jau::fraction_i64, std::memory_order_seq_cst > jau::sc_atomic_fraction_i64
 SC atomic integral scalar jau::fraction_i64.
 
typedef ordered_atomic< jau::fraction_u64, std::memory_order_seq_cst > jau::sc_atomic_fraction_u64
 SC atomic integral scalar jau::fraction_u64.
 

Functions

template<typename int_type>
constexpr fraction< int_type > jau::abs (const fraction< int_type > &rhs) noexcept
 Returns the absolute fraction.
 
constexpr fraction_timespec jau::abs (const fraction_timespec &rhs) noexcept
 Returns the absolute fraction_timespec.
 
fraction_timespec jau::getMonotonicTime () noexcept
 Returns current monotonic time since Unix Epoch 00:00:00 UTC on 1970-01-01.
 
fraction_timespec jau::getWallClockTime () noexcept
 Returns current wall-clock real-time since Unix Epoch 00:00:00 UTC on 1970-01-01.
 
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.
 
constexpr const fraction_timespecjau::max (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Return the maximum of the two given fraction_timespec.
 
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.
 
constexpr const fraction_timespecjau::min (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Return the minimum of the two given fraction_timespec.
 
template<typename int_type>
constexpr bool jau::operator!= (const fraction< int_type > &lhs, const fraction< int_type > &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.
 
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.
 
constexpr fraction_timespec jau::operator* (const fraction_timespec &lhs, const int64_t rhs) noexcept
 Returns product of fraction_timespec * scalar.
 
constexpr fraction_timespec jau::operator* (const int64_t lhs, const fraction_timespec &rhs) noexcept
 Returns product of scalar * fraction_timespec.
 
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.
 
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.
 
constexpr fraction_timespec jau::operator+ (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Returns sum of two fraction_timespec.
 
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.
 
constexpr fraction_timespec jau::operator- (const fraction_timespec &lhs, const fraction_timespec &rhs) noexcept
 Returns difference of two fraction_timespec.
 
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.
 
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.
 
constexpr fraction_timespec jau::operator/ (const fraction_timespec &lhs, const int64_t rhs) noexcept
 Returns fraction of fraction_timespec / scalar.
 
constexpr fraction_timespec jau::operator/ (const int64_t lhs, const fraction_timespec &rhs) noexcept
 Returns fraction of scalar / fraction_timespec.
 
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.
 
template<typename int_type>
constexpr bool jau::operator< (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
template<typename int_type>
constexpr bool jau::operator<= (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
template<typename int_type>
constexpr bool jau::operator== (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
template<typename int_type>
constexpr bool jau::operator> (const fraction< int_type > &lhs, const fraction< int_type > &rhs) noexcept
 
template<typename int_type>
constexpr bool jau::operator>= (const fraction< int_type > &lhs, const fraction< int_type > &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.
 
constexpr snsize_t jau::sign (const fraction_timespec &rhs) noexcept
 Returns the value of the sign function applied to tv_sec.
 
FracI64SizeBoolTuple jau::to_fraction_i64 (const std::string &value, const fraction_i64 &min_allowed, const fraction_i64 &max_allowed) noexcept
 Returns the fraction_i64 of the given string in format <num>/<denom>, which may contain whitespace.
 
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 737 of file fraction_type.hpp.

◆ fraction_u64

typedef fraction<uint64_t> jau::fraction_u64

fraction using uint64_t as integral type

Definition at line 769 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 1306 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 1309 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 1312 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 1315 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 66 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 72 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 547 of file fraction_type.hpp.

◆ operator!=()

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

Definition at line 550 of file fraction_type.hpp.

◆ operator==()

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

Definition at line 555 of file fraction_type.hpp.

◆ operator>()

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

Definition at line 560 of file fraction_type.hpp.

◆ operator>=()

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

Definition at line 565 of file fraction_type.hpp.

◆ operator<()

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

Definition at line 570 of file fraction_type.hpp.

◆ operator<=()

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

Definition at line 575 of file fraction_type.hpp.

◆ max() [1/2]

template<typename int_type>
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 581 of file fraction_type.hpp.

◆ min() [1/2]

template<typename int_type>
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 587 of file fraction_type.hpp.

◆ sign() [1/2]

template<typename int_type>
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 601 of file fraction_type.hpp.

◆ abs() [1/2]

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

Returns the absolute fraction.

Definition at line 609 of file fraction_type.hpp.

◆ operator*() [1/5]

template<typename int_type>
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 626 of file fraction_type.hpp.

◆ operator*() [2/5]

template<typename int_type>
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 641 of file fraction_type.hpp.

◆ operator/() [1/5]

template<typename int_type>
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 653 of file fraction_type.hpp.

◆ operator/() [2/5]

template<typename int_type>
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 666 of file fraction_type.hpp.

◆ operator+() [1/2]

template<typename int_type>
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 682 of file fraction_type.hpp.

◆ operator-() [1/2]

template<typename int_type>
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 699 of file fraction_type.hpp.

◆ operator*() [3/5]

template<typename int_type>
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 716 of file fraction_type.hpp.

◆ operator/() [3/5]

template<typename int_type>
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 730 of file fraction_type.hpp.

◆ to_fraction_i64()

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

Returns the fraction_i64 of the given string 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, complete=false is being returned.

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

You may use C++17 structured bindings to handle the tuple.

Parameters
valuethe string value
min_allowedthe minimum allowed value
max_allowedthe maximum allowed value
Returns
tuple [fraction_i64 result, size_t consumed_chars, bool complete], i.e. complete is true if value has been accepted, otherwise false

Definition at line 960 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 1186 of file fraction_type.hpp.

◆ max() [2/2]

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 1189 of file fraction_type.hpp.

◆ min() [2/2]

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 1194 of file fraction_type.hpp.

◆ sign() [2/2]

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 1207 of file fraction_type.hpp.

◆ abs() [2/2]

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

Returns the absolute fraction_timespec.

Definition at line 1214 of file fraction_type.hpp.

◆ operator+() [2/2]

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 1228 of file fraction_type.hpp.

◆ operator-() [2/2]

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 1243 of file fraction_type.hpp.

◆ operator*() [4/5]

fraction_timespec jau::operator* ( const fraction_timespec & lhs,
const int64_t rhs )
constexprnoexcept

Returns product of fraction_timespec * scalar.

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

Definition at line 1256 of file fraction_type.hpp.

◆ operator*() [5/5]

fraction_timespec jau::operator* ( const int64_t lhs,
const fraction_timespec & rhs )
constexprnoexcept

Returns product of scalar * fraction_timespec.

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

Definition at line 1268 of file fraction_type.hpp.

◆ operator/() [4/5]

fraction_timespec jau::operator/ ( const fraction_timespec & lhs,
const int64_t rhs )
constexprnoexcept

Returns fraction of fraction_timespec / scalar.

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

Definition at line 1280 of file fraction_type.hpp.

◆ operator/() [5/5]

fraction_timespec jau::operator/ ( const int64_t lhs,
const fraction_timespec & rhs )
constexprnoexcept

Returns fraction of scalar / fraction_timespec.

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

Definition at line 1292 of file fraction_type.hpp.