I have here some sample code and I am curious why I can pass handles of type Resource2Handle to the printResource1 function.
Personally I would expect Resource1Handle and Resource2Handle types to be different types right? Or am I miss understanding zig generics?
const std = @import("std");
fn GenericTypeWithHandle(T: type) type {
return struct {
const Handle = struct {
index: u32,
};
item: []const T,
};
}
const Resource1 = struct {
value: usize,
};
const Resource2 = struct {
value: usize,
value1: usize,
};
const GenericTypeWithHandleResource1 = GenericTypeWithHandle(Resource1);
const Resource1Handle = GenericTypeWithHandleResource1.Handle;
const GenericTypeWithHandleResource2 = GenericTypeWithHandle(Resource2);
const Resource2Handle = GenericTypeWithHandleResource2.Handle;
pub fn printResource1(resources: GenericTypeWithHandleResource1, handle: Resource1Handle) void {
const value = resources.item[handle.index].value;
std.debug.print("{d}", .{value});
}
pub fn printResource2(resources: GenericTypeWithHandleResource2, handle: Resource2Handle) void {
const value = resources.item[handle.index].value;
const value1 = resources.item[handle.index].value1;
std.debug.print("{d} {d}", .{ value, value1 });
}
pub fn main() void {
const resources1 = GenericTypeWithHandleResource1{ .item = &.{.{ .value = 1 }} };
const resources2 = GenericTypeWithHandleResource2{ .item = &.{ .{ .value = 1, .value1 = 1 }, .{ .value = 2, .value1 = 2 }, .{ .value = 3, .value1 = 3 } } };
const handle1 = Resource1Handle{ .index = 0 };
const handle2 = Resource2Handle{ .index = 0 };
printResource1(resources1, handle2);
printResource2(resources2, handle1);
}
And if this is valid code, how can I achieve compile time error when passing handle2 to a function expecting handle1?