Compare commits

..

1 commit

Author SHA1 Message Date
19cc6619fa added dupe method 2025-04-14 17:06:06 +02:00
3 changed files with 43 additions and 2 deletions

View file

@ -10,7 +10,7 @@
// This is a [Semantic Version](https://semver.org/).
// In a future version of Zig it will be used for package deduplication.
.version = "0.0.1",
.version = "0.0.2",
// Together with name, this represents a globally unique package
// identifier. This field is generated by the Zig toolchain when the

View file

@ -1,5 +1,7 @@
const std = @import("std");
const AllocError = std.mem.Allocator.Error;
pub const SmolStr = struct {
pub const max_inline_len: usize = 22;
@ -13,7 +15,7 @@ pub const SmolStr = struct {
inner: Inner,
pub fn init(alloc: std.mem.Allocator, s: []const u8) !SmolStr {
pub fn init(alloc: std.mem.Allocator, s: []const u8) AllocError!SmolStr {
if (s.len <= max_inline_len) {
return initInline(s);
}
@ -73,6 +75,13 @@ pub const SmolStr = struct {
}
}
pub fn dupe(self: SmolStr, alloc: std.mem.Allocator) AllocError!SmolStr {
switch (self.inner) {
.inl => return self, // dupe inlined string by direct copy
.heap => |s| return try SmolStr.init(alloc, s),
}
}
pub fn format(self: SmolStr, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
_ = fmt;
_ = options;

View file

@ -36,3 +36,35 @@ test "heap" {
try std.testing.expectEqual(s.len, str.len());
try std.testing.expectEqualStrings(s, str.str());
}
test "dupe inline" {
const alloc = std.testing.allocator;
{
const s = "abcd";
const str1 = try SmolStr.init(alloc, s);
defer str1.deinit(alloc);
const str2 = try str1.dupe(alloc);
defer str2.deinit(alloc);
try std.testing.expectEqualSlices(u8, std.mem.asBytes(&str1), std.mem.asBytes(&str2));
}
{
const s = "abcdefghijklmnopqrstuvwxyz";
const str1 = try SmolStr.init(alloc, s);
defer str1.deinit(alloc);
const str2 = try str1.dupe(alloc);
defer str2.deinit(alloc);
// try std.testing.expectEqualSlices(u8, std.mem.asBytes(&str1), std.mem.asBytes(&str2));
try std.testing.expectEqualStrings(str1.str(), str2.str());
try std.testing.expect(str1.inner.heap.ptr != str2.inner.heap.ptr);
}
}