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:
Daniel Kolesa 2014-04-11 10:55:07 +01:00 committed by Daniel Kolesa
parent f3c0072c13
commit 2d0be0a015
5 changed files with 229 additions and 16 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)