RQ_OBJECT.h

Go to the documentation of this file.
00001 // @(#)root/base:$Id: RQ_OBJECT.h 20877 2007-11-19 11:17:07Z rdm $
00002 // Author: Valeriy Onuchin & Fons Rademakers   15/10/2000
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #ifndef ROOT_RQ_OBJECT
00013 #define ROOT_RQ_OBJECT
00014 
00015 #include <TQObject.h>
00016 #include <Varargs.h>
00017 
00018 
00019 //---- RQ_OBJECT macro -----------------------------------------------
00020 //
00021 // Macro is used to delegate TQObject methods to other classes
00022 // Example:
00023 //
00024 //    #include "RQ_OBJECT.h"
00025 //
00026 //    class A {
00027 //       RQ_OBJECT("A")
00028 //    private:
00029 //       Int_t fValue;
00030 //    public:
00031 //       A() : fValue(0) { }
00032 //       ~A() { }
00033 //
00034 //       void  SetValue(Int_t value)
00035 //       void  PrintValue() const { printf("value=%d\n", fValue); }
00036 //       Int_t GetValue() const { return fValue; }
00037 //    };
00038 //
00039 //    void A::SetValue(Int_t value)
00040 //    {
00041 //       // Sets new value
00042 //
00043 //       // to prevent infinite looping in the case
00044 //       // of cyclic connections
00045 //       if (value != fValue) {
00046 //          fValue = value;
00047 //          Emit("SetValue(Int_t)", fValue);
00048 //       }
00049 //    }
00050 //
00051 // Load this class into root session and try the folllowing:
00052 //
00053 // a = new A();
00054 // b = new A();
00055 //
00056 // Here is one way to connect two of these objects together:
00057 //
00058 // a->Connect("SetValue(Int_t)", "A", b, "SetValue(Int_t)");
00059 //
00060 // Calling a->SetValue(79) will make a emit a signal, which b
00061 // will receive, i.e. b->SetValue(79) is invoked. b will in
00062 // turn emit the same signal, which nobody receives, since no
00063 // slot has been connected to it, so it disappears into hyperspace.
00064 //
00065 
00066 #define RQ_OBJECT1(sender_class)\
00067 private:\
00068 TQObjSender fQObject;\
00069 public:\
00070 TList *GetListOfSignals() const {return fQObject.GetListOfSignals();}\
00071 Bool_t Connect(const char *sig,const char *cl,void *rcvr,const char *slt)\
00072 {fQObject.SetSender(this);fQObject.SetSenderClassName(sender_class);return fQObject.Connect(sig,cl,rcvr,slt);}\
00073 Bool_t Disconnect(const char *sig=0,void *rcvr=0,const char *slt=0){return fQObject.Disconnect(sig,rcvr,slt);}\
00074 void HighPriority(const char *signal_name,const char *slot_name=0){fQObject.HighPriority(signal_name,slot_name);}\
00075 void LowPriority(const char *signal_name,const char *slot_name=0){fQObject.LowPriority(signal_name,slot_name);}\
00076 void EmitVA(const char *signal,Int_t nargs, ...){va_list ap;va_start(ap,nargs);fQObject.EmitVA(signal,nargs,ap);va_end(ap);}\
00077 void Emit(const char *signal){fQObject.Emit(signal);}\
00078 void Emit(const char *signal,const char *params){fQObject.Emit(signal,params);}\
00079 void Emit(const char *signal,Long_t *paramArr){fQObject.Emit(signal,paramArr);}\
00080 void Emit(const char *signal,Double_t param){fQObject.Emit(signal,param);}\
00081 void Emit(const char *signal,Long_t param){fQObject.Emit(signal,param);}
00082 
00083 #define RQ_OBJECT2(sender_class)\
00084 void Emit(const char *signal,Long64_t param){fQObject.Emit(signal,param);}\
00085 void Emit(const char *signal,ULong64_t param){fQObject.Emit(signal,param);}\
00086 void Emit(const char *signal,Bool_t param){Emit(signal,(Long_t)param);}\
00087 void Emit(const char *signal,Char_t param){Emit(signal,(Long_t)param);}\
00088 void Emit(const char *signal,UChar_t param){Emit(signal,(Long_t)param);}\
00089 void Emit(const char *signal,Short_t param){Emit(signal,(Long_t)param);}\
00090 void Emit(const char *signal,UShort_t param){Emit(signal,(Long_t)param);}\
00091 void Emit(const char *signal,Int_t param){Emit(signal,(Long_t)param);}\
00092 void Emit(const char *signal,UInt_t param){Emit(signal,(Long_t)param);}\
00093 void Emit(const char *signal,ULong_t param){Emit(signal,(Long_t)param);}\
00094 void Emit(const char *signal,Float_t param){Emit(signal,(Double_t)param);}\
00095 void Destroyed(){Emit("Destroyed()");}\
00096 void ChangedBy(const char *method){Emit("ChangedBy(char*)",method);}\
00097 void Message(const char *msg){Emit("Message(char*)",msg);}\
00098 private:
00099 
00100 #define RQ_OBJECT(sender_class)\
00101    RQ_OBJECT1(sender_class)\
00102    RQ_OBJECT2(sender_class)
00103 
00104 
00105 //--- Only used in TQObject::Load_RQ_OBJECT()
00106 
00107 #define _QUOTE2_(string)\
00108    _QUOTE_(string)
00109 
00110 #define RQ_OBJECT_STRING1\
00111    _QUOTE_(#define RQ_OBJECT1(sender_class))\
00112    _QUOTE2_(RQ_OBJECT1(sender_class))
00113 
00114 #define RQ_OBJECT_STRING2\
00115    _QUOTE_(#define RQ_OBJECT2(sender_class))\
00116    _QUOTE2_(RQ_OBJECT2(sender_class))
00117 
00118 #define RQ_OBJECT_STRING\
00119    _QUOTE_(#define RQ_OBJECT(sender_class)\
00120            RQ_OBJECT1(sender_class)\
00121            RQ_OBJECT2(sender_class))
00122 
00123 #endif

Generated on Tue Jul 5 14:10:19 2011 for ROOT_528-00b_version by  doxygen 1.5.1