00001 00002 #ifndef _FUNCPTR_HPP_ 00003 #define _FUNCPTR_HPP_ 00004 00005 namespace ps 00006 { 00012 class FuncPtr 00013 { 00014 public: 00015 FuncPtr(void *addr = 0) 00016 { 00017 this->addr = addr; 00018 } 00019 00020 void set(void *addr) 00021 { 00022 this->addr = addr; 00023 } 00024 void *get(void) 00025 { 00026 return addr; 00027 } 00028 00029 void call(void) 00030 { 00031 if (!addr) return; 00032 typedef void (*FUNCPTR)(void); 00033 void (*funcptr)(void); 00034 funcptr = (FUNCPTR)addr; 00035 funcptr(); 00036 } 00037 template <typename A> void call(A arg1) 00038 { 00039 if (!addr) return; 00040 typedef void (*FUNCPTR)(A); 00041 void (*funcptr)(A); 00042 funcptr = (FUNCPTR)addr; 00043 funcptr(arg1); 00044 } 00045 template <typename A, typename B> void call(A arg1, B arg2) 00046 { 00047 if (!addr) return; 00048 typedef void (*FUNCPTR)(A, B); 00049 void (*funcptr)(A, B); 00050 funcptr = (FUNCPTR)addr; 00051 funcptr(arg1, arg2); 00052 } 00053 template <typename A, typename B, typename C> void call(A arg1, B arg2, C arg3) 00054 { 00055 if (!addr) return 0; 00056 typedef void (*FUNCPTR)(A, B, C); 00057 void (*funcptr)(A, B, C); 00058 funcptr = (FUNCPTR)addr; 00059 funcptr(arg1, arg2, arg3); 00060 } 00061 template <typename R> R call(void) 00062 { 00063 if (!addr) return 0; 00064 typedef R (*FUNCPTR)(void); 00065 R (*funcptr)(void); 00066 funcptr = (FUNCPTR)addr; 00067 return funcptr(); 00068 } 00069 template <typename R, typename A> R call(A arg1) 00070 { 00071 if (!addr) return 0; 00072 typedef R (*FUNCPTR)(A); 00073 R (*funcptr)(A); 00074 funcptr = (FUNCPTR)addr; 00075 return funcptr(arg1); 00076 } 00077 template <typename R, typename A, typename B> R call(A arg1, B arg2) 00078 { 00079 if (!addr) return 0; 00080 typedef R (*FUNCPTR)(A, B); 00081 R (*funcptr)(A, B); 00082 funcptr = (FUNCPTR)addr; 00083 return funcptr(arg1, arg2); 00084 } 00085 template <typename R, typename A, typename B, typename C> R call(A arg1, B arg2, C arg3) 00086 { 00087 if (!addr) return 0; 00088 typedef R (*FUNCPTR)(A, B, C); 00089 R (*funcptr)(A, B, C); 00090 funcptr = (FUNCPTR)addr; 00091 return funcptr(arg1, arg2, arg3); 00092 } 00093 private: 00094 void *addr; 00095 }; 00096 } 00097 00098 #endif 00099