//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;
}