AFEPack
|
00001 00011 #ifndef __MPI_Controller_h__ 00012 #define __MPI_Controller_h__ 00013 00014 #include <cstdlib> 00015 #include <string> 00016 #include <mpi.h> 00017 00018 namespace MPI { 00019 00020 namespace details { 00021 struct controller_packer { 00022 std::string name; 00023 std::string description; 00024 virtual void call(const char * args) const = 0; 00025 virtual ~controller_packer() {} 00026 }; 00027 template <class T> 00028 struct controller_packer_impl : public controller_packer { 00029 T * obj_ptr; 00030 void (T::*fun_ptr)(const char *); 00031 virtual void call(const char * args) const { 00032 (obj_ptr->*fun_ptr)(args); 00033 } 00034 virtual ~controller_packer_impl() {} 00035 }; 00036 template <class T> 00037 struct controller_packer_impl<const T> : public controller_packer { 00038 const T * obj_ptr; 00039 void (T::*fun_ptr)(const char *) const; 00040 virtual void call(const char * args) const { 00041 (obj_ptr->*fun_ptr)(args); 00042 } 00043 virtual ~controller_packer_impl() {} 00044 }; 00045 void setControllerEntry(controller_packer *); 00046 } 00047 00048 void registerController(const char * name, 00049 void (*function)(const char *), 00050 const char * desc = NULL); 00051 void controllerScript(const char * filename, MPI_Comm = MPI_COMM_WORLD); 00052 void getControl(); 00053 00054 template <class T> 00055 void registerController(const char * name, 00056 T * obj, 00057 void (T::*function)(const char *), 00058 const char * desc = NULL) 00059 { 00060 details::controller_packer_impl<T> * 00061 cnt_ptr = new details::controller_packer_impl<T>; 00062 cnt_ptr->name = name; 00063 cnt_ptr->obj_ptr = obj; 00064 cnt_ptr->fun_ptr = function; 00065 if (desc != NULL) { 00066 cnt_ptr->description = desc; 00067 } 00068 details::setControllerEntry(cnt_ptr); 00069 } 00070 00071 template <class T> 00072 void registerController(const char * name, 00073 const T * obj, 00074 void (T::*function)(const char *) const, 00075 const char * desc = NULL) 00076 { 00077 details::controller_packer_impl<const T> * 00078 cnt_ptr = new details::controller_packer_impl<const T>; 00079 cnt_ptr->name = name; 00080 cnt_ptr->obj_ptr = obj; 00081 cnt_ptr->fun_ptr = function; 00082 if (desc != NULL) { 00083 cnt_ptr->description = desc; 00084 } 00085 details::setControllerEntry(cnt_ptr); 00086 } 00087 } 00088 00089 #endif /* __MPI_Controller_h__ */ 00090