#include <stdlib.h>

#include "builder.h"

#include "internal/common.h"

static size_t nextpow2(size_t);

struct u8buf *
u8strgrow(struct u8buf *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;
}