diff --git a/mock/lib-time-mocks.cpp b/mock/lib-time-mocks.cpp index 601012a..6619b63 100644 --- a/mock/lib-time-mocks.cpp +++ b/mock/lib-time-mocks.cpp @@ -7,9 +7,9 @@ efitimeus_t getTimeNowUs() { } efitimesec_t getTimeNowS() { - return getTimeNowUs() / 1000 / 1000; + return static_cast(getTimeNowUs()) / 1000 / 1000; } efitick_t getTimeNowNt() { - return getTimeNowUs() * US_TO_NT_MULTIPLIER; + return (static_cast(getTimeNowUs())) * US_TO_NT_MULTIPLIER; } diff --git a/util/include/rusefi/rusefi_time_types.h b/util/include/rusefi/rusefi_time_types.h index 2406f02..ace3451 100644 --- a/util/include/rusefi/rusefi_time_types.h +++ b/util/include/rusefi/rusefi_time_types.h @@ -5,6 +5,16 @@ #include #include +#include "tagged_numeric.h" + +enum class time_unit { + MICROSECOND, +}; + +template struct timestamp_tag_s { + using value_type = arithmetic_value_type; +}; + /** * We use a signed type here so that subtraction result is a proper negative value. * A typical use-case negative result is when we do 'timeNow() - timeOfEvent' where timeOfEvent @@ -24,7 +34,7 @@ using efitick_t = int64_t; /** * 64 bit time in microseconds (1/1_000_000 of a second), since boot */ -using efitimeus_t = int64_t; +using efitimeus_t = tagged_numeric_t>; // time in seconds using efitimesec_t = time_t; @@ -55,4 +65,7 @@ efitick_t getTimeNowNt(); #define US_PER_SECOND_LL 1000000LL #define MS2US(MS_TIME) ((MS_TIME) * 1000) -#define US2MS(US_TIME) ((US_TIME) / 1000) + +inline int US2MS(const efitimeus_t& timeus) { + return static_cast(timeus) / 1000; +} diff --git a/util/include/rusefi/tagged_numeric.h b/util/include/rusefi/tagged_numeric.h new file mode 100644 index 0000000..e71882c --- /dev/null +++ b/util/include/rusefi/tagged_numeric.h @@ -0,0 +1,32 @@ +// +// Created by kifir on 4/25/24. +// + +#pragma once + +#include + +template class tagged_numeric_t { +public: + using value_type = typename tag_type::value_type; + + tagged_numeric_t(); + tagged_numeric_t(const value_type& val); // implicit to allow init from numeric value (for backward compatibility) + + explicit operator value_type() const; + explicit operator int() const; + explicit operator float() const; + + bool operator ==(const tagged_numeric_t& val) const; + bool operator ==(const value_type& val) const; + bool operator !=(const value_type& val) const; + bool operator >(const tagged_numeric_t& val) const; + + tagged_numeric_t operator -(const tagged_numeric_t& val) const; + tagged_numeric_t operator +(const tagged_numeric_t& val) const; + tagged_numeric_t operator +(const int& val) const; +private: + value_type value; +}; + +#include "tagged_numeric.inl" diff --git a/util/include/rusefi/tagged_numeric.inl b/util/include/rusefi/tagged_numeric.inl new file mode 100644 index 0000000..2f966bc --- /dev/null +++ b/util/include/rusefi/tagged_numeric.inl @@ -0,0 +1,63 @@ +template +tagged_numeric_t::tagged_numeric_t() + : tagged_numeric_t(0) { +} + +template +tagged_numeric_t::tagged_numeric_t(const value_type& val) + : value(val) { + static_assert(std::is_arithmetic_v); + static_assert(sizeof(tagged_numeric_t) == sizeof(value_type)); +} + +template +tagged_numeric_t::operator value_type() const { + return value; +} + +template +tagged_numeric_t::operator int() const { + return static_cast(value); +} + +template +tagged_numeric_t::operator float() const { + return static_cast(value); +} + +template +bool tagged_numeric_t::operator ==(const tagged_numeric_t& val) const { + return value == val; +} + +template +bool tagged_numeric_t::operator ==(const value_type& val) const { + return value == val; +} + +template +bool tagged_numeric_t::operator !=(const value_type& val) const { + return value != val; +} + +template +bool tagged_numeric_t::operator >(const tagged_numeric_t& val) const { + return value > val.value; +} + +template +tagged_numeric_t tagged_numeric_t::operator -( + const tagged_numeric_t& val +) const { + return tagged_numeric_t(value - val.value); +} + +template +tagged_numeric_t tagged_numeric_t::operator +(const tagged_numeric_t& val) const { + return tagged_numeric_t(value + val.value); +} + +template +tagged_numeric_t tagged_numeric_t::operator +(const int& val) const { + return tagged_numeric_t(value + val); +} diff --git a/util/src/tagged_numeric.cpp b/util/src/tagged_numeric.cpp new file mode 100644 index 0000000..3be3205 --- /dev/null +++ b/util/src/tagged_numeric.cpp @@ -0,0 +1,5 @@ +// +// Created by kifir on 4/25/24. +// + +#include "tagged_numeric.h"