diff --git a/ClockReceiver/JustInTime.hpp b/ClockReceiver/JustInTime.hpp index 21d0cdf27..e5f9a5ef6 100644 --- a/ClockReceiver/JustInTime.hpp +++ b/ClockReceiver/JustInTime.hpp @@ -9,7 +9,7 @@ #ifndef JustInTime_h #define JustInTime_h -//#include "../Concurrency/AsyncTaskQueue.hpp" +#include "../Concurrency/AsyncTaskQueue.hpp" /*! A JustInTimeActor holds (i) an embedded object with a run_for method; and (ii) an amount @@ -51,12 +51,50 @@ template }; /*! - A JustInTimeAsyncActor acts like a JustInTimeActor but additionally contains an AsyncTaskQueue. + A AsyncJustInTimeActor acts like a JustInTimeActor but additionally contains an AsyncTaskQueue. Any time the amount of accumulated time crosses a threshold provided at construction time, the object will be updated on the AsyncTaskQueue. */ -template class JustInTimeAsyncActor { +template class AsyncJustInTimeActor { + public: + /// Constructs a new AsyncJustInTimeActor using the same construction arguments as the included object. + template AsyncJustInTimeActor(TargetTimeScale threshold, Args&&... args) : + object_(std::forward(args)...), + threshold_(threshold) {} + /// Adds time to the actor. + inline void operator += (const LocalTimeScale &rhs) { + time_since_update_ += rhs; + if(time_since_update_ >= threshold_) { + time_since_update_ -= threshold_; + task_queue_.enqueue([this] () { + object_.run_for(threshold_); + }); + } + is_flushed_ = false; + } + + /// Flushes all accumulated time and returns a pointer to the included object. + inline T *operator->() { + flush(); + return &object_; + } + + /// Flushes all accumulated time. + inline void flush() { + if(!is_flushed_) { + task_queue_.flush(); + object_.run_for(time_since_update_.template flush()); + is_flushed_ = true; + } + } + + private: + T object_; + LocalTimeScale time_since_update_; + TargetTimeScale threshold_; + bool is_flushed_ = true; + Concurrency::AsyncTaskQueue task_queue_; }; #endif /* JustInTime_h */ diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme index 0cd11b1be..3ae34802d 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme +++ b/OSBindings/Mac/Clock Signal.xcodeproj/xcshareddata/xcschemes/Clock Signal.xcscheme @@ -69,7 +69,7 @@