X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=turbopfor-encode.h;h=d149ae75ce85dd6b4a08392d652e991c488d22d0;hb=cbecd483f57c465b2ad6d3867c760c2e5b5e79aa;hp=693bd301544a9cdcec378b2dd5bc5c2e7547ae17;hpb=89b31924b02a7b49f476a05c90195b9b7a613e80;p=plocate diff --git a/turbopfor-encode.h b/turbopfor-encode.h index 693bd30..d149ae7 100644 --- a/turbopfor-encode.h +++ b/turbopfor-encode.h @@ -14,7 +14,6 @@ #include "turbopfor-common.h" #include - #include #include #include @@ -53,6 +52,12 @@ unsigned char *write_baseval(Docid in, unsigned char *out) out[1] = in & 0xff; out[2] = (in >> 8) & 0xff; return out + 3; + } else if (in < 0x10000000) { + out[0] = (in >> 24) | 0xe0; + out[1] = (in >> 16) & 0xff; + out[2] = (in >> 8) & 0xff; + out[3] = in & 0xff; + return out + 4; } else { assert(false); // Not implemented. } @@ -89,11 +94,20 @@ unsigned char *write_vb(Docid val, unsigned char *out) template inline unsigned num_bits(Docid x) { +#ifdef __GNUC__ if (x == 0) { return 0; } else { return sizeof(Docid) * CHAR_BIT - __builtin_clz(x); } +#else + for (int i = sizeof(Docid) * CHAR_BIT; i-- > 0; ) { + if (x & (Docid{1} << i)) { + return i; + } + } + return 0; +#endif } struct BitWriter {