在閱讀log文件的時候,會發現使用了Status
這個類,可以用它來得到函數返回的狀態,比如:
Status s = Function();
if (!s.ok()) return false;
return true
今天就來認真學習一下相關實現方法。
1. 私有
-
state_
,一個指向字符常數的指針。如果是成功的那麼state_
是null,否則,他是一個數組,索引0~3位是消息長度,4位是狀態碼,5位以後是消息本身。 -
返回的狀態是可以枚舉的,在Status類中,這些可枚舉狀態是私有變量
Code
,一共定義了成功、沒找到、出錯、不支持、不合法的參數、IO錯誤六種情況。 -
code函數,通過state_的第四位及狀態值返回是哪種可枚舉值
-
帶參數的構造函數。這個是很重要的一個函數,因爲public函數中主要使用這個函數返回狀態和類型。
Status::Status(Code code, const Slice& msg, const Slice& msg2)
主要是使用了memcpy
內存拷貝,把msg按照字節拷貝到返回結果中,具體過程如下:
CopyState
函數,對狀態進行深拷貝,即開闢了新的內存。
可以看到這裏也使用了memcpy函數,我查了一下官方文檔,有這樣一句評論:
std::memcpy 理應是最快的內存到內存複製子程序。它通常比必須掃描其所複製數據的 std::strcpy ,或必須預防以處理重疊輸入的 std::memmove 更高效。
2. public
2.1 the big three
- 構造函數
- 析構函數
- 拷貝構造函數-傳參是const
- 賦值函數-傳參是const
- 拷貝構造函數-傳參是非const
- 賦值構造函數-傳參是非const
2.2 是不是某一種狀態
我們之前說過,一共有6種可枚舉的狀態,所以這裏有六個公有成員函數,返回的都是布爾類型,來判斷狀態是不是OK的或者出錯了等。主要使用的就是我們之前說的Code
函數。
2.3 把某種狀態和相關信息封裝返回
也是六個函數,使用的就是我們之前說的帶參數的構造函數。
2.4 轉字符串
把state轉成字符串,方便打印。