Files
bun.sh/src/strings.zig
Jarred Sumner 7b48e206db Dynamic routes resolve! Just gotta pass query params to the JS correctly
Former-commit-id: 2c4d3184a4f06ba9dd7d27d653834589796ebd0f
2021-08-07 02:28:53 -07:00

53 lines
1.5 KiB
Zig

const mutable = @import("string_mutable.zig");
const std = @import("std");
pub usingnamespace @import("string_types.zig");
pub const strings = @import("string_immutable.zig");
pub const MutableString = mutable.MutableString;
pub const eql = std.meta.eql;
pub fn NewStringBuilder(comptime size: usize) type {
return struct {
const This = @This();
buffer: [*]u8 = undefined,
remain: []u8 = undefined,
pub fn init() This {
return This{};
}
pub fn load(this: *This) void {
this.remain = (&this.buffer)[0..size];
}
pub fn append(this: *This, _str: string) void {
std.mem.copy(u8, this.remain, _str);
this.remain = this.remain[_str.len..];
}
pub fn str(this: *This) string {
var buf = this.buffer[0 .. @ptrToInt(this.remain.ptr) - @ptrToInt(&this.buffer)];
// Always leave a sentinel so that anything that expects a sentinel Just Works
// specifically, the reason for this is so C-based APIs can be used without an extra copy.
// one byte is cheap...right?
this.buffer[buf.len] = 0;
return buf;
}
pub fn pop(this: *This, count: usize) string {
this.remain = this.buffer[0 .. @ptrToInt(this.remain.ptr) - @ptrToInt(&this.buffer) - count];
}
pub fn reset(this: *This) void {
this.load();
}
};
}
pub fn nql(a: anytype, b: @TypeOf(a)) bool {
return !eql(a, b);
}