ewah: add bitmap_dup() function

There's no easy way to make a copy of a bitmap. Obviously a caller can
iterate over the bits and set them one by one in a new bitmap, but we
can go much faster by copying whole words with memcpy().

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2020-12-08 17:03:50 -05:00 committed by Junio C Hamano
parent 3ed675101a
commit ccae08e822
2 changed files with 8 additions and 0 deletions

View File

@ -35,6 +35,13 @@ struct bitmap *bitmap_new(void)
return bitmap_word_alloc(32); return bitmap_word_alloc(32);
} }
struct bitmap *bitmap_dup(const struct bitmap *src)
{
struct bitmap *dst = bitmap_word_alloc(src->word_alloc);
COPY_ARRAY(dst->words, src->words, src->word_alloc);
return dst;
}
static void bitmap_grow(struct bitmap *self, size_t word_alloc) static void bitmap_grow(struct bitmap *self, size_t word_alloc)
{ {
size_t old_size = self->word_alloc; size_t old_size = self->word_alloc;

View File

@ -173,6 +173,7 @@ struct bitmap {
struct bitmap *bitmap_new(void); struct bitmap *bitmap_new(void);
struct bitmap *bitmap_word_alloc(size_t word_alloc); struct bitmap *bitmap_word_alloc(size_t word_alloc);
struct bitmap *bitmap_dup(const struct bitmap *src);
void bitmap_set(struct bitmap *self, size_t pos); void bitmap_set(struct bitmap *self, size_t pos);
void bitmap_unset(struct bitmap *self, size_t pos); void bitmap_unset(struct bitmap *self, size_t pos);
int bitmap_get(struct bitmap *self, size_t pos); int bitmap_get(struct bitmap *self, size_t pos);