00001
00002
00003
00004 template <typename BaseModule, typename OptionsType>
00005 inline void TemplateFactory<BaseModule,OptionsType>::addArgument(
00006 const std::string& argument){
00007 addArgument(fMostRecentRegister,argument);
00008 }
00009
00010 template <typename BaseModule, typename OptionsType>
00011 inline void TemplateFactory<BaseModule,OptionsType>::addArgument(
00012 const std::string& module,const std::string& argument){
00013 fModules[module].arguments.push_back(argument);
00014 }
00015
00016 template <typename BaseModule, typename OptionsType>
00017 inline std::string TemplateFactory<BaseModule,OptionsType>::GetArgumentName(
00018 const std::string& module,const int& argument){
00019 return fModules.at(module).arguments.at(argument);
00020 }
00021
00022 template <typename BaseModule, typename OptionsType>
00023 BaseModule* TemplateFactory<BaseModule,OptionsType>::createModule(
00024 const std::string& name, OptionsType* opts){
00025
00026 BaseModule* module=NULL;
00027 const PerModule& details=GetModuleDetails(name);
00028
00029 try{
00030 module=details.maker(opts?opts:details.opts);
00031 }catch(modules::missing_option& e){
00032 std::cout<<fName<<"::createModule: Error: "<<e.what()<<std::endl;
00033 return NULL;
00034 }catch(modules::bad_value& e){
00035 std::cout<<fName<<"::createModule: Error: "<<e.what()<<std::endl;
00036 return NULL;
00037 }
00038 return module;
00039 }
00040
00041 template <typename BaseModule, typename OptionsType>
00042 void TemplateFactory<BaseModule,OptionsType>::registerModule(
00043 const std::string& name,
00044 TemplateFactory<BaseModule,OptionsType>::ModuleMaker make,
00045 const std::string& out){
00046 fModules[name].maker=make;
00047 fModules[name].product=out;
00048 fMostRecentRegister=name;
00049 }
00050
00051 template <typename BaseModule, typename OptionsType>
00052 std::string TemplateFactory<BaseModule,OptionsType>::GetProduct(const std::string& module){
00053 return GetModuleDetails(module).product;
00054 }
00055
00056 template <typename BaseModule, typename OptionsType>
00057 const typename TemplateFactory<BaseModule,OptionsType>::PerModule& TemplateFactory<BaseModule,OptionsType>::GetModuleDetails(
00058 const std::string& name)const{
00059 typename ModuleList::const_iterator it = fModules.find(name);
00060 if(it == fModules.end() ){
00061 std::cout<<fName<<"::GetModuleDetails: Error: I don't know how to make : "<<name<<std::endl;
00062 PrintPossibleModules();
00063 throw std::out_of_range(("unknown: "+name).c_str());
00064 }
00065 return it->second;
00066 }
00067
00068 template <typename BaseModule, typename OptionsType>
00069 void TemplateFactory<BaseModule,OptionsType>::addOptions(
00070 const std::string& name, OptionsType *opts){
00071 fModules[name].opts=opts;
00072 }
00073
00074 template <typename BaseModule, typename OptionsType>
00075 void TemplateFactory<BaseModule,OptionsType>::addArguments(const std::string& all_args){
00076 std::vector<std::string> args;
00077 modules::parser::TokeniseByDelimiter(all_args,args,", ");
00078 for(unsigned i=0;i<args.size();i++){
00079 addArgument(args[i]);
00080 }
00081 }
00082
00083 template <typename BaseModule, typename OptionsType>
00084 void TemplateFactory<BaseModule,OptionsType>::PrintPossibleModules()const{
00085 std::cout<<"Available modules are:"<<std::endl;
00086 for(typename ModuleList::const_iterator it=fModules.begin();
00087 it!=fModules.end(); it++){
00088 std::cout<<" "<<it->first<<std::endl;
00089 }
00090 }