summaryrefslogtreecommitdiff
path: root/src/mat.h
blob: 2f116ea5cc695f24265811ba2326f58e93fdb773 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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