int luaC_lunum_array(lua_State *L) { if (lua_type(L, 2) == LUA_TSTRING) { const enum ArrayType T = array_typeflag(lua_tostring(L, 2)[0]); lunum_upcast(L, 1, T, 1); } else { const enum ArrayType T = (enum ArrayType) luaL_optinteger(L, 2, ARRAY_TYPE_DOUBLE); lunum_upcast(L, 1, T, 1); } return 1; }
static int luaC_lunum_array(lua_State *L) { if (lua_type(L, 2) == LUA_TSTRING) { const ArrayType T = array_typeflag(lua_tostring(L, 2)[0]); lunum_upcast(L, 1, T, 1); } else { const ArrayType T = (ArrayType) luaL_optinteger(L, 2, ARRAY_TYPE_DOUBLE); lunum_upcast(L, 1, T, 1); } lua_replace(L, 1); /* place array at bottom of stack */ if (!lua_isnone(L, 2)) lua_remove(L, 2); /* remove arg 2 if given */ if (lua_istable(L, 2)) { luaC_lunum_resize(L); /* reshape array to third arg if given */ } return 1; }
void *lunum_checkarray2(lua_State *L, int pos, enum ArrayType T, int *N) { if (lunum_upcast(L, pos, T, 1)) { lua_replace(L, pos); } struct Array *A = lunum_checkarray1(L, pos); if (N != NULL) *N = A->size; return A->data; }
int _array_binary_op1(lua_State *L, enum ArrayOperation op) { if (!lunum_hasmetatable(L, 1, "array")) { struct Array *B = lunum_checkarray1(L, 2); lunum_upcast(L, 1, B->dtype, B->size); lua_replace(L, 1); struct Array *A = lunum_checkarray1(L, 1); array_resize(A, B->shape, B->ndims); } if (!lunum_hasmetatable(L, 2, "array")) { struct Array *A = lunum_checkarray1(L, 1); lunum_upcast(L, 2, A->dtype, A->size); lua_replace(L, 2); struct Array *B = lunum_checkarray1(L, 2); array_resize(B, A->shape, A->ndims); } return _array_binary_op2(L, op); }
int test_upcast(lua_State *L) { ArrayType T = luaL_checkinteger(L, 2); if (lunum_upcast(L, 1, T, 0)) { lua_replace(L, 1); } lua_settop(L, 1); return 1; }
static int _array_binary_op(lua_State *L, ArrayBinaryOperation op) { if ((lua_istable(L, 1) || lunum_hasmetatable(L, 1, "array")) && (lua_istable(L, 2) || lunum_hasmetatable(L, 2, "array"))) { /* both args are tables or arrays, upcast to arrays if not already */ if (!lunum_hasmetatable(L, 1, "array")) { Array *B = lunum_checkarray1(L, 2); lunum_upcast(L, 1, B->dtype, B->size); lua_replace(L, 1); Array *A = lunum_checkarray1(L, 1); array_resize_t(A, B->shape, B->ndims); } if (!lunum_hasmetatable(L, 2, "array")) { Array *A = lunum_checkarray1(L, 1); lunum_upcast(L, 2, A->dtype, A->size); lua_replace(L, 2); Array *B = lunum_checkarray1(L, 2); array_resize_t(B, A->shape, A->ndims); } return _array_array_binary_op(L, op); } else { /* one arg is not a table(array) */ return _array_number_binary_op(L, op, lunum_hasmetatable(L, 1, "array")); } }