27 constexpr explicit operator bool() const noexcept {
47 std::uint64_t hit_count) noexcept
51 hit_count_(hit_count) {}
59 if (error_ >= hit_count_ - remainder_) {
61 error_ -= hit_count_ - remainder_;
68 std::uint64_t coordinate_ = 0;
69 std::uint64_t step_ = 0;
70 std::uint64_t remainder_ = 0;
71 std::uint64_t hit_count_ = 1;
72 std::uint64_t error_ = 0;
85template <std::
size_t MaximumHits = 64>
86[[nodiscard]]
constexpr RatchetProjectionResult
89 std::span<TickPosition> output)
noexcept {
90 static_assert(MaximumHits > 0,
"ratchet capacity must be positive");
91 static_assert(MaximumHits <= std::numeric_limits<std::uint64_t>::max(),
92 "ratchet capacity must fit the subdivision domain");
94 if (interval_end <= interval_begin)
98 if (hit_count > MaximumHits)
102 if (
static_cast<std::uint64_t
>(hit_count) > interval_span)
104 if (window_end < window_begin)
107 const auto count_visible = [&]()
constexpr noexcept {
108 std::size_t event_count = 0;
110 static_cast<std::uint64_t
>(hit_count));
111 for (std::size_t index = 0; index < hit_count; ++index) {
112 const auto position = cursor.
position();
113 if (position >= window_begin && position < window_end)
120 const auto event_count = count_visible();
121 if (event_count > output.size())
124 std::size_t output_index = 0;
126 static_cast<std::uint64_t
>(hit_count));
127 for (std::size_t index = 0; index < hit_count; ++index) {
128 const auto position = cursor.
position();
129 if (position >= window_begin && position < window_end)
130 output[output_index++] = position;
Definition ratchet.hpp:44
constexpr void advance() noexcept
Definition ratchet.hpp:57
constexpr RatchetSubdivisionCursor(TickPosition interval_begin, TickPosition interval_end, std::uint64_t hit_count) noexcept
Definition ratchet.hpp:46
constexpr TickPosition position() const noexcept
Definition ratchet.hpp:53
constexpr std::uint64_t kSignedTickOrderBit
Definition ratchet.hpp:34
constexpr std::uint64_t ordered_tick_coordinate(TickPosition position) noexcept
Definition ratchet.hpp:36
constexpr TickPosition tick_from_ordered_coordinate(std::uint64_t coordinate) noexcept
Definition ratchet.hpp:40
Definition beat_division.hpp:11
RatchetError
Definition ratchet.hpp:13
@ None
Definition ratchet.hpp:14
@ InvalidHitCount
Definition ratchet.hpp:16
@ InvalidInterval
Definition ratchet.hpp:15
@ InvalidWindow
Definition ratchet.hpp:19
@ InsufficientResolution
Definition ratchet.hpp:18
@ OutputTooSmall
Definition ratchet.hpp:20
@ CapacityExceeded
Definition ratchet.hpp:17
constexpr RatchetProjectionResult project_ratchet_interval(TickPosition interval_begin, TickPosition interval_end, std::size_t hit_count, TickPosition window_begin, TickPosition window_end, std::span< TickPosition > output) noexcept
Projects a bounded ratchet burst into an exact clock interval.
Definition ratchet.hpp:87
@ None
Definition grid_projection.hpp:97
@ OutputTooSmall
Definition grid_projection.hpp:104
Definition ratchet.hpp:23
std::size_t event_count
Definition ratchet.hpp:25
RatchetError error
Definition ratchet.hpp:24