Madeorsk
04b61f9787
+ Add compile-time utility functions to build strings and queries. * Relations to retrieve when querying a model must now be set at comptime.
33 lines
1,008 B
Zig
33 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;
|
|
}
|