mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-06 15:48:47 +00:00
[examples] implement default & auto map features
This commit is contained in:
@@ -35,9 +35,12 @@ TypeInfo*
|
|||||||
type_info_from_shape(Shape v)
|
type_info_from_shape(Shape v)
|
||||||
{
|
{
|
||||||
TypeInfo* result;
|
TypeInfo* result;
|
||||||
memset(&result, 0, sizeof(result));
|
|
||||||
switch (v)
|
switch (v)
|
||||||
{
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
}break;
|
||||||
case Shape_Circle:
|
case Shape_Circle:
|
||||||
{
|
{
|
||||||
result = &Circle_type_info;
|
result = &Circle_type_info;
|
||||||
@@ -57,13 +60,21 @@ U32
|
|||||||
max_slot_from_shape(Shape v)
|
max_slot_from_shape(Shape v)
|
||||||
{
|
{
|
||||||
U32 result;
|
U32 result;
|
||||||
memset(&result, 0, sizeof(result));
|
|
||||||
switch (v)
|
switch (v)
|
||||||
{
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
}break;
|
||||||
case Shape_Polygon:
|
case Shape_Polygon:
|
||||||
{
|
{
|
||||||
result = 12;
|
result = 12;
|
||||||
}break;
|
}break;
|
||||||
|
case Shape_Circle:
|
||||||
|
case Shape_Segment:
|
||||||
|
{
|
||||||
|
result = 64;
|
||||||
|
}break;
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
//~ setup base types //////////////////////////////////////////////////////////
|
//~ setup base types //////////////////////////////////////////////////////////
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
|
||||||
typedef uint32_t U32;
|
typedef uint32_t U32;
|
||||||
typedef float F32;
|
typedef float F32;
|
||||||
typedef struct V2F32 V2F32;
|
typedef struct V2F32 V2F32;
|
||||||
|
|||||||
@@ -928,12 +928,73 @@ gen_function_definitions_from_maps(FILE *out)
|
|||||||
fprintf(out, "%.*s\n", MD_S8VArg(out_type));
|
fprintf(out, "%.*s\n", MD_S8VArg(out_type));
|
||||||
fprintf(out, "%.*s(%.*s v)\n", MD_S8VArg(map->node->string), MD_S8VArg(in_type));
|
fprintf(out, "%.*s(%.*s v)\n", MD_S8VArg(map->node->string), MD_S8VArg(in_type));
|
||||||
fprintf(out, "{\n");
|
fprintf(out, "{\n");
|
||||||
// TODO implement default
|
|
||||||
// TODO implement auto
|
|
||||||
fprintf(out, "%.*s result;\n", MD_S8VArg(out_type));
|
fprintf(out, "%.*s result;\n", MD_S8VArg(out_type));
|
||||||
fprintf(out, "memset(&result, 0, sizeof(result));\n");
|
|
||||||
fprintf(out, "switch (v)\n");
|
fprintf(out, "switch (v)\n");
|
||||||
fprintf(out, "{\n");
|
fprintf(out, "{\n");
|
||||||
|
|
||||||
|
// default
|
||||||
|
fprintf(out, "default:\n");
|
||||||
|
fprintf(out, "{\n");
|
||||||
|
if (!MD_NodeIsNil(map->default_val))
|
||||||
|
{
|
||||||
|
MD_String8 default_expr = map->default_val->string;
|
||||||
|
MD_String8 val_expr = default_expr;
|
||||||
|
if (map->out_is_type_info_ptr)
|
||||||
|
{
|
||||||
|
val_expr = MD_S8Fmt(scratch.arena, "&%.*s_type_info", MD_S8VArg(default_expr));
|
||||||
|
}
|
||||||
|
fprintf(out, "result = %.*s;\n", MD_S8VArg(val_expr));
|
||||||
|
}
|
||||||
|
else if (map->out_is_type_info_ptr)
|
||||||
|
{
|
||||||
|
fprintf(out, "result = 0;\n");
|
||||||
|
}
|
||||||
|
fprintf(out, "}break;\n");
|
||||||
|
|
||||||
|
// auto cases
|
||||||
|
if (!MD_NodeIsNil(map->auto_val))
|
||||||
|
{
|
||||||
|
int map_has_an_implicit_case = 0;
|
||||||
|
for (GEN_TypeEnumerant *enumerant = map->in->first_enumerant;
|
||||||
|
enumerant != 0;
|
||||||
|
enumerant = enumerant->next)
|
||||||
|
{
|
||||||
|
int enumerant_has_explicit_case = 0;
|
||||||
|
for (GEN_MapCase *map_case = map->first_case;
|
||||||
|
map_case != 0;
|
||||||
|
map_case = map_case->next)
|
||||||
|
{
|
||||||
|
if (map_case->in_enumerant == enumerant)
|
||||||
|
{
|
||||||
|
enumerant_has_explicit_case = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enumerant_has_explicit_case)
|
||||||
|
{
|
||||||
|
map_has_an_implicit_case = 1;
|
||||||
|
MD_String8 in_expr = enumerant->node->string;
|
||||||
|
fprintf(out, "case %.*s_%.*s:\n", MD_S8VArg(in_type), MD_S8VArg(in_expr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (map_has_an_implicit_case)
|
||||||
|
{
|
||||||
|
MD_String8 auto_expr = map->auto_val->string;
|
||||||
|
MD_String8 val_expr = auto_expr;
|
||||||
|
if (map->out_is_type_info_ptr)
|
||||||
|
{
|
||||||
|
val_expr = MD_S8Fmt(scratch.arena, "&%.*s_type_info", MD_S8VArg(auto_expr));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(out, "{\n");
|
||||||
|
fprintf(out, "result = %.*s;\n", MD_S8VArg(val_expr));
|
||||||
|
fprintf(out, "}break;\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// explicit cases
|
||||||
for (GEN_MapCase *map_case = map->first_case;
|
for (GEN_MapCase *map_case = map->first_case;
|
||||||
map_case != 0;
|
map_case != 0;
|
||||||
map_case = map_case->next)
|
map_case = map_case->next)
|
||||||
@@ -951,6 +1012,7 @@ gen_function_definitions_from_maps(FILE *out)
|
|||||||
fprintf(out, "result = %.*s;\n", MD_S8VArg(val_expr));
|
fprintf(out, "result = %.*s;\n", MD_S8VArg(val_expr));
|
||||||
fprintf(out, "}break;\n");
|
fprintf(out, "}break;\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(out, "}\n");
|
fprintf(out, "}\n");
|
||||||
fprintf(out, "return(result);\n");
|
fprintf(out, "return(result);\n");
|
||||||
fprintf(out, "}\n");
|
fprintf(out, "}\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user