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可以顯示出類的繼承和實現結構,包括它的父類和...