diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/object.cpp | 2 | ||||
-rw-r--r-- | src/point.hpp | 3 | ||||
-rw-r--r-- | src/timer-ns.cpp | 71 | ||||
-rw-r--r-- | src/timer-test.cpp | 7 | ||||
-rw-r--r-- | src/timer.cpp | 17 | ||||
-rw-r--r-- | src/timer.hpp | 96 |
6 files changed, 105 insertions, 91 deletions
diff --git a/src/object.cpp b/src/object.cpp index 521fa7b1..82c79d7d 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -303,7 +303,7 @@ uint32_t object::allocate_frame_time(Ns dt, uint16_t& accum, uint32_t hz, float const auto ticks = from_dt + from_accum; const auto frame_duration = ns_in_sec / hz; const auto frames = (uint32_t)(ticks / frame_duration); - const auto rem = (uint32_t)(ticks % frame_duration); + const auto rem = ticks % frame_duration; const auto new_accum_ = rem * u16_max / uint64_t{ns_in_sec}; const auto new_accum = (uint16_t)Math::clamp(new_accum_, uint64_t{0}, u16_max); [[maybe_unused]] const auto old_accum = accum; diff --git a/src/point.hpp b/src/point.hpp index bd9c66ca..3b164ac3 100644 --- a/src/point.hpp +++ b/src/point.hpp @@ -34,6 +34,9 @@ struct point size_t hash() const; friend Debug& operator<<(Debug& dbg, const point& pt); + static constexpr uint32_t distance(point a, point b); + static constexpr uint32_t distance_l2(point a, point b); + private: int16_t cx = 0, cy = 0; int8_t cz = 0; diff --git a/src/timer-ns.cpp b/src/timer-ns.cpp index a705365e..5bc302ff 100644 --- a/src/timer-ns.cpp +++ b/src/timer-ns.cpp @@ -26,73 +26,6 @@ static_assert(MAX - HALF <= HALF+1); } // 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); - return Ns{a + b}; -} - -Ns operator-(const Ns& lhs, const Ns& rhs) -{ - auto a = lhs.stamp, b = rhs.stamp; - fm_assert(a >= b); - return Ns{a - b}; -} - -uint64_t operator/(const Ns& lhs, const Ns& rhs) -{ - auto a = lhs.stamp, b = rhs.stamp; - fm_assert(b != 0); - return a / b; -} - -Ns operator/(const Ns& lhs, uint64_t b) -{ - auto a = lhs.stamp; - fm_assert(b != 0); - return Ns{a / b}; -} - -uint64_t operator%(const Ns& lhs, const Ns& rhs) -{ - auto a = lhs.stamp, b = rhs.stamp; - fm_assert(b != 0); - return a % b; -} - -Ns operator%(const Ns& lhs, uint64_t b) -{ - auto a = lhs.stamp; - fm_assert(b != 0); - return Ns{a % b}; -} - -bool operator==(const Ns& lhs, const Ns& rhs) -{ - auto a = lhs.stamp, b = rhs.stamp; - return a == b; -} - -std::strong_ordering operator<=>(const Ns& lhs, const Ns& rhs) -{ - auto a = lhs.stamp, b = rhs.stamp; - return a <=> b; -} - -Ns Ns::from_millis(uint64_t a) -{ - constexpr auto b = uint64_t(1e6); - const auto x = a * b; - fm_assert(a == 0 || x / a == b); - return Ns{x}; -}; - -Ns::operator uint64_t() const { return stamp; } -Ns::operator float() const { return float(stamp); } -uint64_t Ns::operator*() const { return stamp; } - Debug& operator<<(Debug& dbg, const Ns& box) { const auto value = (float)((double)box.stamp * 1e-6); @@ -109,10 +42,10 @@ Debug& operator<<(Debug& dbg, const Ns& box) auto flags = dbg.flags(); dbg << ""; dbg.setFlags(flags | Debug::Flag::NoSpace); - dbg << "{"; + //dbg << "{"; dbg << fraction(value, precision); dbg << " ms"; - dbg << "}"; + //dbg << "}"; dbg.setFlags(flags); return dbg; } diff --git a/src/timer-test.cpp b/src/timer-test.cpp new file mode 100644 index 00000000..e23443b7 --- /dev/null +++ b/src/timer-test.cpp @@ -0,0 +1,7 @@ +#include "timer.hpp" + +namespace floormat { + + + +} // namespace floormat diff --git a/src/timer.cpp b/src/timer.cpp index 8e9ed917..f67d7324 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -46,8 +46,21 @@ uint64_t Time::init() noexcept { return get_time(); } bool Time::operator==(const Time&) const noexcept = default; std::strong_ordering Time::operator<=>(const Time&) const noexcept = default; -float Time::to_seconds(const Ns& ts) noexcept { return float{ts} * 1e-9f; } -float Time::to_milliseconds(const Ns& ts) noexcept { return float{ts} * 1e-6f; } +double Time::to_seconds(const Ns& ts) noexcept +{ + auto x1 = double{ts}; + auto x2 = x1 * 1e-9; + fm_assert(x2 < double{1 << 24}); + return (float)x2; +} + +double Time::to_milliseconds(const Ns& ts) noexcept +{ + auto x1 = double{ts}; + auto x2 = x1 * 1e-6; + fm_assert(x2 < double{1 << 24}); + return (float)x2; +} const char* format_datetime_to_string(char (&buf)[fm_DATETIME_BUF_SIZE]) { diff --git a/src/timer.hpp b/src/timer.hpp index 45c41459..1350899b 100644 --- a/src/timer.hpp +++ b/src/timer.hpp @@ -8,20 +8,40 @@ struct Ns { explicit constexpr Ns(): stamp{0} {} explicit constexpr Ns(uint64_t x) : stamp{x} {} - static Ns from_millis(uint64_t x); + explicit constexpr operator uint64_t() const { return stamp; } + explicit constexpr operator double() const { return stamp; } + explicit constexpr operator float() const = delete; - explicit operator uint64_t() const; - explicit operator float() const; - uint64_t operator*() const; + static constexpr Ns from_millis(uint64_t a) + { + constexpr auto b = uint64_t(1e6); + const auto x = a * b; + fm_assert(a == 0 || x / a == b); + return Ns{x}; + } + + // ----- - friend Ns operator+(const Ns& lhs, const Ns& rhs); - friend Ns operator-(const Ns& lhs, const Ns& rhs); + friend constexpr 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); + return Ns{a + b}; + } + + friend constexpr Ns operator-(const Ns& lhs, const Ns& rhs) + { + auto a = lhs.stamp, b = rhs.stamp; + fm_assert(a >= b); + return Ns{a - b}; + } friend Ns operator*(const Ns&, const Ns&) = delete; template<typename T> requires (std::is_integral_v<T> && std::is_unsigned_v<T>) - friend Ns operator*(const Ns& lhs, T rhs) + friend constexpr Ns operator*(const Ns& lhs, T rhs) { auto a = lhs.stamp, b = uint64_t{rhs}; auto x = a * b; @@ -31,18 +51,18 @@ struct Ns template<typename T> requires (std::is_integral_v<T> && std::is_signed_v<T> && sizeof(T) < sizeof(uint64_t)) - friend Ns operator*(const Ns& lhs, T rhs) + friend constexpr Ns operator*(const Ns& lhs, T rhs) { fm_assert(rhs >= T{0}); return lhs * uint64_t(rhs); } template<typename T> - friend Ns operator*(T lhs, const Ns& rhs) { return rhs * lhs; } + friend constexpr Ns operator*(T lhs, const Ns& rhs) { return rhs * lhs; } template<typename T> requires std::is_same_v<float, T> - friend Ns operator*(const Ns& lhs, T rhs) + friend constexpr Ns operator*(const Ns& lhs, T rhs) { auto a = lhs.stamp; auto x = float(a) * float{rhs}; @@ -52,15 +72,53 @@ struct Ns template<typename T> requires std::is_same_v<float, T> - friend Ns operator*(T lhs, const Ns& rhs) { return rhs * lhs; } + friend constexpr Ns operator*(T lhs, const Ns& rhs) { return rhs * lhs; } + + friend constexpr uint64_t operator/(const Ns& lhs, const Ns& rhs) + { + auto a = lhs.stamp, b = rhs.stamp; + fm_assert(b != 0); + return a / b; + } - 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 constexpr Ns operator/(const Ns& lhs, uint64_t b) + { + auto a = lhs.stamp; + fm_assert(b != 0); + return Ns{a / b}; + } + + friend constexpr uint64_t operator%(const Ns& lhs, const Ns& rhs) + { + auto a = lhs.stamp, b = rhs.stamp; + fm_assert(b != 0); + return a % b; + } + + friend constexpr Ns operator%(const Ns& lhs, uint64_t b) + { + auto a = lhs.stamp; + fm_assert(b != 0); + return Ns{a % b}; + } + + friend constexpr Ns& operator+=(Ns& lhs, const Ns& rhs) + { + constexpr auto max = (uint64_t)-1; + auto b = rhs.stamp; + fm_assert(max - lhs.stamp >= b); + lhs.stamp += b; + return lhs; + } + + friend constexpr bool operator==(const Ns& lhs, const Ns& rhs) = default; + + friend constexpr std::strong_ordering operator<=>(const Ns& lhs, const Ns& rhs) + { + auto a = lhs.stamp, b = rhs.stamp; + return a <=> b; + } - friend bool operator==(const Ns& lhs, const Ns& rhs); - friend std::strong_ordering operator<=>(const Ns& lhs, const Ns& rhs); friend Debug& operator<<(Debug& dbg, const Ns& box); uint64_t stamp; @@ -76,8 +134,8 @@ struct Time final friend Ns operator-(const Time& lhs, const Time& rhs) noexcept; [[nodiscard]] Ns update(const Time& ts = now()) & noexcept; - static float to_seconds(const Ns& ts) noexcept; - static float to_milliseconds(const Ns& ts) noexcept; + static double to_seconds(const Ns& ts) noexcept; + static double to_milliseconds(const Ns& ts) noexcept; uint64_t stamp = init(); |