A quick helper to create some code for each member in a structure. (Not recursive)
// %1 = member name
// type_of(%1) = member type
for_each_member :: ($T: Type, format: string) -> string
{
builder: String_Builder;
defer free_buffers(*builder);
struct_info := cast(*Type_Info_Struct) T;
assert(struct_info.type == Type_Info_Tag.STRUCT);
for struct_info.members
{
if it.flags & .CONSTANT continue;
print_to_builder(*builder, format, it.name);
}
return builder_to_string(*builder);
}
Usage:
serialize_structure :: (s: $T, builder: *String_Builder) -> success: bool
{
#insert #run for_each_member(type_of(s), "if !serialize(s.%1, builder) return false;\n" );
return true;
}
serialize :: (to_serialize: int, builder: *String_Builder) -> success: bool { return true; } // @Placeholder
serialize :: (to_serialize: u16, builder: *String_Builder) -> success: bool { return true; } // @Placeholder
main :: ()
{
Player :: struct
{
status: u16;
health: int;
}
p: Player;
builder: String_Builder;
defer free_buffers(*builder);
success := serialize_structure(p, *builder);
}
Adds the following to the polymorphic serialize_structure(Player, *String_Builder) function
if !serialize(s.status, builder) return false;
if !serialize(s.health, builder) return false;