diff options
| author | tylo <[email protected]> | 2020-08-14 17:34:17 +0200 |
|---|---|---|
| committer | tylo <[email protected]> | 2020-08-14 17:34:17 +0200 |
| commit | 744ebf56851b5c0f549e68b07d3fd9c9fda32925 (patch) | |
| tree | 120a3b0a7f3146cf6780df1988816176f980a07a | |
| parent | b4503b65d624a94f5ad817301f309b72eafed426 (diff) | |
| download | STC-modified-744ebf56851b5c0f549e68b07d3fd9c9fda32925.tar.gz STC-modified-744ebf56851b5c0f549e68b07d3fd9c9fda32925.zip | |
Fixed cbitset iter.
| -rw-r--r-- | examples/bits.c | 2 | ||||
| -rw-r--r-- | stc/cbitset.h | 17 |
2 files changed, 14 insertions, 5 deletions
diff --git a/examples/bits.c b/examples/bits.c index 88d9a1f3..c54c02fd 100644 --- a/examples/bits.c +++ b/examples/bits.c @@ -23,7 +23,7 @@ int main() { cbitset_set_value(&set, 99, false);
printf("%4zu: ", set.size);
c_foreach (i, cbitset, set)
- printf("%d", *i.item);
+ printf("%d", i.item(i));
puts("");
printf("%4zu: ", set.size);
for (int i=0; i<set.size; ++i)
diff --git a/stc/cbitset.h b/stc/cbitset.h index 6b3c9746..a88b1b86 100644 --- a/stc/cbitset.h +++ b/stc/cbitset.h @@ -147,17 +147,26 @@ STC_INLINE cbitset_t cbitset_not(cbitset_t s1) { cbitset_flip_all(&set); return set;
}
-typedef struct { cbitset_t *_bs; size_t pos; int *item, *end, _val; } cbitset_iter_t;
+struct cbitset_iter;
+typedef bool(*cbitset_cb)(struct cbitset_iter);
+typedef struct cbitset_iter {
+ cbitset_t *_bs;
+ cbitset_cb item, end;
+ size_t pos;
+} cbitset_iter_t;
+
+STC_INLINE bool cbitset_item(cbitset_iter_t it) {
+ return cbitset_test(*it._bs, it.pos);
+}
STC_INLINE cbitset_iter_t
cbitset_begin(cbitset_t* self) {
- if (!self->size) { cbitset_iter_t it = {self, 0, NULL, NULL, 0}; return it; }
- cbitset_iter_t it = {self, 0, &it._val, NULL, self->_arr[0] & 1};
+ if (self->size == 0) { cbitset_iter_t it = {NULL}; return it; }
+ cbitset_iter_t it = {self, &cbitset_item, NULL, 0};
return it;
}
STC_INLINE void
cbitset_next(cbitset_iter_t* it) {
if (++it->pos == it->_bs->size) it->item = NULL;
- else *it->item = cbitset_test(*it->_bs, it->pos);
}
#if !defined(STC_HEADER) || defined(STC_IMPLEMENTATION)
|
