2 t_generator类和t_generator_registry类
这个两个类的主要功能就是为生成所有 语言的代码提供基础信息和提供具体代码生成器对象,上面就是调用这个两个类的方法来生成具体语言 的代码生成器对象和执行生成代码的功能函数。下面主要分析两个函数的功能,一个是 t_generator_registry类的get_generator函数,这个是一个静态的函数可以直接通过类调用;另一个 是t_generator类的generate_program函数。
(1)t_generator_registry类的get_generator函 数
这个函数有两个参数,一个是表示程序的对象program,另一个是语言字符串参数(包括代表 语言的简短字符串和可选项的组合,有的没有)。函数首先解析语言字符串参数,参数字符串中是这样 组织的:在冒号(:)之前是代表语言的字符串,冒号之后是可选项的参数,每一个可选项参数用逗号 (,)分割,每一个可选项参数都是键值对并且键和值是用等号(=)分割。按照上面的字符串格式解 析各个参数部分就可以了,可选项参数用map来保存键值对,代码实现如下:
string::size_type colon = options.find(':'); string language = options.substr(0, colon); map<string, string> parsed_options; if (colon != string::npos) { string::size_type pos = colon+1; while (pos != string::npos && pos < options.size()) { string::size_type next_pos = options.find(',', pos); string option = options.substr(pos, next_pos-pos); pos = ((next_pos == string::npos) ? next_pos : next_pos+1); string::size_type separator = option.find('='); string key, value; if (separator == string::npos) { key = option; value = ""; } else { key = option.substr(0, separator); value = option.substr(separator+1); } parsed_options[key] = value; } }
然后调用get_generator_map函数得到一个代表语言字符串和产生这种语言生成器对象的 工厂对象的map对象:gen_map_t& the_map = get_generator_map(); gen_map_t的定义如下:
typedef std::map<std::string, t_generator_factory*> gen_map_t;
get_generator_map函数只有两句代码,一个是定义一个静态局部变量并初始化(因 为静态局部变量必须并初始化并且只有第一次会执行初始化,因为不初始化链接程序的时候会报错), 第二句就是返回这个静态局部变量给调用者,代码如下:
static gen_map_t* the_map = new gen_map_t();
return *the_map;
然后在这个map对象中找到对应语言的工厂对象 ,然后用这个工厂对象生产一个这种语言的代码生成器对象并返回给调用者,代码如下所示:
gen_map_t::iterator iter = the_map.find(language);
return iter- >second->get_generator(program, parsed_options, options);
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 对象
, 函数
, 语言
, 代码
, 一个
, 两个map
, generator代码
, map函数
, map参数
生成map对象
thrift compiler、动软代码生成器 源码、java代码生成器源码、easyui代码生成器源码、狂人代码生成器 源码,以便于您获取更多的相关知识。