Thrift的代码生成器Compiler原理及源码详细解析 2

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代码生成器源码、狂人代码生成器 源码,以便于您获取更多的相关知识。

时间: 2024-10-29 06:24:07

Thrift的代码生成器Compiler原理及源码详细解析 2的相关文章

Thrift的代码生成器Compiler原理及源码详细解析 1 类关系图

最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是由于调试GlusterFS的一些新增功能就 用了整整的一天,还有一天就陪老婆大人逛街去了!今晚浏览完微博发现时间还早就来博客一篇,本篇 博客内容主要是前一段时间研究的Thrift的代码生成器的源码详细分析,没有具体分析语法解析,因为 是工具字段生成的代码,人是没有办法阅读的----到处都是跳转表!由于Thrift支持N多种语言,但是 生成代码原理都差不多,我主要分析了C++相关代码生成.关于Thrift的使用及原理.代码网上基本上 都

Thrift的代码生成器Compiler原理及源码详细解析 3

生成C++语言代码的代码详解 这个功能是由t_cpp_generator类实现(在文件t_cpp_generator.cc定义和实现),直接继承至 t_oop_generator类(这个类是所有面向对象语言生成器类的直接基类,封装了面向对象语言生成器共 有的特征与行为),而t_oop_generator又从t_generator继承(上面已经介绍),下面详细分析这个类 是怎样生成C++语言的代码文件的.这个还有从上面介绍的generate_program函数开始说起,因为这个 函数才是控制整个代

thrift的TTransport类体系原理及源码详细解析1-类结构和抽象基类

本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些 功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图, 如下: 由上面的类关系图可以看出,这部分的功能是相当的强大,所以类比较多且关系错综复杂.但是如 果理解清楚了这些类直接的关系就很容易掌握这部分的实现技术和这部分实现的功能.我们把这个类关 系图分为三部分来看,第一部分看抽象基类TTransport类,它是所有传输类的基类,有很大一部分类直 接从它继承实现它提供或者

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCom

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCompactProtocol) 这个协议类采用了zigzag 编码,这种编码是基于Variable-length quantity编码提出来 的,因为Variable-length quantity编码对于负数的编码都需要很长的字节数,而zigzag 编 码对于绝对值小的数字,无论正负都可以采用较少的字节来表示,充分利用了 Varint技术. 所以这个协议类采用zigzag 编码可以节省传输空

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBi

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBinaryProtocol) 这个协议是Thrift支持的默认二进制协议,它以二进制的格式写所有的数据,基本上直接 发送原始数据.因为它直接从TVirtualProtocol类继承,而且是一个模板类.它的模板参数 就是一个封装具体传输发送的类,这个类才是真正实现数据传输的.这个类的定义上一节举 例已经出现过了就不在列出来了. 下面我就结合scribe的Log函数执行的具体过程来 分析使用这个协

深度理解Android InstantRun原理以及源码分析

深度理解Android InstantRun原理以及源码分析 @Author 莫川 Instant Run官方介绍 简单介绍一下Instant Run,它是Android Studio2.0以后新增的一个运行机制,能够显著减少你第二次及以后的构建和部署时间.简单通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代

从Python的源码来解析Python下的freeblock

  这篇文章主要介绍了从Python的源码来解析Python下的freeblock,包括内存空间分配等知识,需要的朋友可以参考下 1 引言 在python内存管理中,有一个block的概念.它比较类似于SGI次级空间配置器. 首先申请一块大的空间(4KB),然后把它切割成一小份(8, 16 一直到512). 当有内存申请的请求时候,简单的流程是:根据大小找到对应的block,然后在freeblock 上给它一份. 2 问题 整个过程是一种比较自然的slab分配方式.但当我读到这段代码时,却感到疑

《Android 源码设计模式解析与实战》——第1章,第1.1节优化代码的第一步——单一职责原则

第1章 走向灵活软件之路--面向对象的六大原则Android 源码设计模式解析与实战 1.1 优化代码的第一步--单一职责原则单一职责原则的英文名称是Single Responsibility Principle,缩写是SRP.SRP的定义是:就一个类而言,应该仅有一个引起它变化的原因.简单来说,一个类中应该是一组相关性很高的函数.数据的封装.就像老师在<设计模式之禅>中说的:"这是一个备受争议却又及其重要的原则.只要你想和别人争执.怄气或者是吵架,这个原则是屡试不爽的".

《Android 源码设计模式解析与实战》——第2章,第2.1节单例模式介绍

第2章 应用最广的模式--单例模式Android 源码设计模式解析与实战 2.1 单例模式介绍单例模式是应用最广的模式之一,也可能是很多初级工程师唯一会使用的设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为.如在一个应用中,应该只有一个ImageLoader实例,这个ImageLoader中又含有线程池.缓存系统.网络请求等,很消耗资源,因此,没有理由让它构造多个实例.这种不能自由构造对象的情况,就是单例模