bsl_kv_btree_data_unit.h 4.9 KB
Newer Older
W
wangguibao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
/* -*- c++ -*-
   copy[write] by dirlt(dirtysalt1987@gmail.com) */
#ifndef _BSL_KV_BTREE_DATA_UNIT_H_
#define _BSL_KV_BTREE_DATA_UNIT_H_

//如何依赖头文件,那么直接在bsl_kv_btree.h里面填写.
template<typename K,
         typename V,
         typename KARCHIVE=_btree_archive_traits<K>,
         typename VARCHIVE=_btree_archive_traits<V>,
         typename LT=std::less<K>,
         typename EQ=std::equal_to<K> >
//这里很难使用Archive这个类
//因为BSL里面的Archive根本就没有序列化到内存的接口..
//所以自己写Archive类.._btree_archive_traits.
//kv btree内部应该包含的内容...
//应该包含V的所有接口..
class _bsl_kv_btree_du {
public:
    typedef _bsl_kv_btree_du<K,V,KARCHIVE,VARCHIVE,LT,EQ> Self;
    //这样就能够得到最终的数据内容了...
    typedef K key_type;
    typedef V value_type;

public:
    //同时持有k,v.
    K _key;
    V _value;
    uint64_t _id;
    LT _lt;
    EQ _eq;
    _btree_archive_traits<uint64_t> _idarchive;
    KARCHIVE _karchive;
    VARCHIVE _varchive;

public:
    //有默认的初始化构造函数和copy构造函数...
    //并且用来初始化archive结构...
    _bsl_kv_btree_du():
        _key(),_value(),
        _idarchive(&_id),_karchive(&_key),
        _varchive(&_value) {
        init();
    }
    _bsl_kv_btree_du(const K&k,const V&v):
        _key(k),_value(v),
        _idarchive(&_id),_karchive(&_key),
        _varchive(&_value) {
        init();
    }
    _bsl_kv_btree_du(const _bsl_kv_btree_du &du):
        _key(du._key),_value(du._value),
        _idarchive(&_id),_karchive(&_key),
        _varchive(&_value) {
        init();
    }
    const Self & operator = (const Self & v) {
        //重复使用的话,那么释放之前的内存.....
        //其实这样是可以使用变长内存的...
        if(this!=&v) {
            bsl_destruct(this);
            bsl_construct(this,v);
        }
        return *this;
    }
    void init() {
        _id=UNDEF_ID;
    }
    //下面这些方法仅仅对于定长有效,但是对于变长的话,
//     //是需要重新实现的..
//     //这个可以固定住..
//     uint64_t get_store_size()const{
//         return (uint64_t)sizeof(Self);
//     }
//     //必须使用archive实现...
//     //但是archive没有实现copy到内存的接口...:(..
//     int store(char *buf,const uint64_t buf_size,
//               uint64_t &data_pos)const {
//                   int err=BTREE_OK;
//         if(buf_size > data_pos &&
//            (buf_size - data_pos)>= (uint64_t)sizeof(V)) {
//             //V *tmp=(V*)(buf+data_pos);
//             //*tmp=_value;
//             //data_pos+=(uint64_t)sizeof(V);
//             Self *tmp=(Self*)(buf+data_pos);
//             *tmp=*this;
//             data_pos+=(uint64_t)sizeof(Self);
//         } else {
//             err=BTREE_UNKNOWN_ERROR;
//         }
//         return err;
//     }
//     int load(char *buf,const uint64_t buf_size,
//              uint64_t &data_pos) {
//         int err=BTREE_OK;
//         if(buf_size > data_pos &&
//            (buf_size - data_pos)>= (uint64_t)sizeof(V)) {
//             //V *tmp=(V*)(buf+data_pos);
//             //_value=*tmp;
//             //data_pos+=(uint64_t)sizeof(V);
//             Self *tmp=(Self*)(buf+data_pos);
//             *this=*tmp;
//             data_pos+=(uint64_t)sizeof(Self);
//         } else {
//             err=BTREE_UNKNOWN_ERROR;
//         }
//         return err;
//     }
    //关于变长内存的话,那么store/load接口就需要花一些心思..
    uint64_t get_store_size()const {
        return (uint64_t)_idarchive.size()+
               (uint64_t)_karchive.size()+
               (uint64_t)_varchive.size();
    }
    int store(char *buf,const uint64_t buf_size,
              uint64_t &data_pos)const {
        int err=BTREE_OK;
        err=_karchive.serialize(buf,buf_size,data_pos);
        if(err!=BTREE_OK) {
            return err;
        }
        err=_varchive.serialize(buf,buf_size,data_pos);
        if(err!=BTREE_OK) {
            return err;
        }
        err=_idarchive.serialize(buf,buf_size,data_pos);
        if(err!=BTREE_OK) {
            return err;
        }
        return err;
    }
    int load(char *buf,const uint64_t buf_size,
             uint64_t &data_pos) {
        int err=BTREE_OK;
        err=_karchive.deserialize(buf,buf_size,data_pos);
        if(err!=BTREE_OK) {
            return err;
        }
        err=_varchive.deserialize(buf,buf_size,data_pos);
        if(err!=BTREE_OK) {
            return err;
        }
        err=_idarchive.deserialize(buf,buf_size,data_pos);
        if(err!=BTREE_OK) {
            return err;
        }
        return err;
    }
    void set_id(uint64_t id) {
        _id=id;
    }
    uint64_t get_id()const {
        return _id;
    }
    //使用Compare对象实现比较接口..
    bool operator==(const K &k)const {
        return _eq(_key,k);
    }
    bool operator==(const Self &self)const {
        return _eq(_key,self._key);
    }

    bool operator<(const K&k)const {
        return _lt(_key,k);
    }
    bool operator<(const Self &self)const {
        return _lt(_key,self._key);
    }
};

#endif