Setup workaround with type casting for POD with assignment overload restriction on varadic args.

This commit is contained in:
Edward R. Gonzalez 2023-05-07 15:46:28 -04:00
parent 0de0e1632b
commit 59042a162c
2 changed files with 54 additions and 32 deletions

View File

@ -2587,10 +2587,25 @@ namespace gen
return Code::Invalid; \
}
# define def_body_code_validation_start( Name_, Get_Code_Expr_ ) \
# define def_body_code_validation_start( Name_ ) \
do \
{ \
Code entry = Get_Code_Expr_; \
Code_POD pod = va_arg(va, Code_POD); \
Code entry = pcast(Code, pod); \
\
if ( ! entry ) \
{ \
log_failure("gen::" txt(Name_) ": Provided an null entry"); \
return Code::Invalid; \
} \
\
switch ( entry->Type ) \
{
# define def_body_code_array_validation_start( Name_ ) \
do \
{ \
Code entry = *codes; codes++; \
\
if ( ! entry ) \
{ \
@ -2624,7 +2639,7 @@ namespace gen
va_list va;
va_start(va, num);
def_body_code_validation_start( def_class_body, va_arg( va, Code ) );
def_body_code_validation_start( def_class_body );
AST_BODY_CLASS_UNALLOWED_TYPES
def_body_code_validation_end( def_class_body );
va_end(va);
@ -2641,7 +2656,7 @@ namespace gen
result = make_code();
result->Type = Function_Body;
def_body_code_validation_start( def_class_body, *codes; codes++ );
def_body_code_array_validation_start( def_class_body );
AST_BODY_CLASS_UNALLOWED_TYPES
def_body_code_validation_end( def_class_body );
@ -2661,7 +2676,8 @@ namespace gen
va_start(va, num);
do
{
Code entry = va_arg(va, Code);
Code_POD pod = va_arg(va, Code_POD);
Code entry = pcast(Code, pod);
if ( ! entry )
{
@ -2726,7 +2742,7 @@ namespace gen
va_list va;
va_start(va, num);
def_body_code_validation_start( def_export_body, va_arg(va, Code) );
def_body_code_validation_start( def_export_body );
AST_BODY_EXPORT_UNALLOWED_TYPES
def_body_code_validation_end( def_export_body );
va_end(va);
@ -2743,7 +2759,7 @@ namespace gen
result = make_code();
result->Type = Export_Body;
def_body_code_validation_start( def_export_body, *codes; codes++ );
def_body_code_array_validation_start( def_export_body );
AST_BODY_EXPORT_UNALLOWED_TYPES
def_body_code_validation_end( def_export_body );
@ -2761,7 +2777,7 @@ namespace gen
va_list va;
va_start(va, num);
def_body_code_validation_start( def_extern_linkage_body, va_arg(va, Code) );
def_body_code_validation_start( def_extern_linkage_body );
AST_BODY_EXTERN_LINKAGE_UNALLOWED_TYPES
def_body_code_validation_end( def_extern_linkage_body );
va_end(va);
@ -2778,7 +2794,7 @@ namespace gen
result = make_code();
result->Type = Extern_Linkage_Body;
def_body_code_validation_start( def_extern_linkage_body, *codes; codes++ );
def_body_code_array_validation_start( def_extern_linkage_body );
AST_BODY_EXTERN_LINKAGE_UNALLOWED_TYPES
def_body_code_validation_end( def_extern_linkage_body );
@ -2796,7 +2812,7 @@ namespace gen
va_list va;
va_start(va, num);
def_body_code_validation_start( def_function_body, va_arg(va, Code) );
def_body_code_validation_start( def_function_body );
AST_BODY_FUNCTION_UNALLOWED_TYPES
def_body_code_validation_end( def_function_body );
va_end(va);
@ -2813,7 +2829,7 @@ namespace gen
result = make_code();
result->Type = Function_Body;
def_body_code_validation_start( def_function_body, *codes; codes++ );
def_body_code_array_validation_start( def_function_body );
AST_BODY_FUNCTION_UNALLOWED_TYPES
def_body_code_validation_end( def_function_body );
@ -2831,7 +2847,7 @@ namespace gen
va_list va;
va_start(va, num);
def_body_code_validation_start( def_global_body, va_arg(va, Code) );
def_body_code_validation_start( def_global_body );
AST_BODY_GLOBAL_UNALLOWED_TYPES
def_body_code_validation_end( def_global_body );
va_end(va);
@ -2848,7 +2864,7 @@ namespace gen
result = make_code();
result->Type = Global_Body;
def_body_code_validation_start( def_global_body, *codes; codes++ );
def_body_code_array_validation_start( def_global_body );
AST_BODY_GLOBAL_UNALLOWED_TYPES
def_body_code_validation_end( def_global_body );
@ -2866,7 +2882,7 @@ namespace gen
va_list va;
va_start(va, num);
def_body_code_validation_start( def_namespace_body, va_arg(va, Code) );
def_body_code_validation_start( def_namespace_body );
AST_BODY_NAMESPACE_UNALLOWED_TYPES
def_body_code_validation_end( def_namespace_body );
va_end(va);
@ -2883,7 +2899,7 @@ namespace gen
result = make_code();
result->Type = Global_Body;
def_body_code_validation_start( def_namespace_body, *codes; codes++ );
def_body_code_array_validation_start( def_namespace_body );
AST_BODY_NAMESPACE_UNALLOWED_TYPES
def_body_code_validation_end( def_namespace_body );
@ -2908,7 +2924,8 @@ namespace gen
va_list va;
va_start(va, num);
Code type = va_arg(va, Code);
Code_POD pod = va_arg(va, Code_POD);
Code type = pcast( Code, pod );
s32 name_length = va_arg(va, s32 );
char const* name = va_arg(va, char const*);
@ -2924,7 +2941,8 @@ namespace gen
while( num -= 3, num && num % 3 == 0 )
{
type = va_arg(va, Code);
pod = va_arg(va, Code_POD);
type = pcast( Code, pod );
name_length = va_arg(va, u32);
name = va_arg(va, char const*);
@ -3029,7 +3047,7 @@ namespace gen
va_list va;
va_start(va, num);
def_body_code_validation_start( def_struct_body, va_arg(va, Code) );
def_body_code_validation_start( def_struct_body );
AST_BODY_STRUCT_UNALLOWED_TYPES
def_body_code_validation_end( def_struct_body );
va_end(va);
@ -3046,7 +3064,7 @@ namespace gen
result = make_code();
result->Type = Struct_Body;
def_body_code_validation_start( def_struct_body, *codes; codes++ );
def_body_code_array_validation_start( def_struct_body );
AST_BODY_STRUCT_UNALLOWED_TYPES
def_body_code_validation_end( def_struct_body );
@ -3066,7 +3084,8 @@ namespace gen
va_start(va, num);
do
{
Code entry = va_arg(va, Code);
Code_POD pod = va_arg(va, Code_POD);
Code entry = pcast( Code, pod );
if ( ! entry )
{
@ -3187,7 +3206,7 @@ namespace gen
return Code::Invalid;
}
if ( type && type != Typename )
if ( type && type->Type != Typename )
{
log_failure("gen::make_enum: type provided is not of code type typename - %s", type->debug_str() );
return Code::Invalid;

View File

@ -547,7 +547,7 @@ namespace gen
constexpr static
uw ArrSpecs_Cap = ArrS_Cap * (sizeof(AST*) / sizeof(SpecifierT));
# define Using_Code_POD \
# define Using_AST_POD \
union { \
AST* ArrStatic[AST::ArrS_Cap]; \
Array(AST*) Entries; \
@ -565,22 +565,22 @@ namespace gen
bool DynamicEntries; \
u8 _Align_Pad[2];
Using_Code_POD
Using_AST_POD
};
struct CodePOD
struct AST_POD
{
Using_Code_POD
Using_AST_POD
# undef Using_CodePOD
};
constexpr sw size_AST = sizeof(AST);
constexpr sw size_POD = sizeof(CodePOD);
constexpr sw size_POD = sizeof(AST_POD);
// Its intended for the AST to have equivalent size to its POD.
// All extra functionality within the AST namespace should just be syntatic sugar.
static_assert( sizeof(AST) == sizeof(CodePOD), "ERROR: AST IS NOT POD" );
static_assert( sizeof(CodePOD) == AST_POD_Size, "ERROR: AST POD is not size of AST_POD_Size" );
static_assert( sizeof(AST) == sizeof(AST_POD), "ERROR: AST IS NOT POD" );
static_assert( sizeof(AST_POD) == AST_POD_Size, "ERROR: AST POD is not size of AST_POD_Size" );
/*
AST* typedef as to not constantly have to add the '*' as this is written often..
@ -666,8 +666,6 @@ namespace gen
return ast;
}
// Cannot be done unfortunately c++ sucks. (Will lose POD by doing so)
#if 0
inline
Code& operator=( Code other )
{
@ -689,7 +687,6 @@ namespace gen
return *this;
}
#endif
inline
AST* operator->()
@ -714,7 +711,13 @@ namespace gen
AST* ast;
};
static_assert( sizeof(Code) == sizeof(AST*), "ERROR: Code is not POD" );
struct Code_POD
{
AST_POD* ast;
};
static_assert( sizeof(Code) == sizeof(Code_POD), "ERROR: Code is not POD" );
// Used when the its desired when omission is allowed in a definition.
constexpr Code NoCode = { nullptr };