aboutsummaryrefslogtreecommitdiff
path: root/nerv/matrix/generic/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'nerv/matrix/generic/matrix.c')
-rw-r--r--nerv/matrix/generic/matrix.c102
1 files changed, 34 insertions, 68 deletions
diff --git a/nerv/matrix/generic/matrix.c b/nerv/matrix/generic/matrix.c
index e17fb42..9d2521b 100644
--- a/nerv/matrix/generic/matrix.c
+++ b/nerv/matrix/generic/matrix.c
@@ -1,68 +1,32 @@
#ifdef NERV_GENERIC_MATRIX
#include "../../common.h"
-#include "matrix.h"
+#include "../../lib/matrix/generic/matrix.h"
extern const char *nerv_matrix_(tname);
extern const char *MATRIX_BASE_TNAME;
-void nerv_matrix_(data_free)(lua_State *L, Matrix *self) {
- (void)L;
- assert(*self->data_ref > 0);
- if (--(*self->data_ref) == 0)
- {
- /* free matrix data */
- MATRIX_DATA_FREE(L, MATRIX_ELEM_PTR(self));
- free(self->data_ref);
- free(self);
- }
-}
-
-void nerv_matrix_(data_retain)(Matrix *self) {
- (*self->data_ref)++;
-}
-
-Matrix *nerv_matrix_(new_)(lua_State *L, long nrow, long ncol) {
- Matrix *self = (Matrix *)malloc(sizeof(Matrix));
- self->nrow = nrow;
- self->ncol = ncol;
- self->nmax = self->nrow * self->ncol;
- MATRIX_DATA_ALLOC(L, &MATRIX_ELEM_PTR(self), &self->stride,
- sizeof(MATRIX_ELEM) * self->ncol, self->nrow);
- self->data_ref = (long *)malloc(sizeof(long));
- *self->data_ref = 0;
- nerv_matrix_(data_retain)(self);
- return self;
-}
-int nerv_matrix_(new)(lua_State *L) {
- luaT_pushudata(L, nerv_matrix_(new_)(L, luaL_checkinteger(L, 1),
- luaL_checkinteger(L, 2)),
- nerv_matrix_(tname));
+int nerv_matrix_(lua_new)(lua_State *L) {
+ Status status;
+ Matrix *self = nerv_matrix_(create)(luaL_checkinteger(L, 1),
+ luaL_checkinteger(L, 2), &status);
+ NERV_LUA_CHECK_STATUS(L, status);
+ luaT_pushudata(L, self, nerv_matrix_(tname));
return 1;
}
-int nerv_matrix_(destroy)(lua_State *L) {
+int nerv_matrix_(lua_destroy)(lua_State *L) {
+ Status status;
Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
- nerv_matrix_(data_free)(L, self);
+ nerv_matrix_(destroy)(self, &status);
+ NERV_LUA_CHECK_STATUS(L, status);
return 1;
}
-int nerv_matrix_(get_elem)(lua_State *L);
-int nerv_matrix_(set_elem)(lua_State *L);
-
-static Matrix *nerv_matrix_(getrow)(Matrix *self, int row) {
- Matrix *prow = (Matrix *)malloc(sizeof(Matrix));
- prow->ncol = self->ncol;
- prow->nrow = 1;
- prow->stride = self->stride;
- prow->nmax = prow->ncol;
- MATRIX_ELEM_PTR(prow) = MATRIX_ROW_PTR(self, row);
- prow->data_ref = self->data_ref;
- nerv_matrix_(data_retain)(prow);
- return prow;
-}
+int nerv_matrix_(lua_get_elem)(lua_State *L);
+int nerv_matrix_(lua_set_elem)(lua_State *L);
-static int nerv_matrix_(newindex)(lua_State *L) {
+static int nerv_matrix_(lua_newindex)(lua_State *L) {
Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
if (lua_isnumber(L, 2))
{
@@ -87,7 +51,8 @@ static int nerv_matrix_(newindex)(lua_State *L) {
}
-static int nerv_matrix_(index)(lua_State *L) {
+static int nerv_matrix_(lua_index)(lua_State *L) {
+ Status status;
Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
if (lua_isnumber(L, 2))
{
@@ -102,7 +67,8 @@ static int nerv_matrix_(index)(lua_State *L) {
{
if (idx < 0 || idx >= self->nrow)
nerv_error(L, "index must be within range [0, %d)", self->nrow);
- luaT_pushudata(L, nerv_matrix_(getrow)(self, idx), nerv_matrix_(tname));
+ luaT_pushudata(L, nerv_matrix_(getrow)(self, idx),
+ nerv_matrix_(tname));
}
lua_pushboolean(L, 1);
return 2;
@@ -114,38 +80,38 @@ static int nerv_matrix_(index)(lua_State *L) {
}
}
-static int nerv_matrix_(ncol)(lua_State *L) {
+static int nerv_matrix_(lua_ncol)(lua_State *L) {
Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
lua_pushinteger(L, self->ncol);
return 1;
}
-static int nerv_matrix_(nrow)(lua_State *L) {
+static int nerv_matrix_(lua_nrow)(lua_State *L) {
Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
lua_pushinteger(L, self->nrow);
return 1;
}
-static int nerv_matrix_(get_dataref_value)(lua_State *L) {
- Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
- lua_pushinteger(L, *(self->data_ref));
- return 1;
-}
+static int nerv_matrix_(lua_get_dataref_value)(lua_State *L) {
+ Matrix *self = luaT_checkudata(L, 1, nerv_matrix_(tname));
+ lua_pushinteger(L, *(self->data_ref));
+ return 1;
+}
static const luaL_Reg nerv_matrix_(methods)[] = {
- {"get_elem", nerv_matrix_(get_elem)},
- {"set_elem", nerv_matrix_(set_elem)},
- {"ncol", nerv_matrix_(ncol)},
- {"nrow", nerv_matrix_(nrow)},
- {"get_dataref_value", nerv_matrix_(get_dataref_value)},
- {"__index__", nerv_matrix_(index)},
- {"__newindex__", nerv_matrix_(newindex)},
+ {"get_elem", nerv_matrix_(lua_get_elem)},
+ {"set_elem", nerv_matrix_(lua_set_elem)},
+ {"ncol", nerv_matrix_(lua_ncol)},
+ {"nrow", nerv_matrix_(lua_nrow)},
+ {"get_dataref_value", nerv_matrix_(lua_get_dataref_value)},
+ {"__index__", nerv_matrix_(lua_index)},
+ {"__newindex__", nerv_matrix_(lua_newindex)},
{NULL, NULL}
};
-void nerv_matrix_(init)(lua_State *L) {
+void nerv_matrix_(lua_init)(lua_State *L) {
luaT_newmetatable(L, nerv_matrix_(tname), MATRIX_BASE_TNAME,
- nerv_matrix_(new), nerv_matrix_(destroy), NULL);
+ nerv_matrix_(lua_new), nerv_matrix_(lua_destroy), NULL);
luaL_register(L, NULL, nerv_matrix_(methods));
#ifdef MATRIX_INIT
MATRIX_INIT(L);