Allow arbitrary meta properties on enum fields

This commit is contained in:
2019-04-01 00:51:14 +11:00
parent 40f72c576e
commit a6c05a950e
4 changed files with 438 additions and 609 deletions
+13 -8
View File
@@ -1,10 +1,7 @@
DQN_INSPECT enum struct EnumWithMetadata
{
Rect DQN_INSPECT_META(FilePath = "Rect.vert", FilePath2 = "Rect.frag"),
Count,
struct V3 {
V3(float a, float b, float c) { (void)a; (void)b; (void)c; }
float a, b, c;
};
struct V3 { V3(float a, float b) { (void)a; (void)b; } float test; };
struct V4 { float test; };
template <typename T, int Size>
@@ -14,6 +11,8 @@ enum struct OpenGLShader { Vertex, Count, };
DQN_INSPECT struct SampleStruct
{
// TODO(doyle): This shit not support yet, you can imagine why
int const *const b, c, *d, *e;
// #if 0
// #endif
Array<V3, 32> lights;
@@ -27,7 +26,6 @@ DQN_INSPECT struct SampleStruct
int draw_call_count;
const int *const a;
int const *const b, c, *d, *e;
const int f;
int const g;
int *const h;
@@ -35,13 +33,20 @@ DQN_INSPECT struct SampleStruct
int *********const j, k, ******l, *m;
};
DQN_INSPECT enum struct EnumWithMetadata
{
Rect DQN_INSPECT_META(char const *FilePath = "Rect.vert", V3 Coords = V3(1, 2, 3)),
Square DQN_INSPECT_META(char const *FilePath = "Square.vert"),
Count,
};
DQN_INSPECT_GENERATE_PROTOTYPE(b = {}, c = nullptr, e = false, f = 1, g = "Hello world")
void Function1(int a, float b, char const *c, bool e, int f, char *g)
{
(void)a; (void)b; (void)c; (void)e; (void)f; (void)g;
}
DQN_INSPECT_GENERATE_PROTOTYPE(foo = V3(10, 20), bar = {120, 150})
DQN_INSPECT_GENERATE_PROTOTYPE(foo = V3(10, 20, 50), bar = {120, 150, 20})
void *Function2(V3 foo, V3 bar, ...) { (void)foo; (void)bar; return nullptr; }
DQN_INSPECT_GENERATE_PROTOTYPE()
+94 -150
View File
@@ -12,205 +12,126 @@
#define CHAR_COUNT(str) (ARRAY_COUNT(str) - 1)
#define STR_AND_LEN(str) str, CHAR_COUNT(str)
char const *DqnInspect_EnumWithMetadata_Strings[] = {"Rect", "Count", };
char const *DqnInspect_EnumString(EnumWithMetadata val)
{
if (val == EnumWithMetadata::Rect) return DqnInspect_EnumWithMetadata_Strings[0]; // "Rect"
if (val == EnumWithMetadata::Count) return DqnInspect_EnumWithMetadata_Strings[1]; // "Count"
return nullptr;
}
char const *DqnInspect_FilePathMetadata(EnumWithMetadata val)
{
if (val == EnumWithMetadata::Rect) return "Rect.vert";
return nullptr;
}
char const *DqnInspect_FilePath2Metadata(EnumWithMetadata val)
{
if (val == EnumWithMetadata::Rect) return "Rect.frag";
return nullptr;
}
DqnInspect_StructMemberMetadata const DqnInspect_SampleStruct_ebo_StructMemberMetadata[] =
{
{
DqnInspect_StructMemberMetadataType::String,
STR_AND_LEN("DisplayName"), STR_AND_LEN("Element Buffer Object"),
},
};
DqnInspect_StructMemberMetadata const DqnInspect_SampleStruct_vao_StructMemberMetadata[] =
{
{
DqnInspect_StructMemberMetadataType::String,
STR_AND_LEN("DisplayName"), STR_AND_LEN("Vertex Array Object"),
},
{
DqnInspect_StructMemberMetadataType::String,
STR_AND_LEN("OpenGLVersion"), STR_AND_LEN("330"),
},
};
DqnInspect_StructMemberMetadata const DqnInspect_SampleStruct_draw_color_StructMemberMetadata[] =
{
{
DqnInspect_StructMemberMetadataType::String,
STR_AND_LEN("DisplayName"), STR_AND_LEN("HelloWorld"),
},
};
DqnInspect_StructMember const DqnInspect_SampleStruct_StructMembers[] =
{
{
STR_AND_LEN("Array"), STR_AND_LEN("lights"),
STR_AND_LEN("V3, 32"), // template_expr
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("Array"), STR_AND_LEN("camera_matrixes"),
STR_AND_LEN("V4, 32"), // template_expr
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("char"), STR_AND_LEN("bitmaps"),
STR_AND_LEN("int const *c"), STR_AND_LEN("b"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
2 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("shaders"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
{
STR_AND_LEN("void"), STR_AND_LEN("win32_handle"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("ebo"),
nullptr, 0, // template_expr and template_expr_len
DqnInspect_SampleStruct_ebo_StructMemberMetadata, 1,
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("vbo"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("vao"),
nullptr, 0, // template_expr and template_expr_len
DqnInspect_SampleStruct_vao_StructMemberMetadata, 2,
0 // array_dimensions
},
{
STR_AND_LEN("V4"), STR_AND_LEN("draw_color"),
nullptr, 0, // template_expr and template_expr_len
DqnInspect_SampleStruct_draw_color_StructMemberMetadata, 1,
0 // array_dimensions
},
{
STR_AND_LEN("V3"), STR_AND_LEN("lighting_ambient_coeff"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("draw_call_count"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("const"), STR_AND_LEN("int"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("const"), STR_AND_LEN("a"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("b"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("c"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("d"),
STR_AND_LEN("int const *const b, c, *"), STR_AND_LEN("d"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("e"),
STR_AND_LEN("int const *const b, c, *d, *"), STR_AND_LEN("e"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
{
STR_AND_LEN("Array"), STR_AND_LEN("lights"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("Array"), STR_AND_LEN("camera_matrixes"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("char **"), STR_AND_LEN("bitmaps"),
nullptr, 0, // template_expr and template_expr_len
2 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("shaders"),
nullptr, 0, // template_expr and template_expr_len
1 // array_dimensions
},
{
STR_AND_LEN("void *"), STR_AND_LEN("win32_handle"),
nullptr, 0, // template_expr and template_expr_len
1 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("ebo"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("vao"), STR_AND_LEN("DQN_INSPECT_META"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("V4"), STR_AND_LEN("draw_color"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("V3"), STR_AND_LEN("lighting_ambient_coeff"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("draw_call_count"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("const"), STR_AND_LEN("int"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("const"), STR_AND_LEN("a"),
nullptr, 0, // template_expr and template_expr_len
0 // array_dimensions
},
{
STR_AND_LEN("const"), STR_AND_LEN("int"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("g"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("h"),
STR_AND_LEN("int *c"), STR_AND_LEN("h"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("i"),
STR_AND_LEN("int const*"), STR_AND_LEN("i"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("j"),
STR_AND_LEN("int *********c"), STR_AND_LEN("j"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
9 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("k"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
0 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("l"),
STR_AND_LEN("int *********const j, k, ******"), STR_AND_LEN("l"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
6 // array_dimensions
},
{
STR_AND_LEN("int"), STR_AND_LEN("m"),
STR_AND_LEN("int *********const j, k, ******l, *"), STR_AND_LEN("m"),
nullptr, 0, // template_expr and template_expr_len
nullptr, 0, // metadata and metadata_len
1 // array_dimensions
},
};
@@ -229,9 +150,32 @@ DqnInspect_Struct const *DqnInspect_GetStruct(SampleStruct const *val)
return result;
}
void Function1(int a, float b = {}, char const *c = nullptr, bool e = false, int f = 1, char *g = "Hello world");
void * Function2(V3 foo = V3(10, 20), V3 bar = {120, 150}, ...);
Array<int const *, 3> const *const Function3(Array<int, 32> const *foobar);
char const *DqnInspect_EnumWithMetadata_Strings[] = {"Rect", "Square", "Count", };
char const *DqnInspectEnum_Stringify(EnumWithMetadata val, int *len = nullptr)
{
if (val == EnumWithMetadata::Rect) { if (len) *len = CHAR_COUNT("Rect"); return DqnInspect_EnumWithMetadata_Strings[0]; }
if (val == EnumWithMetadata::Square) { if (len) *len = CHAR_COUNT("Square"); return DqnInspect_EnumWithMetadata_Strings[1]; }
if (val == EnumWithMetadata::Count) { if (len) *len = CHAR_COUNT("Count"); return DqnInspect_EnumWithMetadata_Strings[2]; }
return nullptr;
}
char const * DqnInspectMetadata_FilePath(EnumWithMetadata val)
{
if (val == EnumWithMetadata::Rect) { return "Rect.vert"; }
if (val == EnumWithMetadata::Square) { return "Square.vert"; }
return nullptr;
}
bool DqnInspectMetadata_Coords(EnumWithMetadata val, V3 *value)
{
if (val == EnumWithMetadata::Rect) { *value = V3(1, 2, 3); return true; }
return false;
}
void Function1(int a, float b = {}, char const * c = nullptr, bool e = false, int f = 1, char * g = "Hello world");
void * Function2(V3 foo = V3(10, 20, 50), V3 bar = {120, 150, 20}, ...);
Array<int const *, 3> const *const Function3(Array<int, 32> const * foobar);
#undef ARRAY_COUNT
#undef CHAR_COUNT