00001 #ifndef QPID_SYS_STATEMONITOR_H
00002 #define QPID_SYS_STATEMONITOR_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "qpid/sys/Waitable.h"
00025
00026 #include <bitset>
00027
00028 namespace qpid {
00029 namespace sys {
00030
00037 template <class Enum, size_t MaxEnum>
00038 class StateMonitor : public Waitable
00039 {
00040 public:
00041 struct Set : public std::bitset<MaxEnum + 1> {
00042 Set() {}
00043 Set(Enum s) { set(s); }
00044 Set(Enum s, Enum t) { set(s).set(t); }
00045 Set(Enum s, Enum t, Enum u) { set(s).set(t).set(u); }
00046 Set(Enum s, Enum t, Enum u, Enum v) { set(s).set(t).set(u).set(v); }
00047 };
00048
00049
00050 StateMonitor(Enum initial) { state=initial; }
00051
00053 void set(Enum s) { state=s; notifyAll(); }
00055 StateMonitor& operator=(Enum s) { set(s); return *this; }
00056
00058 Enum get() const { return state; }
00060 operator Enum() const { return state; }
00061
00063 void waitFor(Enum s) { ScopedWait(*this); while (s != state) wait(); }
00065 void waitFor(Set s) { ScopedWait(*this); while (!s.test(state)) wait(); }
00067 void waitNot(Enum s) { ScopedWait(*this); while (s == state) wait(); }
00069 void waitNot(Set s) { ScopedWait(*this); while (s.test(state)) wait(); }
00070
00071 private:
00072 Enum state;
00073 };
00074
00075 }}
00076
00077
00078 #endif