poulpy/spqlios/lib/spqlios/commons_private.c
spqlios/lib/spqlios/commons_private.cRaw
1#include "commons_private.h"
2
3#include <stdio.h>
4#include <stdlib.h>
5
6#include "commons.h"
7
8EXPORT void* spqlios_error(const char* error) {
9 fputs(error, stderr);
10 abort();
11 return nullptr;
12}
13EXPORT void* spqlios_keep_or_free(void* ptr, void* ptr2) {
14 if (!ptr2) {
15 free(ptr);
16 }
17 return ptr2;
18}
19
20EXPORT uint32_t log2m(uint32_t m) {
21 uint32_t a = m - 1;
22 if (m & a) FATAL_ERROR("m must be a power of two");
23 a = (a & 0x55555555u) + ((a >> 1) & 0x55555555u);
24 a = (a & 0x33333333u) + ((a >> 2) & 0x33333333u);
25 a = (a & 0x0F0F0F0Fu) + ((a >> 4) & 0x0F0F0F0Fu);
26 a = (a & 0x00FF00FFu) + ((a >> 8) & 0x00FF00FFu);
27 return (a & 0x0000FFFFu) + ((a >> 16) & 0x0000FFFFu);
28}
29
30EXPORT uint64_t is_not_pow2_double(void* doublevalue) { return (*(uint64_t*)doublevalue) & 0x7FFFFFFFFFFFFUL; }
31
32uint32_t revbits(uint32_t nbits, uint32_t value) {
33 uint32_t res = 0;
34 for (uint32_t i = 0; i < nbits; ++i) {
35 res = (res << 1) + (value & 1);
36 value >>= 1;
37 }
38 return res;
39}
40
41/**
42 * @brief this computes the sequence: 0,1/2,1/4,3/4,1/8,5/8,3/8,7/8,...
43 * essentially: the bits of (i+1) in lsb order on the basis (1/2^k) mod 1*/
44double fracrevbits(uint32_t i) {
45 if (i == 0) return 0;
46 if (i == 1) return 0.5;
47 if (i % 2 == 0)
48 return fracrevbits(i / 2) / 2.;
49 else
50 return fracrevbits((i - 1) / 2) / 2. + 0.5;
51}
52
53uint64_t ceilto64b(uint64_t size) { return (size + UINT64_C(63)) & (UINT64_C(-64)); }
54
55uint64_t ceilto32b(uint64_t size) { return (size + UINT64_C(31)) & (UINT64_C(-32)); }