00001 #ifndef __LOUT_SIGNALS_HH__
00002 #define __LOUT_SIGNALS_HH__
00003
00004 #include "object.hh"
00005 #include "container.hh"
00006
00177 namespace lout {
00178
00179 namespace signal {
00180
00181 class Receiver;
00182
00212 class Emitter: public object::Object
00213 {
00214 friend class Receiver;
00215
00216 private:
00217 container::typed::List <Receiver> *receivers;
00218
00219 void unconnect (Receiver *receiver);
00220
00221 protected:
00222 void emitVoid (int signalNo, int argc, Object **argv);
00223 bool emitBool (int signalNo, int argc, Object **argv);
00224 void connect(Receiver *receiver);
00225
00235 virtual bool emitToReceiver (Receiver *receiver, int signalNo,
00236 int argc, Object **argv) = 0;
00237
00238 public:
00239 Emitter();
00240 ~Emitter();
00241
00242 void intoStringBuffer(misc::StringBuffer *sb);
00243 };
00244
00253 class Receiver: public object::Object
00254 {
00255 friend class Emitter;
00256
00257 private:
00258 container::typed::List<Emitter> *emitters;
00259
00260 void connectTo(Emitter *emitter);
00261 void unconnectFrom(Emitter *emitter);
00262
00263 public:
00264 Receiver();
00265 ~Receiver();
00266
00267 void intoStringBuffer(misc::StringBuffer *sb);
00268 };
00269
00274 class ObservedObject
00275 {
00276 public:
00277 class DeletionReceiver: public signal::Receiver
00278 {
00279 public:
00280 virtual void deleted (ObservedObject *object) = 0;
00281 };
00282
00283 private:
00284 class DeletionEmitter: public signal::Emitter
00285 {
00286 protected:
00287 bool emitToReceiver (signal::Receiver *receiver, int signalNo,
00288 int argc, Object **argv);
00289
00290 public:
00291 inline void connectDeletion (DeletionReceiver *receiver)
00292 { connect (receiver); }
00293
00294 void emitDeletion (ObservedObject *obj);
00295 };
00296
00297 DeletionEmitter deletionEmitter;
00298
00299 public:
00300 virtual ~ObservedObject();
00301
00302 inline void connectDeletion (DeletionReceiver *receiver)
00303 { deletionEmitter.connectDeletion (receiver); }
00304 };
00305
00306 }
00307
00308 }
00309
00310 #endif // __LOUT_SIGNALS_HH__