TinyFormat 源碼閱讀(二)
那從這一章開始我們正式進(jìn)入 tinyformat
,首先是 tfm::format
函數(shù),一起來看一下它的定義:
那這里的話和上一章的代碼風(fēng)格基本類似,同樣是借助 TINYFORMAT_FOREACH_ARGNUM
來生成出多個(gè)版本的 format
函數(shù),而功能的實(shí)現(xiàn)則放在 vformat
中我們待會(huì)再來看,首先看一下這里向 vformat
中傳入的參數(shù)有一個(gè) makeFormatList
,通過之前的用例我們應(yīng)該知道這里傳入的是用于填充 fmt
串的參數(shù),一起來看一下它的定義:
這里開始有更多需要拓展的內(nèi)容了,我們比較熟悉的 TINYFORMAT_FOREACH_ARGNUM
先放在一邊,這里的返回值是在 detail
命名空間下的 FormatList
類型,那同樣一起來看看它的定義:
可以看到這個(gè)類的功能就是把傳入的參數(shù)一起打包封裝到 FormatListN
的 m_formatterStore
成員中,構(gòu)造函數(shù)結(jié)合 init
實(shí)現(xiàn)了一個(gè)遞歸的初始化方式(TINYFORMAT_PASSARGS_TAIL
的實(shí)現(xiàn)從第二個(gè)參數(shù)開始取值,所以每次調(diào)用參數(shù)都會(huì)減少):
看完了構(gòu)建參數(shù)的過程,我們回到本章真正的核心, vformat
函數(shù),它的定義是這樣的:
其中 FormatListRef
是指向 FormatList
的 const
引用:
如果之前只關(guān)注 FormatListN
而沒有看到 FormatList
的話,前者是后者的父類,在構(gòu)造函數(shù)中通過 : FormatList(&m_formatterStore[0], n)
傳遞了初始化好的參數(shù)數(shù)組指針 m_args
和參數(shù)長(zhǎng)度 m_N
這里我們先拋開一些錯(cuò)誤狀態(tài)的處理,先來看主要流程,傳入的 fmt
串要通過 printFormatStringLiteral
函數(shù)進(jìn)行第一步處理,看一下它的定義:
這段代碼實(shí)際上 c 風(fēng)格比較明顯,作用的話就是找到 fmt
中的第一個(gè)需要填充參數(shù)的位置并返回, c-fmt
通過兩個(gè)指針相減算出子串的長(zhǎng)度,返回剩余部分。
篇幅原因本節(jié)關(guān)于 TinyFormat
的源碼閱讀就先到這里,下一節(jié)我們?cè)倮^續(xù)閱讀串解析以及流狀態(tài)的部分,再會(huì)!