Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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"));
  }
}