mariadb/storage/tokudb/tokudb_vlq.h
Rich Prohaska 8b619cad16 refs #6112 use templates for the vlq functions in the tokudb handlerton
git-svn-id: file:///svn/mysql/tokudb-engine/tokudb-engine@53779 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-17 00:02:18 -04:00

45 lines
1.3 KiB
C++

#ifndef _TOKUDB_VLQ_H
#define _TOKUDB_VLQ_H
namespace tokudb {
// Variable length encode an unsigned integer into a buffer with limit s.
// Returns the number of bytes used to encode n in the buffer.
// Returns 0 if the buffer is too small.
template <class T> size_t vlq_encode_ui(T n, void *p, size_t s) {
unsigned char *pp = (unsigned char *)p;
size_t i = 0;
while (n >= 128) {
if (i >= s)
return 0; // not enough space
pp[i++] = n%128;
n = n/128;
}
if (i >= s)
return 0; // not enough space
pp[i++] = 128+n;
return i;
}
// Variable length decode an unsigned integer from a buffer with limit s.
// Returns the number of bytes used to decode the buffer.
// Returns 0 if the buffer is too small.
template <class T> size_t vlq_decode_ui(T *np, void *p, size_t s) {
unsigned char *pp = (unsigned char *)p;
T n = 0;
size_t i = 0;
while (1) {
if (i >= s)
return 0; // not a full decode
T m = pp[i];
n |= (m & 127) << (7*i);
i++;
if ((m & 128) != 0)
break;
}
*np = n;
return i;
}
}
#endif