mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-30 22:40:54 -07:00 
			
		
		
		
	working to towards https://github.com/Ed94/gencpp/issues/56
This commit is contained in:
		| @@ -40,11 +40,11 @@ CodeBody gen_array_base() | ||||
| 	)); | ||||
| }; | ||||
|  | ||||
| CodeBody gen_array( StrC type, StrC array_name ) | ||||
| CodeBody gen_array( Str type, Str array_name ) | ||||
| { | ||||
| 	String array_type = String::fmt_buf( GlobalAllocator, "%.*s", array_name.Len, array_name.Ptr ); | ||||
| 	String fn         = String::fmt_buf( GlobalAllocator, "%.*s", array_name.Len, array_name.Ptr ); | ||||
| 	// str_to_lower(fn.Data); | ||||
| 	StrBuilder array_type = StrBuilder::fmt_buf( GlobalAllocator, "%.*s", array_name.Len, array_name.Ptr ); | ||||
| 	StrBuilder fn         = StrBuilder::fmt_buf( GlobalAllocator, "%.*s", array_name.Len, array_name.Ptr ); | ||||
| 	// c_str_to_lower(fn.Data); | ||||
|  | ||||
| #pragma push_macro( "GEN_ASSERT" ) | ||||
| #pragma push_macro( "rcast" ) | ||||
| @@ -56,7 +56,7 @@ CodeBody gen_array( StrC type, StrC array_name ) | ||||
| #undef cast | ||||
| #undef typeof | ||||
| #undef forceinline | ||||
| 	CodeBody result = parse_global_body( token_fmt( "array_type", (StrC)array_type, "fn", (StrC)fn, "type", (StrC)type | ||||
| 	CodeBody result = parse_global_body( token_fmt( "array_type", (Str)array_type, "fn", (Str)fn, "type", (Str)type | ||||
| 	, stringize( | ||||
| 		typedef <type>* <array_type>; | ||||
|  | ||||
| @@ -375,9 +375,9 @@ CodeBody gen_array( StrC type, StrC array_name ) | ||||
| #pragma pop_macro( "forceinline" ) | ||||
|  | ||||
| 	++ Array_DefinitionCounter; | ||||
| 	StrC slot_str = String::fmt_buf(GlobalAllocator, "%d", Array_DefinitionCounter).to_strc(); | ||||
| 	Str slot_str = StrBuilder::fmt_buf(GlobalAllocator, "%d", Array_DefinitionCounter).to_str(); | ||||
|  | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type", type, "array_type", (StrC)array_type, "slot", (StrC)slot_str, | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type", type, "array_type", (Str)array_type, "slot", (Str)slot_str, | ||||
| R"(#define GENERIC_SLOT_<slot>__array_init         <type>,        <array_type>_init | ||||
| #define GENERIC_SLOT_<slot>__array_init_reserve    <type>,        <array_type>_init_reserve | ||||
| #define GENERIC_SLOT_<slot>__array_append          <array_type>,  <array_type>_append | ||||
| @@ -399,13 +399,13 @@ R"(#define GENERIC_SLOT_<slot>__array_init         <type>,        <array_type>_i | ||||
| 	)); | ||||
|  | ||||
| 	return def_global_body( args( | ||||
| 		def_pragma( string_to_strc( string_fmt_buf( GlobalAllocator, "region %S", array_type ))), | ||||
| 		def_pragma( strbuilder_to_str( strbuilder_fmt_buf( GlobalAllocator, "region %SB", array_type ))), | ||||
| 		fmt_newline, | ||||
| 		generic_interface_slot, | ||||
| 		fmt_newline, | ||||
| 		result, | ||||
| 		fmt_newline, | ||||
| 		def_pragma( string_to_strc(string_fmt_buf( GlobalAllocator, "endregion %S", array_type ))), | ||||
| 		def_pragma( strbuilder_to_str(strbuilder_fmt_buf( GlobalAllocator, "endregion %SB", array_type ))), | ||||
| 		fmt_newline | ||||
| 	)); | ||||
| }; | ||||
|   | ||||
| @@ -27,24 +27,24 @@ R"(#define HashTable(_type) struct _type | ||||
| 	return def_global_body(args(struct_def, define_type, define_critical_load_scale)); | ||||
| } | ||||
|  | ||||
| CodeBody gen_hashtable( StrC type, StrC hashtable_name ) | ||||
| CodeBody gen_hashtable( Str type, Str hashtable_name ) | ||||
| { | ||||
|  | ||||
| 	String tbl_type = {(char*) hashtable_name.duplicate(GlobalAllocator).Ptr}; | ||||
| 	String fn       = tbl_type.duplicate(GlobalAllocator); | ||||
| 	// str_to_lower(fn.Data); | ||||
| 	StrBuilder tbl_type = {(char*) hashtable_name.duplicate(GlobalAllocator).Ptr}; | ||||
| 	StrBuilder fn       = tbl_type.duplicate(GlobalAllocator); | ||||
| 	// c_str_to_lower(fn.Data); | ||||
|  | ||||
| 	String name_lower = String::make( GlobalAllocator, hashtable_name ); | ||||
| 	// str_to_lower( name_lower.Data ); | ||||
| 	StrBuilder name_lower = StrBuilder::make( GlobalAllocator, hashtable_name ); | ||||
| 	// c_str_to_lower( name_lower.Data ); | ||||
|  | ||||
| 	String hashtable_entry   = String::fmt_buf( GlobalAllocator, "HTE_%.*s",     hashtable_name.Len, hashtable_name.Ptr ); | ||||
| 	String entry_array_name  = String::fmt_buf( GlobalAllocator, "Arr_HTE_%.*s", hashtable_name.Len, hashtable_name.Ptr ); | ||||
| 	String entry_array_fn_ns = String::fmt_buf( GlobalAllocator, "arr_hte_%.*s", name_lower.length(), name_lower.Data ); | ||||
| 	StrBuilder hashtable_entry   = StrBuilder::fmt_buf( GlobalAllocator, "HTE_%.*s",     hashtable_name.Len, hashtable_name.Ptr ); | ||||
| 	StrBuilder entry_array_name  = StrBuilder::fmt_buf( GlobalAllocator, "Arr_HTE_%.*s", hashtable_name.Len, hashtable_name.Ptr ); | ||||
| 	StrBuilder entry_array_fn_ns = StrBuilder::fmt_buf( GlobalAllocator, "arr_hte_%.*s", name_lower.length(), name_lower.Data ); | ||||
|  | ||||
| 	CodeBody hashtable_types = parse_global_body( token_fmt( | ||||
| 		"type",        (StrC) type, | ||||
| 		"tbl_name",    (StrC) hashtable_name, | ||||
| 		"tbl_type",    (StrC) tbl_type, | ||||
| 		"type",        (Str) type, | ||||
| 		"tbl_name",    (Str) hashtable_name, | ||||
| 		"tbl_type",    (Str) tbl_type, | ||||
| 	stringize( | ||||
| 		typedef struct HashTable_<type> <tbl_type>; | ||||
| 		typedef struct HTE_<tbl_name> HTE_<tbl_name>; | ||||
| @@ -74,13 +74,13 @@ CodeBody gen_hashtable( StrC type, StrC hashtable_name ) | ||||
| #undef typeof | ||||
| #undef forceinline | ||||
| 	CodeBody hashtable_def = parse_global_body( token_fmt( | ||||
| 		"type",           (StrC) type, | ||||
| 		"tbl_name",       (StrC) hashtable_name, | ||||
| 		"tbl_type",       (StrC) tbl_type, | ||||
| 		"fn",             (StrC) fn, | ||||
| 		"entry_type",     (StrC) hashtable_entry, | ||||
| 		"array_entry",    (StrC) entry_array_name, | ||||
| 		"fn_array",       (StrC) entry_array_fn_ns, | ||||
| 		"type",           (Str) type, | ||||
| 		"tbl_name",       (Str) hashtable_name, | ||||
| 		"tbl_type",       (Str) tbl_type, | ||||
| 		"fn",             (Str) fn, | ||||
| 		"entry_type",     (Str) hashtable_entry, | ||||
| 		"array_entry",    (Str) entry_array_name, | ||||
| 		"fn_array",       (Str) entry_array_fn_ns, | ||||
| 	stringize( | ||||
| 		struct HashTable_<type> { | ||||
| 			Array_ssize   Hashes; | ||||
| @@ -372,9 +372,9 @@ CodeBody gen_hashtable( StrC type, StrC hashtable_name ) | ||||
| #pragma pop_macro( "forceinline" ) | ||||
|  | ||||
| 	++ HashTable_DefinitionCounter; | ||||
| 	StrC slot_str = String::fmt_buf(GlobalAllocator, "%d", HashTable_DefinitionCounter).to_strc(); | ||||
| 	Str slot_str = StrBuilder::fmt_buf(GlobalAllocator, "%d", HashTable_DefinitionCounter).to_str(); | ||||
|  | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type", type, "tbl_type", (StrC)tbl_type, "slot", (StrC)slot_str, | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type", type, "tbl_type", (Str)tbl_type, "slot", (Str)slot_str, | ||||
| R"(#define GENERIC_SLOT_<slot>__hashtable_init          <type>,      <tbl_type>_init | ||||
| #define GENERIC_SLOT_<slot>__hashtable_init_reserve     <type>,      <tbl_type>_init_reserve | ||||
| #define GENERIC_SLOT_<slot>__hashtable_clear            <tbl_type>,  <tbl_type>_clear | ||||
| @@ -395,12 +395,12 @@ R"(#define GENERIC_SLOT_<slot>__hashtable_init          <type>,      <tbl_type>_ | ||||
| )" | ||||
| 	)); | ||||
|  | ||||
| 	char const* cmt_str = str_fmt_buf( "Name: %.*s Type: %.*s" | ||||
| 	char const* cmt_str = c_str_fmt_buf( "Name: %.*s Type: %.*s" | ||||
| 		, tbl_type.length(), tbl_type.Data | ||||
| 		, type.Len, type.Ptr ); | ||||
|  | ||||
| 	return def_global_body(args( | ||||
| 		def_pragma( string_to_strc( string_fmt_buf( GlobalAllocator, "region %S", tbl_type ))), | ||||
| 		def_pragma( strbuilder_to_str( strbuilder_fmt_buf( GlobalAllocator, "region %SB", tbl_type ))), | ||||
| 		fmt_newline, | ||||
| 		generic_interface_slot, | ||||
| 		fmt_newline, | ||||
| @@ -409,7 +409,7 @@ R"(#define GENERIC_SLOT_<slot>__hashtable_init          <type>,      <tbl_type>_ | ||||
| 		entry_array, | ||||
| 		hashtable_def, | ||||
| 		fmt_newline, | ||||
| 		def_pragma( string_to_strc( string_fmt_buf( GlobalAllocator, "endregion %S", tbl_type ))), | ||||
| 		def_pragma( strbuilder_to_str( strbuilder_fmt_buf( GlobalAllocator, "endregion %SB", tbl_type ))), | ||||
| 		fmt_newline | ||||
| 	)); | ||||
| } | ||||
|   | ||||
| @@ -3,9 +3,9 @@ | ||||
| //   ____                       _        ______                _   _                ____                  _                 __ _
 | ||||
| //  / ___}                     (_)      |  ____}              | | (_)              / __ \                | |               | |(_)
 | ||||
| // | | ___  ___ _ __   ___ _ __ _  ___  | |__ _   _ _ __   ___| |_ _  ___  _ __   | |  | |_   _____ _ __ | | ___   __ _  __| | _ _ __   __ _
 | ||||
| // | |{__ |/ _ \ '_ \ / _ \ '__} |/ __| |  __} | | | '_ \ / __} __} |/ _ \| '_ \  | |  | \ \ / / _ \ '_ \| |/ _ \ / _` |/ _` || | '_ \ / _` |
 | ||||
| // | |__j |  __/ | | |  __/ |  | | (__  | |  | |_| | | | | (__| l_| | (_) | | | | | l__| |\ V /  __/ | | | | (_) | (_| | (_| || | | | | (_| |
 | ||||
| //  \____/ \___}_l l_l\___}_l  l_l\___| l_l   \__,_l_l l_l\___}\__}_l\___/l_l l_l  \____/  \_/ \___}_l l_l_l\___/ \__,_l\__,_l|_|_| |_|\__, |
 | ||||
| // | |{__ |/ _ \ '_ \ / _ \ '__} |/ __| |  __} | | | '_ \ / __} __} |/ _ \| '_ \  | |  | \ \ / / _ \ '_ }| |/ _ \ / _` |/ _` || | '_ \ / _` |
 | ||||
| // | |__j |  __/ | | |  __/ |  | | (__  | |  | |_| | | | | (__| l_| | (_) | | | | | l__| |\ V /  __/ |   | | (_) | (_| | (_| || | | | | (_| |
 | ||||
| //  \____/ \___}_l l_l\___}_l  l_l\___| l_l   \__,_l_l l_l\___}\__}_l\___/l_l l_l  \____/  \_/ \___}_l   l_l\___/ \__,_l\__,_l|_|_| |_|\__, |
 | ||||
| // This implemnents macros for utilizing "The Naive Extendible _Generic Macro" explained in:                                            __| |
 | ||||
| // https://github.com/JacksonAllan/CC/blob/main/articles/Better_C_Generics_Part_1_The_Extendible_Generic.md                            {___/
 | ||||
| // Since gencpp is used to generate the c-library, it was choosen over the more novel implementations to keep the macros as easy to understand and unobfuscated as possible.
 | ||||
| @@ -30,7 +30,7 @@ | ||||
| // Where GEN_GENERIC_SEL_ENTRY_COMMA_DELIMITER is specifically looking for that <comma> ,
 | ||||
| #define GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( slot_exp ) GEN_GENERIC_SEL_ENTRY_COMMA_DELIMITER( slot_exp, GEN_GENERIC_SEL_ENTRY_TYPE( slot_exp, ): GEN_GENERIC_SEL_ENTRY_FUNCTION( slot_exp, ) GEN_COMMA_OPERATOR, , ) | ||||
| //                                                          ^ Selects the comma                              ^ is the type                             ^ is the function                             ^ Insert a comma
 | ||||
| // The slot won't exist if that comma is not found.                                                                                                                                                  |
 | ||||
| // The slot won't exist if that comma is not found.
 | ||||
| 
 | ||||
| // For the occastion where an expression didn't resolve to a selection option the "default: <value>" will be set to:
 | ||||
| typedef struct GENCPP_NO_RESOLVED_GENERIC_SELECTION GENCPP_NO_RESOLVED_GENERIC_SELECTION; | ||||
| @@ -43,12 +43,12 @@ GENCPP_NO_RESOLVED_GENERIC_SELECTION const gen_generic_selection_fail = {0}; | ||||
| 
 | ||||
| // Below are generated on demand for an overlaod depdendent on a type:
 | ||||
| // ----------------------------------------------------------------------------------------------------------------------------------
 | ||||
| #define GEN_FUNCTION_GENERIC_EXAMPLE( selector_arg ) _Generic(       \ | ||||
| (selector_arg), /* Select Via Expression*/                           \ | ||||
|   /* Extendibility slots: */                                         \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( FunctionID__ARGS_SIG_1 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( FunctionID__ARGS_SIG_1 ) \ | ||||
| 	default: gen_generic_selection_fail                              \ | ||||
| #define GEN_FUNCTION_GENERIC_EXAMPLE( selector_arg ) _Generic(             \ | ||||
| (selector_arg), /* Select Via Expression*/                                 \ | ||||
|   /* Extendibility slots: */                                               \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_1__function_sig ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_2__function_sig ) \ | ||||
| 	default: gen_generic_selection_fail                                    \ | ||||
| ) GEN_RESOLVED_FUNCTION_CALL( selector_arg ) | ||||
| // ----------------------------------------------------------------------------------------------------------------------------------
 | ||||
| 
 | ||||
| @@ -68,20 +68,21 @@ size_t gen_example_hash__P_long( long val ) { return val * 2654435761ull; } | ||||
| #define GENERIC_SLOT_2_gen_example_hash  long long, gen_example_hash__P_long_long | ||||
| size_t gen_example_hash__P_long_long( long long val ) { return val * 2654435761ull; } | ||||
| 
 | ||||
| // If using an Editor with support for syntax hightlighting macros: HASH__ARGS_SIG_1 and HASH_ARGS_SIG_2 should show color highlighting indicating the slot is enabled,
 | ||||
| // If using an Editor with support for syntax hightlighting macros:
 | ||||
| // GENERIC_SLOT_1_gen_example_hash and GENERIC_SLOT_2_gen_example_hash should show color highlighting indicating the slot is enabled,
 | ||||
| // or, "defined" for usage during the compilation pass that handles the _Generic instrinsic.
 | ||||
| #define gen_hash_example( function_arguments ) _Generic(       \ | ||||
| (function_arguments), /* Select Via Expression*/               \ | ||||
|   /* Extendibility slots: */                                   \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_1 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_2 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_3 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_4 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_5 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_6 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_7 ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( HASH__ARGS_SIG_8 ) \ | ||||
| 	default: gen_generic_selection_fail                        \ | ||||
| #define gen_hash_example( function_arguments ) _Generic(                      \ | ||||
| (function_arguments), /* Select Via Expression*/                              \ | ||||
|   /* Extendibility slots: */                                                  \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_1_gen_example_hash ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_2_gen_example_hash ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_3_gen_example_hash ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_4_gen_example_hash ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_5_gen_example_hash ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_6_gen_example_hash ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_7_gen_example_hash ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_8_gen_example_hash ) \ | ||||
| 	default: gen_generic_selection_fail                                       \ | ||||
| ) GEN_RESOLVED_FUNCTION_CALL( function_arguments ) | ||||
| 
 | ||||
| // Additional Variations:
 | ||||
| @@ -89,20 +90,20 @@ size_t gen_example_hash__P_long_long( long long val ) { return val * 2654435761u | ||||
| // If the function takes more than one argument the following is used:
 | ||||
| #define GEN_FUNCTION_GENERIC_EXAMPLE_VARADIC( selector_arg, ... ) _Generic( \ | ||||
| (selector_arg),                                                             \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( FunctionID__ARGS_SIG_1 )        \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( FunctionID__ARGS_SIG_2 )        \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_1__function_sig )  \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_2__function_sig )  \ | ||||
| 	/* ... */                                                               \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT(FunctionID__ARGS_SIG_N )         \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT(GENERIC_SLOT_N__function_sig )   \ | ||||
| 	default: gen_generic_selection_fail                                     \ | ||||
| ) GEN_RESOLVED_FUNCTION_CALL( selector_arg, __VA_ARG__ ) | ||||
| 
 | ||||
| // If the function does not take the arugment as a parameter:
 | ||||
| #define GEN_FUNCTION_GENERIC_EXAMPLE_DIRECT_TYPE( selector_arg ) _Generic( \ | ||||
| ( GEN_TYPE_TO_EXP(selector_arg) ),                                         \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( FunctionID__ARGS_SIG_1 )       \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( FunctionID__ARGS_SIG_2 )       \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_1__function_sig ) \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_2__function_sig ) \ | ||||
| 	/* ... */                                                              \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT(FunctionID__ARGS_SIG_N )        \ | ||||
| 	GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT(GENERIC_SLOT_N__function_sig )  \ | ||||
| 	default: gen_generic_selection_fail                                    \ | ||||
| ) GEN_RESOLVED_FUNCTION_CALL() | ||||
| 
 | ||||
| @@ -18,13 +18,13 @@ void convert_cpp_enum_to_c( CodeEnum to_convert, CodeBody to_append ) | ||||
| #pragma pop_macro("enum_underlying") | ||||
| } | ||||
|  | ||||
| b32 ignore_preprocess_cond_block( StrC cond_sig, Code& entry_iter, CodeBody& parsed_body, CodeBody& body ) | ||||
| b32 ignore_preprocess_cond_block( Str cond_sig, Code& entry_iter, CodeBody& parsed_body, CodeBody& body ) | ||||
| { | ||||
| 	b32 found = false; | ||||
| 	CodePreprocessCond cond = cast(CodePreprocessCond, entry_iter); | ||||
| 	if ( cond->Content.is_equal(cond_sig) ) | ||||
| 	{ | ||||
| 		//log_fmt("Preprocess cond found: %SC\n", cond->Content); | ||||
| 		//log_fmt("Preprocess cond found: %S\n", cond->Content); | ||||
| 		found = true; | ||||
|  | ||||
| 		s32 depth = 1; | ||||
| @@ -72,7 +72,7 @@ b32 ignore_preprocess_cond_block( StrC cond_sig, Code& entry_iter, CodeBody& par | ||||
|  | ||||
| constexpr bool GenericSel_One_Arg = true; | ||||
| enum GenericSelectionOpts : u32 { GenericSel_Default, GenericSel_By_Ref, GenericSel_Direct_Type }; | ||||
| Code gen_generic_selection_function_macro( s32 num_slots, StrC macro_name, GenericSelectionOpts opts = GenericSel_Default, bool one_arg = false ) | ||||
| Code gen_generic_selection_function_macro( s32 num_slots, Str macro_name, GenericSelectionOpts opts = GenericSel_Default, bool one_arg = false ) | ||||
| { | ||||
| /* Implements: | ||||
| 	#define GEN_FUNCTION_GENERIC_EXAMPLE( selector_arg, ... ) _Generic(      \ | ||||
| @@ -84,18 +84,18 @@ Code gen_generic_selection_function_macro( s32 num_slots, StrC macro_name, Gener | ||||
| 	) GEN_RESOLVED_FUNCTION_CALL( selector_arg ) | ||||
| */ | ||||
| 	local_persist | ||||
| 	String define_builder = String::make_reserve(GlobalAllocator, kilobytes(64)); | ||||
| 	StrBuilder define_builder = StrBuilder::make_reserve(GlobalAllocator, kilobytes(64)); | ||||
| 	define_builder.clear(); | ||||
|  | ||||
| 	StrC macro_begin; | ||||
| 	Str macro_begin; | ||||
| 	if (opts == GenericSel_Direct_Type) { | ||||
| 		macro_begin = token_fmt( "macro_name", (StrC)macro_name, | ||||
| 		macro_begin = token_fmt( "macro_name", (Str)macro_name, | ||||
| R"(#define <macro_name>(selector_arg, ...) _Generic( (*(selector_arg*)NULL ), \ | ||||
| )" | ||||
| 		); | ||||
| 	} | ||||
| 	else { | ||||
| 		macro_begin = token_fmt( "macro_name", (StrC)macro_name, | ||||
| 		macro_begin = token_fmt( "macro_name", (Str)macro_name, | ||||
| R"(#define <macro_name>(selector_arg, ...) _Generic( (selector_arg), \ | ||||
| )" | ||||
| 		); | ||||
| @@ -104,7 +104,7 @@ R"(#define <macro_name>(selector_arg, ...) _Generic( (selector_arg), \ | ||||
|  | ||||
| 	for ( s32 slot = 1; slot <= num_slots; ++ slot ) | ||||
| 	{ | ||||
| 		StrC slot_str = String::fmt_buf(GlobalAllocator, "%d", slot).to_strc(); | ||||
| 		Str slot_str = StrBuilder::fmt_buf(GlobalAllocator, "%d", slot).to_str(); | ||||
| 		if (slot == num_slots && false) | ||||
| 		{ | ||||
| 			define_builder.append( token_fmt( "macro_name", macro_name, "slot", slot_str, | ||||
| @@ -152,25 +152,25 @@ R"(		GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_<slot>__<macro_name> ) | ||||
| 	// Add gap for next definition | ||||
| 	define_builder.append(txt("\n\n")); | ||||
|  | ||||
| 	Code macro = untyped_str(define_builder.to_strc()); | ||||
| 	Code macro = untyped_str(define_builder.to_str()); | ||||
| 	return macro; | ||||
| } | ||||
|  | ||||
| CodeFn rename_function_to_unique_symbol(CodeFn fn, StrC optional_prefix = txt("")) | ||||
| CodeFn rename_function_to_unique_symbol(CodeFn fn, Str optional_prefix = txt("")) | ||||
| { | ||||
|     // Get basic components for the name | ||||
|     StrC old_name = fn->Name; | ||||
|     String new_name; | ||||
|     Str        old_name = fn->Name; | ||||
|     StrBuilder new_name; | ||||
|  | ||||
|     // Add prefix if provided | ||||
|     if (optional_prefix.Len) | ||||
|         new_name = string_fmt_buf(GlobalAllocator, "%SC_%SC_", optional_prefix, old_name); | ||||
|         new_name = strbuilder_fmt_buf(GlobalAllocator, "%S_%S_", optional_prefix, old_name); | ||||
|     else | ||||
|         new_name = string_fmt_buf(GlobalAllocator, "%SC_", old_name); | ||||
|         new_name = strbuilder_fmt_buf(GlobalAllocator, "%S_", old_name); | ||||
|  | ||||
|     // Add return type to the signature | ||||
|     if (fn->ReturnType) | ||||
|         new_name.append_fmt("_%SC", fn->ReturnType->Name); | ||||
|         new_name.append_fmt("_%S", fn->ReturnType->Name); | ||||
|  | ||||
|     // Add parameter types to create a unique signature | ||||
|     bool first_param = true; | ||||
| @@ -198,11 +198,11 @@ CodeFn rename_function_to_unique_symbol(CodeFn fn, StrC optional_prefix = txt("" | ||||
| 						continue; | ||||
| 					} | ||||
|  | ||||
|                     new_name.append_fmt("%SC_", spec_to_str(spec)); | ||||
|                     new_name.append_fmt("%S_", spec_to_str(spec)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             new_name.append_fmt("%SC", param->ValueType->Name); | ||||
|             new_name.append_fmt("%S", param->ValueType->Name); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -214,7 +214,7 @@ CodeFn rename_function_to_unique_symbol(CodeFn fn, StrC optional_prefix = txt("" | ||||
|              spec != end(fn->Specs); | ||||
|              ++spec) | ||||
|         { | ||||
|             new_name.append_fmt("%SC_", spec_to_str(*spec)); | ||||
|             new_name.append_fmt("%S_", spec_to_str(*spec)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -223,13 +223,13 @@ CodeFn rename_function_to_unique_symbol(CodeFn fn, StrC optional_prefix = txt("" | ||||
| } | ||||
|  | ||||
| using SwapContentProc = CodeBody(void); | ||||
| bool swap_pragma_region_implementation( StrC region_name, SwapContentProc* swap_content, Code& entry_iter, CodeBody& body ) | ||||
| bool swap_pragma_region_implementation( Str region_name, SwapContentProc* swap_content, Code& entry_iter, CodeBody& body ) | ||||
| { | ||||
| 	bool found = false; | ||||
| 	CodePragma possible_region = cast(CodePragma, entry_iter); | ||||
|  | ||||
| 	String region_sig    = string_fmt_buf(GlobalAllocator, "region %s",    region_name.Ptr); | ||||
| 	String endregion_sig = string_fmt_buf(GlobalAllocator, "endregion %s", region_name.Ptr); | ||||
| 	StrBuilder region_sig    = strbuilder_fmt_buf(GlobalAllocator, "region %s",    region_name.Ptr); | ||||
| 	StrBuilder endregion_sig = strbuilder_fmt_buf(GlobalAllocator, "endregion %s", region_name.Ptr); | ||||
| 	if ( possible_region->Content.contains(region_sig)) | ||||
| 	{ | ||||
| 		found = true; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user