for_each_member

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;