… | |
… | |
54 | template<class R$CLASS> |
54 | template<class R$CLASS> |
55 | struct callback<R ($TYPE)> |
55 | struct callback<R ($TYPE)> |
56 | { |
56 | { |
57 | typedef R (*ptr_type)(void *self$_TYPE); |
57 | typedef R (*ptr_type)(void *self$_TYPE); |
58 | |
58 | |
59 | private: |
|
|
60 | |
|
|
61 | void *self; |
|
|
62 | ptr_type func; |
|
|
63 | |
|
|
64 | protected: |
|
|
65 | |
|
|
66 | template<typename method> |
|
|
67 | struct thunktype; |
|
|
68 | |
|
|
69 | template<class klass> |
|
|
70 | struct thunktype<R (klass::*)> |
|
|
71 | { |
|
|
72 | typedef klass K; |
|
|
73 | }; |
|
|
74 | |
|
|
75 | template<class klass, R (klass::*method)($TYPE)> |
|
|
76 | static R thunk (void *self$_TYPEARG) |
|
|
77 | { |
|
|
78 | klass *obj = static_cast<klass *>(self); |
|
|
79 | return (obj->*method) ($ARG); |
|
|
80 | } |
|
|
81 | |
|
|
82 | public: |
|
|
83 | template<class K, R (K::*method)($TYPE)> |
59 | template<class K, R (K::*method)($TYPE)> |
84 | void set (K *object) |
60 | void set (K *object) |
85 | { |
61 | { |
86 | self = object; |
62 | self = object; |
87 | func = thunk<K, method>; |
63 | func = thunk<K, method>; |
… | |
… | |
94 | |
70 | |
95 | R operator ()($TYPEARG) const |
71 | R operator ()($TYPEARG) const |
96 | { |
72 | { |
97 | return call ($ARG); |
73 | return call ($ARG); |
98 | } |
74 | } |
|
|
75 | |
|
|
76 | private: |
|
|
77 | |
|
|
78 | void *self; |
|
|
79 | ptr_type func; |
|
|
80 | |
|
|
81 | template<class klass, R (klass::*method)($TYPE)> |
|
|
82 | static R thunk (void *self$_TYPEARG) |
|
|
83 | { |
|
|
84 | klass *obj = static_cast<klass *>(self); |
|
|
85 | return (obj->*method) ($ARG); |
|
|
86 | } |
99 | }; |
87 | }; |
100 | |
88 | |
101 | EOF |
89 | EOF |
102 | } |
90 | } |
103 | |
91 | |