Class designed to store and invoke function pointers and method pointers

Committer:
Blaze513
Date:
Wed Nov 23 00:23:53 2011 +0000
Revision:
0:2aa4daee328e
Child:
1:2418b141f599
First Revision with basic functionality

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Blaze513 0:2aa4daee328e 1 //mbed Microcontroller Library
Blaze513 0:2aa4daee328e 2 //Class designed to store and invoke function pointers and method pointers
Blaze513 0:2aa4daee328e 3 //Copyright 2011
Blaze513 0:2aa4daee328e 4 //Thomas Hamilton
Blaze513 0:2aa4daee328e 5
Blaze513 0:2aa4daee328e 6 #ifndef GenericFunctionHandlerLibrary
Blaze513 0:2aa4daee328e 7 #define GenericFunctionHandlerLibrary
Blaze513 0:2aa4daee328e 8
Blaze513 0:2aa4daee328e 9 class GenericFunctionHandler
Blaze513 0:2aa4daee328e 10 {
Blaze513 0:2aa4daee328e 11 private:
Blaze513 0:2aa4daee328e 12 bool FunctionPointerType;
Blaze513 0:2aa4daee328e 13 void (*FunctionPointer)();
Blaze513 0:2aa4daee328e 14 unsigned char* ObjectPointer;
Blaze513 0:2aa4daee328e 15 unsigned char* MethodPointer;
Blaze513 0:2aa4daee328e 16 void (GenericFunctionHandler::*InvokePointer)();
Blaze513 0:2aa4daee328e 17
Blaze513 0:2aa4daee328e 18 template<class Class>
Blaze513 0:2aa4daee328e 19 void InvokeMethod()
Blaze513 0:2aa4daee328e 20 {
Blaze513 0:2aa4daee328e 21 (*(Class**)ObjectPointer->**(void (Class::**)())MethodPointer)();
Blaze513 0:2aa4daee328e 22 }
Blaze513 0:2aa4daee328e 23
Blaze513 0:2aa4daee328e 24 public:
Blaze513 0:2aa4daee328e 25 GenericFunctionHandler(void (*FunctionAddress)())
Blaze513 0:2aa4daee328e 26 : FunctionPointerType(0), FunctionPointer(FunctionAddress)
Blaze513 0:2aa4daee328e 27 {
Blaze513 0:2aa4daee328e 28 }
Blaze513 0:2aa4daee328e 29 template<class Class>
Blaze513 0:2aa4daee328e 30 GenericFunctionHandler(Class* ObjectAddress, void (Class::*MethodAddress)()) :
Blaze513 0:2aa4daee328e 31 FunctionPointerType(1), ObjectPointer(new unsigned char(sizeof(ObjectAddress))),
Blaze513 0:2aa4daee328e 32 MethodPointer(new unsigned char(sizeof(MethodAddress))),
Blaze513 0:2aa4daee328e 33 InvokePointer(&GenericFunctionHandler::InvokeMethod<Class>)
Blaze513 0:2aa4daee328e 34 {
Blaze513 0:2aa4daee328e 35 memcpy(ObjectPointer, (unsigned char*)&ObjectAddress, sizeof(ObjectAddress));
Blaze513 0:2aa4daee328e 36 memcpy(MethodPointer, (unsigned char*)&MethodAddress, sizeof(MethodAddress));
Blaze513 0:2aa4daee328e 37 }
Blaze513 0:2aa4daee328e 38
Blaze513 0:2aa4daee328e 39 ~GenericFunctionHandler()
Blaze513 0:2aa4daee328e 40 {
Blaze513 0:2aa4daee328e 41 delete[] ObjectPointer;
Blaze513 0:2aa4daee328e 42 delete[] MethodPointer;
Blaze513 0:2aa4daee328e 43 }
Blaze513 0:2aa4daee328e 44
Blaze513 0:2aa4daee328e 45 void Call()
Blaze513 0:2aa4daee328e 46 {
Blaze513 0:2aa4daee328e 47 if (!FunctionPointerType)
Blaze513 0:2aa4daee328e 48 {
Blaze513 0:2aa4daee328e 49 (*FunctionPointer)();
Blaze513 0:2aa4daee328e 50 }
Blaze513 0:2aa4daee328e 51 else
Blaze513 0:2aa4daee328e 52 {
Blaze513 0:2aa4daee328e 53 (this->*InvokePointer)();
Blaze513 0:2aa4daee328e 54 }
Blaze513 0:2aa4daee328e 55 }
Blaze513 0:2aa4daee328e 56
Blaze513 0:2aa4daee328e 57 void operator ()()
Blaze513 0:2aa4daee328e 58 {
Blaze513 0:2aa4daee328e 59 if (!FunctionPointerType)
Blaze513 0:2aa4daee328e 60 {
Blaze513 0:2aa4daee328e 61 (*FunctionPointer)();
Blaze513 0:2aa4daee328e 62 }
Blaze513 0:2aa4daee328e 63 else
Blaze513 0:2aa4daee328e 64 {
Blaze513 0:2aa4daee328e 65 (this->*InvokePointer)();
Blaze513 0:2aa4daee328e 66 }
Blaze513 0:2aa4daee328e 67 }
Blaze513 0:2aa4daee328e 68 };
Blaze513 0:2aa4daee328e 69
Blaze513 0:2aa4daee328e 70 #endif