a_linalg_{Tnn,Tmn}->{T1,T2}
[liba.git] / quickjs / src / trajtrap.c
blob811d6a82ede71c1ec0585fbd9b7cca1218227703
1 #include "a.h"
2 #include "a/trajtrap.h"
4 static JSClassID liba_trajtrap_class_id;
6 static void liba_trajtrap_finalizer(JSRuntime *rt, JSValue val)
8 js_free_rt(rt, JS_GetOpaque(val, liba_trajtrap_class_id));
11 static JSValue liba_trajtrap_ctor(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv)
13 JSValue proto, clazz = JS_UNDEFINED;
14 a_trajtrap *const self = (a_trajtrap *)js_mallocz(ctx, sizeof(a_trajtrap));
15 if (!self) { return JS_EXCEPTION; }
16 proto = JS_GetPropertyStr(ctx, new_target, "prototype");
17 if (JS_IsException(proto)) { goto fail; }
18 clazz = JS_NewObjectProtoClass(ctx, proto, liba_trajtrap_class_id);
19 JS_FreeValue(ctx, proto);
20 if (JS_IsException(clazz)) { goto fail; }
21 JS_SetOpaque(clazz, self);
22 return clazz;
23 fail:
24 (void)argc;
25 (void)argv;
26 js_free(ctx, self);
27 JS_FreeValue(ctx, clazz);
28 return JS_EXCEPTION;
31 static JSValue liba_trajtrap_gen(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
33 double arg[] = {0, 0, 0, 0, 0, 0, 0};
34 int i = (int)A_LEN(arg);
35 a_trajtrap *const self = (a_trajtrap *)JS_GetOpaque2(ctx, this_val, liba_trajtrap_class_id);
36 if (!self) { return JS_EXCEPTION; }
37 if (argc > i) { argc = i; }
38 for (i = 0; i < 5; ++i)
40 if (JS_ToFloat64(ctx, &arg[i], argv[i])) { return JS_EXCEPTION; }
42 for (i = 5; i < argc; ++i)
44 if (JS_ToFloat64(ctx, &arg[i], argv[i])) { return JS_EXCEPTION; }
46 arg[0] = (double)a_trajtrap_gen(self, (a_float)arg[0], (a_float)arg[1], (a_float)arg[2],
47 (a_float)arg[3], (a_float)arg[4], (a_float)arg[5], (a_float)arg[6]);
48 return JS_NewFloat64(ctx, arg[0]);
51 static JSValue liba_trajtrap_pos(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
53 double x;
54 a_float pos;
55 a_trajtrap *const self = (a_trajtrap *)JS_GetOpaque2(ctx, this_val, liba_trajtrap_class_id);
56 if (!self) { return JS_EXCEPTION; }
57 if (JS_ToFloat64(ctx, &x, argv[0])) { return JS_EXCEPTION; }
58 pos = a_trajtrap_pos(self, (a_float)x);
59 (void)argc;
60 return JS_NewFloat64(ctx, (double)pos);
63 static JSValue liba_trajtrap_vel(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
65 double x;
66 a_float vel;
67 a_trajtrap *const self = (a_trajtrap *)JS_GetOpaque2(ctx, this_val, liba_trajtrap_class_id);
68 if (!self) { return JS_EXCEPTION; }
69 if (JS_ToFloat64(ctx, &x, argv[0])) { return JS_EXCEPTION; }
70 vel = a_trajtrap_vel(self, (a_float)x);
71 (void)argc;
72 return JS_NewFloat64(ctx, (double)vel);
75 static JSValue liba_trajtrap_acc(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
77 double x;
78 a_float acc;
79 a_trajtrap *const self = (a_trajtrap *)JS_GetOpaque2(ctx, this_val, liba_trajtrap_class_id);
80 if (!self) { return JS_EXCEPTION; }
81 if (JS_ToFloat64(ctx, &x, argv[0])) { return JS_EXCEPTION; }
82 acc = a_trajtrap_acc(self, (a_float)x);
83 (void)argc;
84 return JS_NewFloat64(ctx, (double)acc);
87 enum
89 self_t,
90 self_p0,
91 self_p1,
92 self_v0,
93 self_v1,
94 self_vc,
95 self_ta,
96 self_td,
97 self_pa,
98 self_pd,
99 self_ac,
100 self_de
103 static JSValue liba_trajtrap_get(JSContext *ctx, JSValueConst this_val, int magic)
105 double x;
106 a_trajtrap *const self = (a_trajtrap *)JS_GetOpaque2(ctx, this_val, liba_trajtrap_class_id);
107 if (!self) { return JS_EXCEPTION; }
108 switch (magic)
110 case self_t: x = (double)self->t; break;
111 case self_p0: x = (double)self->p0; break;
112 case self_p1: x = (double)self->p1; break;
113 case self_v0: x = (double)self->v0; break;
114 case self_v1: x = (double)self->v1; break;
115 case self_vc: x = (double)self->vc; break;
116 case self_ta: x = (double)self->ta; break;
117 case self_td: x = (double)self->td; break;
118 case self_pa: x = (double)self->pa; break;
119 case self_pd: x = (double)self->pd; break;
120 case self_ac: x = (double)self->ac; break;
121 case self_de: x = (double)self->de; break;
122 default: return JS_UNDEFINED;
124 return JS_NewFloat64(ctx, x);
127 static JSClassDef liba_trajtrap_class;
128 static JSCFunctionListEntry const liba_trajtrap_proto[] = {
129 JS_PROP_STRING_DEF("[Symbol.toStringTag]", "a.trajtrap", 0),
130 JS_CGETSET_MAGIC_DEF("t", liba_trajtrap_get, NULL, self_t),
131 JS_CGETSET_MAGIC_DEF("p0", liba_trajtrap_get, NULL, self_p0),
132 JS_CGETSET_MAGIC_DEF("p1", liba_trajtrap_get, NULL, self_p1),
133 JS_CGETSET_MAGIC_DEF("v0", liba_trajtrap_get, NULL, self_v0),
134 JS_CGETSET_MAGIC_DEF("v1", liba_trajtrap_get, NULL, self_v1),
135 JS_CGETSET_MAGIC_DEF("vc", liba_trajtrap_get, NULL, self_vc),
136 JS_CGETSET_MAGIC_DEF("ta", liba_trajtrap_get, NULL, self_ta),
137 JS_CGETSET_MAGIC_DEF("td", liba_trajtrap_get, NULL, self_td),
138 JS_CGETSET_MAGIC_DEF("pa", liba_trajtrap_get, NULL, self_pa),
139 JS_CGETSET_MAGIC_DEF("pd", liba_trajtrap_get, NULL, self_pd),
140 JS_CGETSET_MAGIC_DEF("ac", liba_trajtrap_get, NULL, self_ac),
141 JS_CGETSET_MAGIC_DEF("de", liba_trajtrap_get, NULL, self_de),
142 JS_CFUNC_DEF("gen", 7, liba_trajtrap_gen),
143 JS_CFUNC_DEF("pos", 1, liba_trajtrap_pos),
144 JS_CFUNC_DEF("vel", 1, liba_trajtrap_vel),
145 JS_CFUNC_DEF("acc", 1, liba_trajtrap_acc),
148 int js_liba_trajtrap_init(JSContext *ctx, JSModuleDef *m)
150 JSValue proto, clazz;
151 liba_trajtrap_class.class_name = "trajtrap";
152 liba_trajtrap_class.finalizer = liba_trajtrap_finalizer;
154 JS_NewClassID(&liba_trajtrap_class_id);
155 JS_NewClass(JS_GetRuntime(ctx), liba_trajtrap_class_id, &liba_trajtrap_class);
157 proto = JS_NewObject(ctx);
158 JS_SetPropertyFunctionList(ctx, proto, liba_trajtrap_proto, A_LEN(liba_trajtrap_proto));
160 clazz = JS_NewCFunction2(ctx, liba_trajtrap_ctor, "trajtrap", 0, JS_CFUNC_constructor, 0);
161 JS_SetClassProto(ctx, liba_trajtrap_class_id, proto);
162 JS_SetConstructor(ctx, clazz, proto);
164 return JS_SetModuleExport(ctx, m, "trajtrap", clazz);