LevelDB原始碼閱讀 Status

2022-08-29 16:42:21 字數 3002 閱讀 7972

status用來判斷函式返回的狀態資訊,封裝了錯誤碼和錯誤資訊。

將不同返回值碼定義為乙個列舉型別。

enum code ;
列舉型別本質是一種int型別,4個位元組,上述列舉型別定義不占用記憶體空間,只有當定義列舉型別變數時才占用空間,如: code code,code只能使用宣告中列出的字串來初始化。

status本質就乙個成員變數const char *state_,為了節省記憶體,state_分為三部分使用:

拷貝控制

關鍵字noexcept宣告符表明該函式不會丟擲異常。

主要優點:

// create a success status.

status() noexcept : state_(nullptr) {}

~status()

status(const status &rhs);

status& operator=(const status &rhs);

status(status &&rhs) noexcept : state_(rhs.state_)

status& operator=(status &&rhs) noexcept;

具體實現

inline status::status(const status &rhs) 

inline status& status::operator=(const status &rhs)

return *this;

}inline status& status::operator=(status &&rhs) noexcept

其中拷貝構造和拷貝賦值本質都是呼叫copystate來完成,重新開闢一塊記憶體儲存s.state_並將指標賦給呼叫函式的s.state_,copystate實現如下:

const char* status::copystate(const char *state)
主要對外介面

直接返回特定型別物件

// return a success status.

static status ok()

static status notfound(const slice &msg, const slice &msg2 = slice())

static status corruption(const slice &msg, const slice &msg2 = slice())

static status notsupported(const slice &msg, const slice &msg2 = slice())

static status invalidargument(const slice &msg, const slice &msg2 = slice())

static status ioerror(const slice &msg, const slice &msg2 = slice())

呼叫例子

status s;

s = status::corruption("corrupted key for ", user_key); // 會用到賦值操作符

這幾個函式又直接呼叫以下函式

status(code code, const slice &msg, const slice &msg2);
具體實現如下:

status::status(code code, const slice &msg, const slice &msg2) 

state_ = result;

}

判斷狀態成員方法

// returns true iff the status indicates success.

bool ok() const

// returns true iff the status indicates a notfound error.

bool isnotfound() const

// returns true iff the status indicates a corruption error.

bool iscorruption() const

// returns true iff the status indicates an ioerror.

bool isioerror() const

// returns true iff the status indicates a notsupportederror.

bool isnotsupportederror() const

// returns true iff the status indicates an invalidargument.

bool isinvalidargument() const

都是通過呼叫code()方法返回狀態,code()實現如下:

code code() const
輸出狀態

std::string status::tostring() const  else 

std::string result(type);

uint32_t length;

memcpy(&length, state_, sizeof(length)); // 取出state_首席資訊官度存入length

return result; // 返回type + 具體資訊

}}

其中snprintf將格式化的n個位元組資料寫入字串,函式原型如下:

int snprintf(char *str, int n, char * format [, argument, ...]);

leveldb原始碼閱讀知識積累4

形式1 返回型別 函式名 參數列 形式1 typede f 返回型別 新型別 參數列 1.typedef char ptrfun int 2.ptrfun pfun 3.charglfun inta 4.voidmain 5.2 c string assign 賦值常用方法函式 assign 常用在...

leveldb 原始碼導讀

1,slice.h中slice是leveldb內部使用的字串類,很簡單 2,leveldb 儲存編碼 對於位元組儲存分大端小端位元組序還是小端小端位元組序 leveldb使用的是小端位元組序儲存,低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。編碼分為變長的varint和固定大小...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...