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