source: cpp/frams/util/callbacks.h @ 875

Last change on this file since 875 was 793, checked in by Maciej Komosinski, 7 years ago

Code formatting

  • Property svn:eol-style set to native
File size: 3.8 KB
Line 
1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
4
5#ifndef _CALLBACKS_H_
6#define _CALLBACKS_H_
7
8#include "list.h"
9#include "statrick.h"
10#include <stdint.h>
11
12//#define USEMEMBERCALLBACK
13
14class CallbackNode
15{
16public:
17        virtual ~CallbackNode() {}
18        virtual void action(intptr_t calldata) = 0;
19        virtual int equals(CallbackNode*n) { return (this == n); }
20};
21
22#ifdef USEMEMBERCALLBACK
23class CallBase;
24class MemberCallbackNode :public CallbackNode
25{
26        void *userdata;
27        CallBase *object;
28        void (CallBase::*member)(void*, intptr_t);
29public:
30        MemberCallbackNode(CallBase *o, void (CallBase::*m)(void*, intptr_t), void *d) :object(o), member(m), userdata(d) {}
31        void action(intptr_t calldata) { (object->*member)(userdata, calldata); }
32        int equals(CallbackNode*);
33};
34#define MEMBERCALLBACK(obj,mem,dat) new MemberCallbackNode((CallBase*)(obj),(void (CallBase::*)(void*,intptr_t))(mem),(void*)(dat))
35#endif
36
37class FunctionCallbackNode :public CallbackNode
38{
39        void *userdata;
40        void(*fun)(void*, intptr_t);
41public:
42        FunctionCallbackNode(void(*f)(void*, intptr_t), void *d) :userdata(d), fun(f) {}
43        void action(intptr_t calldata) { (*fun)(userdata, calldata); }
44        int equals(CallbackNode*);
45};
46#define FUNCTIONCALLBACK(fun,dat) new FunctionCallbackNode((void (*)(void*,intptr_t))(fun),(void*)(dat))
47
48class StatrickCallbackNode :public CallbackNode
49{
50        void *object;
51        void *userdata;
52        void(*fun)(void*, void*, intptr_t);
53public:
54        StatrickCallbackNode(void *o, void(*f)(void*, void*, intptr_t), void *d) :object(o), userdata(d), fun(f) {}
55        void action(intptr_t calldata) { (*fun)(object, userdata, calldata); }
56        int equals(CallbackNode*);
57};
58#define STATRICKCALLBACK(obj,name,dat) new StatrickCallbackNode((void*)(obj),(void (*)(void*,void*,intptr_t))STATRICKNAME(name),(void*)(dat))
59
60/**
61   Like in old 'DuoList' you can register for an event giving function pointer
62   add(Function* fun, void* anydata)
63   'fun' will be called with your pointer as the first argument (void*)
64   and event specific value as the second argument (intptr_t)
65   fun(void* anydata,intptr_t eventdata)
66
67   'StatrickCallbackNode' uses static functions to emulate object member calls.
68   @see statrick.h
69
70   Unregistering callbacks:
71   The old remove(...) still works, but removeNode() is more efficient.
72   To use it you have to store what you get from add(...);
73   CallbackNode* node=thelist.l_add.add(&fun,data);
74   // thelist.l_add.remove(&fun,data);
75   thelist.l_add.removeNode(node); // this is better!
76
77   */
78
79class Callback : protected SList
80{
81public:
82        ~Callback();
83        CallbackNode* add(CallbackNode*n);
84        CallbackNode* add(void(*f)(void*, intptr_t), void *d)
85        {
86                return add(new FunctionCallbackNode(f, d));
87        }
88        void remove(void(*f)(void*, intptr_t), void *d)
89        {
90                remove(new FunctionCallbackNode(f, d));
91        }
92        void remove(CallbackNode*n);
93        void removeNode(CallbackNode*n);
94        void operator+=(void* fun) { add((void(*)(void*, intptr_t))fun, 0); }
95        void operator-=(void* fun) { remove((void(*)(void*, intptr_t))fun, 0); }
96        void action(intptr_t data);
97        void action() { action(0); }
98        int size() { return SList::size(); }
99        void clear() { SList::clear(); }
100};
101
102///////////////////
103
104#define STCALLBACKDEF(name) STATRICKDEF2(name,void*,intptr_t)
105#define STCALLBACKDEFC(cls,name) STATRICKSTUB2(cls,name,void*,intptr_t)  \
106        void name(void* arg1,intptr_t arg2)
107#define VIRTCALLBACKDEF(name) STATRICKSTUB2(STATRICKCLASS,name,void*,intptr_t)  \
108        virtual void name(void* arg1,intptr_t arg2)
109#define VIRTCALLBACKDEFC(cls,name) STATRICKSTUB2(cls,name,void*,intptr_t)  \
110        virtual void name(void* arg1,intptr_t arg2)
111
112/* STCALLBACKDEFC(Class,name)
113
114         |
115         v
116
117         #define STATRICKCLASS Class
118         STCALLBACKDEF(name)
119         #undef STATRICKCLASS
120         */
121
122#define CALLBACKARGS void* arg1,intptr_t arg2
123
124#endif
Note: See TracBrowser for help on using the repository browser.