ROOT
6.12/07
Reference Guide
core
base
inc
RQ_OBJECT.h
Go to the documentation of this file.
1
// @(#)root/base:$Id$
2
// Author: Valeriy Onuchin & Fons Rademakers 15/10/2000
3
4
/*************************************************************************
5
* Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6
* All rights reserved. *
7
* *
8
* For the licensing terms see $ROOTSYS/LICENSE. *
9
* For the list of contributors see $ROOTSYS/README/CREDITS. *
10
*************************************************************************/
11
12
#ifndef ROOT_RQ_OBJECT
13
#define ROOT_RQ_OBJECT
14
15
#include <
TQObject.h
>
16
#include <
Varargs.h
>
17
18
19
//---- RQ_OBJECT macro -----------------------------------------------
20
//
21
// Macro is used to delegate TQObject methods to other classes
22
// Example:
23
//
24
// #include "RQ_OBJECT.h"
25
//
26
// class A {
27
// RQ_OBJECT("A")
28
// private:
29
// Int_t fValue;
30
// public:
31
// A() : fValue(0) { }
32
// ~A() { }
33
//
34
// void SetValue(Int_t value)
35
// void PrintValue() const { printf("value=%d\n", fValue); }
36
// Int_t GetValue() const { return fValue; }
37
// };
38
//
39
// void A::SetValue(Int_t value)
40
// {
41
// // Sets new value
42
//
43
// // to prevent infinite looping in the case
44
// // of cyclic connections
45
// if (value != fValue) {
46
// fValue = value;
47
// Emit("SetValue(Int_t)", fValue);
48
// }
49
// }
50
//
51
// Load this class into root session and try the folllowing:
52
//
53
// a = new A();
54
// b = new A();
55
//
56
// Here is one way to connect two of these objects together:
57
//
58
// a->Connect("SetValue(Int_t)", "A", b, "SetValue(Int_t)");
59
//
60
// Calling a->SetValue(79) will make a emit a signal, which b
61
// will receive, i.e. b->SetValue(79) is invoked. b will in
62
// turn emit the same signal, which nobody receives, since no
63
// slot has been connected to it, so it disappears into hyperspace.
64
//
65
66
#define RQ_OBJECT1(sender_class)\
67
private:\
68
TQObjSender fQObject;\
69
public:\
70
TList *GetListOfSignals() const {return fQObject.GetListOfSignals();}\
71
Bool_t Connect(const char *sig,const char *cl,void *rcvr,const char *slt)\
72
{fQObject.SetSender(this);fQObject.SetSenderClassName(sender_class);return fQObject.Connect(sig,cl,rcvr,slt);}\
73
Bool_t Disconnect(const char *sig=0,void *rcvr=0,const char *slt=0){return fQObject.Disconnect(sig,rcvr,slt);}\
74
void HighPriority(const char *signal_name,const char *slot_name=0){fQObject.HighPriority(signal_name,slot_name);}\
75
void LowPriority(const char *signal_name,const char *slot_name=0){fQObject.LowPriority(signal_name,slot_name);}\
76
template <typename... T> void EmitVA(const char *signal_name, Int_t nargs, const T&... params) \
77
{ fQObject.EmitVA(signal_name,nargs,params...); } \
78
void Emit(const char *signal){EmitVA(signal,
/*nargs*/
0);} \
79
template <typename T> void Emit(const char *signal, const T& arg) { EmitVA(signal,
/*nargs*/
1, arg); } \
80
81
#define RQ_OBJECT2(sender_class)\
82
void Destroyed(){Emit("Destroyed()");}\
83
void ChangedBy(const char *method){Emit("ChangedBy(char*)",method);}\
84
void Message(const char *msg){Emit("Message(char*)",msg);}\
85
private:
86
87
#define RQ_OBJECT(sender_class)\
88
RQ_OBJECT1(sender_class)\
89
RQ_OBJECT2(sender_class)
90
91
#endif
Varargs.h
TQObject.h