Slice-levelDB源码解析

本文介绍了Slice类的基本概念,包括其成员变量、构造函数及各种方法,如数据操作、比较和转换等,并提供了运算符重载实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值