#ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved."
#ident "The technology is licensed by the Massachusetts Institute of Technology, Rutgers State University of New Jersey, and the Research Foundation of State University of New York at Stony Brook under United States of America Serial No. 11/760379 and to the patents and/or patent applications resulting from it."
#ifndef RANGE_BUFFER_H
#define RANGE_BUFFER_H
#include<toku_stdint.h>
#include<ft/ybt.h>
namespacetoku{
// a key range buffer represents a set of key ranges that can
// be stored, iterated over, and then destroyed all at once.
classrange_buffer{
private:
// the key range buffer is a bunch of records in a row.
// each record has the following header, followed by the
// left key and right key data payload, if applicable.
structrecord_header{
boolleft_neg_inf;
boolleft_pos_inf;
boolright_pos_inf;
boolright_neg_inf;
uint32_tleft_key_size;
uint32_tright_key_size;
boolleft_is_infinite(void)const;
boolright_is_infinite(void)const;
voidinit(constDBT*left_key,constDBT*right_key);
};
static_assert(sizeof(record_header)==12,"record header format is off");
public:
// the iterator abstracts reading over a buffer of variable length
// records one by one until there are no more left.
classiterator{
public:
// a record represents the user-view of a serialized key range.
// it handles positive and negative infinity and the optimized
// point range case, where left and right points share memory.
classrecord{
public:
// get a read-only pointer to the left key of this record's range
constDBT*get_left_key(void)const;
// get a read-only pointer to the right key of this record's range
constDBT*get_right_key(void)const;
// how big is this record? this tells us where the next record is
size_tsize(void)const;
// populate a record header and point our DBT's
// buffers into ours if they are not infinite.
voiddeserialize(constchar*buf);
private:
record_headerm_header;
DBTm_left_key;
DBTm_right_key;
};
voidcreate(constrange_buffer*buffer);
// populate the given record object with the current
// the memory referred to by record is valid for only
// as long as the record exists.
boolcurrent(record*rec);
// move the iterator to the next record in the buffer
voidnext(void);
private:
// the key range buffer we are iterating over, the current
// offset in that buffer, and the size of the current record.
constrange_buffer*m_buffer;
size_tm_current_offset;
size_tm_current_size;
};
// allocate buffer space lazily instead of on creation. this way,
// no malloc/free is done if the transaction ends up taking no locks.
voidcreate(void);
// append a left/right key range to the buffer.
// if the keys are equal, then only one copy is stored.