Beispiel #1
0
static void test_for_size(size_t size)
{
	struct ewah_bitmap *a = generate_bitmap(size);
	struct ewah_bitmap *b = generate_bitmap(size);
	struct ewah_bitmap *result = ewah_new();
	size_t i;

	struct {
		const char *name;
		void (*generate)(struct ewah_bitmap *, struct ewah_bitmap *, struct ewah_bitmap *);
		size_t (*check)(size_t, size_t);
	} tests[] = {
		{"or", &ewah_or, &op_or},
		{"xor", &ewah_xor, &op_xor},
		{"and", &ewah_and, &op_and},
		{"and-not", &ewah_and_not, &op_andnot}
	};

	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) {
		fprintf(stderr, "'%s' in %zu bits... ", tests[i].name, size);

		tests[i].generate(a, b, result);

		if (verify_operation(a, b, result, tests[i].check))
			fprintf(stderr, "OK\n");

		ewah_clear(result);
	}

	ewah_free(a);
	ewah_free(b);
	ewah_free(result);
}
Beispiel #2
0
int ewah_deserialize(struct ewah_bitmap *self, int fd)
{
	size_t i;
	eword_t dump[2048];
	const size_t words_per_dump = sizeof(dump) / sizeof(eword_t);
	uint32_t bitsize, word_count, rlw_pos;

	eword_t *buffer = NULL;
	size_t words_left;

	ewah_clear(self);

	/* 32 bit -- bit size for the map */
	if (read(fd, &bitsize, 4) != 4)
		return -1;

	self->bit_size = (size_t)ntohl(bitsize);

	/** 32 bit -- number of compressed 64-bit words */
	if (read(fd, &word_count, 4) != 4)
		return -1;

	self->buffer_size = self->alloc_size = (size_t)ntohl(word_count);
	self->buffer = ewah_realloc(self->buffer,
		self->alloc_size * sizeof(eword_t));

	if (!self->buffer)
		return -1;

	/** 64 bit x N -- compressed words */
	buffer = self->buffer;
	words_left = self->buffer_size;

	while (words_left >= words_per_dump) {
		if (read(fd, dump, sizeof(dump)) != sizeof(dump))
			return -1;

		for (i = 0; i < words_per_dump; ++i, ++buffer)
			*buffer = ntohll(dump[i]);

		words_left -= words_per_dump;
	}

	if (words_left) {
		if (read(fd, dump, words_left * 8) != words_left * 8)
			return -1;

		for (i = 0; i < words_left; ++i, ++buffer)
			*buffer = ntohll(dump[i]);
	}

	/** 32 bit -- position for the RLW */
	if (read(fd, &rlw_pos, 4) != 4)
		return -1;

	self->rlw = self->buffer + ntohl(rlw_pos);
	return 0;
}
Beispiel #3
0
struct ewah_bitmap *ewah_new(void)
{
	struct ewah_bitmap *self;

	self = xmalloc(sizeof(struct ewah_bitmap));
	self->alloc_size = 32;
	ALLOC_ARRAY(self->buffer, self->alloc_size);

	ewah_clear(self);
	return self;
}
Beispiel #4
0
void ewah_pool_free(struct ewah_bitmap *self)
{
	if (self == NULL)
		return;

	if (bitmap_pool_size == BITMAP_POOL_MAX ||
		self->alloc_size == 0) {
		ewah_free(self);
		return;
	}

	ewah_clear(self);
	bitmap_pool[bitmap_pool_size++] = self;
}