From 056181160ce510e5409886fd7b8884480ae30a27 Mon Sep 17 00:00:00 2001 From: astrojhgu Date: Mon, 19 Oct 2009 16:57:14 +0000 Subject: git-svn-id: file:///home/svn/opt_utilities@82 ed2142bd-67ad-457f-ba7c-d818d4011675 --- models/dl_model.hpp | 181 ++++++---------------------------------------------- models/models.cc | 3 - 2 files changed, 21 insertions(+), 163 deletions(-) (limited to 'models') diff --git a/models/dl_model.hpp b/models/dl_model.hpp index 7221fd1..9729335 100644 --- a/models/dl_model.hpp +++ b/models/dl_model.hpp @@ -12,169 +12,30 @@ namespace opt_utilities { + template - class dl_model - :public model,std::string> + model,std::string>* load_model(const char* fname) { - private: - T (*calc_model)(T x,const T* p); - int nparams; - mutable void* handle; - private: - model >* do_clone()const - { - dl_model* result=new dl_model(*this); - this->handle=NULL; - return result; - } + void* handle; - const char* do_get_type_name()const - { - return "shared object wrapping model"; - } - - // public: - public: - dl_model() - :handle(NULL) - {} - - - public: - dl_model(const char* file_name) - :handle(NULL) - { - - handle=dlopen(file_name,RTLD_LAZY); - - if(!handle) - { - throw opt_exception("faild loading object"); - } - - calc_model=(T (*)(T,const T*))dlsym(handle,"calc_model"); - - if(!calc_model) - { - throw opt_exception("symble undefined"); - } - - const char* (*get_param_name)(int) - =(const char* (*)(int))dlsym(handle,"get_param_name"); - - if(!get_param_name) - { - throw opt_exception("symble undefined"); - } - - int (*get_num_params)() - =(int (*)())dlsym(handle,"get_num_params"); - - if(!get_num_params) - { - throw opt_exception("symble undefined"); - if(!get_num_params) - { - throw opt_exception("symble undefined"); - } } - - T (*get_default_value)(int) - =(T (*)(int))dlsym(handle,"get_default_value"); - - if(!get_default_value) - { - throw opt_exception("symble undefined"); - } - - nparams=get_num_params(); - - for(int i=0;i!=nparams;++i) - { - this->push_param_info(param_info >(get_param_name(i), - get_default_value(i))); - } - } - - ~dl_model() - { - if(handle) - { - dlclose(handle); - } - } - - void bind(const char* file_name) - { - if(handle) - { - dlclose(handle); - } - this->clear_param_info(); - handle=dlopen(file_name,RTLD_LAZY); - - if(!handle) - { - throw opt_exception("faild loading object"); - } - - calc_model=(T (*)(T,const T*))dlsym(handle,"calc_model"); - - if(!calc_model) - { - throw opt_exception("symble undefined"); - } - - const char* (*get_param_name)(int) - =(const char* (*)(int))dlsym(handle,"get_param_name"); - - if(!get_param_name) - { - throw opt_exception("symble undefined"); - } - - - int (*get_num_params)() - =(int (*)())dlsym(handle,"get_num_params"); - - if(!get_num_params) - { - throw opt_exception("symble undefined"); - } - - - T (*get_default_value)(int) - =(T (*)(int))dlsym(handle,"get_default_value"); - - - if(!get_default_value) - { - throw opt_exception("symble undefined"); - } - - - nparams=get_num_params(); - for(int i=0;i!=nparams;++i) - { - this->push_param_info(param_info >(get_param_name(i), - get_default_value(i))); - } - } - - T do_eval(const T& x,const std::vector& param) - { - if(handle==NULL) - { - throw opt_exception("dl object unloaded"); - } - return calc_model(x,&get_element(param,0)); - } - - std::string do_to_string()const - { - return "Dynamical load model\n" - "Should be loaded from an shared object file\n"; - } - }; + handle=dlopen(fname,RTLD_LAZY); + + if(!handle) + { + throw opt_exception("faild loading object"); + } + + + model,std::string>* (*func_create)(); + + func_create=(model,std::string>* (*)())dlsym(handle,"create_model_object"); + + if(!func_create) + { + throw opt_exception("symble undefined"); + } + return func_create(); + } } diff --git a/models/models.cc b/models/models.cc index 8a63037..e1c6d34 100644 --- a/models/models.cc +++ b/models/models.cc @@ -108,9 +108,6 @@ model,std::vector,std::string>& get_2dmodel_by_nam model_map["poly1d3"]=new poly1d; model_map["poly1d4"]=new poly1d; model_map["poly1d5"]=new poly1d; -#ifdef __linux__ - model_map["dlmodel"]=new dl_model; -#endif //DECL_POLY(7) } -- cgit v1.2.2