From 66b0fb8c4b4d1d7d97bd90a22a613b00b7d2d0a8 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sat, 9 Aug 2014 20:40:59 +0200 Subject: [PATCH] Add functions to iterate over number sets. --- lib/numberset.c | 32 ++++++++++++++++++++++++++++++++ lib/numberset.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/lib/numberset.c b/lib/numberset.c index d55246f..786c2d2 100644 --- a/lib/numberset.c +++ b/lib/numberset.c @@ -343,4 +343,36 @@ number_set_is_element(number_range* number_set, return 0; } + +int +number_set_get_first(number_set_iter* iter_p) +{ + if (!iter_p || !iter_p->range) + return 0; + + iter_p->val = iter_p->range->start; + + return iter_p->val; +} + + +int +number_set_get_next(number_set_iter* iter_p) +{ + if (!iter_p || !iter_p->range) + return 0; + + iter_p->val++; + + if (iter_p->val > iter_p->range->end) + { + iter_p->range = iter_p->range->next; + + if (iter_p->range) + iter_p->val = iter_p->range->start; + } + + return iter_p->val; +} + /* end of numberset.c */ diff --git a/lib/numberset.h b/lib/numberset.h index 96fd7da..445961b 100644 --- a/lib/numberset.h +++ b/lib/numberset.h @@ -132,6 +132,38 @@ int number_set_is_element(number_range* number_set, int number); + +/* + * A structure used to iterate over a number set. + */ + +typedef struct number_set_iter_ +{ + number_range* range; + int val; +} number_set_iter; + + +/* + * Get first element of a number set. `iter_p' must be initialized with the + * `number_range' structure to iterate over. After the call, `iter_p' is + * ready to be used in a call to `number_set_get_next'. + */ + +int +number_set_get_first(number_set_iter* iter_p); + + +/* + * Get next element of a number set, using `iter_p' from a previous call to + * `number_set_get_first' or `number_set_get_next'. If `iter_p->range' is + * NULL after the call, there is no next element, and the return value is + * undefined. + */ + +int +number_set_get_next(number_set_iter* iter_p); + #ifdef __cplusplus } /* extern "C" */ #endif -- 2.11.4.GIT