34 lines
1,008 B
Zig
34 lines
1,008 B
Zig
|
|
||
|
/// Append an element to the given array at comptime.
|
||
|
pub fn append(array: anytype, element: anytype) @TypeOf(array ++ .{element}) {
|
||
|
return array ++ .{element};
|
||
|
}
|
||
|
|
||
|
/// Join strings into one, with the given separator in between.
|
||
|
pub fn join(separator: []const u8, slices: []const[]const u8) []const u8 {
|
||
|
if (slices.len == 0) return "";
|
||
|
|
||
|
// Compute total length of the string to make.
|
||
|
const totalLen = total: {
|
||
|
// Compute separator length.
|
||
|
var total = separator.len * (slices.len - 1);
|
||
|
// Add length of all slices.
|
||
|
for (slices) |slice| total += slice.len;
|
||
|
break :total total;
|
||
|
};
|
||
|
|
||
|
var buffer: [totalLen]u8 = undefined;
|
||
|
|
||
|
// Based on std.mem.joinMaybeZ implementation.
|
||
|
@memcpy(buffer[0..slices[0].len], slices[0]);
|
||
|
var buf_index: usize = slices[0].len;
|
||
|
for (slices[1..]) |slice| {
|
||
|
@memcpy(buffer[buf_index .. buf_index + separator.len], separator);
|
||
|
buf_index += separator.len;
|
||
|
@memcpy(buffer[buf_index .. buf_index + slice.len], slice);
|
||
|
buf_index += slice.len;
|
||
|
}
|
||
|
|
||
|
return &buffer;
|
||
|
}
|