leveldb源碼閱讀—status

在閱讀log文件的時候,會發現使用了Status這個類,可以用它來得到函數返回的狀態,比如:

Status s = Function();
if (!s.ok()) return false;
return true

今天就來認真學習一下相關實現方法。

1. 私有

  1. state_,一個指向字符常數的指針。如果是成功的那麼state_是null,否則,他是一個數組,索引0~3位是消息長度,4位是狀態碼,5位以後是消息本身。

  2. 返回的狀態是可以枚舉的,在Status類中,這些可枚舉狀態是私有變量Code,一共定義了成功、沒找到、出錯、不支持、不合法的參數、IO錯誤六種情況。

  3. code函數,通過state_的第四位及狀態值返回是哪種可枚舉值

  4. 帶參數的構造函數。這個是很重要的一個函數,因爲public函數中主要使用這個函數返回狀態和類型。

Status::Status(Code code, const Slice& msg, const Slice& msg2) 

主要是使用了memcpy內存拷貝,把msg按照字節拷貝到返回結果中,具體過程如下:

  1. CopyState函數,對狀態進行深拷貝,即開闢了新的內存。

可以看到這裏也使用了memcpy函數,我查了一下官方文檔,有這樣一句評論:

std::memcpy 理應是最快的內存到內存複製子程序。它通常比必須掃描其所複製數據的 std::strcpy ,或必須預防以處理重疊輸入的 std::memmove 更高效。

2. public

2.1 the big three

  1. 構造函數
  2. 析構函數
  3. 拷貝構造函數-傳參是const
  4. 賦值函數-傳參是const
  5. 拷貝構造函數-傳參是非const
  6. 賦值構造函數-傳參是非const

2.2 是不是某一種狀態

我們之前說過,一共有6種可枚舉的狀態,所以這裏有六個公有成員函數,返回的都是布爾類型,來判斷狀態是不是OK的或者出錯了等。主要使用的就是我們之前說的Code函數。

2.3 把某種狀態和相關信息封裝返回

也是六個函數,使用的就是我們之前說的帶參數的構造函數。

2.4 轉字符串

把state轉成字符串,方便打印。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章