include/leveldb/slice.h
slice
是leveldb内部使用的字符串类,代码很简单。
该类只有两个数据成员:
const char* data_;
size_t size_;
函数成员也很简单,如通过各种方式构造,比较,移除前缀等等。
util/coding.h
coding
这个类是用来类型转换和压缩空间的,比如声明一个uint32
类型的变量,要分配4个字节的空间,如果这个uint32
只是用了1个字节,浪费 3 个字节,而Leveldb
中记录长度的uint
变量非常多,不压缩的话就会浪费大量的空间
// 将 char* 转换为 uint32_t
inline uint32_t DecodeFixed32(const char* ptr) {
// 小端模式直接拷贝
if (port::kLittleEndian) {
// Load the raw bytes
uint32_t result;
memcpy(&result, ptr, sizeof(result)); // gcc optimizes this to a plain load
return result;
} else {
// 大端模式还需要转换
return ((static_cast<uint32_t>(static_cast<unsigned char>(ptr[0])))
| (static_cast<uint32_t>(static_cast<unsigned char>(ptr[1])) << 8)
| (static_cast<uint32_t>(static_cast<unsigned char>(ptr[2])) << 16)
| (static_cast<uint32_t>(static_cast<unsigned char>(ptr[3])) << 24));
}
}
util/coding.cc
// 将数字v重新编码,然后放到dst中
// 做法是将一个字节分为两部分,最高位,即第8位存放是否还需要继续编码,低7位表示数据
// 如数字360,二进制为101101000,需要两个字节
// 00000001 01101000
// 00000010 11101000
// 可以看出第8位为1,说明还有数据要编码,如果为0,则已经没有数据需要编码了
char* EncodeVarint32(char* dst, uint32_t v