diff options
| author | Jesper Jensen <jesper@jnsn.dev> | 2025-03-23 11:26:53 +0100 |
|---|---|---|
| committer | Jesper Jensen <jesper@jnsn.dev> | 2025-03-23 11:26:53 +0100 |
| commit | 6e1eaaf13a13584294c6a090ef40500cd786f56f (patch) | |
| tree | f2234a8a6b1a6a150a7cac44ea43fbf5dd31d1eb /src/mat.h | |
Initial commit
Diffstat (limited to 'src/mat.h')
| -rw-r--r-- | src/mat.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/mat.h b/src/mat.h new file mode 100644 index 0000000..2f116ea --- /dev/null +++ b/src/mat.h @@ -0,0 +1,43 @@ +#ifndef MAT_TYPE +#error MAT_TYPE must be defined +#endif + +#include <stddef.h> +#include <assert.h> + +#define PP_CONCAT1(x,y) x ## y +#define PP_CONCAT(x,y) PP_CONCAT1(x,y) + +#ifndef MAT_H_SHARED +#define MAT_H_SHARED + +#define DECL_MAT(NAME, TYPE, X, Y) \ + PP_CONCAT(mat_, TYPE) NAME = { \ + .data = (TYPE[X * Y]){}, \ + .stride = X, \ + } + +#define DECL_MAT_DATA(NAME, TYPE, X, Y, ...) \ + PP_CONCAT(mat_, TYPE) NAME = { \ + .data = (TYPE[X * Y]){__VA_ARGS__}, \ + .stride = X, \ + } + +#endif + +#define SELF_T PP_CONCAT(mat_, MAT_TYPE) +#define F(NAME) PP_CONCAT(NAME##_, MAT_TYPE) + +typedef struct { + MAT_TYPE *data; + size_t stride; +} SELF_T; + +static inline MAT_TYPE *F(imat)(SELF_T mat, size_t x, size_t y) { + assert(x >= 0 && x < mat.stride); + assert(y >= 0); + return &mat.data[x + y*mat.stride]; +} + +#undef SELF_T +#undef MAT_TYPE |
