blob: 022b2168b745461ddaf6293a2f48e4927f8982f9 (
plain) (
tree)
|
|
#include <stdlib.h>
#include "builder.h"
#include "internal/common.h"
static size_t nextpow2(size_t);
struct u8str *
u8strgrow(struct u8str *b, size_t n)
{
if (n > b->cap) {
b->cap = nextpow2(n);
if (!(b->p = realloc(b->p, b->cap)))
return nullptr;
}
return b;
}
size_t
nextpow2(size_t x)
{
#if defined(__has_builtin) && __has_builtin(__builtin_clzl)
x = x <= 1 ? 1 : 1 << (64 - __builtin_clzl(x - 1));
#else
if (x) {
x--;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
if (sizeof(size_t) >= 4)
x |= x >> 16;
if (sizeof(size_t) >= 8)
x |= x >> 32;
}
x++;
#endif
return x;
}
|