From: Rusty Russell Date: Sat, 25 Sep 2010 02:15:12 +0000 (+0930) Subject: tally: don't add extra bucket unless buckets == 0 X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=097857e6c09bf9696797fe08cd4241b8315f9c9a tally: don't add extra bucket unless buckets == 0 That way we match our comment about optimal tally_new() arg matching histogram height. --- diff --git a/ccan/tally/tally.c b/ccan/tally/tally.c index 9f2a4591..b3ac863b 100644 --- a/ccan/tally/tally.c +++ b/ccan/tally/tally.c @@ -16,25 +16,28 @@ struct tally { size_t total[2]; /* This allows limited frequency analysis. */ unsigned buckets, step_bits; - size_t counts[1 /* [buckets] */ ]; + size_t counts[1 /* Actually: [buckets] */ ]; }; struct tally *tally_new(unsigned buckets) { struct tally *tally; + /* There is always 1 bucket. */ + if (buckets == 0) + buckets = 1; + /* Check for overflow. */ if (buckets && SIZE_MAX / buckets < sizeof(tally->counts[0])) return NULL; - tally = malloc(sizeof(*tally) + sizeof(tally->counts[0])*buckets); + tally = malloc(sizeof(*tally) + sizeof(tally->counts[0])*(buckets-1)); if (tally) { tally->max = ((size_t)1 << (SIZET_BITS - 1)); tally->min = ~tally->max; tally->total[0] = tally->total[1] = 0; - /* There is always 1 bucket. */ - tally->buckets = buckets+1; + tally->buckets = buckets; tally->step_bits = 0; - memset(tally->counts, 0, sizeof(tally->counts[0])*(buckets+1)); + memset(tally->counts, 0, sizeof(tally->counts[0])*buckets); } return tally; } @@ -422,7 +425,7 @@ char *tally_histogram(const struct tally *tally, } else { /* We create a temporary then renormalize so < height. */ /* FIXME: Antialias properly! */ - tmp = tally_new(tally->buckets-1); + tmp = tally_new(tally->buckets); if (!tmp) return NULL; tmp->min = tally->min; diff --git a/ccan/tally/test/run-renormalize.c b/ccan/tally/test/run-renormalize.c index 5ec8b678..7c141528 100644 --- a/ccan/tally/test/run-renormalize.c +++ b/ccan/tally/test/run-renormalize.c @@ -3,7 +3,7 @@ int main(void) { - struct tally *tally = tally_new(1); + struct tally *tally = tally_new(2); plan_tests(4); tally->min = 0;