summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/timer-ns.cpp37
-rw-r--r--src/timer.hpp29
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