arnaucube
arnaucube/poulpyPublic Self-hosted repository
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)); }