From 5e407d74130accfbbf94d2cabcb03fc126a89410 Mon Sep 17 00:00:00 2001 From: Determinant Date: Wed, 24 Jun 2015 22:48:24 +0800 Subject: separate non-Lua part of matrix code to a dedicated dir --- nerv/matrix/generic/matrix.c | 102 +++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 68 deletions(-) (limited to 'nerv/matrix/generic/matrix.c') 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); -- cgit v1.2.3-70-g09d2