00001 #ifndef PHX_CLOCK_H
00002 #define PHX_CLOCK_H
00003
00010 #include <Phx/PhxConfig.h>
00011 #include <Phx/PhxTypes.h>
00012 #include <Phx/Core/PhxNamedInterface.h>
00013
00014 namespace Phx {
00015
00036 class Clock : public NamedInterface {
00037 public:
00038 class Task;
00039 class Timer;
00040
00041
00042
00049 virtual Ptr<Task> newTask(const String& name) = 0;
00050
00072 virtual Ptr<Timer> newTimer(void) = 0;
00073
00074
00075
00080 virtual double time(void) const = 0;
00081
00086 virtual void time(double time) = 0;
00087
00094 virtual double rate(void) const = 0;
00095
00102 virtual void rate(double rate) = 0;
00103 };
00104
00105
00110 class Clock::Timer : public LockedPtrInterface<Clock::Timer> {
00111 public:
00116 virtual double time(void) = 0;
00117
00122 virtual void time(double time) = 0;
00123
00130 virtual double rate(void) const = 0;
00131
00138 virtual void rate(double rate) = 0;
00139
00140 };
00141
00152 class Clock::Task : public LockedPtrInterface<Clock::Task> {
00153 public:
00154
00158 const static uint32_t AFFINITY_NONE;
00159
00166 const static uint32_t AFFINITY_MAIN_THREAD;
00167
00168
00169 virtual ~Task() {}
00170
00175 const static double NEVER;
00176
00181 class Listener : public BaseListener<Clock::Task, Listener> {
00182 public:
00193 virtual void onTimeout(double scheduledTime) = 0;
00194 };
00195
00215 virtual double nextTime(void) const = 0;
00216
00263 virtual void nextTime(double nextTime) = 0;
00264
00272 virtual double time(void) const = 0;
00273
00278 virtual void listener(Listener* listener) = 0;
00279
00284 virtual String name(void) const = 0;
00285
00299 virtual void affinity(uint32_t affinity) = 0;
00300
00308 virtual uint32_t affinity(void) const = 0;
00309 };
00310
00324 class WallClock : public Clock {
00325 public:
00326 const static NamedInterface::Type INTERFACE_TYPE;
00327 const static String INTERFACE_TYPE_NAME;
00328 };
00329
00342 class FrameClock : public Clock {
00343 public:
00344 const static NamedInterface::Type INTERFACE_TYPE;
00345 const static String INTERFACE_TYPE_NAME;
00346 };
00347
00348 };
00349
00350 #endif