首页 > 其他分享 >leveldb学习笔记之四——include/leveldb/slice.h

leveldb学习笔记之四——include/leveldb/slice.h

时间:2022-11-07 13:06:29浏览次数:40  
标签:leveldb const Slice slice 之四 return data size


在真正开始研究leveldb的存储过程之前,先来研究一下相关的结构,首先是slice。

为了操作方便,leveldb将数据和长度包装成了slice使用,至于为什么要这么做,估计是两位大神是为了效率的提升,避免一些不必要的操作吧。

class LEVELDB_EXPORT Slice {
public:
//创建一个空slice
Slice() : data_(""), size_(0) { }

// 传入数据指针和长度创建一个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()) { }

// 传入一个字符串创建slice
Slice(const char* s) : data_(s), size_(strlen(s)) { }

// 定义默认拷贝构造和默认赋值函数
Slice(const Slice&) = default;
Slice& operator=(const Slice&) = default;

// 返回slice数据的指针
const char* data() const { return data_; }

// 返回slice数据的长度
size_t size() const { return size_; }

// 判断数据是否为空
bool empty() const { return size_ == 0; }

// 重载【】
char operator[](size_t n) const {
assert(n < size());
return data_[n];
}

// 清空数据
void clear() { data_ = ""; size_ = 0; }

// slice丢掉前n个字节
void remove_prefix(size_t n) {
assert(n <= size());
data_ += n;
size_ -= n;
}

std::string ToString() const { return std::string(data_, size_); }

// 比较方式. 返回值:
// < 0 iff "*this" < "b",
// == 0 iff "*this" == "b",
// > 0 iff "*this" > "b"
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_;
};

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

学习是一种慰藉,编程是一种情怀,技术提升永不可辜负!


标签:leveldb,const,Slice,slice,之四,return,data,size
From: https://blog.51cto.com/u_15862521/5828911

相关文章

  • leveldb学习笔记之三——include/leveldb/db.h
    此文件为leveldb的c++接口文件,用c++的方式调用leveldb只需要包含此文件即可。在此文件中定义了leveldb对外的接口DB,其具体的实现由db/db_impl.h中的DBImpl类实现。DB的定......
  • leveldb学习笔记之二——源码目录结构
    说明从今天开始,将正式进入leveldb源码的学习。leveldb主要采用c++实现,整体代码比较规范,除了学习存储相关的原理,还可以学习c++相关的知识,提升c++的技巧。目录leveldb的目录结......
  • leveldb学习笔记之六——db/memtable.h
    db数据在内存中的存储格式,写操作的数据都会先写到memtable中类classMemTable{public://构造函数,不允许隐式转换,参数为内部key比较器explicitMemTable(constInte......
  • leveldb学习笔记之一——clion调用leveldb使用示例
    前言2018年杀入区块链,算是接触了分布式、数据存储这一系列的知识,前段时间接触某手机厂商的技术人员,才发现自己在存储方面知识的不足,因此这段时间准备沉下心来学习学习。接下......
  • leveldb学习笔记之十——leveldb/util/cache.cc
    cache.cc中的代码是Cache的实现代码,其中主要涉及到LRUHandle、HandleTable、LRUCache以及ShardedLRUCache。它们与Cache的关系如下:ShardedLRUCache是抽象类Cache的实现,提供......
  • Rust 编程中使用 leveldb 的简单例子
    前言最近准备用Rust写一个完善的blockchain的教学demo,在持久化时考虑到使用leveldb。通过查阅文档,发现Rust中已经提供了使用leveldb的接口。将官方的例子修改了下,能够运行通......
  • 0081-Go-切片 slice
    环境Time2022-08-23Go1.19前言说明参考:https://gobyexample.com/slices目标使用Go语言的切片类型。新建切片类型packagemainimport"fmt"funcmain()......
  • 腾讯云~基于zookeeper(集群)+LevelDB的ActiveMq高可用伪集群安装、配置、测试
    文章目录​​一、预先准备​​​​1.技术选型​​​​2.zk集群搭建​​​​3.MQ集群规划​​​​二、预先准备​​​​2.1.MQ下载​​​​2.2.解压​​​​2.3.复制3......
  • python遇到IndexError: only integers, slices (`:`), ellipsis (`...`)……
    完整错误信息如下:IndexError:onlyintegers,slices(​​:​​​),ellipsis(​​...​​​),numpy.newaxis(​​None​​)andintegerorbooleanarraysarevalid......
  • subStr和subString以及slice的使用和区别
    substr相关使用注意事项第一个参数必须为数值,可正可负可为0为负数则从倒数开始第二个参数是指定长度,默认为到字符串最后如果第一个参数超过字符串的长度,那么会返回......