Class designed to store and invoke function pointers and method pointers
GenericFunctionHandler.h@0:2aa4daee328e, 2011-11-23 (annotated)
- 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?
User | Revision | Line number | New 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 |