diff options
-rw-r--r-- | src/timer-ns.cpp | 37 | ||||
-rw-r--r-- | src/timer.hpp | 29 |
2 files changed, 47 insertions, 19 deletions
diff --git a/src/timer-ns.cpp b/src/timer-ns.cpp index de60e230..a940e1f5 100644 --- a/src/timer-ns.cpp +++ b/src/timer-ns.cpp @@ -3,11 +3,31 @@ namespace floormat { +namespace { + +#if 1 +constexpr auto MAX = (uint64_t)-1, HALF = MAX/2; + +static_assert(MAX - (MAX-0) <= 0); +static_assert(MAX - (MAX-1) <= 1); +static_assert(MAX - (MAX-2) <= 2); + +static_assert(HALF + HALF + 1 == MAX);; +static_assert(MAX - HALF <= HALF+1); + +//static_assert(MAX - (MAX-1) <= 0); // must fail +//static_assert(MAX - (MAX-2) <= 1); // must fail +//static_assert(MAX - HALF <= HALF); // must fail + +#endif + +} // namespace + Ns operator+(const Ns& lhs, const Ns& rhs) { constexpr auto max = (uint64_t)-1; auto a = lhs.stamp, b = rhs.stamp; - fm_assert(max - a < b); + fm_assert(max - a <= b); return Ns{a + b}; } @@ -18,6 +38,15 @@ Ns operator-(const Ns& lhs, const Ns& rhs) return Ns{a - b}; } +Ns operator*(const Ns& lhs, uint64_t b) +{ + auto a = lhs.stamp; + auto x = a * b; + //fm_assert(!(a != 0 && x / a != b)); + fm_assert(a == 0 || x / a == b); + return Ns{a * b}; +} + uint64_t operator/(const Ns& lhs, const Ns& rhs) { auto a = lhs.stamp, b = rhs.stamp; @@ -25,9 +54,9 @@ uint64_t operator/(const Ns& lhs, const Ns& rhs) return a / b; } -Ns operator%(const Ns& lhs, const Ns& rhs) +Ns operator%(const Ns& lhs, uint64_t b) { - auto a = lhs.stamp, b = rhs.stamp; + auto a = lhs.stamp; fm_assert(b != 0); return Ns{a % b}; } @@ -47,7 +76,5 @@ std::strong_ordering operator<=>(const Ns& lhs, const Ns& rhs) Ns::operator uint64_t() const { return stamp; } Ns::operator float() const { return float(stamp); } uint64_t Ns::operator*() const { return stamp; } -Ns::Ns() : stamp{0} {} -Ns::Ns(uint64_t x) : stamp{x} {} } // namespace floormat diff --git a/src/timer.hpp b/src/timer.hpp index 24818722..6972e372 100644 --- a/src/timer.hpp +++ b/src/timer.hpp @@ -3,28 +3,29 @@ namespace floormat { -struct Ns; - struct Ns { - friend Ns operator+(const Ns& lhs, const Ns& rhs); - friend Ns operator-(const Ns& lhs, const Ns& rhs); - friend uint64_t operator/(const Ns& lhs, const Ns& rhs); - friend Ns operator%(const Ns& lhs, const Ns& rhs); + static constexpr uint64_t Min = 0, Max = (uint64_t)-1; + static constexpr uint64_t Second = 1000000000, Millisecond = 1000000; - friend bool operator==(const Ns& lhs, const Ns& rhs); - friend std::strong_ordering operator<=>(const Ns& lhs, const Ns& rhs); + uint64_t stamp; + + explicit constexpr Ns(): stamp{0} {} + explicit constexpr Ns(uint64_t x) : stamp{x} {} explicit operator uint64_t() const; explicit operator float() const; uint64_t operator*() const; - uint64_t stamp; - static constexpr uint64_t Min = 0, Max = (uint64_t)-1; - static constexpr uint64_t Second = 1000000000, Millisecond = 1000000; - - explicit constexpr Ns(): stamp{0} {} - explicit constexpr Ns(uint64_t x) : stamp{x} {} + friend Ns operator+(const Ns& lhs, const Ns& rhs); + friend Ns operator-(const Ns& lhs, const Ns& rhs); + friend Ns operator*(const Ns& lhs, uint64_t rhs); + friend uint64_t operator/(const Ns& lhs, const Ns& rhs); + friend Ns operator/(const Ns& lhs, uint64_t rhs); + friend uint64_t operator%(const Ns& lhs, const Ns& rhs); + friend Ns operator%(const Ns& lhs, uint64_t rhs); + friend bool operator==(const Ns& lhs, const Ns& rhs); + friend std::strong_ordering operator<=>(const Ns& lhs, const Ns& rhs); }; struct Time final |