move List.join to zig

This commit is contained in:
Folkert 2021-04-25 21:35:27 +02:00
parent 1691b96197
commit 42d065af45
4 changed files with 60 additions and 157 deletions

View file

@ -816,3 +816,32 @@ fn swapElements(source_ptr: [*]u8, element_width: usize, index_1: usize, index_2
return swap(element_width, element_at_i, element_at_j);
}
pub fn listJoin(list_of_lists: RocList, alignment: usize, element_width: usize) callconv(.C) RocList {
var total_length: usize = 0;
const size = list_of_lists.len();
const slice_of_lists = @ptrCast([*]RocList, @alignCast(@alignOf(RocList), list_of_lists.bytes));
var i: usize = 0;
while (i < list_of_lists.len()) : (i += 1) {
total_length += slice_of_lists[i].len();
}
const output = RocList.allocate(std.heap.c_allocator, alignment, total_length, element_width);
if (output.bytes) |target| {
var elements_copied: usize = 0;
i = 0;
while (i < list_of_lists.len()) : (i += 1) {
const list = slice_of_lists[i];
if (list.bytes) |source| {
@memcpy(target + elements_copied * element_width, source, list.len() * element_width);
elements_copied += list.len();
}
}
}
return output;
}

View file

@ -19,6 +19,7 @@ comptime {
exportListFn(list.listContains, "contains");
exportListFn(list.listRepeat, "repeat");
exportListFn(list.listAppend, "append");
exportListFn(list.listJoin, "join");
exportListFn(list.listRange, "range");
exportListFn(list.listReverse, "reverse");
exportListFn(list.listSortWith, "sort_with");