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
);
27 JS_FreeValue(ctx
, clazz
);
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
)
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
);
60 return JS_NewFloat64(ctx
, (double)pos
);
63 static JSValue
liba_trajtrap_vel(JSContext
*ctx
, JSValueConst this_val
, int argc
, JSValueConst
*argv
)
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
);
72 return JS_NewFloat64(ctx
, (double)vel
);
75 static JSValue
liba_trajtrap_acc(JSContext
*ctx
, JSValueConst this_val
, int argc
, JSValueConst
*argv
)
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
);
84 return JS_NewFloat64(ctx
, (double)acc
);
103 static JSValue
liba_trajtrap_get(JSContext
*ctx
, JSValueConst this_val
, int magic
)
106 a_trajtrap
*const self
= (a_trajtrap
*)JS_GetOpaque2(ctx
, this_val
, liba_trajtrap_class_id
);
107 if (!self
) { return JS_EXCEPTION
; }
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
);