Message ID | 20191115141541.11149-4-chriscool@tuxfamily.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Rewrite packfile reuse code | expand |
On Fri, Nov 15, 2019 at 03:15:35PM +0100, Christian Couder wrote: > In a following commit we will need to allocate a variable > number of bitmap words, instead of always 32, so let's add > bitmap_word_alloc() for this purpose. This name is much better than the horrible "bitmap_new2()" it was called in the original. ;) I wonder if "new_with_world_alloc" or "new_with_size" would make it more obvious that this is also a constructor, though. > void bitmap_set(struct bitmap *self, size_t pos) > { > size_t block = EWAH_BLOCK(pos); > > if (block >= self->word_alloc) { > size_t old_size = self->word_alloc; > - self->word_alloc = block * 2; > + self->word_alloc = block ? block * 2 : 1; Since this hunk caused so much confusion, maybe worth calling it out in the commit message. Something like: Note that we have to adjust the block growth in bitmap_set(), since a caller could now use an initial size of "0" (we don't plan to do that, but it doesn't hurt to be defensive). -Peff
On Mon, Dec 9, 2019 at 7:28 AM Jeff King <peff@peff.net> wrote: > > On Fri, Nov 15, 2019 at 03:15:35PM +0100, Christian Couder wrote: > > > In a following commit we will need to allocate a variable > > number of bitmap words, instead of always 32, so let's add > > bitmap_word_alloc() for this purpose. > > This name is much better than the horrible "bitmap_new2()" it was called > in the original. ;) > > I wonder if "new_with_world_alloc" or "new_with_size" would make it more > obvious that this is also a constructor, though. bitmap_new_with_word_alloc() feels a bit verbose to me for such a short function, so for now I kept bitmap_word_alloc(). I think that if we really want to use "new" for constructors then a better solution would be something like renaming bitmap_new(void) to bitmap_new_default(void) and bitmap_word_alloc(size_t word_alloc) to bitmap_new(size_t word_alloc). > > void bitmap_set(struct bitmap *self, size_t pos) > > { > > size_t block = EWAH_BLOCK(pos); > > > > if (block >= self->word_alloc) { > > size_t old_size = self->word_alloc; > > - self->word_alloc = block * 2; > > + self->word_alloc = block ? block * 2 : 1; > > Since this hunk caused so much confusion, maybe worth calling it out in > the commit message. Something like: > > Note that we have to adjust the block growth in bitmap_set(), since > a caller could now use an initial size of "0" (we don't plan to do > that, but it doesn't hurt to be defensive). Ok, I added the above as a commit message note in my current version.
On Wed, Dec 11, 2019 at 02:50:40PM +0100, Christian Couder wrote: > > I wonder if "new_with_world_alloc" or "new_with_size" would make it more > > obvious that this is also a constructor, though. > > bitmap_new_with_word_alloc() feels a bit verbose to me for such a > short function, so for now I kept bitmap_word_alloc(). OK, that's fine with me... > I think that if we really want to use "new" for constructors then a > better solution would be something like renaming bitmap_new(void) to > bitmap_new_default(void) and bitmap_word_alloc(size_t word_alloc) to > bitmap_new(size_t word_alloc). ...but that also would be fine with me. -Peff
diff --git a/ewah/bitmap.c b/ewah/bitmap.c index 52f1178db4..b5fed9621f 100644 --- a/ewah/bitmap.c +++ b/ewah/bitmap.c @@ -22,21 +22,26 @@ #define EWAH_MASK(x) ((eword_t)1 << (x % BITS_IN_EWORD)) #define EWAH_BLOCK(x) (x / BITS_IN_EWORD) -struct bitmap *bitmap_new(void) +struct bitmap *bitmap_word_alloc(size_t word_alloc) { struct bitmap *bitmap = xmalloc(sizeof(struct bitmap)); - bitmap->words = xcalloc(32, sizeof(eword_t)); - bitmap->word_alloc = 32; + bitmap->words = xcalloc(word_alloc, sizeof(eword_t)); + bitmap->word_alloc = word_alloc; return bitmap; } +struct bitmap *bitmap_new(void) +{ + return bitmap_word_alloc(32); +} + void bitmap_set(struct bitmap *self, size_t pos) { size_t block = EWAH_BLOCK(pos); if (block >= self->word_alloc) { size_t old_size = self->word_alloc; - self->word_alloc = block * 2; + self->word_alloc = block ? block * 2 : 1; REALLOC_ARRAY(self->words, self->word_alloc); memset(self->words + old_size, 0x0, (self->word_alloc - old_size) * sizeof(eword_t)); diff --git a/ewah/ewok.h b/ewah/ewok.h index 84b2a29faa..1b98b57c8b 100644 --- a/ewah/ewok.h +++ b/ewah/ewok.h @@ -172,6 +172,7 @@ struct bitmap { }; struct bitmap *bitmap_new(void); +struct bitmap *bitmap_word_alloc(size_t word_alloc); void bitmap_set(struct bitmap *self, size_t pos); int bitmap_get(struct bitmap *self, size_t pos); void bitmap_reset(struct bitmap *self);