16#include "Serializable.h"
21template <
class T, isize delay>
class TimeDelayed :
public Serializable {
23 static constexpr isize capacity = delay + 1;
45 TimeDelayed(i64 *clock) {
52 TimeDelayed() : TimeDelayed(nullptr) { };
54 TimeDelayed<T,delay>& operator= (
const TimeDelayed<T,delay>& other) {
56 std::copy(std::begin(other.pipeline), std::end(other.pipeline), std::begin(pipeline));
57 timeStamp = other.timeStamp;
63 void setClock(i64 *clock) { this->clock = clock; }
67 for (isize i = 0; i < capacity; i++) pipeline[i] = value;
72 void clear() { reset((T)0); }
76 for (isize i = 0; i < capacity; i++)
if (pipeline[i])
return false;
88 void serialize(W& worker)
95 } SERIALIZERS(serialize);
103 void write(T value) { writeWithDelay(value, 0); }
106 void writeWithDelay(T value, u8 waitCycles) {
108 i64 referenceTime = *clock + waitCycles;
111 i64 diff = referenceTime - timeStamp;
112 for (isize i = capacity - 1; i >= 0; i--) {
113 pipeline[i] = (i - diff > 0) ? pipeline[i - diff] : pipeline[0];
117 timeStamp = referenceTime;
122 T current()
const {
return pipeline[0]; }
126 i64 offset = timeStamp - *clock + delay;
127 if (likely(offset <= 0)) {
130 return pipeline[offset];
135 T readWithDelay(u8 d)
const {
136 assert(d <= this->capacity);
137 return pipeline[std::max(0LL, timeStamp - *clock + d)];
VirtualC64 project namespace.
Definition CmdQueue.cpp:16