tiny.trace.checkpoint
Defined in tiny.trace.
API (5)
Types and contracts
Public types and contracts.
Source
Source: lib/trace/src/checkpoint.zig
zig
const std = @import("std");const Allocator = std.mem.Allocator;pub const CaptureFn = *const fn (context: *anyopaque, allocator: Allocator) anyerror![]u8;pub const PrepareRestoreFn = *const fn (context: *anyopaque, bytes: []const u8) anyerror!void;pub const CommitRestoreFn = *const fn (context: *anyopaque) void;pub const CancelRestoreFn = *const fn (context: *anyopaque) void;pub const Provider = struct { context: *anyopaque, capture: CaptureFn, prepare_restore: PrepareRestoreFn, commit_restore: CommitRestoreFn, cancel_restore: CancelRestoreFn, pub fn captureAlloc(self: Provider, allocator: Allocator) ![]u8 { return try self.capture(self.context, allocator); } pub fn prepareRestoreBytes(self: Provider, bytes: []const u8) !void { try self.prepare_restore(self.context, bytes); } pub fn commitRestore(self: Provider) void { self.commit_restore(self.context); } pub fn cancelRestore(self: Provider) void { self.cancel_restore(self.context); }};const ProviderTestState = struct { value: [32]u8 = undefined, value_len: usize = 0, staged: [32]u8 = undefined, staged_len: usize = 0, prepared: bool = false, fn init(bytes: []const u8) ProviderTestState { var self: ProviderTestState = .{}; self.setValue(bytes); return self; } fn setValue(self: *ProviderTestState, bytes: []const u8) void { std.debug.assert(bytes.len <= self.value.len); @memcpy(self.value[0..bytes.len], bytes); self.value_len = bytes.len; } fn current(self: *const ProviderTestState) []const u8 { return self.value[0..self.value_len]; } fn capture(context: *anyopaque, allocator: Allocator) ![]u8 { const self: *@This() = @ptrCast(@alignCast(context)); return try allocator.dupe(u8, self.current()); } fn prepareRestore(context: *anyopaque, bytes: []const u8) !void { const self: *@This() = @ptrCast(@alignCast(context)); if (bytes.len > self.staged.len) return error.TestProviderCapacityExceeded; @memcpy(self.staged[0..bytes.len], bytes); self.staged_len = bytes.len; self.prepared = true; } fn commitRestore(context: *anyopaque) void { const self: *@This() = @ptrCast(@alignCast(context)); std.debug.assert(self.prepared); @memcpy(self.value[0..self.staged_len], self.staged[0..self.staged_len]); self.value_len = self.staged_len; self.prepared = false; } fn cancelRestore(context: *anyopaque) void { const self: *@This() = @ptrCast(@alignCast(context)); self.prepared = false; }};test "provider stages restore before an infallible commit" { var state = ProviderTestState.init("before"); const provider = Provider{ .context = &state, .capture = ProviderTestState.capture, .prepare_restore = ProviderTestState.prepareRestore, .commit_restore = ProviderTestState.commitRestore, .cancel_restore = ProviderTestState.cancelRestore, }; { const bytes = try provider.captureAlloc(std.testing.allocator); defer std.testing.allocator.free(bytes); state.setValue("after"); try provider.prepareRestoreBytes(bytes); try std.testing.expectEqualStrings("after", state.current()); provider.commitRestore(); } try std.testing.expectEqualStrings("before", state.current());}test "provider cancel discards a staged restore" { var state = ProviderTestState.init("before"); const provider = Provider{ .context = &state, .capture = ProviderTestState.capture, .prepare_restore = ProviderTestState.prepareRestore, .commit_restore = ProviderTestState.commitRestore, .cancel_restore = ProviderTestState.cancelRestore, }; try provider.prepareRestoreBytes("after"); provider.cancelRestore(); try std.testing.expectEqualStrings("before", state.current()); try std.testing.expect(!state.prepared);}Source: lib/trace/src/root.zig:34
zig
pub const checkpoint = @import("checkpoint.zig");Audit
| Definitions | 5 |
|---|---|
| Public names | 5 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |