From c434e0a5a52f108860209fc58c91927ab32a8c45 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Fri, 3 Aug 2007 22:23:33 -0700 Subject: [PATCH] Generalize histogram printing to accept a predicate function --- mnemon.c | 67 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/mnemon.c b/mnemon.c index 52a77d0..446d449 100644 --- a/mnemon.c +++ b/mnemon.c @@ -323,6 +323,27 @@ bin_item_index (bin_t *bin, assert (0); } +typedef int (item_match_predicate_t) (void *closure, item_t *item); + +/* Return the number of items in the bin from the given category (or + * from all categories if category == NULL) */ +static int +bin_num_items_matching (bin_t *bin, + item_match_predicate_t *predicate, + void *closure) +{ + int i, num_items = 0; + + if (predicate == NULL) + return bin->num_items; + + for (i = 0; i < bin->num_items; i++) + if ((predicate) (closure, bin->items[i])) + num_items++; + + return num_items; +} + static void mnemon_init (mnemon_t *mnemon) { @@ -760,23 +781,20 @@ mnemon_item_category (mnemon_t *mnemon, assert (0); } -/* Return the number of items in the bin from the given category (or - * from all categories if category == NULL) */ -static int -mnemon_bin_num_items_in_category (mnemon_t *mnemon, - bin_t *bin, - category_t *category) +typedef struct _item_in_category_closure { - int i, num_items = 0; - - if (category == NULL) - return bin->num_items; + mnemon_t *mnemon; + category_t *category; +} item_in_category_closure_t; - for (i = 0; i < bin->num_items; i++) - if (mnemon_item_category (mnemon, bin->items[i]) == category) - num_items++; +static int +mnemon_item_in_category (void *closure, item_t *item) +{ + item_in_category_closure_t *iicc = closure; + mnemon_t *mnemon = iicc->mnemon; + category_t *category = iicc->category; - return num_items; + return (mnemon_item_category (mnemon, item) == category); } static void @@ -861,17 +879,26 @@ mnemon_print_histogram (mnemon_t *mnemon, category_t *category = NULL; bin_t *bin; int num_items; + item_match_predicate_t *predicate = NULL; + void *closure = NULL; + item_in_category_closure_t item_in_category; if (mnemon->num_bins == 0) return; - if (category_name) + if (category_name) { category = mnemon_get_category_if_exists (mnemon, category_name); + if (category) { + predicate = mnemon_item_in_category; + item_in_category.mnemon = mnemon; + item_in_category.category = category; + closure = &item_in_category; + } + } for (i = 0; i < mnemon->num_bins; i++) { - num_items = mnemon_bin_num_items_in_category (mnemon, - &mnemon->bins[i], - category); + num_items = bin_num_items_matching (&mnemon->bins[i], + predicate, closure); if (i == 0 || num_items > max) max = num_items; } @@ -881,8 +908,8 @@ mnemon_print_histogram (mnemon_t *mnemon, if (i != 0) while (bin->score - last_score > 1) printf (HISTOGRAM_ROW_FORMAT "\n", ++last_score, 0); - num_items = mnemon_bin_num_items_in_category (mnemon, - bin, category); + num_items = bin_num_items_matching (bin, + predicate, closure); printf (HISTOGRAM_ROW_FORMAT " ", bin->score, num_items); print_histogram_bar (num_items, max); last_score = bin->score; -- 2.43.0