AFEPack
MPI_Controller.h
浏览该文件的文档。
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