diff options
Diffstat (limited to 'src/StringBuilder.zig')
| -rw-r--r-- | src/StringBuilder.zig | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/StringBuilder.zig b/src/StringBuilder.zig new file mode 100644 index 0000000..632b1b3 --- /dev/null +++ b/src/StringBuilder.zig | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | const std = @import("std"); | ||
| 2 | |||
| 3 | const Allocator = std.mem.Allocator; | ||
| 4 | const ArrayList = std.ArrayList; | ||
| 5 | const StringBuilder = @This(); | ||
| 6 | |||
| 7 | pub const Error = std.mem.Allocator.Error; | ||
| 8 | pub const Writer = std.io.Writer(*StringBuilder, Error, writeFn); | ||
| 9 | |||
| 10 | data: ArrayList(u8), | ||
| 11 | |||
| 12 | pub fn init(allocator: std.mem.Allocator) StringBuilder { | ||
| 13 | return .{ | ||
| 14 | .data = ArrayList(u8).init(allocator), | ||
| 15 | }; | ||
| 16 | } | ||
| 17 | |||
| 18 | pub fn deinit(self: StringBuilder) void { | ||
| 19 | self.data.deinit(); | ||
| 20 | } | ||
| 21 | |||
| 22 | pub fn append(self: *StringBuilder, char: u8) Error!void { | ||
| 23 | return self.data.append(char); | ||
| 24 | } | ||
| 25 | |||
| 26 | pub fn appendMany(self: *StringBuilder, chars: []const u8) Error!void { | ||
| 27 | return self.data.appendSlice(chars); | ||
| 28 | } | ||
| 29 | |||
| 30 | pub fn seeSlice(self: *StringBuilder) []const u8 { | ||
| 31 | return self.data.items; | ||
| 32 | } | ||
| 33 | |||
| 34 | pub fn toOwnedSlice(self: StringBuilder) []u8 { | ||
| 35 | return self.data.toOwnedSlice(); | ||
| 36 | } | ||
| 37 | |||
| 38 | pub fn writer(self: *StringBuilder) Writer { | ||
| 39 | return Writer { .context = self }; | ||
| 40 | } | ||
| 41 | |||
| 42 | fn writeFn(self: *StringBuilder, chars: []const u8) Error!usize { | ||
| 43 | try self.appendMany(chars); | ||
| 44 | return chars.len; | ||
| 45 | } | ||