diff options
| author | Tyge Løvset <[email protected]> | 2023-02-24 17:15:24 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2023-02-24 17:15:24 +0100 |
| commit | 1a2143fbbda0805fdc9d3862e9c45cb0fc6a336f (patch) | |
| tree | 7c6a139207c7efaec414ad85dd4ea58a6f3b19b5 /include/stc/cspan.h | |
| parent | dde5e3465c4198841fdba32dfaf2220c87bc6a94 (diff) | |
| download | STC-modified-1a2143fbbda0805fdc9d3862e9c45cb0fc6a336f.tar.gz STC-modified-1a2143fbbda0805fdc9d3862e9c45cb0fc6a336f.zip | |
Added eq function to cspan.
Final cleanup normalized var naming.
Diffstat (limited to 'include/stc/cspan.h')
| -rw-r--r-- | include/stc/cspan.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/include/stc/cspan.h b/include/stc/cspan.h index bbaaf6c0..506702b3 100644 --- a/include/stc/cspan.h +++ b/include/stc/cspan.h @@ -61,14 +61,20 @@ int demo2() { #include "ccommon.h" #define using_cspan(...) c_MACRO_OVERLOAD(using_cspan, __VA_ARGS__) -#define using_cspan_2(Self, T) using_cspan_3(Self, T, 1) +#define using_cspan_2(Self, T) \ + using_cspan_3(Self, T, 1) + #define using_cspan_3(Self, T, RANK) \ + using_cspan_4(Self, T, RANK, c_default_eq) + +#define using_cspan_4(Self, T, RANK, i_eq) \ typedef T Self##_value; typedef T Self##_raw; \ typedef struct { \ Self##_value *data; \ int32_t shape[RANK]; \ cspan_idx##RANK stride; \ } Self; \ + \ typedef struct { Self##_value *ref; int32_t pos[RANK]; const Self *_s; } Self##_iter; \ \ STC_INLINE Self Self##_from_n(Self##_raw* raw, const intptr_t n) { \ @@ -93,6 +99,13 @@ int demo2() { it->ref += _cspan_next##RANK(RANK, it->pos, it->_s->shape, it->_s->stride.d); \ if (it->pos[0] == it->_s->shape[0]) it->ref = NULL; \ } \ + STC_INLINE bool Self##_eq(const Self* x, const Self* y) { \ + if (memcmp(x->shape, y->shape, sizeof x->shape)) return false; \ + Self##_iter i = Self##_begin(x), j = Self##_begin(y); \ + for (; i.ref; Self##_next(&i), Self##_next(&j)) \ + if (!(i_eq(i.ref, j.ref))) return false; \ + return true; \ + } \ struct stc_nostruct #define using_cspan2(Self, T) using_cspan_3(Self, T, 1); using_cspan_3(Self##2, T, 2) |
