Implement version with macros
This commit is contained in:
parent
ac64a206b0
commit
62e9a9405b
17
02_macros/main.c
Normal file
17
02_macros/main.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#define VEC_IMPLEMENTATION
|
||||||
|
#include "vec.h"
|
||||||
|
#undef VEC_IMPLEMENTATION
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
vec2i_t v1 = (vec2i_t){2, 3};
|
||||||
|
vec2i_t v2 = (vec2i_t){4, 5};
|
||||||
|
|
||||||
|
vec_print(vec2i_t, vec_add(vec2i_t, v1, v2));
|
||||||
|
vec_print(vec2i_t, vec_sub(vec2i_t, v1, v2));
|
||||||
|
vec_print(vec2i_t, vec_mul(vec2i_t, v1, v2));
|
||||||
|
printf("%d\n", vec_dot(vec2i_t, v1, v2));
|
||||||
|
printf("%d\n", vec_magnitude(vec2i_t, v1));
|
||||||
|
printf("%d\n", vec_magnitude(vec2i_t, v2));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
23
02_macros/vec.h
Normal file
23
02_macros/vec.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef VEC_MACRO_H
|
||||||
|
#define VEC_MACRO_H
|
||||||
|
|
||||||
|
#include "../aliases.h"
|
||||||
|
|
||||||
|
#define vec_print(T, v1) vec_print_##T(v1)
|
||||||
|
#define vec_add(T, v1, v2) vec_add_##T(v1, v2)
|
||||||
|
#define vec_sub(T, v1, v2) vec_sub_##T(v1, v2)
|
||||||
|
#define vec_mul(T, v1, v2) vec_mul_##T(v1, v2)
|
||||||
|
#define vec_dot(T, v1, v2) vec_dot_##T(v1, v2)
|
||||||
|
#define vec_magnitude(T, v) vec_magnitude_##T(v)
|
||||||
|
|
||||||
|
#define T i32
|
||||||
|
#define I i
|
||||||
|
#define PI d
|
||||||
|
#include "vec.inc"
|
||||||
|
|
||||||
|
#define T f32
|
||||||
|
#define I f
|
||||||
|
#define PI f
|
||||||
|
#include "vec.inc"
|
||||||
|
|
||||||
|
#endif // VEC_MACRO_H
|
93
02_macros/vec.inc
Normal file
93
02_macros/vec.inc
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#include "../aliases.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define obj(o, m) o.m
|
||||||
|
#define stringify(x) #x
|
||||||
|
#define printf_spec(PI) stringify(PI)
|
||||||
|
#define typename_concat(C, I) vec##C##I##_t
|
||||||
|
#define typename(C, I) typename_concat(C, I)
|
||||||
|
#define funcname_concat(B, C, I) vec_##B##_vec##C##I##_t
|
||||||
|
#define funcname(B, C, I) funcname_concat(B, C, I)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
T x;
|
||||||
|
T y;
|
||||||
|
} typename(2, I);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
T x;
|
||||||
|
T y;
|
||||||
|
T z;
|
||||||
|
} typename(3, I);
|
||||||
|
|
||||||
|
INTERNAL void funcname(print, 2, I)(typename(2, I) v1);
|
||||||
|
INTERNAL typename(2, I) funcname(add, 2, I)(typename(2, I) v1, typename(2, I) v2);
|
||||||
|
INTERNAL typename(2, I) funcname(sub, 2, I)(typename(2, I) v1, typename(2, I) v2);
|
||||||
|
INTERNAL typename(2, I) funcname(mul, 2, I)(typename(2, I) v1, typename(2, I) v2);
|
||||||
|
INTERNAL T funcname(dot, 2, I)(typename(2, I) v1, typename(2, I) v2);
|
||||||
|
INTERNAL T funcname(magnitude, 2, I)(typename(2, I) v1);
|
||||||
|
|
||||||
|
INTERNAL void funcname(print, 3, I)(typename(3, I) v1);
|
||||||
|
INTERNAL typename(3, I) funcname(add, 3, I)(typename(3, I) v1, typename(3, I) v3);
|
||||||
|
INTERNAL typename(3, I) funcname(sub, 3, I)(typename(3, I) v1, typename(3, I) v3);
|
||||||
|
INTERNAL typename(3, I) funcname(mul, 3, I)(typename(3, I) v1, typename(3, I) v3);
|
||||||
|
INTERNAL T funcname(dot, 3, I)(typename(3, I) v1, typename(3, I) v3);
|
||||||
|
INTERNAL T funcname(magnitude, 3, I)(typename(3, I) v1);
|
||||||
|
|
||||||
|
#ifdef VEC_IMPLEMENTATION
|
||||||
|
INTERNAL void funcname(print, 2, I)(typename(2, I) v1) {
|
||||||
|
printf("{%" printf_spec(PI) ", %" printf_spec(PI) "}\n", v1.x, v1.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL typename(2, I) funcname(add, 2, I)(typename(2, I) v1, typename(2, I) v2) {
|
||||||
|
return (typename(2, I)){v1.x + v2.x, v1.y + v2.y};
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL typename(2, I) funcname(sub, 2, I)(typename(2, I) v1, typename(2, I) v2) {
|
||||||
|
return (typename(2, I)){v1.x - v2.x, v1.y - v2.y};
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL typename(2, I) funcname(mul, 2, I)(typename(2, I) v1, typename(2, I) v2) {
|
||||||
|
return (typename(2, I)){v1.x * v2.x, v1.y * v2.y};
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL T funcname(dot, 2, I)(typename(2, I) v1, typename(2, I) v2) {
|
||||||
|
return v1.x * v2.x + v1.y * v2.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL T funcname(magnitude, 2, I)(typename(2, I) v1) {
|
||||||
|
T dotproduct = funcname(dot, 2, I)(v1, v1);
|
||||||
|
return (T)sqrtf(dotproduct);
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL void funcname(print, 3, I)(typename(3, I) v1) {
|
||||||
|
printf("{%" printf_spec(PI) ", %" printf_spec(PI) ", %" printf_spec(PI) "}\n", v1.x, v1.y, v1.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL typename(3, I) funcname(add, 3, I)(typename(3, I) v1, typename(3, I) v2) {
|
||||||
|
return (typename(3, I)){v1.x + v2.x, v1.y + v2.y, v1.z + v2.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL typename(3, I) funcname(sub, 3, I)(typename(3, I) v1, typename(3, I) v2) {
|
||||||
|
return (typename(3, I)){v1.x - v2.x, v1.y - v2.y, v1.z - v2.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL typename(3, I) funcname(mul, 3, I)(typename(3, I) v1, typename(3, I) v2) {
|
||||||
|
return (typename(3, I)){v1.x * v2.x, v1.y * v2.y, v1.z * v2.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL T funcname(dot, 3, I)(typename(3, I) v1, typename(3, I) v2) {
|
||||||
|
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL T funcname(magnitude, 3, I)(typename(3, I) v1) {
|
||||||
|
T dotproduct = funcname(dot, 3, I)(v1, v1);
|
||||||
|
return (T)sqrtf(dotproduct);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef PI
|
||||||
|
#undef I
|
||||||
|
#undef C
|
||||||
|
#undef T
|
Loading…
Reference in New Issue
Block a user