13 #ifndef DD4HEP_DDCORE_CALLBACK_H
14 #define DD4HEP_DDCORE_CALLBACK_H
40 typedef unsigned long (*
func_t)(
void* obj,
const void* fun,
const void* args[]);
67 operator bool()
const {
71 unsigned long execute(
const void* user_param[])
const {
75 template <
typename T>
static T*
cast(
void* p) {
79 template <
typename T>
static const T*
c_cast(
const void* p) {
113 template <
typename T>
const Callback&
_make(
ulong (*fptr)(
void* o,
const void* f,
const void* u[]),
T pmf) {
115 typename Wrapper<T>::Functor f(pmf);
122 typedef R (
T::*pfunc_t)();
123 struct _Wrapper :
public Wrapper<pfunc_t> {
124 static ulong call(
void* o,
const void* f,
const void*[]) {
128 return _make(_Wrapper::call, pmf);
131 template <
typename R,
typename T>
const Callback&
make(R (
T::*pmf)()
const) {
132 typedef R (
T::*pfunc_t)()
const;
133 struct _Wrapper :
public Wrapper<pfunc_t> {
134 static ulong call(
void* o,
const void* f,
const void*[]) {
138 return _make(_Wrapper::call, pmf);
142 typedef void (
T::*pfunc_t)()
const;
143 struct _Wrapper :
public Wrapper<pfunc_t> {
144 static ulong call(
void* o,
const void* f,
const void*[]) {
149 return _make(_Wrapper::call, pmf);
153 typedef void (
T::*pfunc_t)()
const;
154 struct _Wrapper :
public Wrapper<pfunc_t> {
155 static ulong call(
void* o,
const void* f,
const void*[]) {
160 return _make(_Wrapper::call, pmf);
164 template <
typename R,
typename T,
typename A>
const Callback&
make(R (
T::*pmf)(A)) {
166 typedef R (
T::*pfunc_t)(A);
167 struct _Wrapper :
public Wrapper<pfunc_t> {
168 static ulong call(
void* o,
const void* f,
const void* u[]) {
169 return (
ulong) (cast<T>(o)->*(
typename Wrapper<pfunc_t>::Functor(f).pmf))((A) u[0]);
172 return _make(_Wrapper::call, pmf);
175 template <
typename R,
typename T,
typename A>
const Callback&
make(R (
T::*pmf)(A)
const) {
176 typedef R (
T::*pfunc_t)(A)
const;
177 struct _Wrapper :
public Wrapper<pfunc_t> {
178 static ulong call(
void* o,
const void* f,
const void* u[]) {
182 return _make(_Wrapper::call, pmf);
186 typedef void (
T::*pfunc_t)(
const A);
187 struct _Wrapper :
public Wrapper<pfunc_t> {
188 static ulong call(
void* o,
const void* f,
const void* u[]) {
193 return _make(_Wrapper::call, pmf);
196 template <
typename T,
typename A>
const Callback&
make(
void (
T::*pmf)(A)
const) {
197 typedef void (
T::*pfunc_t)(
const A)
const;
198 struct _Wrapper :
public Wrapper<pfunc_t> {
199 static ulong call(
void* o,
const void* f,
const void* u[]) {
204 return _make(_Wrapper::call, pmf);
209 template <
typename R,
typename T,
typename A0,
typename A1>
const Callback&
make(R (
T::*pmf)(A0, A1)) {
211 typedef R (
T::*pfunc_t)(A0, A1);
212 typedef Wrapper<pfunc_t> _W;
213 struct _Wrapper :
public _W {
214 static ulong call(
void* o,
const void* f,
const void* u[]) {
215 return (
ulong) (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1]);
218 return _make(_Wrapper::call, pmf);
221 template <
typename R,
typename T,
typename A0,
typename A1>
const Callback&
make(R (
T::*pmf)(A0, A1)
const) {
222 typedef R (
T::*pfunc_t)(A0, A1);
224 struct _Wrapper :
public _W {
225 static ulong call(
void* o,
const void* f,
const void* u[]) {
226 return (
ulong) (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1]);
229 return _make(_Wrapper::call, pmf);
232 template <
typename T,
typename A0,
typename A1>
const Callback&
make(
void (
T::*pmf)(A0, A1)) {
233 typedef void (
T::*pfunc_t)(A0, A1);
235 struct _Wrapper :
public _W {
236 static ulong call(
void* o,
const void* f,
const void* u[]) {
237 (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1]);
241 return _make(_Wrapper::call, pmf);
244 template <
typename T,
typename A0,
typename A1>
const Callback&
make(
void (
T::*pmf)(A0, A1)
const) {
245 typedef void (
T::*pfunc_t)(A0, A1);
247 struct _Wrapper :
public _W {
248 static ulong call(
void* o,
const void* f,
const void* u[]) {
249 (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1]);
253 return _make(_Wrapper::call, pmf);
258 template <
typename R,
typename T,
typename A0,
typename A1,
typename A2>
const Callback&
make(R (
T::*pmf)(A0, A1, A2)) {
260 typedef R (
T::*pfunc_t)(A0, A1, A2);
261 typedef Wrapper<pfunc_t> _W;
262 struct _Wrapper :
public _W {
263 static ulong call(
void* o,
const void* f,
const void* u[]) {
264 return (
ulong) (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1], (A2) u[2]);
267 return _make(_Wrapper::call, pmf);
270 template <
typename R,
typename T,
typename A0,
typename A1,
typename A2>
const Callback&
make(R (
T::*pmf)(A0, A1, A2)
const) {
271 typedef R (
T::*pfunc_t)(A0, A1, A2);
273 struct _Wrapper :
public _W {
274 static ulong call(
void* o,
const void* f,
const void* u[]) {
275 return (
ulong) (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1], (A2) u[2]);
278 return _make(_Wrapper::call, pmf);
281 template <
typename T,
typename A0,
typename A1,
typename A2>
const Callback&
make(
void (
T::*pmf)(A0, A1, A2)) {
282 typedef void (
T::*pfunc_t)(A0, A1, A2);
284 struct _Wrapper :
public _W {
285 static ulong call(
void* o,
const void* f,
const void* u[]) {
286 (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1], (A2) u[2]);
290 return _make(_Wrapper::call, pmf);
293 template <
typename T,
typename A0,
typename A1,
typename A2>
const Callback&
make(
void (
T::*pmf)(A0, A1, A2)
const) {
294 typedef void (
T::*pfunc_t)(A0, A1, A2);
296 struct _Wrapper :
public _W {
297 static ulong call(
void* o,
const void* f,
const void* u[]) {
298 (cast<T>(o)->*(
typename _W::Functor(f).pmf))((A0) u[0], (A1) u[1], (A2) u[2]);
302 return _make(_Wrapper::call, pmf);
309 template <
typename P,
typename R,
typename T>
static T*
dyn_cast(P* p, R (
T::*)()) {
310 return dynamic_cast<T*
>(p);
312 template <
typename P,
typename R,
typename T>
static const T*
dyn_cast(
const P* p, R (
T::*)()
const) {
313 return dynamic_cast<const T*
>(p);
316 template <
typename P,
typename R,
typename T,
typename A>
static T*
dyn_cast(P* p, R (
T::*)(A)) {
317 return dynamic_cast<T*
>(p);
319 template <
typename P,
typename R,
typename T,
typename A>
static const T*
dyn_cast(
const P* p, R (
T::*)(A)
const) {
320 return dynamic_cast<const T*
>(p);
371 template <
typename A0>
void operator()(A0 a0)
const;
373 template <
typename A0,
typename A1>
void operator()(A0 a0, A1 a1)
const;
375 template <
typename A0,
typename A1,
typename A2>
void operator()(A0 a0, A1 a1, A2 a2)
const;
377 static void checkTypes(
const std::type_info& typ1,
const std::type_info& typ2,
void* test);
380 template <
typename TYPE,
typename R,
typename OBJECT>
383 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
387 template <
typename TYPE,
typename R,
typename OBJECT>
389 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
393 template <
typename TYPE,
typename OBJECT>
395 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
399 template <
typename TYPE,
typename OBJECT>
401 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
406 template <
typename TYPE,
typename R,
typename OBJECT,
typename A>
409 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
413 template <
typename TYPE,
typename OBJECT,
typename A>
415 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
419 template <
typename TYPE,
typename R,
typename OBJECT,
typename A>
421 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
425 template <
typename TYPE,
typename OBJECT,
typename A>
427 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
433 template <
typename TYPE,
typename R,
typename OBJECT,
typename A1,
typename A2>
436 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
440 template <
typename TYPE,
typename R,
typename OBJECT,
typename A1,
typename A2>
442 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
446 template <
typename TYPE,
typename OBJECT,
typename A1,
typename A2>
448 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
452 template <
typename TYPE,
typename OBJECT,
typename A1,
typename A2>
454 checkTypes(
typeid(TYPE),
typeid(OBJECT), dynamic_cast<OBJECT*>(pointer));
462 const void* args[1] = { 0 };
468 template <
typename A0>
inline
471 const void* args[1] = { a0 };
477 template <
typename A0,
typename A1>
inline
480 const void* args[2] = { a0, a1 };
486 template <
typename A0,
typename A1,
typename A2>
inline
489 const void* args[3] = { a0, a1, a2 };
496 #endif // DD4HEP_DDCORE_CALLBACK_H
const Callback & make(void(T::*pmf)(A0, A1, A2))
Callback setup function for Callbacks with const void member functions taking 3 arguments.
void operator()() const
Execution overload for callbacks with no arguments.
unsigned long(* func_t)(void *obj, const void *fun, const void *args[])
const Callback & make(void(T::*pmf)())
Callback setup function for Callbacks with void member functions taking no arguments.
const Callback & make(R(T::*pmf)(A0, A1) const)
Callback setup function for Callbacks with const member functions with explicit return type taking 2 ...
const Callback & make(void(T::*pmf)(A))
Callback setup function for Callbacks with void member functions taking 1 argument.
static const T * c_cast(const void *p)
Template const cast function used internally by the wrapper for type conversion to the object's type...
const Callback & make(R(T::*pmf)(A0, A1, A2) const)
Callback setup function for Callbacks with const member functions with explicit return type taking 3 ...
void add(TYPE *pointer, R(OBJECT::*pmf)(A), Location where=CallbackSequence::END)
Add a new callback to a member function with explicit return type and 1 argument. ...
void add(TYPE *pointer, R(OBJECT::*pmf)(A) const, Location where=CallbackSequence::END)
Add a new callback to a const member function with explicit return type and 1 argument.
const Callback & make(void(T::*pmf)(A0, A1) const)
Callback setup function for Callbacks with const void member functions taking 2 arguments.
Callback(void *p)
Constructor with object initialization.
Structure definition to store callback related data.
void add(TYPE *pointer, void(OBJECT::*pmf)(A1, A2) const, Location where=CallbackSequence::END)
Add a new callback to a const void member function with 2 arguments.
void add(TYPE *pointer, R(OBJECT::*pmf)(), Location where=CallbackSequence::END)
Add a new callback to a member function with explicit return type and no arguments.
const Callback & make(void(T::*pmf)(A0, A1))
Callback setup function for Callbacks with const void member functions taking 2 arguments.
unsigned long execute(const void *user_param[]) const
Execute the callback with the required number of user parameters.
void add(const Callback &cb, Location where)
Generically Add a new callback to the sequence depending on the location arguments.
CallbackSequence(const CallbackSequence &c)
Copy constructor.
Definition of an actor on sequences of callbacks.
Callback(void *p, void *mf, func_t c)
Initializing constructor.
const Callback & make(void(T::*pmf)() const)
Callback setup function for Callbacks with const void member functions taking no arguments.
void add(TYPE *pointer, void(OBJECT::*pmf)(A) const, Location where=CallbackSequence::END)
Add a new callback to a const void member function and 1 argument.
Wrapper around a C++ member function pointer.
const Callback & make(void(T::*pmf)(A0, A1, A2) const)
Callback setup function for Callbacks with const void member functions taking 3 arguments.
void add(TYPE *pointer, R(OBJECT::*pmf)(A1, A2), Location where=CallbackSequence::END)
Add a new callback to a member function with explicit return type and 2 arguments.
const Callback & make(void(T::*pmf)(A) const)
Callback setup function for Callbacks with const void member functions taking 1 argument.
static void checkTypes(const std::type_info &typ1, const std::type_info &typ2, void *test)
Check the compatibility of two typed objects. The test is the result of a dynamic_cast.
CallbackSequence & operator=(const CallbackSequence &c)
Assignment operator.
void clear()
Clear the sequence and remove all callbacks.
void add(TYPE *pointer, void(OBJECT::*pmf)() const, Location where=CallbackSequence::END)
Add a new callback to a const void member function and no arguments.
const Callback & make(R(T::*pmf)())
Callback setup function for Callbacks with member functions with explicit return type taking no argum...
Definition of the generic callback structure for member functions.
void add(TYPE *pointer, void(OBJECT::*pmf)(A1, A2), Location where=CallbackSequence::END)
Add a new callback to a void member function with 2 arguments.
static Callback make(void *p, T pmf)
Callback()
Default constructor.
void add(TYPE *pointer, R(OBJECT::*pmf)() const, Location where=CallbackSequence::END)
Add a new callback to a const member function with explicit return type and no arguments.
std::vector< Callback > Callbacks
static T * dyn_cast(P *p, R(T::*)(A))
void add(TYPE *pointer, void(OBJECT::*pmf)(A), Location where=CallbackSequence::END)
Add a new callback to a void member function and 1 argument.
const Callback & make(R(T::*pmf)() const)
Callback setup function for Callbacks with const member functions with explicit return type taking no...
static const T * dyn_cast(const P *p, R(T::*)(A) const)
static mfunc_t pmf(pmf_t f)
const Callback & make(R(T::*pmf)(A) const)
Callback setup function for Callbacks with const member functions with explicit return type taking 1 ...
void add(TYPE *pointer, R(OBJECT::*pmf)(A1, A2) const, Location where=CallbackSequence::END)
Add a new callback to a const member function with explicit return type and 2 arguments.
static const T * dyn_cast(const P *p, R(T::*)() const)
void add(TYPE *pointer, void(OBJECT::*pmf)(), Location where=CallbackSequence::END)
Add a new callback to a void member function with no arguments.
const Callback & _make(ulong(*fptr)(void *o, const void *f, const void *u[]), T pmf)
Callback setup function for Callbacks with member functions taking no arguments.
static T * dyn_cast(P *p, R(T::*)())
Union to store pointers to member functions in callback objects.
CallbackSequence()
Default constructor.
static T * cast(void *p)
Template cast function used internally by the wrapper for type conversion to the object's type...