include/funcptr.hpp

Go to the documentation of this file.
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 

Generated on Sun Feb 3 21:38:49 2008 for libplusscript++ by  doxygen 1.5.3