forked from enlightenment/efl
elua: simple bindings to Eina_List (cannot be used raw conveniently, and is safe because it doesn't allow any writing to the list)
This commit is contained in:
parent
f3c0072c13
commit
2d0be0a015
|
@ -149,7 +149,7 @@ M.dir_list = function(dir, recursive, cb)
|
|||
end)
|
||||
local v = eina.eina_file_dir_list(dir, recursive or false, cbp, nil)
|
||||
cbp:free()
|
||||
return v == 1
|
||||
return v ~= 0
|
||||
end
|
||||
|
||||
local Iterator = iterator.Iterator
|
||||
|
@ -255,7 +255,7 @@ M.copy = function(source, destination, flags, cb)
|
|||
end
|
||||
local v = eina.eina_file_copy(source, destination, flags, cbp, nil)
|
||||
if cbp then cbp:free() end
|
||||
return v == 1
|
||||
return v ~= 0
|
||||
end
|
||||
|
||||
M.Xattr_Iterator = Iterator:clone {
|
||||
|
@ -327,10 +327,10 @@ M.File = ffi.metatype("Eina_File", {
|
|||
end,
|
||||
|
||||
is_virtual = function(self)
|
||||
return eina.eina_file_virtual(self) == 1
|
||||
return eina.eina_file_virtual(self) ~= 0
|
||||
end,
|
||||
refresh = function(self)
|
||||
return eina.eina_file_refresh(self) == 1
|
||||
return eina.eina_file_refresh(self) ~= 0
|
||||
end,
|
||||
|
||||
size_get = function(self)
|
||||
|
@ -381,7 +381,7 @@ M.File = ffi.metatype("Eina_File", {
|
|||
end,
|
||||
|
||||
map_faulted = function(self, map)
|
||||
return eina.eina_file_map_faulted(self, map) == 1
|
||||
return eina.eina_file_map_faulted(self, map) ~= 0
|
||||
end,
|
||||
|
||||
lines = M.Line_Iterator
|
||||
|
|
|
@ -39,8 +39,8 @@ ffi.metatype("Eina_Iterator", {
|
|||
if r == nil then return nil end
|
||||
return data[0]
|
||||
end,
|
||||
lock = function(self) return eina.eina_iterator_lock (self) == 1 end,
|
||||
unlock = function(self) return eina.eina_iterator_unlock(self) == 1 end,
|
||||
lock = function(self) return eina.eina_iterator_lock (self) ~= 0 end,
|
||||
unlock = function(self) return eina.eina_iterator_unlock(self) ~= 0 end,
|
||||
container_get = function(self)
|
||||
local v = eina.eina_iterator_container_get(self)
|
||||
if v == nil then return nil end
|
||||
|
|
|
@ -0,0 +1,213 @@
|
|||
-- EFL LuaJIT bindings: Eina (list module)
|
||||
-- For use with Elua
|
||||
|
||||
local ffi = require("ffi")
|
||||
|
||||
local iterator = require("eina.iterator")
|
||||
|
||||
ffi.cdef [[
|
||||
typedef unsigned char Eina_Bool;
|
||||
|
||||
typedef struct _Eina_List Eina_List;
|
||||
typedef struct _Eina_List_Accounting Eina_List_Accounting;
|
||||
|
||||
struct _Eina_List_T {
|
||||
void *data;
|
||||
Eina_List *next;
|
||||
Eina_List *prev;
|
||||
struct {
|
||||
Eina_List *last;
|
||||
unsigned int count;
|
||||
} *accounting;
|
||||
} Eina_List_T;
|
||||
|
||||
Eina_List *eina_list_append(Eina_List *list, const void *data);
|
||||
Eina_List *eina_list_prepend(Eina_List *list, const void *data);
|
||||
Eina_List *eina_list_append_relative(Eina_List *list, const void *data, const void *relative);
|
||||
Eina_List *eina_list_append_relative_list(Eina_List *list, const void *data, Eina_List *relative);
|
||||
Eina_List *eina_list_prepend_relative(Eina_List *list, const void *data, const void *relative);
|
||||
Eina_List *eina_list_prepend_relative_list(Eina_List *list, const void *data, Eina_List *relative);
|
||||
Eina_List *eina_list_sorted_insert(Eina_List *list, Eina_Compare_Cb func, const void *data);
|
||||
Eina_List *eina_list_remove(Eina_List *list, const void *data);
|
||||
Eina_List *eina_list_remove_list(Eina_List *list, Eina_List *remove_list);
|
||||
Eina_List *eina_list_promote_list(Eina_List *list, Eina_List *move_list);
|
||||
Eina_List *eina_list_demote_list(Eina_List *list, Eina_List *move_list);
|
||||
void *eina_list_data_find(const Eina_List *list, const void *data);
|
||||
Eina_List *eina_list_data_find_list(const Eina_List *list, const void *data);
|
||||
Eina_Bool eina_list_move(Eina_List **to, Eina_List **from, void *data);
|
||||
Eina_Bool eina_list_move_list(Eina_List **to, Eina_List **from, Eina_List *data);
|
||||
Eina_List *eina_list_free(Eina_List *list);
|
||||
void *eina_list_nth(const Eina_List *list, unsigned int n);
|
||||
Eina_List *eina_list_nth_list(const Eina_List *list, unsigned int n);
|
||||
Eina_List *eina_list_reverse(Eina_List *list);
|
||||
Eina_List *eina_list_reverse_clone(const Eina_List *list);
|
||||
Eina_List *eina_list_clone(const Eina_List *list);
|
||||
Eina_List *eina_list_sort(Eina_List *list, unsigned int limit, Eina_Compare_Cb func);
|
||||
Eina_List *eina_list_shuffle(Eina_List *list, Eina_Random_Cb func);
|
||||
Eina_List *eina_list_merge(Eina_List *left, Eina_List *right);
|
||||
Eina_List *eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func);
|
||||
Eina_List *eina_list_split_list(Eina_List *list, Eina_List *relative, Eina_List **right);
|
||||
Eina_List *eina_list_search_sorted_near_list(const Eina_List *list, Eina_Compare_Cb func, const void *data, int *result_cmp);
|
||||
Eina_List *eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data);
|
||||
void *eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data);
|
||||
Eina_List *eina_list_search_unsorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data);
|
||||
void *eina_list_search_unsorted(const Eina_List *list, Eina_Compare_Cb func, const void *data);
|
||||
Eina_Iterator *eina_list_iterator_new(const Eina_List *list);
|
||||
Eina_Iterator *eina_list_iterator_reversed_new(const Eina_List *list);
|
||||
// Eina_Accessor *eina_list_accessor_new(const Eina_List *list);
|
||||
]]
|
||||
|
||||
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
|
||||
|
||||
cutil.init_module(init, shutdown)
|
||||
|
||||
local Iterator = iterator.Iterator
|
||||
|
||||
M.Iterator = Iterator:clone {
|
||||
__ctor = function(self, list)
|
||||
self.__list = list
|
||||
return Iterator.__ctor(self, eina.eina_list_iterator_new(list.__list))
|
||||
end,
|
||||
|
||||
next = function(self)
|
||||
local v = Iterator.next(self)
|
||||
if not v then return nil end
|
||||
return self.__list:data_get(v)
|
||||
end
|
||||
}
|
||||
|
||||
M.Reverse_Iterator = Iterator:clone {
|
||||
__ctor = function(self, list)
|
||||
self.__list = list
|
||||
return Iterator.__ctor(self, eina.eina_list_iterator_reversed_new(
|
||||
list.__list))
|
||||
end,
|
||||
|
||||
next = function(self)
|
||||
local v = Iterator.next(self)
|
||||
if not v then return nil end
|
||||
return self.__list:data_get(v)
|
||||
end
|
||||
}
|
||||
|
||||
local get_list_t = function(list)
|
||||
return ffi.cast("Eina_List_T*", list)
|
||||
end
|
||||
|
||||
local List = ffi.metatype("Eina_List", {
|
||||
__len = function(self)
|
||||
return get_list_t(self).accounting.count
|
||||
end,
|
||||
|
||||
__index = {
|
||||
data_get = function(self, ptr)
|
||||
if ptr ~= nil then return ptr end
|
||||
local v = get_list_t(self).data
|
||||
if v == nil then return nil end
|
||||
return v
|
||||
end,
|
||||
|
||||
nth = function(self, n)
|
||||
local v = eina.eina_list_nth(self, n - 1)
|
||||
if v == nil then return nil end
|
||||
return self:data_get(v)
|
||||
end,
|
||||
|
||||
nth_list = function(self, n)
|
||||
local v = eina.eina_list_nth_list(self, n - 1)
|
||||
if v == nil then return nil end
|
||||
return v
|
||||
end,
|
||||
|
||||
last = function(self)
|
||||
local v = get_list_t(self).accounting.last
|
||||
if v == nil then return nil end
|
||||
return v
|
||||
end,
|
||||
|
||||
next = function(self)
|
||||
local v = get_list_t(self).next
|
||||
if v == nil then return nil end
|
||||
return v
|
||||
end,
|
||||
|
||||
prev = function(self)
|
||||
local v = get_list_t(self).prev
|
||||
if v == nil then return nil end
|
||||
return v
|
||||
end
|
||||
}
|
||||
})
|
||||
|
||||
M.List = util.Object:clone {
|
||||
__ctor = function(self, list, freefunc)
|
||||
if list and freefunc then
|
||||
list = ffi.gc(list, freefunc)
|
||||
self.__free = freefunc
|
||||
end
|
||||
self.__list = list
|
||||
end,
|
||||
|
||||
free = function(self)
|
||||
local ffunc, l = self.__free, self.__list
|
||||
if not ffunc or l == nil then return end
|
||||
ffunc(ffi.gc(self.__list, nil))
|
||||
end,
|
||||
|
||||
count = function(self)
|
||||
local l = self.__list
|
||||
if l == nil then return 0 end
|
||||
return #l
|
||||
end,
|
||||
|
||||
nth = function(self, n)
|
||||
local l = self.__list
|
||||
if l == nil then return nil end
|
||||
return l:nth()
|
||||
end,
|
||||
|
||||
nth_list = function(self, n)
|
||||
local l = self.__list
|
||||
if l == nil then return nil end
|
||||
return self.__index(l:nth_list())
|
||||
end,
|
||||
|
||||
last = function(self, n)
|
||||
local l = self.__list
|
||||
if l == nil then return nil end
|
||||
return self.__index(l:last())
|
||||
end,
|
||||
|
||||
next = function(self, n)
|
||||
local l = self.__list
|
||||
if l == nil then return nil end
|
||||
return self.__index(l:next())
|
||||
end,
|
||||
|
||||
prev = function(self, n)
|
||||
local l = self.__list
|
||||
if l == nil then return nil end
|
||||
return self.__index(l:prev())
|
||||
end,
|
||||
|
||||
data_get = function(self, ptr)
|
||||
local l = self.__list
|
||||
if l == nil then return nil end
|
||||
return l:data_get(ptr)
|
||||
end
|
||||
}
|
||||
|
||||
return M
|
|
@ -113,11 +113,11 @@ M.Tiler = ffi.metatype("Eina_Tiler", {
|
|||
end,
|
||||
|
||||
is_empty = function(self)
|
||||
return eina.eina_tiler_empty(self) == 1
|
||||
return eina.eina_tiler_empty(self) ~= 0
|
||||
end,
|
||||
|
||||
rect_add = function(self, r)
|
||||
return eina.eina_tiler_rect_add(self, r) == 1
|
||||
return eina.eina_tiler_rect_add(self, r) ~= 0
|
||||
end,
|
||||
rect_del = function(self, r)
|
||||
eina.eina_tiler_rect_del(self, r)
|
||||
|
@ -137,7 +137,7 @@ M.Tile_Grid_Slicer = ffi.metatype("Eina_Tile_Grid_Slicer", {
|
|||
__index = {
|
||||
setup = function(self, x, y, w, h, tile_w, tile_h)
|
||||
return eina.eina_tile_grid_slicer_setup(x, y, w, h,
|
||||
tile_w, tile_h) == 1
|
||||
tile_w, tile_h) ~= 0
|
||||
end,
|
||||
|
||||
next = function(self)
|
||||
|
|
|
@ -91,7 +91,7 @@ M.Value_Iterator = Iterator:clone {
|
|||
M.value_ls = M.Value_Iterator
|
||||
|
||||
M.copy = function(src, dst)
|
||||
return eina.eina_xatr_copy(src, dst) == 1
|
||||
return eina.eina_xatr_copy(src, dst) ~= 0
|
||||
end
|
||||
|
||||
M.get = function(file, attribute)
|
||||
|
@ -111,16 +111,16 @@ M.flags = {
|
|||
|
||||
M.set = function(file, attribute, data, flags)
|
||||
if not data then return false end
|
||||
return eina.eina_xattr_set(file, attribute, data, #data, flags or 0) == 1
|
||||
return eina.eina_xattr_set(file, attribute, data, #data, flags or 0) ~= 0
|
||||
end
|
||||
|
||||
M.del = function(file, attribute)
|
||||
return eina.eina_xattr_del(file, attribute) == 1
|
||||
return eina.eina_xattr_del(file, attribute) ~= 0
|
||||
end
|
||||
|
||||
M.string_set = function(file, attribute, data, flags)
|
||||
return eina.eina_xattr_set(file, attribute, data, #data + 1,
|
||||
flags or 0) == 1
|
||||
flags or 0) ~= 0
|
||||
end
|
||||
|
||||
M.string_get = function(file, attribute)
|
||||
|
@ -132,7 +132,7 @@ M.string_get = function(file, attribute)
|
|||
end
|
||||
|
||||
M.double_set = function(file, attribute, value, flags)
|
||||
return eina.eina_xattr_double_set(file, attribute, value, flags) == 1
|
||||
return eina.eina_xattr_double_set(file, attribute, value, flags) ~= 0
|
||||
end
|
||||
|
||||
M.double_get = function(file, attribute)
|
||||
|
@ -143,7 +143,7 @@ M.double_get = function(file, attribute)
|
|||
end
|
||||
|
||||
M.int_set = function(file, attribute, value, flags)
|
||||
return eina.eina_xattr_int_set(file, attribute, value, flags) == 1
|
||||
return eina.eina_xattr_int_set(file, attribute, value, flags) ~= 0
|
||||
end
|
||||
|
||||
M.int_get = function(file, attribute)
|
||||
|
|
Loading…
Reference in New Issue