leveldb_slice Posted on 2023-03-10 | In leveldb源码学习 | Words count in article: 602 | Reading time ≈ 3 Slice切片。切片是一种简单的数据结构,包含指向数据的指针和数据的大小。 多个线程可以在没有外部同步的情况下在Slice上调用const方法,但是如果任何线程可以调用非const方法,则访问同一Slice的所有线程都必须使用外部同步。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115//// Created by Dell on 2023/3/10.//#ifndef LEVELDB_SLICE_H#define LEVELDB_SLICE_H#include <cassert>#include <cstddef>#include <cstring>#include <string>namespace leveldb {class Slice {public: // TODO // 无参构造函数 Slice() : data_(""), size_(0) {} // 有参构造函数 Slice(const char* d, size_t n) : data_(d), size_(n) {} // 通过string构造 Slice(const std::string& s) : data_(s.data()), size_(s.size()) {} // 通过char* 构造 Slice(const char* s) : data_(s), size_(strlen(s)) {} // 默认的拷贝构造函数和赋值构造函数 Slice(const Slice&) = default; Slice& operator=(const Slice&) = default; // 获取数据方法 const char* data() const { return data_; } // 获取数据大小方法 size_t size() const { return size_; } // 判断slice是否为空 bool empty() { return size_ == 0; } // 清空slice void clear() { data_ = ""; size_ = 0; } // 将slice转化为string std::string ToString() const { return std::string(data_, size_); } // 比较slice的前缀是否为x bool starts_with(const Slice& x) const { return ((size_ > x.size_) && (memcmp(data_, x.data_, x.size_) == 0)); } // 移除长度为n的前缀 void remove_prefix(size_t n) { assert(n <= size_); data_ += n; size_ -= n; } // 比较两个slice int compare(const Slice& b) const; // 重载取值运算符 char operator[](size_t n) const { assert(n <= size_); return data_[n]; }private: // 数据 const char* data_; // 大小 size_t size_;}; // 重载==运算符inline bool operator==(const Slice& x, const Slice& y) { // 两个slice相等:大小相等且数据相等 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); // 比较前min_len个数据大小 if (r == 0) { // 如果前min_len个数据相等,长度大的大 if (size_ < b.size_) r = -1; else if (size_ > b.size_) r = +1; } return r;}};#endif //LEVELDB_SLICE_H/**#define PTR char*int memcmp(const PTR str1, const PTR str2, size_t count) { // register 放到寄存器 register const unsigned char *s1 = (const unsigned char*)str1; register const unsigned char *s2 = (const unsigned char*)str2; while (count -- > 0) { if (*s1 ++ == *s2 ++) return s1[-1] < s2[-1] ? -1 : 1; } return 0;}**/