未加星标

LevelDB 源码分析(四):Slice

字体大小 | |
[数据库(综合) 所属分类 数据库(综合) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

LevelDB 中的字符串并没有使用 std:string ,而是将其封装成了Slice类, Slice 是非常简单的数据结构,它包括 size (字符串的长度)和一个指向外部字节数组的指针。

返回一个 Slice 比返回 std:string 更加方便,因为我们不需要去复制大量原始的key和value的数据。

使用 slice 之前必须要保证 slice 中指针指向的内存没有被收回。

源码: include/leveldb/slice.h

class Slice {
public:
// 创建一个空的slice
Slice() : data_(""), size_(0) { }
// 根据字符数组d[0,n-1]创建一个Slice
Slice(const char* d, size_t n) : data_(d), size_(n) { }
// 根据string类型的"s"创建一个Slice
Slice(const std::string& s) : data_(s.data()), size_(s.size()) { }
// 根据字符数组s[0, strlen(s)-1]创建一个Slice
Slice(const char* s) : data_(s), size_(strlen(s)) { }
// 返回数据的首地址
const char* data() const { return data_; }
// 返回数据的长度(单位为字节)
size_t size() const { return size_; }
// 判断数据是否为空
bool empty() const { return size_ == 0; }
// 返回第n个字节的字符
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;
}
// 返回一个string类型的字符串
std::string ToString() const { return std::string(data_, size_); }
// 比较两个slice
// if "*this" < "b", return < 0;
// if "*this" == "b", return == 0;
// if "*this" > "b", return >0 .
int compare(const Slice& b) const;
// 判断当前slice的字符串是否是以x的字符串为首
bool starts_with(const Slice& x) const {return ((size_ >= x.size_) && (memcmp(data_, x.data_, x.size_) == 0));
}
private:
const char* data_;
size_t size_;
// Intentionally copyable
};
// slice == 运算符重载
inline bool operator==(const Slice& x, const Slice& y) {
return ((x.size() == y.size()) && (memcmp(x.data(), y.data(), x.size()) == 0));
}
inline bool operator!=(const Slice& x, const Slice& y) {
return !(x == y);
}
// 比较函数
inline int Slice::compare(const Slice& b) const {
const size_t 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;
}

本文数据库(综合)相关术语:系统安全软件

主题: 数据结构数据删除
代码区博客精选文章
分页:12
转载请注明
本文标题:LevelDB 源码分析(四):Slice
本站链接:https://www.codesec.net/view/457742.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(275)