From 6e1eaaf13a13584294c6a090ef40500cd786f56f Mon Sep 17 00:00:00 2001 From: Jesper Jensen Date: Sun, 23 Mar 2025 11:26:53 +0100 Subject: Initial commit --- src/mat.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/mat.h (limited to 'src/mat.h') 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 +#include + +#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 -- cgit v1.2.3