diff options
| author | Tyge Løvset <[email protected]> | 2022-12-29 00:28:50 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-12-29 00:28:50 +0100 |
| commit | 0761c13f316cc98ae7756f3527931aa86bed5016 (patch) | |
| tree | e90777558956fcf91d6b1c958e0c3a6fb0ab007f /include/stc/algo/filter.h | |
| parent | d623c6c85071b9af5d607bb5d9aceceaea05220a (diff) | |
| download | STC-modified-0761c13f316cc98ae7756f3527931aa86bed5016.tar.gz STC-modified-0761c13f316cc98ae7756f3527931aa86bed5016.zip | |
Restructuring of some headers into include/algo folder. Some API changes *_replace*() functions have been renamed, and a few minor API changes.
Diffstat (limited to 'include/stc/algo/filter.h')
| -rw-r--r-- | include/stc/algo/filter.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/include/stc/algo/filter.h b/include/stc/algo/filter.h new file mode 100644 index 00000000..486568f2 --- /dev/null +++ b/include/stc/algo/filter.h @@ -0,0 +1,76 @@ +/* MIT License + * + * Copyright (c) 2022 Tyge Løvset, NORCE, www.norceresearch.no + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ +/* +#include <stdio.h> +#define i_val int +#define i_capacity 10 +#include <stc/cstack.h> +#include <stc/algo/filter.h> + +int main() +{ + cstack_int stk = cstack_INITIALIZER(int, {1, 2, 3, 4, 5, 6, 7, 8, 9}); + + c_foreach (i, cstack_int, stk) + printf(" %d", *i.ref); + puts(""); + + c_forfilter (i, cstack_int, stk + , c_flt_skipwhile(i, *i.ref < 3) + && (*i.ref & 1) == 0 // even only + , c_flt_take(i, 2)) // break after 2 + printf(" %d", *i.ref); + puts(""); +} +*/ +#ifndef STC_FILTER_H_INCLUDED +#define STC_FILTER_H_INCLUDED + +#include <stc/ccommon.h> + +#ifndef c_NFILTERS + #define c_NFILTERS 14 /* 22, 30, .. */ +#endif + +#define c_flt_take(i, n) (++(i).s1[(i).s1top++] <= (n)) +#define c_flt_skip(i, n) (++(i).s1[(i).s1top++] > (n)) +#define c_flt_skipwhile(i, pred) ((i).s2[(i).s2top++] |= !(pred)) +#define c_flt_takewhile(i, pred) !c_flt_skipwhile(i, pred) + +#define c_forfilter(...) c_MACRO_OVERLOAD(c_forfilter, __VA_ARGS__) + +#define c_forfilter4(i, C, cnt, filter) \ + c_forfilter_b(i, C, C##_begin(&cnt), filter) + +#define c_forfilter5(i, C, cnt, filter, cond) \ + c_forfilter_b(i, C, C##_begin(&cnt), filter) if (!(cond)) break; else + +#define c_forfilter_b(i, C, start, filter) \ + for (struct {C##_iter it; C##_value *ref; \ + uint32_t s1[c_NFILTERS], index, count; \ + bool s2[c_NFILTERS]; uint8_t s1top, s2top;} \ + i = {.it=start, .ref=i.it.ref}; i.it.ref \ + ; C##_next(&i.it), i.ref = i.it.ref, ++i.index, i.s1top=0, i.s2top=0) \ + if (!((filter) && ++i.count)) ; else + +#endif |
