Skip to content

Commit c71e67f

Browse files
committed
Updated minor functionality of the Callback class
- Marked `call` and `operator()` functions as const - Moved to static_cast for internal function pointer to avoid losing compiler checked const-safety - Added test for `operator=` with non-callback types - Moved from zero-cast to value-initializer when callback is null - Added `operator==` and `operator!=` - Removed special handling of null callback - Replicated doxygen to all overloads - Added correct nops where uninitialized callbacks are called - Added assertion for null callback - Removed copy-constructor from callback constructor
1 parent 45d25ed commit c71e67f

File tree

6 files changed

+1108
-336
lines changed

6 files changed

+1108
-336
lines changed

TESTS/mbed_drivers/callback/main.cpp

Lines changed: 48 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -203,20 +203,14 @@ void test_dispatch0() {
203203
Verifier<T>::verify0((volatile Thing<T>*)&thing, &volatile_func0<T>);
204204
Verifier<T>::verify0((const volatile Thing<T>*)&thing, &const_volatile_func0<T>);
205205
Verifier<T>::verify0(callback(static_func0<T>));
206-
Verifier<T>::verify0(callback(&thing, &Thing<T>::member_func0));
207-
Verifier<T>::verify0(callback((const Thing<T>*)&thing, &Thing<T>::const_member_func0));
208-
Verifier<T>::verify0(callback((volatile Thing<T>*)&thing, &Thing<T>::volatile_member_func0));
209-
Verifier<T>::verify0(callback((const volatile Thing<T>*)&thing, &Thing<T>::const_volatile_member_func0));
210-
Verifier<T>::verify0(callback(&thing, &bound_func0<T>));
211-
Verifier<T>::verify0(callback((const Thing<T>*)&thing, &const_func0<T>));
212-
Verifier<T>::verify0(callback((volatile Thing<T>*)&thing, &volatile_func0<T>));
213-
Verifier<T>::verify0(callback((const volatile Thing<T>*)&thing, &const_volatile_func0<T>));
214-
215-
Callback<T()> callback(static_func0);
216-
Verifier<T>::verify0(callback);
217-
callback.attach(&thing, &bound_func0<T>);
218-
Verifier<T>::verify0(&callback, &Callback<T()>::call);
219-
Verifier<T>::verify0((void*)&callback, &Callback<T()>::thunk);
206+
207+
Callback<T()> cb(static_func0);
208+
Verifier<T>::verify0(cb);
209+
cb = static_func0;
210+
Verifier<T>::verify0(cb);
211+
cb.attach(&thing, &bound_func0<T>);
212+
Verifier<T>::verify0(&cb, &Callback<T()>::call);
213+
Verifier<T>::verify0((void*)&cb, &Callback<T()>::thunk);
220214
}
221215

222216
template <typename T>
@@ -232,20 +226,14 @@ void test_dispatch1() {
232226
Verifier<T>::verify1((volatile Thing<T>*)&thing, &volatile_func1<T>);
233227
Verifier<T>::verify1((const volatile Thing<T>*)&thing, &const_volatile_func1<T>);
234228
Verifier<T>::verify1(callback(static_func1<T>));
235-
Verifier<T>::verify1(callback(&thing, &Thing<T>::member_func1));
236-
Verifier<T>::verify1(callback((const Thing<T>*)&thing, &Thing<T>::const_member_func1));
237-
Verifier<T>::verify1(callback((volatile Thing<T>*)&thing, &Thing<T>::volatile_member_func1));
238-
Verifier<T>::verify1(callback((const volatile Thing<T>*)&thing, &Thing<T>::const_volatile_member_func1));
239-
Verifier<T>::verify1(callback(&thing, &bound_func1<T>));
240-
Verifier<T>::verify1(callback((const Thing<T>*)&thing, &const_func1<T>));
241-
Verifier<T>::verify1(callback((volatile Thing<T>*)&thing, &volatile_func1<T>));
242-
Verifier<T>::verify1(callback((const volatile Thing<T>*)&thing, &const_volatile_func1<T>));
243-
244-
Callback<T(T)> callback(static_func1);
245-
Verifier<T>::verify1(callback);
246-
callback.attach(&thing, &bound_func1<T>);
247-
Verifier<T>::verify1(&callback, &Callback<T(T)>::call);
248-
Verifier<T>::verify1((void*)&callback, &Callback<T(T)>::thunk);
229+
230+
Callback<T(T)> cb(static_func1);
231+
Verifier<T>::verify1(cb);
232+
cb = static_func1;
233+
Verifier<T>::verify1(cb);
234+
cb.attach(&thing, &bound_func1<T>);
235+
Verifier<T>::verify1(&cb, &Callback<T(T)>::call);
236+
Verifier<T>::verify1((void*)&cb, &Callback<T(T)>::thunk);
249237
}
250238

251239
template <typename T>
@@ -261,20 +249,14 @@ void test_dispatch2() {
261249
Verifier<T>::verify2((volatile Thing<T>*)&thing, &volatile_func2<T>);
262250
Verifier<T>::verify2((const volatile Thing<T>*)&thing, &const_volatile_func2<T>);
263251
Verifier<T>::verify2(callback(static_func2<T>));
264-
Verifier<T>::verify2(callback(&thing, &Thing<T>::member_func2));
265-
Verifier<T>::verify2(callback((const Thing<T>*)&thing, &Thing<T>::const_member_func2));
266-
Verifier<T>::verify2(callback((volatile Thing<T>*)&thing, &Thing<T>::volatile_member_func2));
267-
Verifier<T>::verify2(callback((const volatile Thing<T>*)&thing, &Thing<T>::const_volatile_member_func2));
268-
Verifier<T>::verify2(callback(&thing, &bound_func2<T>));
269-
Verifier<T>::verify2(callback((const Thing<T>*)&thing, &const_func2<T>));
270-
Verifier<T>::verify2(callback((volatile Thing<T>*)&thing, &volatile_func2<T>));
271-
Verifier<T>::verify2(callback((const volatile Thing<T>*)&thing, &const_volatile_func2<T>));
272-
273-
Callback<T(T, T)> callback(static_func2);
274-
Verifier<T>::verify2(callback);
275-
callback.attach(&thing, &bound_func2<T>);
276-
Verifier<T>::verify2(&callback, &Callback<T(T, T)>::call);
277-
Verifier<T>::verify2((void*)&callback, &Callback<T(T, T)>::thunk);
252+
253+
Callback<T(T, T)> cb(static_func2);
254+
Verifier<T>::verify2(cb);
255+
cb = static_func2;
256+
Verifier<T>::verify2(cb);
257+
cb.attach(&thing, &bound_func2<T>);
258+
Verifier<T>::verify2(&cb, &Callback<T(T, T)>::call);
259+
Verifier<T>::verify2((void*)&cb, &Callback<T(T, T)>::thunk);
278260
}
279261

280262
template <typename T>
@@ -290,20 +272,14 @@ void test_dispatch3() {
290272
Verifier<T>::verify3((volatile Thing<T>*)&thing, &volatile_func3<T>);
291273
Verifier<T>::verify3((const volatile Thing<T>*)&thing, &const_volatile_func3<T>);
292274
Verifier<T>::verify3(callback(static_func3<T>));
293-
Verifier<T>::verify3(callback(&thing, &Thing<T>::member_func3));
294-
Verifier<T>::verify3(callback((const Thing<T>*)&thing, &Thing<T>::const_member_func3));
295-
Verifier<T>::verify3(callback((volatile Thing<T>*)&thing, &Thing<T>::volatile_member_func3));
296-
Verifier<T>::verify3(callback((const volatile Thing<T>*)&thing, &Thing<T>::const_volatile_member_func3));
297-
Verifier<T>::verify3(callback(&thing, &bound_func3<T>));
298-
Verifier<T>::verify3(callback((const Thing<T>*)&thing, &const_func3<T>));
299-
Verifier<T>::verify3(callback((volatile Thing<T>*)&thing, &volatile_func3<T>));
300-
Verifier<T>::verify3(callback((const volatile Thing<T>*)&thing, &const_volatile_func3<T>));
301-
302-
Callback<T(T, T, T)> callback(static_func3);
303-
Verifier<T>::verify3(callback);
304-
callback.attach(&thing, &bound_func3<T>);
305-
Verifier<T>::verify3(&callback, &Callback<T(T, T, T)>::call);
306-
Verifier<T>::verify3((void*)&callback, &Callback<T(T, T, T)>::thunk);
275+
276+
Callback<T(T, T, T)> cb(static_func3);
277+
Verifier<T>::verify3(cb);
278+
cb = static_func3;
279+
Verifier<T>::verify3(cb);
280+
cb.attach(&thing, &bound_func3<T>);
281+
Verifier<T>::verify3(&cb, &Callback<T(T, T, T)>::call);
282+
Verifier<T>::verify3((void*)&cb, &Callback<T(T, T, T)>::thunk);
307283
}
308284

309285
template <typename T>
@@ -319,20 +295,14 @@ void test_dispatch4() {
319295
Verifier<T>::verify4((volatile Thing<T>*)&thing, &volatile_func4<T>);
320296
Verifier<T>::verify4((const volatile Thing<T>*)&thing, &const_volatile_func4<T>);
321297
Verifier<T>::verify4(callback(static_func4<T>));
322-
Verifier<T>::verify4(callback(&thing, &Thing<T>::member_func4));
323-
Verifier<T>::verify4(callback((const Thing<T>*)&thing, &Thing<T>::const_member_func4));
324-
Verifier<T>::verify4(callback((volatile Thing<T>*)&thing, &Thing<T>::volatile_member_func4));
325-
Verifier<T>::verify4(callback((const volatile Thing<T>*)&thing, &Thing<T>::const_volatile_member_func4));
326-
Verifier<T>::verify4(callback(&thing, &bound_func4<T>));
327-
Verifier<T>::verify4(callback((const Thing<T>*)&thing, &const_func4<T>));
328-
Verifier<T>::verify4(callback((volatile Thing<T>*)&thing, &volatile_func4<T>));
329-
Verifier<T>::verify4(callback((const volatile Thing<T>*)&thing, &const_volatile_func4<T>));
330-
331-
Callback<T(T, T, T, T)> callback(static_func4);
332-
Verifier<T>::verify4(callback);
333-
callback.attach(&thing, &bound_func4<T>);
334-
Verifier<T>::verify4(&callback, &Callback<T(T, T, T, T)>::call);
335-
Verifier<T>::verify4((void*)&callback, &Callback<T(T, T, T, T)>::thunk);
298+
299+
Callback<T(T, T, T, T)> cb(static_func4);
300+
Verifier<T>::verify4(cb);
301+
cb = static_func4;
302+
Verifier<T>::verify4(cb);
303+
cb.attach(&thing, &bound_func4<T>);
304+
Verifier<T>::verify4(&cb, &Callback<T(T, T, T, T)>::call);
305+
Verifier<T>::verify4((void*)&cb, &Callback<T(T, T, T, T)>::thunk);
336306
}
337307

338308
template <typename T>
@@ -348,20 +318,14 @@ void test_dispatch5() {
348318
Verifier<T>::verify5((volatile Thing<T>*)&thing, &volatile_func5<T>);
349319
Verifier<T>::verify5((const volatile Thing<T>*)&thing, &const_volatile_func5<T>);
350320
Verifier<T>::verify5(callback(static_func5<T>));
351-
Verifier<T>::verify5(callback(&thing, &Thing<T>::member_func5));
352-
Verifier<T>::verify5(callback((const Thing<T>*)&thing, &Thing<T>::const_member_func5));
353-
Verifier<T>::verify5(callback((volatile Thing<T>*)&thing, &Thing<T>::volatile_member_func5));
354-
Verifier<T>::verify5(callback((const volatile Thing<T>*)&thing, &Thing<T>::const_volatile_member_func5));
355-
Verifier<T>::verify5(callback(&thing, &bound_func5<T>));
356-
Verifier<T>::verify5(callback((const Thing<T>*)&thing, &const_func5<T>));
357-
Verifier<T>::verify5(callback((volatile Thing<T>*)&thing, &volatile_func5<T>));
358-
Verifier<T>::verify5(callback((const volatile Thing<T>*)&thing, &const_volatile_func5<T>));
359-
360-
Callback<T(T, T, T, T, T)> callback(static_func5);
361-
Verifier<T>::verify5(callback);
362-
callback.attach(&thing, &bound_func5<T>);
363-
Verifier<T>::verify5(&callback, &Callback<T(T, T, T, T, T)>::call);
364-
Verifier<T>::verify5((void*)&callback, &Callback<T(T, T, T, T, T)>::thunk);
321+
322+
Callback<T(T, T, T, T, T)> cb(static_func5);
323+
Verifier<T>::verify5(cb);
324+
cb = static_func5;
325+
Verifier<T>::verify5(cb);
326+
cb.attach(&thing, &bound_func5<T>);
327+
Verifier<T>::verify5(&cb, &Callback<T(T, T, T, T, T)>::call);
328+
Verifier<T>::verify5((void*)&cb, &Callback<T(T, T, T, T, T)>::thunk);
365329
}
366330

367331
template <typename T>

0 commit comments

Comments
 (0)