mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 13:59:08 +00:00
move List.join to zig
This commit is contained in:
parent
1691b96197
commit
42d065af45
4 changed files with 60 additions and 157 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue