Type Function Sentinel [src]

Given a "memory span" type, returns the same type except with the given sentinel value.

Prototype

pub fn Sentinel(comptime T: type, comptime sentinel_val: Elem(T)) type

Parameters

T: typesentinel_val: Elem(T)

Source

pub fn Sentinel(comptime T: type, comptime sentinel_val: Elem(T)) type { switch (@typeInfo(T)) { .pointer => |info| switch (info.size) { .one => switch (@typeInfo(info.child)) { .array => |array_info| return @Type(.{ .pointer = .{ .size = info.size, .is_const = info.is_const, .is_volatile = info.is_volatile, .alignment = info.alignment, .address_space = info.address_space, .child = @Type(.{ .array = .{ .len = array_info.len, .child = array_info.child, .sentinel_ptr = @as(?*const anyopaque, @ptrCast(&sentinel_val)), }, }), .is_allowzero = info.is_allowzero, .sentinel_ptr = info.sentinel_ptr, }, }), else => {}, }, .many, .slice => return @Type(.{ .pointer = .{ .size = info.size, .is_const = info.is_const, .is_volatile = info.is_volatile, .alignment = info.alignment, .address_space = info.address_space, .child = info.child, .is_allowzero = info.is_allowzero, .sentinel_ptr = @as(?*const anyopaque, @ptrCast(&sentinel_val)), }, }), else => {}, }, .optional => |info| switch (@typeInfo(info.child)) { .pointer => |ptr_info| switch (ptr_info.size) { .many => return @Type(.{ .optional = .{ .child = @Type(.{ .pointer = .{ .size = ptr_info.size, .is_const = ptr_info.is_const, .is_volatile = ptr_info.is_volatile, .alignment = ptr_info.alignment, .address_space = ptr_info.address_space, .child = ptr_info.child, .is_allowzero = ptr_info.is_allowzero, .sentinel_ptr = @as(?*const anyopaque, @ptrCast(&sentinel_val)), }, }), }, }), else => {}, }, else => {}, }, else => {}, } @compileError("Unable to derive a sentinel pointer type from " ++ @typeName(T)); }