/usr/include/kmer/unaryEncoding.h is in libmeryl-dev 0~20150903+r2013-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | #ifndef UNARY_ENCODING_H
#define UNARY_ENCODING_H
#include "bitPacking.h"
// Routines to store and retrieve a unary encoded number to/from a
// bit packed word array based at 'ptr' and currently at location
// 'pos'. Both routines return the size of the encoded number in
// 'siz'.
// The usual unary encoding. Store the number n as n 0 bits followed
// by a single 1 bit.
//
// 0 -> 1
// 1 -> 01
// 2 -> 001
// 3 -> 0001
// 4 -> 00001
//
// See the decoder as to why we use 0 instead of 1 for the count.
inline
void
setUnaryEncodedNumber(uint64 *ptr,
uint64 pos,
uint64 *siz,
uint64 val) {
*siz = val + 1;
while (val >= 64) {
setDecodedValue(ptr, pos, 64, uint64ZERO);
pos += 64;
val -= 64;
siz += 64;
}
setDecodedValue(ptr, pos, val + 1, uint64ONE);
pos += val + 1;
}
inline
uint64
getUnaryEncodedNumber(uint64 *ptr,
uint64 pos,
uint64 *siz) {
uint64 val = uint64ZERO;
uint64 enc = uint64ZERO;
// How many whole words are zero?
//
enc = getDecodedValue(ptr, pos, 64);
while (enc == uint64ZERO) {
val += 64;
pos += 64;
enc = getDecodedValue(ptr, pos, 64);
}
// This word isn't zero. Count how many bits are zero (see, the
// choice of 0 or 1 for the encoding wasn't arbitrary!)
//
val += 64 - logBaseTwo64(enc);
*siz = val + 1;
return(val);
}
#endif // UNARY_ENCODING_H
|