diff options
Diffstat (limited to 'src/bindings/lua/eina/accessor.lua')
-rw-r--r-- | src/bindings/lua/eina/accessor.lua | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/bindings/lua/eina/accessor.lua b/src/bindings/lua/eina/accessor.lua new file mode 100644 index 0000000000..d2068fc8b5 --- /dev/null +++ b/src/bindings/lua/eina/accessor.lua @@ -0,0 +1,132 @@ +-- EFL LuaJIT bindings: Eina (accessor module) +-- For use with Elua + +local ffi = require("ffi") +local C = ffi.C + +ffi.cdef [[ + typedef struct _Eina_Accessor Eina_Accessor; + typedef unsigned char Eina_Bool; + + void eina_accessor_free (Eina_Accessor *accessor); + Eina_Bool eina_accessor_data_get (Eina_Accessor *accessor, + unsigned int position, + void **data); + Eina_Bool eina_accessor_lock (Eina_Accessor *accessor); + Eina_Bool eina_accessor_unlock (Eina_Accessor *accessor); + Eina_Accessor *eina_accessor_clone (Eina_Accessor *accessor); + void *eina_accessor_container_get(Eina_Accessor *accessor); +]] + +local cutil = require("cutil") +local util = require("util") + +local M = {} + +local eina + +local init = function() + eina = util.lib_load("eina") +end + +local shutdown = function() + util.lib_unload("eina") +end + +ffi.metatype("Eina_Accessor", { + __index = { + free = function(self) eina.eina_accessor_free(ffi.gc(self, nil)) end, + data_get = function(self, position) + local data = ffi.new("void*[1]") + local r = eina.eina_accessor_data_get(self, position - 1, data) + if r == 0 then return nil end + return data[0] + end, + lock = function(self) return eina.eina_accessor_lock (self) ~= 0 end, + unlock = function(self) return eina.eina_accessor_unlock(self) ~= 0 end, + clone = function(self) + local v = eina.eina_accessor_clone(self) + if v == ffi.nullptr then return nil end + return v + end, + container_get = function(self) + local v = eina.eina_accessor_container_get(self) + if v == ffi.nullptr then return nil end + return v + end + } +}) + +cutil.init_module(init, shutdown) + +local dgetmt = debug.getmetatable + +M.Accessor = util.Readonly_Object:clone { + __ctor = function(self, selfmt, acc) + -- prevent null stuff + if acc == ffi.nullptr then acc = nil end + if acc then ffi.gc(acc, acc.free) end + selfmt.__eq = function(self, other) + return selfmt.__accessor == dgetmt(other).__accessor + end + selfmt.__call = function(self) + return self:next() + end + local oi = selfmt.__index + selfmt.__index = function(self, name) + if type(name) == "number" then return self:data_get(name) end + return oi[name] + end + selfmt.__accessor = acc + end, + + free = function(self) + self = dgetmt(self) + if not self.__accessor then return end + self.__accessor:free() + self.__accessor = nil + end, + + lock = function(self) + self = dgetmt(self) + if not self.__accessor then return false end + return self.__accessor:lock() + end, + + unlock = function(self) + self = dgetmt(self) + if not self.__accessor then return false end + return self.__accessor:unlock() + end, + + clone = function(self) + self = dgetmt(self) + if not self.__accessor then return nil end + return self.__protos[1](self.__accessor:clone()) + end, + + data_get = function(self, pos) + self = dgetmt(self) + if not self.__accessor then return nil end + return self.__accessor:data_get(pos) + end, + + container_get = function(self) + self = dgetmt(self) + if not self.__accessor then return end + return self.__accessor:container_get() + end, + + each = function(self) + local acc = dgetmt(self).__accessor + if not acc then return nil end + local cnt = 0 + return function() + cnt = cnt + 1 + local v = self:data_get(cnt) + if v then return cnt, v end + end + end +} + +return M |