Skip to content

Item transfer via Slot

Description

Item transfer via Slot.

  • Create an Event, place it in a Slot.
  • Take it out with moveFromSlot, append it to a list.
  • Pop the item back out of the list, assign it to a Slot.
  • Verify the recovered data, then free it.

moveFromSlot checks the tag and empties the Slot in one step.\ fromSlot would leave the Slot full — that is the difference.

Diagram

 alloc.create ──► slot (non-null)
      │ moveFromSlot + list.append
 list (holds item)
      │ list.popFirst + slot=item
 slot (holds item again)
      │ freeSlot
 freed

Source

pub fn item_transfer_via_slot(allocator: std.mem.Allocator, io: std.Io) !void {
    _ = io;

    var slot: Slot = null;
    defer items.Event.EventPolyHelper.destroy(allocator, &slot);
    try items.Event.EventPolyHelper.create(allocator, &slot);
    const ev: *items.Event = items.Event.EventPolyHelper.mustFromSlot(&slot);
    ev.*.code = 42;
    try helpers.expect(error.ItemTransferFailed, slot != null, "slot should be non-null after create");

    // Transfer to list — moveFromSlot checks the tag and empties the slot.
    var list: polynode.ItemList = .{};
    const moved: *items.Event = items.Event.EventPolyHelper.moveFromSlot(&slot) orelse return error.WrongTag;
    list.append(&moved.*.poly);
    try helpers.expect(error.ItemTransferFailed, slot == null, "slot should be null after transfer");

    // Recover from list — assign back to slot.
    slot = list.popFirst() orelse return error.EmptyList;
    try helpers.expect(error.ItemTransferFailed, slot != null, "slot should be non-null after recovery");

    const recovered: *items.Event = items.Event.EventPolyHelper.mustFromSlot(&slot);
    try helpers.expect(error.ItemTransferFailed, recovered.*.code == 42, "wrong event code");

    items.freeSlot(&slot, allocator);
    try helpers.expect(error.ItemTransferFailed, slot == null, "slot should be null after destroy");
    // defer runs as no-op
}

const items = @import("../items/items.zig");
const helpers = @import("../helpers/helpers.zig");
const polynode = @import("matryoshka").polynode;
const std = @import("std");
const Slot = polynode.Slot;