mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-13 07:52:22 -07:00
[examples] generating type info definitions
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:193
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:197
|
||||
TypeInfoMember Circle_members[2] = {
|
||||
{"r", 1, -1, &F32_type_info},
|
||||
{"pos", 3, -1, &V2F32_type_info},
|
||||
@@ -14,10 +14,19 @@ TypeInfoMember RoundedPolygon_members[3] = {
|
||||
{"p", 1, 1, &V2F32_type_info},
|
||||
};
|
||||
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:232
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:236
|
||||
TypeInfoEnumerant Shape_members[3] = {
|
||||
{"Circle", 6, 1},
|
||||
{"Segment", 7, 2},
|
||||
{"Polygon", 7, 3},
|
||||
};
|
||||
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:272
|
||||
TypeInfo U32_type_info = {TypeKind_Basic, "U32", 3, 0, 0, 0};
|
||||
TypeInfo F32_type_info = {TypeKind_Basic, "F32", 3, 0, 0, 0};
|
||||
TypeInfo V2F32_type_info = {TypeKind_Basic, "V2F32", 5, 0, 0, 0};
|
||||
TypeInfo Circle_type_info = {TypeKind_Struct, "Circle", 6, 2, &Circle_members, 0};
|
||||
TypeInfo RoundedSegment_type_info = {TypeKind_Struct, "RoundedSegment", 14, 3, &RoundedSegment_members, 0};
|
||||
TypeInfo RoundedPolygon_type_info = {TypeKind_Struct, "RoundedPolygon", 14, 3, &RoundedPolygon_members, 0};
|
||||
TypeInfo Shape_type_info = {TypeKind_Enum, "Shape", 5, 3, &Shape_members, 0};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#if !defined(META_TYPES_H)
|
||||
#define META_TYPES_H
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:93
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:97
|
||||
typedef struct Circle Circle;
|
||||
struct Circle
|
||||
{
|
||||
@@ -28,11 +28,11 @@ Shape_Segment = 2,
|
||||
Shape_Polygon = 3,
|
||||
} Shape;
|
||||
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:152
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:156
|
||||
TypeInfo* type_info_from_shape(Shape v);
|
||||
U32 max_slot_from_shape(Shape v);
|
||||
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:177
|
||||
// generated by W:/metadesk/examples/type_metadata/type_metadata.c:181
|
||||
extern TypeInfo U32_type_info;
|
||||
extern TypeInfo F32_type_info;
|
||||
extern TypeInfo V2F32_type_info;
|
||||
|
||||
@@ -36,6 +36,8 @@ struct TypeInfo
|
||||
// struct: TypeInfoMember*
|
||||
// enum: TypeInfoMember*
|
||||
void *children;
|
||||
// enum
|
||||
TypeInfo *underlying_type;
|
||||
};
|
||||
|
||||
typedef struct TypeInfoMember TypeInfoMember;
|
||||
|
||||
@@ -31,15 +31,19 @@ struct TypeInfo
|
||||
TypeKind kind;
|
||||
MD_Node *node;
|
||||
|
||||
// member list
|
||||
// basic
|
||||
int size;
|
||||
|
||||
// structs
|
||||
struct TypeMember *first_member;
|
||||
struct TypeMember *last_member;
|
||||
int member_count;
|
||||
|
||||
// enumerant list
|
||||
// enums
|
||||
struct TypeEnumerant *first_enumerant;
|
||||
struct TypeEnumerant *last_enumerant;
|
||||
int enumerant_count;
|
||||
TypeInfo *underlying_type;
|
||||
};
|
||||
|
||||
typedef struct TypeMember TypeMember;
|
||||
@@ -260,6 +264,66 @@ generate_enum_member_tables_from_types(FILE *out, TypeInfo *first_type)
|
||||
fprintf(out, "\n");
|
||||
}
|
||||
|
||||
void
|
||||
generate_type_info_definitions_from_types(FILE *out, TypeInfo *first_type)
|
||||
{
|
||||
MD_ArenaTemp scratch = MD_GetScratch(0, 0);
|
||||
|
||||
MD_PrintGenNoteCComment(out);
|
||||
|
||||
for (TypeInfo *type = first_type;
|
||||
type != 0;
|
||||
type = type->next)
|
||||
{
|
||||
MD_String8 type_name = type->node->string;
|
||||
|
||||
switch (type->kind)
|
||||
{
|
||||
default:break;
|
||||
|
||||
case TypeKind_Basic:
|
||||
{
|
||||
int size = type->size;
|
||||
fprintf(out, "TypeInfo %.*s_type_info = "
|
||||
"{TypeKind_Basic, \"%.*s\", %d, %d, 0, 0};\n",
|
||||
MD_S8VArg(type_name),
|
||||
MD_S8VArg(type_name), (int)type_name.size, size);
|
||||
}break;
|
||||
|
||||
case TypeKind_Struct:
|
||||
{
|
||||
int child_count = type->member_count;
|
||||
fprintf(out, "TypeInfo %.*s_type_info = "
|
||||
"{TypeKind_Struct, \"%.*s\", %d, %d, %.*s_members, 0};\n",
|
||||
MD_S8VArg(type_name),
|
||||
MD_S8VArg(type_name), (int)type_name.size, child_count, MD_S8VArg(type_name));
|
||||
}break;
|
||||
|
||||
case TypeKind_Enum:
|
||||
{
|
||||
MD_String8 underlying_type_ptr_expression = MD_S8Lit("0");
|
||||
if (type->underlying_type != 0)
|
||||
{
|
||||
MD_String8 underlying_type_name = type->underlying_type->node->string;
|
||||
underlying_type_ptr_expression = MD_S8Fmt(scratch.arena, "&%.*s_type_info",
|
||||
MD_S8VArg(underlying_type_name));
|
||||
}
|
||||
|
||||
int child_count = type->enumerant_count;
|
||||
fprintf(out, "TypeInfo %.*s_type_info = "
|
||||
"{TypeKind_Enum, \"%.*s\", %d, %d, %.*s_members, %.*s};\n",
|
||||
MD_S8VArg(type_name),
|
||||
MD_S8VArg(type_name), (int)type_name.size, child_count, MD_S8VArg(type_name),
|
||||
MD_S8VArg(underlying_type_ptr_expression));
|
||||
}break;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(out, "\n");
|
||||
|
||||
MD_ReleaseScratch(scratch);
|
||||
}
|
||||
|
||||
|
||||
//~ main //////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -411,6 +475,8 @@ main(int argc, char **argv)
|
||||
|
||||
// TODO no duplicate member names check
|
||||
|
||||
// TODO basic type sizes
|
||||
|
||||
// build member lists
|
||||
for (TypeInfo *type = first_type;
|
||||
type != 0;
|
||||
@@ -503,6 +569,8 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO check enum base types
|
||||
|
||||
// build enumerant lists
|
||||
for (TypeInfo *type = first_type;
|
||||
type != 0;
|
||||
@@ -510,6 +578,7 @@ main(int argc, char **argv)
|
||||
{
|
||||
if (type->kind == TypeKind_Enum)
|
||||
{
|
||||
|
||||
// build the list
|
||||
MD_b32 got_list = 1;
|
||||
TypeEnumerant *first_enumerant = 0;
|
||||
@@ -598,6 +667,7 @@ main(int argc, char **argv)
|
||||
// generate metadata tables
|
||||
generate_struct_member_tables_from_types(c, first_type);
|
||||
generate_enum_member_tables_from_types(c, first_type);
|
||||
generate_type_info_definitions_from_types(c, first_type);
|
||||
|
||||
// TODO generate function definitions
|
||||
|
||||
|
||||
Reference in New Issue
Block a user