//slice是level中很基礎的一個類型,是對key , value的封裝,裏面的數據成員很簡單,只有兩個,一個是const char* data_,size_t size_,所以它其實是key或value的一個引用,非常節省內存,同時也提供了非常方便的操作接口。
class Slice {
public:
//創建一個空的slice
Slice() : data_(""), size_(0) { }
//通過指定data和size來創建一個slice對象
Slice(const char* d, size_t n) : data_(d), size_(n) { }
//通過string對象創建一個slice對象
Slice(const std::string& s) : data_(s.data()), size_(s.size()) { }
//通過char型數組來創建一個slice
Slice(const char* s) : data_(s), size_(strlen(s)) { }
//返回指向data的指針
const char* data() const { return data_; }
//slice的大小
size_t size() const { return size_; }
//slice是否爲空
bool empty() const { return size_ == 0; }
//取data的第i個字節
char operator[](size_t n) const {
assert(n < size());
return data_[n];
}
//清空slice
void clear() { data_ = ""; size_ = 0; }
//移除前n個字節
void remove_prefix(size_t n) {
assert(n <= size());
data_ += n;
size_ -= n;
}
//返回data的一個字符竄副本
std::string ToString() const {
return std::string(data_, size_);
}
//如果當前slice < b,返回 < 0
//如果當前slice == b,返回 == 0
//如果當前slice > b,返回 > 0
int compare(const Slice& b) const;
//如果x是slice是prefix
bool start_with(const Slice& x) const {
return ((size_ >= x.size_) && (memcmp(data_, x.data_, x.size_) == 0));
}
private:
const char* data_;
size_t size_;
};
//運算符重載,判斷兩個slice是否相等
inline bool operator==(const Slice& x, const Slice& y) {
return ((x.size() == y.size()) && (memcmp(x.data(), y.data(), x.size()) == 0));
}
//運算符重載,判斷兩個slice是否不等
inline bool operator!=(const Slice& x, const Slice& y) {
return !(x == y);
}
inline int Slice::compare(const Slice& b) const {
const int min_len = (size_ < b.size_) ? size_ : b.size_;
int r = memcmp(data_, b.data_, min_len);
if (r == 0) {
if (size_ < b.size_) r = -1;
else if (size_ > b.size_) r = +1;
}
return r;
}