zigrc
Reference-counted pointers for Zig inspired by Rust's Rc
and Arc
How to use
To use zigrc
, import the src/main.zig
file into your project, or add it as a module on your build file.
Example
const std = @import("std");
const rc = @import("zigrc");
const Thread = std.Thread;
const Mutex = Thread.Mutex;
const ArrayList = std.ArrayList;
const Arc = rc.Arc(Data);
const THREADS = 8;
const Data = struct {
mutex: Mutex = Mutex{},
data: ArrayList(u64) = ArrayList(u64).init(std.testing.allocator),
pub fn deinit(self: Data) void {
self.data.deinit();
}
};
test "example" {
std.debug.print("\n", .{});
std.debug.print("Data size: {}\n", .{@sizeOf(Data)});
std.debug.print("Heap size: {}\n\n", .{Arc.innerSize()});
std.debug.print("Data align: {}\n", .{@alignOf(Data)});
std.debug.print("Heap align: {}\n\n", .{Arc.innerAlign()});
var value = try Arc.init(std.testing.allocator, .{});
errdefer value.releaseWithFn(Data.deinit);
var handles: [THREADS]Thread = undefined;
var i: usize = 0;
while (i < THREADS) {
const this_value = value.retain();
errdefer this_value.releaseWithFn(Data.deinit);
handles[i] = try Thread.spawn(.{}, thread_exec, .{this_value});
i += 1;
}
for (handles) |handle| {
handle.join();
}
const owned_value: Data = value.tryUnwrap().?;
defer owned_value.deinit();
std.debug.print("{d}\n", .{owned_value.data.items});
}
fn thread_exec(data: Arc) !void {
defer data.releaseWithFn(Data.deinit);
var rng = std.rand.DefaultPrng.init(@bitCast(u64, @truncate(i64, std.time.nanoTimestamp())));
data.value.mutex.lock();
defer data.value.mutex.unlock();
const value = rng.random().int(u64);
try data.value.data.append(value);
std.debug.print("{}: {}\n", .{ std.time.nanoTimestamp(), value });
}
Builds
Genrate docs
zig build
Run tests
zig build test
Run examples
zig build example
Generate coverage report (requires kcov)
zig build test -Dcoverage