mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-27 01:31:42 +00:00
Implements AsyncJustInTimeActor, experimentally.
This commit is contained in:
parent
a43ada82b2
commit
2f2478d2d3
@ -9,7 +9,7 @@
|
|||||||
#ifndef JustInTime_h
|
#ifndef JustInTime_h
|
||||||
#define 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
|
A JustInTimeActor holds (i) an embedded object with a run_for method; and (ii) an amount
|
||||||
@ -51,12 +51,50 @@ template <class T, class LocalTimeScale, class TargetTimeScale = LocalTimeScale>
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
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,
|
Any time the amount of accumulated time crosses a threshold provided at construction time,
|
||||||
the object will be updated on the AsyncTaskQueue.
|
the object will be updated on the AsyncTaskQueue.
|
||||||
*/
|
*/
|
||||||
template <class T, class TimeScale> class JustInTimeAsyncActor {
|
template <class T, class LocalTimeScale, class TargetTimeScale = LocalTimeScale> class AsyncJustInTimeActor {
|
||||||
|
public:
|
||||||
|
/// Constructs a new AsyncJustInTimeActor using the same construction arguments as the included object.
|
||||||
|
template<typename... Args> AsyncJustInTimeActor(TargetTimeScale threshold, Args&&... args) :
|
||||||
|
object_(std::forward<Args>(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<TargetTimeScale>());
|
||||||
|
is_flushed_ = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
T object_;
|
||||||
|
LocalTimeScale time_since_update_;
|
||||||
|
TargetTimeScale threshold_;
|
||||||
|
bool is_flushed_ = true;
|
||||||
|
Concurrency::AsyncTaskQueue task_queue_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* JustInTime_h */
|
#endif /* JustInTime_h */
|
||||||
|
@ -69,7 +69,7 @@
|
|||||||
</AdditionalOptions>
|
</AdditionalOptions>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
<LaunchAction
|
<LaunchAction
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Release"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
enableASanStackUseAfterReturn = "YES"
|
enableASanStackUseAfterReturn = "YES"
|
||||||
|
Loading…
Reference in New Issue
Block a user