00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __PROMISE_H
00025 #define __PROMISE_H
00026
00027 #include <stlib/Object.h>
00028 #include <stlib/Array.h>
00029 #include <stlib/String.h>
00030 #include <stlib/GenericException.h>
00031
00032 #include <stlib/Callback0.h>
00033 #include <stlib/Callback1.h>
00034
00035 namespace OS {
00036
00037 class Semaphore;
00038 class Thread;
00039
00044 class Promise : public Core::Object
00045 {
00046 protected:
00047 Callback<Object *> *_receiver;
00048 Array *_arguments;
00049 Thread *thread;
00050
00051 Semaphore *sync;
00052 Object *_value;
00053 bool has_value;
00054 GenericException *_exception;
00055
00056 public:
00057 Promise(Callback<Object *> *receiver);
00058 virtual ~Promise(void);
00059
00060
00061 virtual String *className(void) const;
00062
00063
00064 static Promise *perform(Callback<Object *> *receiver, Array *args = nil);
00065
00066 template <class TReceiver>
00067 static Promise *perform(TReceiver *receiver, Object *(TReceiver::*execFunc)(void))
00068 {
00069 Callback0<TReceiver,Object *> *callback;
00070 callback = new Callback0<TReceiver,Object *>(receiver, execFunc);
00071 return perform(callback);
00072 }
00073
00074 template <class TReceiver>
00075 static Promise *perform(TReceiver *receiver, Object *(TReceiver::*execFunc)(Array *),
00076 Array *args)
00077 {
00078 Callback1<TReceiver,Object*,Array*> *callback;
00079 callback = new Callback1<TReceiver,Object*,Array*>(receiver, execFunc);
00080 return perform(callback, args);
00081 }
00082
00083 virtual void run(void);
00084
00085
00086 virtual void exception(GenericException *ex);
00087 virtual void value(Object *object);
00088
00089
00090 virtual void arguments(Array *args);
00091 virtual bool hasValue(void);
00092 virtual Object *value(void);
00093
00094
00095 virtual void executePromise(void);
00096 };
00097
00098 };
00099
00100 #endif