mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 07:44:45 -08:00
Looking into what the library's convention for enums will be.
Most likely will just reduce them to C-enums with underlying type. Otherwise there has to be a mechanism to drop the defs down to them anyways, and eliminate the namespace wraps.
This commit is contained in:
parent
e5acac1d18
commit
ed0c0422ad
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -39,7 +39,8 @@
|
||||
"raylib.h": "c",
|
||||
"*.m": "cpp",
|
||||
"atomic": "cpp",
|
||||
"gen.h": "c"
|
||||
"gen.h": "c",
|
||||
"string_ops.hpp": "c"
|
||||
},
|
||||
"C_Cpp.intelliSenseEngineFallback": "disabled",
|
||||
"mesonbuild.configureOnOpen": true,
|
||||
|
@ -1,6 +1,7 @@
|
||||
#define GEN_DEFINE_LIBRARY_CODE_CONSTANTS
|
||||
#define GEN_ENFORCE_STRONG_CODE_TYPES
|
||||
#define GEN_EXPOSE_BACKEND
|
||||
#define GEN_SUPPORT_CPP_MEMBER_FEATURES 1
|
||||
#include "../project/gen.cpp"
|
||||
|
||||
#include "helpers/push_ignores.inline.hpp"
|
||||
|
@ -1,6 +1,7 @@
|
||||
#define GEN_DEFINE_LIBRARY_CODE_CONSTANTS
|
||||
#define GEN_ENFORCE_STRONG_CODE_TYPES
|
||||
#define GEN_EXPOSE_BACKEND
|
||||
#define GEN_SUPPORT_CPP_MEMBER_FEATURES 0
|
||||
#include "gen.cpp"
|
||||
|
||||
#include "helpers/push_ignores.inline.hpp"
|
||||
|
@ -377,6 +377,7 @@ struct AST
|
||||
AccessSpec ParentAccess;
|
||||
s32 NumEntries;
|
||||
s32 VarConstructorInit; // Used by variables to know that initialization is using a constructor expression instead of an assignment expression.
|
||||
b32 EnumUnderlyingMacro; // Used by enums incase the user wants to wrap underlying type specification in a macro
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -174,7 +174,7 @@ struct AST_Enum
|
||||
CodeAttributes Attributes;
|
||||
char _PAD_SPEC_ [ sizeof(AST*) ];
|
||||
CodeType UnderlyingType;
|
||||
char _PAD_PARAMS_[ sizeof(AST*) ];
|
||||
Code UnderlyingTypeMacro;
|
||||
CodeBody Body;
|
||||
char _PAD_PROPERTIES_2_[ sizeof(AST*) ];
|
||||
};
|
||||
@ -186,7 +186,7 @@ struct AST_Enum
|
||||
StringCached Name;
|
||||
CodeT Type;
|
||||
ModuleFlag ModuleFlags;
|
||||
char _PAD_UNUSED_[ sizeof(u32) ];
|
||||
b32 EnumUnderlyingMacro;
|
||||
};
|
||||
static_assert( sizeof(AST_Enum) == sizeof(AST), "ERROR: AST_Enum is not the same size as AST");
|
||||
|
||||
|
@ -160,7 +160,7 @@ String CodeClass::to_string()
|
||||
|
||||
void CodeClass::to_string_def( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
append( result, "class " );
|
||||
@ -204,7 +204,7 @@ void CodeClass::to_string_def( String& result )
|
||||
|
||||
void CodeClass::to_string_fwd( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -314,7 +314,7 @@ String CodeEnum::to_string()
|
||||
|
||||
void CodeEnum::to_string_def( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes || ast->UnderlyingType )
|
||||
@ -330,6 +330,12 @@ void CodeEnum::to_string_def( String& result )
|
||||
, ast->UnderlyingType.to_string()
|
||||
, ast->Body.to_string()
|
||||
);
|
||||
else if ( ast->UnderlyingTypeMacro )
|
||||
append_fmt( result, "%S : %S\n{\n%S\n}"
|
||||
, ast->Name
|
||||
, ast->UnderlyingTypeMacro.to_string()
|
||||
, ast->Body.to_string()
|
||||
);
|
||||
|
||||
else append_fmt( result, "%S\n{\n%S\n}", ast->Name, ast->Body.to_string() );
|
||||
}
|
||||
@ -341,7 +347,7 @@ void CodeEnum::to_string_def( String& result )
|
||||
|
||||
void CodeEnum::to_string_fwd( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -360,7 +366,7 @@ void CodeEnum::to_string_fwd( String& result )
|
||||
|
||||
void CodeEnum::to_string_class_def( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes || ast->UnderlyingType )
|
||||
@ -392,7 +398,7 @@ void CodeEnum::to_string_class_def( String& result )
|
||||
|
||||
void CodeEnum::to_string_class_fwd( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
append( result, "enum class " );
|
||||
@ -474,7 +480,7 @@ String CodeFn::to_string()
|
||||
|
||||
void CodeFn::to_string_def( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export" );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -527,7 +533,7 @@ void CodeFn::to_string_def( String& result )
|
||||
|
||||
void CodeFn::to_string_fwd( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -597,10 +603,10 @@ String CodeModule::to_string()
|
||||
|
||||
void CodeModule::to_string( String& result )
|
||||
{
|
||||
if (((u32(ModuleFlag::Export) & u32(ast->ModuleFlags)) == u32(ModuleFlag::Export)))
|
||||
if (((u32(ModuleFlag_Export) & u32(ast->ModuleFlags)) == u32(ModuleFlag_Export)))
|
||||
append( result, "export ");
|
||||
|
||||
if (((u32(ModuleFlag::Import) & u32(ast->ModuleFlags)) == u32(ModuleFlag::Import)))
|
||||
if (((u32(ModuleFlag_Import) & u32(ast->ModuleFlags)) == u32(ModuleFlag_Import)))
|
||||
append( result, "import ");
|
||||
|
||||
append_fmt( result, "%S;\n", ast->Name );
|
||||
@ -615,7 +621,7 @@ String CodeNS::to_string()
|
||||
|
||||
void CodeNS::to_string( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
append_fmt( result, "namespace %S\n{\n%S\n}\n", ast->Name , ast->Body.to_string() );
|
||||
@ -641,7 +647,7 @@ String CodeOperator::to_string()
|
||||
|
||||
void CodeOperator::to_string_def( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -695,7 +701,7 @@ void CodeOperator::to_string_def( String& result )
|
||||
|
||||
void CodeOperator::to_string_fwd( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -985,7 +991,7 @@ String CodeStruct::to_string()
|
||||
|
||||
void CodeStruct::to_string_def( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
append( result, "struct " );
|
||||
@ -1029,7 +1035,7 @@ void CodeStruct::to_string_def( String& result )
|
||||
|
||||
void CodeStruct::to_string_fwd( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -1055,7 +1061,7 @@ String CodeTemplate::to_string()
|
||||
|
||||
void CodeTemplate::to_string( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Params )
|
||||
@ -1073,7 +1079,7 @@ String CodeTypedef::to_string()
|
||||
|
||||
void CodeTypedef::to_string( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
append( result, "typedef ");
|
||||
@ -1168,7 +1174,7 @@ String CodeUnion::to_string()
|
||||
|
||||
void CodeUnion::to_string( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
append( result, "union " );
|
||||
@ -1213,7 +1219,7 @@ String CodeUsing::to_string()
|
||||
|
||||
void CodeUsing::to_string( String& result )
|
||||
{
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes )
|
||||
@ -1302,7 +1308,7 @@ void CodeVar::to_string( String& result )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export ))
|
||||
if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag_Export ))
|
||||
append( result, "export " );
|
||||
|
||||
if ( ast->Attributes || ast->Specs )
|
||||
|
@ -78,7 +78,7 @@ void CodeClass::add_interface( CodeType type )
|
||||
if ( possible_slot.ast )
|
||||
{
|
||||
// Were adding an interface to parent type, so we need to make sure the parent type is public.
|
||||
ast->ParentAccess = AccessSpec::Public;
|
||||
ast->ParentAccess = AccessSpec_Public;
|
||||
// If your planning on adding a proper parent,
|
||||
// then you'll need to move this over to ParentType->next and update ParentAccess accordingly.
|
||||
}
|
||||
@ -151,7 +151,7 @@ void CodeStruct::add_interface( CodeType type )
|
||||
if ( possible_slot.ast )
|
||||
{
|
||||
// Were adding an interface to parent type, so we need to make sure the parent type is public.
|
||||
ast->ParentAccess = AccessSpec::Public;
|
||||
ast->ParentAccess = AccessSpec_Public;
|
||||
// If your planning on adding a proper parent,
|
||||
// then you'll need to move this over to ParentType->next and update ParentAccess accordingly.
|
||||
}
|
||||
|
@ -83,17 +83,17 @@ void define_constants()
|
||||
|
||||
t_empty = (CodeType) make_code();
|
||||
t_empty->Type = ECode::Typename;
|
||||
scast(String, t_empty->Name) = get_cached_string( txt("") );
|
||||
t_empty->Name = get_cached_string( txt("") );
|
||||
t_empty.set_global();
|
||||
|
||||
access_private = make_code();
|
||||
access_private->Type = ECode::Access_Private;
|
||||
scast(String, access_private->Name) = get_cached_string( txt("private:\n") );
|
||||
access_private->Name = get_cached_string( txt("private:\n") );
|
||||
access_private.set_global();
|
||||
|
||||
access_protected = make_code();
|
||||
access_protected->Type = ECode::Access_Protected;
|
||||
scast(String, access_protected->Name) = get_cached_string( txt("protected:\n") );
|
||||
access_protected->Name = get_cached_string( txt("protected:\n") );
|
||||
access_protected.set_global();
|
||||
|
||||
access_public = make_code();
|
||||
@ -226,6 +226,10 @@ void define_constants()
|
||||
# pragma pop_macro("local_persist")
|
||||
# pragma pop_macro("neverinline")
|
||||
|
||||
# pragma push_macro("enum_underlying")
|
||||
|
||||
# pragma pop_macro("enum_underlying")
|
||||
|
||||
# undef def_constant_spec
|
||||
}
|
||||
|
||||
|
@ -44,9 +44,9 @@ CodeComment def_comment ( StrC content );
|
||||
|
||||
CodeClass def_class( StrC name
|
||||
, Code body = NoCode
|
||||
, CodeType parent = NoCode, AccessSpec access = AccessSpec::Default
|
||||
, CodeType parent = NoCode, AccessSpec access = AccessSpec_Default
|
||||
, CodeAttributes attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None
|
||||
, ModuleFlag mflags = ModuleFlag_None
|
||||
, CodeType* interfaces = nullptr, s32 num_interfaces = 0 );
|
||||
|
||||
CodeConstructor def_constructor( CodeParam params = NoCode, Code initializer_list = NoCode, Code body = NoCode );
|
||||
@ -57,8 +57,8 @@ CodeDestructor def_destructor( Code body = NoCode, CodeSpecifiers specifiers = N
|
||||
|
||||
CodeEnum def_enum( StrC name
|
||||
, Code body = NoCode, CodeType type = NoCode
|
||||
, EnumT specifier = EnumRegular, CodeAttributes attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
, EnumT specifier = EnumDecl_Regular, CodeAttributes attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeExec def_execution ( StrC content );
|
||||
CodeExtern def_extern_link( StrC name, Code body );
|
||||
@ -67,16 +67,16 @@ CodeFriend def_friend ( Code symbol );
|
||||
CodeFn def_function( StrC name
|
||||
, CodeParam params = NoCode, CodeType ret_type = NoCode, Code body = NoCode
|
||||
, CodeSpecifiers specifiers = NoCode, CodeAttributes attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeInclude def_include ( StrC content, bool foreign = false );
|
||||
CodeModule def_module ( StrC name, ModuleFlag mflags = ModuleFlag::None );
|
||||
CodeNS def_namespace( StrC name, Code body, ModuleFlag mflags = ModuleFlag::None );
|
||||
CodeModule def_module ( StrC name, ModuleFlag mflags = ModuleFlag_None );
|
||||
CodeNS def_namespace( StrC name, Code body, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeOperator def_operator( OperatorT op, StrC nspace
|
||||
, CodeParam params = NoCode, CodeType ret_type = NoCode, Code body = NoCode
|
||||
, CodeSpecifiers specifiers = NoCode, CodeAttributes attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeOpCast def_operator_cast( CodeType type, Code body = NoCode, CodeSpecifiers specs = NoCode );
|
||||
|
||||
@ -89,27 +89,27 @@ CodeSpecifiers def_specifier( SpecifierT specifier );
|
||||
|
||||
CodeStruct def_struct( StrC name
|
||||
, Code body = NoCode
|
||||
, CodeType parent = NoCode, AccessSpec access = AccessSpec::Default
|
||||
, CodeType parent = NoCode, AccessSpec access = AccessSpec_Default
|
||||
, CodeAttributes attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None
|
||||
, ModuleFlag mflags = ModuleFlag_None
|
||||
, CodeType* interfaces = nullptr, s32 num_interfaces = 0 );
|
||||
|
||||
CodeTemplate def_template( CodeParam params, Code definition, ModuleFlag mflags = ModuleFlag::None );
|
||||
CodeTemplate def_template( CodeParam params, Code definition, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeType def_type ( StrC name, Code arrayexpr = NoCode, CodeSpecifiers specifiers = NoCode, CodeAttributes attributes = NoCode );
|
||||
CodeTypedef def_typedef( StrC name, Code type, CodeAttributes attributes = NoCode, ModuleFlag mflags = ModuleFlag::None );
|
||||
CodeTypedef def_typedef( StrC name, Code type, CodeAttributes attributes = NoCode, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeUnion def_union( StrC name, Code body, CodeAttributes attributes = NoCode, ModuleFlag mflags = ModuleFlag::None );
|
||||
CodeUnion def_union( StrC name, Code body, CodeAttributes attributes = NoCode, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeUsing def_using( StrC name, CodeType type = NoCode
|
||||
, CodeAttributes attributess = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
CodeUsing def_using_namespace( StrC name );
|
||||
|
||||
CodeVar def_variable( CodeType type, StrC name, Code value = NoCode
|
||||
, CodeSpecifiers specifiers = NoCode, CodeAttributes attributes = NoCode
|
||||
, ModuleFlag mflags = ModuleFlag::None );
|
||||
, ModuleFlag mflags = ModuleFlag_None );
|
||||
|
||||
// Constructs an empty body. Use AST::validate_body() to check if the body is was has valid entries.
|
||||
CodeBody def_body( CodeT type );
|
||||
|
@ -719,14 +719,14 @@ CodeEnum def_enum( StrC name
|
||||
return CodeInvalid;
|
||||
}
|
||||
|
||||
result->Type = specifier == EnumClass ?
|
||||
result->Type = specifier == EnumDecl_Class ?
|
||||
Enum_Class : Enum;
|
||||
|
||||
result->Body = body;
|
||||
}
|
||||
else
|
||||
{
|
||||
result->Type = specifier == EnumClass ?
|
||||
result->Type = specifier == EnumDecl_Class ?
|
||||
Enum_Class_Fwd : Enum_Fwd;
|
||||
}
|
||||
|
||||
@ -1145,16 +1145,16 @@ CodePreprocessCond def_preprocess_cond( EPreprocessCond type, StrC expr )
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case EPreprocessCond::If:
|
||||
case PreprocessCond_If:
|
||||
result->Type = Preprocess_If;
|
||||
break;
|
||||
case EPreprocessCond::IfDef:
|
||||
case PreprocessCond_IfDef:
|
||||
result->Type = Preprocess_IfDef;
|
||||
break;
|
||||
case EPreprocessCond::IfNotDef:
|
||||
case PreprocessCond_IfNotDef:
|
||||
result->Type = Preprocess_IfNotDef;
|
||||
break;
|
||||
case EPreprocessCond::ElIf:
|
||||
case PreprocessCond_ElIf:
|
||||
result->Type = Preprocess_ElIf;
|
||||
break;
|
||||
}
|
||||
|
@ -682,17 +682,17 @@ Code parse_class_struct( TokType which, bool inplace_def = false )
|
||||
|
||||
Token name { nullptr, 0, TokType::Invalid };
|
||||
|
||||
AccessSpec access = AccessSpec::Default;
|
||||
AccessSpec access = AccessSpec_Default;
|
||||
CodeType parent = { nullptr };
|
||||
CodeBody body = { nullptr };
|
||||
CodeAttributes attributes = { nullptr };
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
|
||||
CodeClass result = CodeInvalid;
|
||||
|
||||
if ( check(TokType::Module_Export) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <ModuleFlags>
|
||||
@ -2534,7 +2534,7 @@ Code parse_operator_function_or_variable( bool expects_function, CodeAttributes
|
||||
if ( found_operator )
|
||||
{
|
||||
// Dealing with an operator overload
|
||||
result = parse_operator_after_ret_type( ModuleFlag::None, attributes, specifiers, type );
|
||||
result = parse_operator_after_ret_type( ModuleFlag_None, attributes, specifiers, type );
|
||||
// <Attributes> <Specifiers> <ReturnType> operator ...
|
||||
}
|
||||
else
|
||||
@ -2552,7 +2552,7 @@ Code parse_operator_function_or_variable( bool expects_function, CodeAttributes
|
||||
if ( detected_capture && ! detected_comma )
|
||||
{
|
||||
// Dealing with a function
|
||||
result = parse_function_after_name( ModuleFlag::None, attributes, specifiers, type, name );
|
||||
result = parse_function_after_name( ModuleFlag_None, attributes, specifiers, type, name );
|
||||
// <Attributes> <Specifiers> <ReturnType> <Name> ( ...
|
||||
}
|
||||
else
|
||||
@ -2565,7 +2565,7 @@ Code parse_operator_function_or_variable( bool expects_function, CodeAttributes
|
||||
}
|
||||
|
||||
// Dealing with a variable
|
||||
result = parse_variable_after_name( ModuleFlag::None, attributes, specifiers, type, name );
|
||||
result = parse_variable_after_name( ModuleFlag_None, attributes, specifiers, type, name );
|
||||
// <Attributes> <Specifiers> <ValueType> <Name> ...
|
||||
}
|
||||
}
|
||||
@ -3319,7 +3319,7 @@ CodeVar parse_variable_declaration_list()
|
||||
eat( TokType::Identifier );
|
||||
// , <Specifiers> <Name>
|
||||
|
||||
CodeVar var = parse_variable_after_name( ModuleFlag::None, NoCode, specifiers, NoCode, name );
|
||||
CodeVar var = parse_variable_after_name( ModuleFlag_None, NoCode, specifiers, NoCode, name );
|
||||
// , <Specifiers> <Name> ...
|
||||
|
||||
if ( ! result )
|
||||
@ -3589,6 +3589,8 @@ CodeEnum parse_enum( bool inplace_def )
|
||||
}
|
||||
// enum <class> <Attributes> <Name>
|
||||
|
||||
b32 use_macro_underlying = false;
|
||||
Code underlying_macro = { nullptr };
|
||||
if ( currtok.Type == TokType::Assign_Classifer )
|
||||
{
|
||||
eat( TokType::Assign_Classifer );
|
||||
@ -3603,6 +3605,17 @@ CodeEnum parse_enum( bool inplace_def )
|
||||
}
|
||||
// enum <class> <Attributes> <Name> : <UnderlyingType>
|
||||
}
|
||||
else if ( currtok.Type == TokType::Preprocess_Define )
|
||||
{
|
||||
// We'll support the enum_underlying macro
|
||||
StrC sig = txt("enum_underlying");
|
||||
|
||||
if (currtok.Length >= sig.Len && str_compare(currtok.Text, sig.Ptr, sig.Len) == 0 )
|
||||
{
|
||||
use_macro_underlying = true;
|
||||
underlying_macro = parse_simple_preprocess( ETokType::Preprocess_Macro);
|
||||
}
|
||||
}
|
||||
|
||||
CodeBody body = { nullptr };
|
||||
|
||||
@ -3770,11 +3783,18 @@ CodeEnum parse_enum( bool inplace_def )
|
||||
result->Attributes = attributes;
|
||||
|
||||
if ( type )
|
||||
{
|
||||
result->EnumUnderlyingMacro = use_macro_underlying;
|
||||
if ( use_macro_underlying )
|
||||
result->UnderlyingTypeMacro = underlying_macro;
|
||||
else
|
||||
result->UnderlyingType = type;
|
||||
}
|
||||
|
||||
if ( inline_cmt )
|
||||
result->InlineCmt = inline_cmt;
|
||||
|
||||
|
||||
Context.pop();
|
||||
return result;
|
||||
}
|
||||
@ -3860,7 +3880,7 @@ CodeFriend parse_friend()
|
||||
Context.Scope->Name = name;
|
||||
// friend <ReturnType> <Name>
|
||||
|
||||
function = parse_function_after_name( ModuleFlag::None, NoCode, NoCode, type, name );
|
||||
function = parse_function_after_name( ModuleFlag_None, NoCode, NoCode, type, name );
|
||||
|
||||
// Parameter list
|
||||
// CodeParam params = parse_params();
|
||||
@ -3914,11 +3934,11 @@ CodeFn parse_function()
|
||||
|
||||
CodeAttributes attributes = { nullptr };
|
||||
CodeSpecifiers specifiers = { nullptr };
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
|
||||
if ( check(TokType::Module_Export) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <export>
|
||||
@ -4024,14 +4044,14 @@ CodeOperator parse_operator()
|
||||
|
||||
CodeAttributes attributes = { nullptr };
|
||||
CodeSpecifiers specifiers = { nullptr };
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
|
||||
SpecifierT specs_found[16] { ESpecifier::NumSpecifiers };
|
||||
s32 NumSpecifiers = 0;
|
||||
|
||||
if ( check(TokType::Module_Export) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <export>
|
||||
@ -4212,11 +4232,11 @@ CodeTemplate parse_template()
|
||||
|
||||
push_scope();
|
||||
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
|
||||
if ( check( TokType::Module_Export ) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <export> template
|
||||
@ -4855,11 +4875,11 @@ CodeTypedef parse_typedef()
|
||||
Code array_expr = { nullptr };
|
||||
Code type = { nullptr };
|
||||
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
|
||||
if ( check(TokType::Module_Export) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <ModuleFlags>
|
||||
@ -5050,11 +5070,11 @@ CodeUnion parse_union( bool inplace_def )
|
||||
{
|
||||
push_scope();
|
||||
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
|
||||
if ( check(TokType::Module_Export) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <ModuleFlags>
|
||||
@ -5199,12 +5219,12 @@ CodeUsing parse_using()
|
||||
|
||||
bool is_namespace = false;
|
||||
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
CodeAttributes attributes = { nullptr };
|
||||
|
||||
if ( check(TokType::Module_Export) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <ModuleFlags>
|
||||
@ -5293,13 +5313,13 @@ CodeVar parse_variable()
|
||||
SpecifierT specs_found[16] { ESpecifier::NumSpecifiers };
|
||||
s32 NumSpecifiers = 0;
|
||||
|
||||
ModuleFlag mflags = ModuleFlag::None;
|
||||
ModuleFlag mflags = ModuleFlag_None;
|
||||
CodeAttributes attributes = { nullptr };
|
||||
CodeSpecifiers specifiers = { nullptr };
|
||||
|
||||
if ( check(TokType::Module_Export) )
|
||||
{
|
||||
mflags = ModuleFlag::Export;
|
||||
mflags = ModuleFlag_Export;
|
||||
eat( TokType::Module_Export );
|
||||
}
|
||||
// <ModuleFlags>
|
||||
|
@ -13,63 +13,71 @@ using LogFailType = ssize(*)(char const*, ...);
|
||||
#define log_failure GEN_FATAL
|
||||
#endif
|
||||
|
||||
enum class AccessSpec : u32
|
||||
enum AccessSpec enum_underlying(u32)
|
||||
{
|
||||
Default,
|
||||
Private,
|
||||
Protected,
|
||||
Public,
|
||||
AccessSpec_Default,
|
||||
AccessSpec_Private,
|
||||
AccessSpec_Protected,
|
||||
AccessSpec_Public,
|
||||
|
||||
Num_AccessSpec,
|
||||
Invalid,
|
||||
AccessSpec_Num_AccessSpec,
|
||||
AccessSpec_Invalid,
|
||||
|
||||
AccessSpec_SizeDef = GEN_U32_MAX,
|
||||
};
|
||||
static_assert( size_of(AccessSpec) == size_of(u32));
|
||||
|
||||
inline
|
||||
char const* to_str( AccessSpec type )
|
||||
{
|
||||
local_persist
|
||||
char const* lookup[ (u32)AccessSpec::Num_AccessSpec ] = {
|
||||
char const* lookup[ (u32)AccessSpec_Num_AccessSpec ] = {
|
||||
"",
|
||||
"private",
|
||||
"protected",
|
||||
"public",
|
||||
};
|
||||
|
||||
if ( type > AccessSpec::Public )
|
||||
if ( type > AccessSpec_Public )
|
||||
return "Invalid";
|
||||
|
||||
return lookup[ (u32)type ];
|
||||
}
|
||||
|
||||
|
||||
enum CodeFlag : u32
|
||||
enum CodeFlag enum_underlying(u32)
|
||||
{
|
||||
None = 0,
|
||||
FunctionType = bit(0),
|
||||
ParamPack = bit(1),
|
||||
Module_Export = bit(2),
|
||||
Module_Import = bit(3),
|
||||
CodeFlag_None = 0,
|
||||
CodeFlag_FunctionType = bit(0),
|
||||
CodeFlag_ParamPack = bit(1),
|
||||
CodeFlag_Module_Export = bit(2),
|
||||
CodeFlag_Module_Import = bit(3),
|
||||
|
||||
CodeFlag_SizeDef = GEN_U32_MAX,
|
||||
};
|
||||
static_assert( size_of(CodeFlag) == size_of(u32));
|
||||
|
||||
// Used to indicate if enum definitoin is an enum class or regular enum.
|
||||
enum class EnumT : u8
|
||||
enum EnumDecl enum_underlying(u8)
|
||||
{
|
||||
Regular,
|
||||
Class
|
||||
EnumDecl_Regular,
|
||||
EnumDecl_Class,
|
||||
|
||||
EnumT_SizeDef = GEN_U8_MAX,
|
||||
};
|
||||
typedef u8 EnumT;
|
||||
|
||||
constexpr EnumT EnumClass = EnumT::Class;
|
||||
constexpr EnumT EnumRegular = EnumT::Regular;
|
||||
|
||||
enum class ModuleFlag : u32
|
||||
enum ModuleFlag enum_underlying(u32)
|
||||
{
|
||||
None = 0,
|
||||
Export = bit(0),
|
||||
Import = bit(1),
|
||||
ModuleFlag_None = 0,
|
||||
ModuleFlag_Export = bit(0),
|
||||
ModuleFlag_Import = bit(1),
|
||||
|
||||
Num_ModuleFlags,
|
||||
Invalid,
|
||||
ModuleFlag_Invalid,
|
||||
|
||||
ModuleFlag_SizeDef = GEN_U32_MAX,
|
||||
};
|
||||
static_assert( size_of(ModuleFlag) == size_of(u32));
|
||||
|
||||
inline
|
||||
StrC to_str( ModuleFlag flag )
|
||||
@ -81,7 +89,7 @@ StrC to_str( ModuleFlag flag )
|
||||
{ sizeof("import"), "import" },
|
||||
};
|
||||
|
||||
if ( flag > ModuleFlag::Import )
|
||||
if ( flag > ModuleFlag_Import )
|
||||
return { sizeof("invalid"), "invalid" };
|
||||
|
||||
return lookup[ (u32)flag ];
|
||||
@ -93,15 +101,13 @@ ModuleFlag operator|( ModuleFlag A, ModuleFlag B)
|
||||
return (ModuleFlag)( (u32)A | (u32)B );
|
||||
}
|
||||
|
||||
enum class EPreprocessCond : u32
|
||||
enum EPreprocessCond enum_underlying(u32)
|
||||
{
|
||||
If,
|
||||
IfDef,
|
||||
IfNotDef,
|
||||
ElIf
|
||||
};
|
||||
PreprocessCond_If,
|
||||
PreprocessCond_IfDef,
|
||||
PreprocessCond_IfNotDef,
|
||||
PreprocessCond_ElIf,
|
||||
|
||||
constexpr EPreprocessCond PreprocessCond_If = EPreprocessCond::If;
|
||||
constexpr EPreprocessCond PreprocessCond_IfDef = EPreprocessCond::IfDef;
|
||||
constexpr EPreprocessCond PreprocessCond_IfNotDef = EPreprocessCond::IfNotDef;
|
||||
constexpr EPreprocessCond PreprocessCond_ElIf = EPreprocessCond::ElIf;
|
||||
EPreprocessCond_SizeDef = GEN_U32_MAX,
|
||||
};
|
||||
static_assert( size_of(EPreprocessCond) == size_of(u32));
|
||||
|
@ -205,4 +205,14 @@
|
||||
# define foreach(Type, entry_id, iterable) for ( Type entry_id : iterable )
|
||||
#endif
|
||||
|
||||
#if GENC_COMPILERC
|
||||
# if __STDC_VERSION__ >= 202311L
|
||||
# define enum_underlying(type) : type
|
||||
# else
|
||||
# define enum_underlying(type)
|
||||
# endif
|
||||
#else
|
||||
# define enum_underlying(type) : type
|
||||
#endif
|
||||
|
||||
#pragma endregion Macros
|
||||
|
@ -76,13 +76,18 @@
|
||||
/* Platform compiler */
|
||||
|
||||
#if defined( _MSC_VER )
|
||||
# define GEN_COMPILER_CLANG 0
|
||||
# define GEN_COMPILER_MSVC 1
|
||||
# define GEN_COMPILER_GCC 0
|
||||
#elif defined( __GNUC__ )
|
||||
# define GEN_COMPILER_CLANG 0
|
||||
# define GEN_COMPILER_MSVC 0
|
||||
# define GEN_COMPILER_GCC 1
|
||||
#elif defined( __clang__ )
|
||||
# define GEN_COMPILER_CLANG 1
|
||||
#elif defined( __MINGW32__ )
|
||||
# define GEN_COMPILER_MINGW 1
|
||||
# define GEN_COMPILER_MSVC 0
|
||||
# define GEN_COMPILER_GCC 1
|
||||
#else
|
||||
# error Unknown compiler
|
||||
#endif
|
||||
|
||||
@ -122,11 +127,23 @@
|
||||
|
||||
#pragma endregion Mandatory Includes
|
||||
|
||||
#if GEN_DONT_USE_NAMESPACE || GEN_COMPILER_C
|
||||
#if GEN_DONT_USE_NAMESPACE
|
||||
# if GEN_COMPILER_C
|
||||
# define GEN_NS_ENUM_BEGIN
|
||||
# define GEN_NS_ENUM_END
|
||||
# define GEN_NS
|
||||
# define GEN_NS_BEGIN
|
||||
# define GEN_NS_END
|
||||
# else
|
||||
# define GEN_NS_ENUM_BEGIN namespace gen_internal_enums {
|
||||
# define GEN_NS_ENUM_END }
|
||||
# define GEN_NS ::
|
||||
# define GEN_NS_BEGIN
|
||||
# define GEN_NS_END
|
||||
# endif
|
||||
#else
|
||||
# define GEN_NS_ENUM_BEGIN namespace gen_internal_enums {
|
||||
# define GEN_NS_ENUM_END }
|
||||
# define GEN_NS gen::
|
||||
# define GEN_NS_BEGIN namespace gen {
|
||||
# define GEN_NS_END }
|
||||
|
@ -85,7 +85,7 @@ struct String
|
||||
forceinline operator bool() { return Data != nullptr; }
|
||||
forceinline operator char*() { return Data; }
|
||||
forceinline operator char const*() const { return Data; }
|
||||
forceinline operator StrC() const { return { length(* this), Data }; }
|
||||
forceinline operator StrC() const { return { GEN_NS length(* this), Data }; }
|
||||
|
||||
String const& operator=(String const& other) const {
|
||||
if (this == &other)
|
||||
@ -101,7 +101,7 @@ struct String
|
||||
forceinline char const& operator[](ssize index) const { return Data[index]; }
|
||||
|
||||
forceinline char* begin() const { return Data; }
|
||||
forceinline char* end() const { return Data + length(* this); }
|
||||
forceinline char* end() const { return Data + GEN_NS length(* this); }
|
||||
|
||||
#if GEN_SUPPORT_CPP_MEMBER_FEATURES
|
||||
#pragma region Member Mapping
|
||||
|
Loading…
Reference in New Issue
Block a user