A poolable string builder (aka string buffer) for Zig
0

Configure Feed

Select the types of activity you want to include in your feed.

add integer writers

Karl Seguin (Aug 3, 2023, 3:43 PM +0800) dae0bcb9 b2b95c87

+77
+2
readme.md
··· 23 23 24 24 You can call `buf.writer()` to get an `std.io.Writer`. 25 25 26 + You can use `writeU16Big`, `writeU32Big`, `writeU64Big` and `writeU16Little`, `writeU32Little`, `writeU64Little` to write integer values. 27 + 26 28 ## Pooling 27 29 28 30 ```zig
+74
src/buffer.zig
··· 105 105 return self.writeAssumeCapacity(data); 106 106 } 107 107 108 + pub fn writeU16Little(self: *Buffer, value: u16) !void { 109 + try self.ensureUnusedCapacity(2); 110 + const pos = self.pos; 111 + const end_pos = self.pos + 2; 112 + std.mem.writeIntLittle(u16, self.buf[pos..end_pos][0..2], value); 113 + self.pos = end_pos; 114 + } 115 + 116 + pub fn writeU32Little(self: *Buffer, value: u32) !void { 117 + try self.ensureUnusedCapacity(4); 118 + const pos = self.pos; 119 + const end_pos = self.pos + 4; 120 + std.mem.writeIntLittle(u32, self.buf[pos..end_pos][0..4], value); 121 + self.pos = end_pos; 122 + } 123 + 124 + pub fn writeU64Little(self: *Buffer, value: u64) !void { 125 + try self.ensureUnusedCapacity(8); 126 + const pos = self.pos; 127 + const end_pos = self.pos + 8; 128 + std.mem.writeIntLittle(u64, self.buf[pos..end_pos][0..8], value); 129 + self.pos = end_pos; 130 + } 131 + 132 + pub fn writeU16Big(self: *Buffer, value: u16) !void { 133 + try self.ensureUnusedCapacity(2); 134 + const pos = self.pos; 135 + const end_pos = self.pos + 2; 136 + std.mem.writeIntBig(u16, self.buf[pos..end_pos][0..2], value); 137 + self.pos = end_pos; 138 + } 139 + 140 + pub fn writeU32Big(self: *Buffer, value: u32) !void { 141 + try self.ensureUnusedCapacity(4); 142 + const pos = self.pos; 143 + const end_pos = self.pos + 4; 144 + std.mem.writeIntBig(u32, self.buf[pos..end_pos][0..4], value); 145 + self.pos = end_pos; 146 + } 147 + 148 + pub fn writeU64Big(self: *Buffer, value: u64) !void { 149 + try self.ensureUnusedCapacity(8); 150 + const pos = self.pos; 151 + const end_pos = self.pos + 8; 152 + std.mem.writeIntBig(u64, self.buf[pos..end_pos][0..8], value); 153 + self.pos = end_pos; 154 + } 155 + 108 156 pub fn writeAssumeCapacity(self: *Buffer, data: []const u8) void { 109 157 const pos = self.pos; 110 158 const end_pos = pos + data.len; ··· 296 344 const c = try sb.copy(t.allocator); 297 345 defer t.allocator.free(c); 298 346 try t.expectString("hello!!", c); 347 + } 348 + 349 + test "write little" { 350 + var sb = try Buffer.init(t.allocator, 20); 351 + defer sb.deinit(); 352 + try sb.writeU64Little(11234567890123456789); 353 + try t.exectSlice(u8, &[_]u8{21, 129, 209, 7, 249, 51, 233, 155}, sb.string()); 354 + 355 + try sb.writeU32Little(3283856184); 356 + try t.exectSlice(u8, &[_]u8{21, 129, 209, 7, 249, 51, 233, 155, 56, 171, 187, 195}, sb.string()); 357 + 358 + try sb.writeU16Little(15000); 359 + try t.exectSlice(u8, &[_]u8{21, 129, 209, 7, 249, 51, 233, 155, 56, 171, 187, 195, 152, 58}, sb.string()); 360 + } 361 + 362 + test "write big" { 363 + var sb = try Buffer.init(t.allocator, 20); 364 + defer sb.deinit(); 365 + try sb.writeU64Big(11234567890123456789); 366 + try t.exectSlice(u8, &[_]u8{155, 233, 51, 249, 7, 209, 129, 21}, sb.string()); 367 + 368 + try sb.writeU32Big(3283856184); 369 + try t.exectSlice(u8, &[_]u8{155, 233, 51, 249, 7, 209, 129, 21, 195, 187, 171, 56}, sb.string()); 370 + 371 + try sb.writeU16Big(15000); 372 + try t.exectSlice(u8, &[_]u8{155, 233, 51, 249, 7, 209, 129, 21, 195, 187, 171, 56, 58, 152}, sb.string()); 299 373 } 300 374 301 375 fn testString(allocator: Allocator, random: std.rand.Random) []const u8 {
+1
src/t.zig
··· 8 8 try std.testing.expectEqual(@as(@TypeOf(actual), expected), actual); 9 9 } 10 10 pub const expectString = std.testing.expectEqualStrings; 11 + pub const exectSlice = std.testing.expectEqualSlices; 11 12 12 13 pub fn getRandom() std.rand.DefaultPrng { 13 14 var seed: u64 = undefined;