Jonathan Jones
/
Radios
Radio Structures in OOP
Diff: utils/RTOS_Management/FunctionPointerRJ.h
- Revision:
- 4:989d51f3e6ef
- Parent:
- 3:dc7e9c6bc26c
--- a/utils/RTOS_Management/FunctionPointerRJ.h Sat Jan 03 04:35:32 2015 +0000 +++ b/utils/RTOS_Management/FunctionPointerRJ.h Sat Jan 03 11:04:31 2015 +0000 @@ -19,13 +19,12 @@ #include <string.h> #include "RTP.h" -namespace mbed { - typedef void (*pvoidf_t)(void); /** A class for storing and calling a pointer to a static or member void function */ -class FunctionPointerRJ { +class FunctionPointerRJ +{ public: /** Create a FunctionPointer, attaching a static function @@ -48,9 +47,9 @@ * * @param function The void static function to attach (default is none) */ - void attach(void (*function)(void) = 0); - void attach(void (*function)(RTP_t*)); - void attach(void (*function)(void const*)); + void attach(void(*function)(void) = 0); + void attach(void(*function)(RTP_t*) = 0); + void attach(void(*function)(void const*)); /** Attach a member function * @@ -64,17 +63,17 @@ _membercaller = &FunctionPointerRJ::membercaller<T>; _function = 0; } - - /** Attach a member function - * - * @param object The object pointer to invoke the member function on (i.e. the this pointer) - * @param function The address of the void member function to attach - */ + + /** Attach a member function + * + * @param object The object pointer to invoke the member function on (i.e. the this pointer) + * @param function The address of the void member function to attach + */ template<typename T> - void attach(T *object, void (T::*member)(RTP_t&)) { + void attach(T *object, void (T::*member)(RTP_t*)) { _object = static_cast<void*>(object); memcpy(_member, (char*)&member, sizeof(member)); - _membercaller = &FunctionPointerRJ::membercaller<T>; + _membercallerRTP = &FunctionPointerRJ::membercallerRTP<T>; _functionRTP = 0; } @@ -101,14 +100,22 @@ (o->*m)(); } - void (*_functionConst)(void const*); - void (*_functionRTP)(RTP_t*); + template<typename T> + static void membercallerRTP(void *object, char *member, RTP_t *p) { + T* o = static_cast<T*>(object); + void(T::*m)(RTP_t*); + memcpy((char*)&m, member, sizeof(m)); + (o->*m)(p); + + } + + void (*_functionConst)(void const*); + void (*_functionRTP)(RTP_t*); void (*_function)(void); // static function pointer - 0 if none attached void *_object; // object this pointer - 0 if none attached char _member[16]; // raw member function pointer storage - converted back by registered _membercaller void (*_membercaller)(void*, char*); // registered membercaller function to convert back and call _member on _object + void (*_membercallerRTP)(void*, char*, RTP_t*); }; -} // namespace mbed - #endif // FUNCTIONPOINTER_RJ_H