Slice-levelDB源碼解析

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

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章