TinyFormat 源码阅读(二)
那从这一章开始我们正式进入 tinyformat
,首先是 tfm::format
函数,一起来看一下它的定义:
那这里的话和上一章的代码风格基本类似,同样是借助 TINYFORMAT_FOREACH_ARGNUM
来生成出多个版本的 format
函数,而功能的实现则放在 vformat
中我们待会再来看,首先看一下这里向 vformat
中传入的参数有一个 makeFormatList
,通过之前的用例我们应该知道这里传入的是用于填充 fmt
串的参数,一起来看一下它的定义:
这里开始有更多需要拓展的内容了,我们比较熟悉的 TINYFORMAT_FOREACH_ARGNUM
先放在一边,这里的返回值是在 detail
命名空间下的 FormatList
类型,那同样一起来看看它的定义:
可以看到这个类的功能就是把传入的参数一起打包封装到 FormatListN
的 m_formatterStore
成员中,构造函数结合 init
实现了一个递归的初始化方式(TINYFORMAT_PASSARGS_TAIL
的实现从第二个参数开始取值,所以每次调用参数都会减少):
看完了构建参数的过程,我们回到本章真正的核心, vformat
函数,它的定义是这样的:
其中 FormatListRef
是指向 FormatList
的 const
引用:
如果之前只关注 FormatListN
而没有看到 FormatList
的话,前者是后者的父类,在构造函数中通过 : FormatList(&m_formatterStore[0], n)
传递了初始化好的参数数组指针 m_args
和参数长度 m_N
这里我们先抛开一些错误状态的处理,先来看主要流程,传入的 fmt
串要通过 printFormatStringLiteral
函数进行第一步处理,看一下它的定义:
这段代码实际上 c 风格比较明显,作用的话就是找到 fmt
中的第一个需要填充参数的位置并返回, c-fmt
通过两个指针相减算出子串的长度,返回剩余部分。
篇幅原因本节关于 TinyFormat
的源码阅读就先到这里,下一节我们再继续阅读串解析以及流状态的部分,再会!