#include "turbopfor-common.h"
+#include <algorithm>
#include <assert.h>
+#ifdef HAS_ENDIAN_H
+#include <endian.h>
+#endif
#include <limits.h>
#include <stdint.h>
+#include <string.h>
template<class Docid>
void write_le(Docid val, void *out)
} else if constexpr (sizeof(Docid) == 2) {
val = htole16(val);
} else if constexpr (sizeof(Docid) == 1) {
- val = val;
+ // No change.
} else {
assert(false);
}
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.
}
template<class Docid>
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 {