Bug fix: check if vm exists
[avr-sim.git] / Clock.h
blob75c612239a88909ad0b8aa7b559ba743bdd52fcd
1 #ifndef AVR_CLOCK_H
2 #define AVR_CLOCK_H
4 #ifdef LINUX
5 # include <ext/slist>
6 #else
7 # include <list>
8 #endif
10 #include <utility>
11 #include "Types.h"
13 namespace avr {
14 typedef unsigned long long ClockOffset;
16 template <class Type>
17 class Clock {
18 public:
19 Clock() : value(0) {}
21 public:
22 void setBreak(ClockOffset cycle, Type *obj);
23 void setBreakDelta(ClockOffset delta, Type *obj);
24 void clearBreak(Type *obj);
25 void clearBreak(ClockOffset cycle);
26 void reassignBreak(ClockOffset oldCycle, ClockOffset newCycle, Type *obj);
27 void reassignBreak(Type *obj, ClockOffset newCycle);
28 void reassignBreakDelta(ClockOffset delta, Type *obj);
30 public:
31 void step();
32 void clearAll();
34 ClockOffset ticks() const { return value; }
36 private:
37 ClockOffset value;
39 typedef std::pair<ClockOffset, Type*> Break;
40 #ifdef LINUX
41 typedef __gnu_cxx::slist< Break > ClockList;
42 #else
43 typedef std::slist< Break > ClockList;
44 #endif
45 typedef typename ClockList::iterator ClockListIt;
46 ClockList objects;
49 template <class Type>
50 inline void Clock<Type>::setBreakDelta(ClockOffset delta, Type *obj) {
51 setBreak( value + delta, obj );
57 #ifndef AVR_CLOCK_INC
58 # include "Clock.inc"
59 #endif
60 #endif /*AVR_CLOCK_H*/