mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-06 15:48:47 +00: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] = {
|
TypeInfoMember Circle_members[2] = {
|
||||||
{"r", 1, -1, &F32_type_info},
|
{"r", 1, -1, &F32_type_info},
|
||||||
{"pos", 3, -1, &V2F32_type_info},
|
{"pos", 3, -1, &V2F32_type_info},
|
||||||
@@ -14,10 +14,19 @@ TypeInfoMember RoundedPolygon_members[3] = {
|
|||||||
{"p", 1, 1, &V2F32_type_info},
|
{"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] = {
|
TypeInfoEnumerant Shape_members[3] = {
|
||||||
{"Circle", 6, 1},
|
{"Circle", 6, 1},
|
||||||
{"Segment", 7, 2},
|
{"Segment", 7, 2},
|
||||||
{"Polygon", 7, 3},
|
{"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)
|
#if !defined(META_TYPES_H)
|
||||||
#define 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;
|
typedef struct Circle Circle;
|
||||||
struct Circle
|
struct Circle
|
||||||
{
|
{
|
||||||
@@ -28,11 +28,11 @@ Shape_Segment = 2,
|
|||||||
Shape_Polygon = 3,
|
Shape_Polygon = 3,
|
||||||
} Shape;
|
} 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);
|
TypeInfo* type_info_from_shape(Shape v);
|
||||||
U32 max_slot_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 U32_type_info;
|
||||||
extern TypeInfo F32_type_info;
|
extern TypeInfo F32_type_info;
|
||||||
extern TypeInfo V2F32_type_info;
|
extern TypeInfo V2F32_type_info;
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ struct TypeInfo
|
|||||||
// struct: TypeInfoMember*
|
// struct: TypeInfoMember*
|
||||||
// enum: TypeInfoMember*
|
// enum: TypeInfoMember*
|
||||||
void *children;
|
void *children;
|
||||||
|
// enum
|
||||||
|
TypeInfo *underlying_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct TypeInfoMember TypeInfoMember;
|
typedef struct TypeInfoMember TypeInfoMember;
|
||||||
|
|||||||
@@ -31,15 +31,19 @@ struct TypeInfo
|
|||||||
TypeKind kind;
|
TypeKind kind;
|
||||||
MD_Node *node;
|
MD_Node *node;
|
||||||
|
|
||||||
// member list
|
// basic
|
||||||
|
int size;
|
||||||
|
|
||||||
|
// structs
|
||||||
struct TypeMember *first_member;
|
struct TypeMember *first_member;
|
||||||
struct TypeMember *last_member;
|
struct TypeMember *last_member;
|
||||||
int member_count;
|
int member_count;
|
||||||
|
|
||||||
// enumerant list
|
// enums
|
||||||
struct TypeEnumerant *first_enumerant;
|
struct TypeEnumerant *first_enumerant;
|
||||||
struct TypeEnumerant *last_enumerant;
|
struct TypeEnumerant *last_enumerant;
|
||||||
int enumerant_count;
|
int enumerant_count;
|
||||||
|
TypeInfo *underlying_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct TypeMember TypeMember;
|
typedef struct TypeMember TypeMember;
|
||||||
@@ -260,6 +264,66 @@ generate_enum_member_tables_from_types(FILE *out, TypeInfo *first_type)
|
|||||||
fprintf(out, "\n");
|
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 //////////////////////////////////////////////////////////////////////
|
//~ main //////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -411,6 +475,8 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
// TODO no duplicate member names check
|
// TODO no duplicate member names check
|
||||||
|
|
||||||
|
// TODO basic type sizes
|
||||||
|
|
||||||
// build member lists
|
// build member lists
|
||||||
for (TypeInfo *type = first_type;
|
for (TypeInfo *type = first_type;
|
||||||
type != 0;
|
type != 0;
|
||||||
@@ -503,6 +569,8 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO check enum base types
|
||||||
|
|
||||||
// build enumerant lists
|
// build enumerant lists
|
||||||
for (TypeInfo *type = first_type;
|
for (TypeInfo *type = first_type;
|
||||||
type != 0;
|
type != 0;
|
||||||
@@ -510,6 +578,7 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
if (type->kind == TypeKind_Enum)
|
if (type->kind == TypeKind_Enum)
|
||||||
{
|
{
|
||||||
|
|
||||||
// build the list
|
// build the list
|
||||||
MD_b32 got_list = 1;
|
MD_b32 got_list = 1;
|
||||||
TypeEnumerant *first_enumerant = 0;
|
TypeEnumerant *first_enumerant = 0;
|
||||||
@@ -598,6 +667,7 @@ main(int argc, char **argv)
|
|||||||
// generate metadata tables
|
// generate metadata tables
|
||||||
generate_struct_member_tables_from_types(c, first_type);
|
generate_struct_member_tables_from_types(c, first_type);
|
||||||
generate_enum_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
|
// TODO generate function definitions
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user