mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-11-03 23:36:12 -08:00 
			
		
		
		
	working to towards https://github.com/Ed94/gencpp/issues/56
This commit is contained in:
		@@ -9,58 +9,58 @@ using namespace gen;
 | 
			
		||||
 | 
			
		||||
CodeBody gen_ecode( char const* path, bool use_c_definition = false )
 | 
			
		||||
{
 | 
			
		||||
	FixedArena_32KB scratch; fixed_arena_init(& scratch);
 | 
			
		||||
	FixedArena_32KB scratch;       fixed_arena_init(& scratch);
 | 
			
		||||
	AllocatorInfo   scratch_info = fixed_arena_allocator_info(& scratch);
 | 
			
		||||
 | 
			
		||||
	CSV_Columns2 csv_enum         = parse_csv_two_columns( scratch_info, path );
 | 
			
		||||
	String enum_entries           = string_make_reserve( GlobalAllocator, kilobytes(1) );
 | 
			
		||||
	String to_str_entries         = string_make_reserve( GlobalAllocator, kilobytes(1) );
 | 
			
		||||
	String to_keyword_str_entries = string_make_reserve( GlobalAllocator, kilobytes(1) );
 | 
			
		||||
	CSV_Columns2 csv_enum                 = parse_csv_two_columns( scratch_info, path );
 | 
			
		||||
	StrBuilder   enum_entries             = strbuilder_make_reserve( GlobalAllocator, kilobytes(1) );
 | 
			
		||||
	StrBuilder   to_c_str_entries         = strbuilder_make_reserve( GlobalAllocator, kilobytes(1) );
 | 
			
		||||
	StrBuilder   to_keyword_c_str_entries = strbuilder_make_reserve( GlobalAllocator, kilobytes(1) );
 | 
			
		||||
 | 
			
		||||
	for ( ssize idx = 0; idx < array_num(csv_enum.Col_1); ++ idx ) 	{
 | 
			
		||||
		char const* code    = csv_enum.Col_1[idx].string;
 | 
			
		||||
		char const* keyword = csv_enum.Col_2[idx].string;
 | 
			
		||||
		// TODO(Ed): to_str_entries and the others in here didn't have proper sizing of the StrC slice.
 | 
			
		||||
		string_append_fmt( & enum_entries,           "CT_%s,\n", code );
 | 
			
		||||
		string_append_fmt( & to_str_entries,         "{ sizeof(\"%s\"), \"%s\" },\n", code, code );
 | 
			
		||||
		string_append_fmt( & to_keyword_str_entries, "{ sizeof(\"%s\") - 1, \"%s\" },\n", keyword, keyword );
 | 
			
		||||
		// TODO(Ed): to_c_str_entries and the others in here didn't have proper sizing of the Str slice.
 | 
			
		||||
		strbuilder_append_fmt( & enum_entries,             "CT_%s,\n", code );
 | 
			
		||||
		strbuilder_append_fmt( & to_c_str_entries,         "{ sizeof(\"%s\"), \"%s\" },\n", code, code );
 | 
			
		||||
		strbuilder_append_fmt( & to_keyword_c_str_entries, "{ sizeof(\"%s\") - 1, \"%s\" },\n", keyword, keyword );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CodeEnum enum_code;
 | 
			
		||||
	if (use_c_definition) {
 | 
			
		||||
		enum_code = parse_enum(token_fmt_impl((3 + 1) / 2, "entries", string_to_strc(enum_entries),
 | 
			
		||||
		enum_code = parse_enum(token_fmt_impl((3 + 1) / 2, "entries", strbuilder_to_str(enum_entries),
 | 
			
		||||
			"enum CodeType enum_underlying(u32) { <entries> CT_NumTypes, CT_UnderlyingType = GEN_U32_MAX };"
 | 
			
		||||
		));
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		enum_code = parse_enum(token_fmt_impl((3 + 1) / 2, "entries", string_to_strc(enum_entries),
 | 
			
		||||
		enum_code = parse_enum(token_fmt_impl((3 + 1) / 2, "entries", strbuilder_to_str(enum_entries),
 | 
			
		||||
			"enum CodeType : u32 { <entries> CT_NumTypes, CT_UnderlyingType = GEN_U32_MAX };"
 | 
			
		||||
		));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#pragma push_macro("local_persist")
 | 
			
		||||
#undef local_persist
 | 
			
		||||
	StrC lookup_size = string_to_strc(string_fmt_buf(GlobalAllocator, "%d", array_num(csv_enum.Col_1) ));
 | 
			
		||||
	CodeBody to_str_fns = parse_global_body( token_fmt(
 | 
			
		||||
		"entries",  string_to_strc(to_str_entries)
 | 
			
		||||
	,	"keywords", string_to_strc(to_keyword_str_entries)
 | 
			
		||||
	Str lookup_size = strbuilder_to_str(strbuilder_fmt_buf(GlobalAllocator, "%d", array_num(csv_enum.Col_1) ));
 | 
			
		||||
	CodeBody to_c_str_fns = parse_global_body( token_fmt(
 | 
			
		||||
		"entries",  strbuilder_to_str(to_c_str_entries)
 | 
			
		||||
	,	"keywords", strbuilder_to_str(to_keyword_c_str_entries)
 | 
			
		||||
	,	"num",      lookup_size
 | 
			
		||||
	, stringize(
 | 
			
		||||
		inline
 | 
			
		||||
		StrC codetype_to_str( CodeType type )
 | 
			
		||||
		Str codetype_to_str( CodeType type )
 | 
			
		||||
		{
 | 
			
		||||
			local_persist
 | 
			
		||||
			StrC lookup[<num>] = {
 | 
			
		||||
			Str lookup[<num>] = {
 | 
			
		||||
				<entries>
 | 
			
		||||
			};
 | 
			
		||||
			return lookup[ type ];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		inline
 | 
			
		||||
		StrC codetype_to_keyword_str( CodeType type )
 | 
			
		||||
		Str codetype_to_keyword_str( CodeType type )
 | 
			
		||||
		{
 | 
			
		||||
			local_persist
 | 
			
		||||
			StrC lookup[ <num> ] = {
 | 
			
		||||
			Str lookup[ <num> ] = {
 | 
			
		||||
				<keywords>
 | 
			
		||||
			};
 | 
			
		||||
			return lookup[ type ];
 | 
			
		||||
@@ -76,14 +76,14 @@ CodeBody gen_ecode( char const* path, bool use_c_definition = false )
 | 
			
		||||
		body_append(result, code_t);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	body_append(result, to_str_fns);
 | 
			
		||||
	body_append(result, to_c_str_fns);
 | 
			
		||||
 | 
			
		||||
	if (! use_c_definition) {
 | 
			
		||||
		#pragma push_macro("forceinline")
 | 
			
		||||
		#undef forceinline
 | 
			
		||||
		CodeBody alias_mappings = parse_global_body(code(
 | 
			
		||||
			forceinline StrC to_str        (CodeType type) { return codetype_to_str(type);         }
 | 
			
		||||
			forceinline StrC to_keyword_str(CodeType type) { return codetype_to_keyword_str(type); }
 | 
			
		||||
			forceinline Str to_str        (CodeType type) { return codetype_to_str(type);         }
 | 
			
		||||
			forceinline Str to_keyword_str(CodeType type) { return codetype_to_keyword_str(type); }
 | 
			
		||||
		));
 | 
			
		||||
		#pragma pop_macro("forceinline")
 | 
			
		||||
		body_append(result, alias_mappings);
 | 
			
		||||
@@ -93,19 +93,18 @@ CodeBody gen_ecode( char const* path, bool use_c_definition = false )
 | 
			
		||||
 | 
			
		||||
CodeBody gen_eoperator( char const* path, bool use_c_definition = false )
 | 
			
		||||
{
 | 
			
		||||
	FixedArena_16KB scratch; fixed_arena_init(& scratch);
 | 
			
		||||
	FixedArena_16KB scratch;       fixed_arena_init(& scratch);
 | 
			
		||||
	AllocatorInfo   scratch_info = fixed_arena_allocator_info(& scratch);
 | 
			
		||||
 | 
			
		||||
	CSV_Columns2 csv_enum = parse_csv_two_columns( scratch_info, path );
 | 
			
		||||
	String enum_entries   = string_make_reserve( GlobalAllocator, 32 );
 | 
			
		||||
	String to_str_entries = string_make_reserve( GlobalAllocator, 32 );
 | 
			
		||||
	CSV_Columns2 csv_enum       = parse_csv_two_columns( scratch_info, path );
 | 
			
		||||
	StrBuilder enum_entries     = strbuilder_make_reserve( GlobalAllocator, 32 );
 | 
			
		||||
	StrBuilder to_c_str_entries = strbuilder_make_reserve( GlobalAllocator, 32 );
 | 
			
		||||
 | 
			
		||||
	for (usize idx = 0; idx < array_num(csv_enum.Col_1); idx++) {
 | 
			
		||||
		char const* enum_str     = csv_enum.Col_1[idx].string;
 | 
			
		||||
		char const* entry_to_str = csv_enum.Col_2[idx].string;
 | 
			
		||||
 | 
			
		||||
		string_append_fmt( & enum_entries, "Op_%s,\n", enum_str );
 | 
			
		||||
		string_append_fmt( & to_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
		strbuilder_append_fmt( & enum_entries,     "Op_%s,\n", enum_str );
 | 
			
		||||
		strbuilder_append_fmt( & to_c_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CodeEnum  enum_code;
 | 
			
		||||
@@ -113,7 +112,7 @@ CodeBody gen_eoperator( char const* path, bool use_c_definition = false )
 | 
			
		||||
	{
 | 
			
		||||
	#pragma push_macro("enum_underlying")
 | 
			
		||||
	#undef enum_underlying
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", string_to_strc(enum_entries), stringize(
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", strbuilder_to_str(enum_entries), stringize(
 | 
			
		||||
			enum Operator enum_underlying(u32)
 | 
			
		||||
			{
 | 
			
		||||
				<entries>
 | 
			
		||||
@@ -125,7 +124,7 @@ CodeBody gen_eoperator( char const* path, bool use_c_definition = false )
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", string_to_strc(enum_entries), stringize(
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", strbuilder_to_str(enum_entries), stringize(
 | 
			
		||||
			enum Operator : u32
 | 
			
		||||
			{
 | 
			
		||||
				<entries>
 | 
			
		||||
@@ -137,16 +136,16 @@ CodeBody gen_eoperator( char const* path, bool use_c_definition = false )
 | 
			
		||||
 | 
			
		||||
#pragma push_macro("local_persist")
 | 
			
		||||
#undef local_persist
 | 
			
		||||
	StrC lookup_size = string_to_strc(string_fmt_buf(GlobalAllocator, "%d", array_num(csv_enum.Col_1) ));
 | 
			
		||||
	Str lookup_size = strbuilder_to_str(strbuilder_fmt_buf(GlobalAllocator, "%d", array_num(csv_enum.Col_1) ));
 | 
			
		||||
	CodeFn to_str   = parse_function(token_fmt(
 | 
			
		||||
		"entries", string_to_strc(to_str_entries)
 | 
			
		||||
		"entries", strbuilder_to_str(to_c_str_entries)
 | 
			
		||||
	,	"num",     lookup_size
 | 
			
		||||
	, stringize(
 | 
			
		||||
		inline
 | 
			
		||||
		StrC operator_to_str( Operator op )
 | 
			
		||||
		Str operator_to_str( Operator op )
 | 
			
		||||
		{
 | 
			
		||||
			local_persist
 | 
			
		||||
			StrC lookup[<num>] = {
 | 
			
		||||
			Str lookup[<num>] = {
 | 
			
		||||
				<entries>
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
@@ -169,7 +168,7 @@ CodeBody gen_eoperator( char const* path, bool use_c_definition = false )
 | 
			
		||||
	#pragma push_macro("forceinline")
 | 
			
		||||
	#undef forceinline
 | 
			
		||||
		CodeBody alias_mappings = parse_global_body(code(
 | 
			
		||||
			forceinline StrC to_str(Operator op) { return operator_to_str(op); }
 | 
			
		||||
			forceinline Str to_str(Operator op) { return operator_to_str(op); }
 | 
			
		||||
		));
 | 
			
		||||
	#pragma pop_macro("forceinline")
 | 
			
		||||
		body_append(result, alias_mappings);
 | 
			
		||||
@@ -179,20 +178,19 @@ CodeBody gen_eoperator( char const* path, bool use_c_definition = false )
 | 
			
		||||
 | 
			
		||||
CodeBody gen_especifier( char const* path, bool use_c_definition = false )
 | 
			
		||||
{
 | 
			
		||||
	FixedArena_16KB scratch; fixed_arena_init(& scratch);
 | 
			
		||||
	FixedArena_16KB scratch;       fixed_arena_init(& scratch);
 | 
			
		||||
	AllocatorInfo   scratch_info = fixed_arena_allocator_info(& scratch);
 | 
			
		||||
 | 
			
		||||
	CSV_Columns2 csv_enum = parse_csv_two_columns( scratch_info, path );
 | 
			
		||||
	String enum_entries   = string_make_reserve( scratch_info, kilobytes(1) );
 | 
			
		||||
	String to_str_entries = string_make_reserve( scratch_info, kilobytes(1) );
 | 
			
		||||
	CSV_Columns2 csv_enum       = parse_csv_two_columns( scratch_info, path );
 | 
			
		||||
	StrBuilder enum_entries     = strbuilder_make_reserve( scratch_info, kilobytes(1) );
 | 
			
		||||
	StrBuilder to_c_str_entries = strbuilder_make_reserve( scratch_info, kilobytes(1) );
 | 
			
		||||
 | 
			
		||||
	for (usize idx = 0; idx < array_num(csv_enum.Col_1); idx++)
 | 
			
		||||
	{
 | 
			
		||||
		char const* enum_str     = csv_enum.Col_1[idx].string;
 | 
			
		||||
		char const* entry_to_str = csv_enum.Col_2[idx].string;
 | 
			
		||||
 | 
			
		||||
		string_append_fmt( & enum_entries, "Spec_%s,\n", enum_str );
 | 
			
		||||
		string_append_fmt( & to_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
		strbuilder_append_fmt( & enum_entries,     "Spec_%s,\n", enum_str );
 | 
			
		||||
		strbuilder_append_fmt( & to_c_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CodeEnum enum_code;
 | 
			
		||||
@@ -200,7 +198,7 @@ CodeBody gen_especifier( char const* path, bool use_c_definition = false )
 | 
			
		||||
	{
 | 
			
		||||
	#pragma push_macro("enum_underlying")
 | 
			
		||||
	#undef enum_underlying
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", string_to_strc(enum_entries), stringize(
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", strbuilder_to_str(enum_entries), stringize(
 | 
			
		||||
			enum Specifier enum_underlying(u32)
 | 
			
		||||
			{
 | 
			
		||||
				<entries>
 | 
			
		||||
@@ -212,7 +210,7 @@ CodeBody gen_especifier( char const* path, bool use_c_definition = false )
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", string_to_strc(enum_entries), stringize(
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", strbuilder_to_str(enum_entries), stringize(
 | 
			
		||||
			enum Specifier : u32
 | 
			
		||||
			{
 | 
			
		||||
				<entries>
 | 
			
		||||
@@ -221,8 +219,7 @@ CodeBody gen_especifier( char const* path, bool use_c_definition = false )
 | 
			
		||||
			};
 | 
			
		||||
		)));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CodeFn is_trailing = parse_function(token_fmt("specifier", string_to_strc(to_str_entries), stringize(
 | 
			
		||||
	CodeFn is_trailing = parse_function(token_fmt("specifier", strbuilder_to_str(to_c_str_entries), stringize(
 | 
			
		||||
		inline
 | 
			
		||||
		bool spec_is_trailing( Specifier specifier )
 | 
			
		||||
		{
 | 
			
		||||
@@ -240,16 +237,16 @@ CodeBody gen_especifier( char const* path, bool use_c_definition = false )
 | 
			
		||||
#undef do_once_end
 | 
			
		||||
#undef forceinline
 | 
			
		||||
#undef neverinline
 | 
			
		||||
	StrC lookup_size = string_to_strc(string_fmt_buf(GlobalAllocator, "%d", array_num(csv_enum.Col_1) ));
 | 
			
		||||
	Str lookup_size = strbuilder_to_str(strbuilder_fmt_buf(GlobalAllocator, "%d", array_num(csv_enum.Col_1) ));
 | 
			
		||||
	CodeFn to_str   = parse_function(token_fmt(
 | 
			
		||||
		"entries", string_to_strc(to_str_entries)
 | 
			
		||||
		"entries", strbuilder_to_str(to_c_str_entries)
 | 
			
		||||
	,	"num",     lookup_size
 | 
			
		||||
	, stringize(
 | 
			
		||||
		inline
 | 
			
		||||
		StrC spec_to_str( Specifier type )
 | 
			
		||||
		Str spec_to_str( Specifier type )
 | 
			
		||||
		{
 | 
			
		||||
			local_persist
 | 
			
		||||
			StrC lookup[<num>] = {
 | 
			
		||||
			Str lookup[<num>] = {
 | 
			
		||||
				<entries>
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
@@ -257,16 +254,16 @@ CodeBody gen_especifier( char const* path, bool use_c_definition = false )
 | 
			
		||||
		}
 | 
			
		||||
	)));
 | 
			
		||||
 | 
			
		||||
	CodeFn to_type = parse_function( token_fmt( "entries", string_to_strc(to_str_entries), stringize(
 | 
			
		||||
	CodeFn to_type = parse_function( token_fmt( "entries", strbuilder_to_str(to_c_str_entries), stringize(
 | 
			
		||||
		inline
 | 
			
		||||
		Specifier strc_to_specifier( StrC str )
 | 
			
		||||
		Specifier str_to_specifier( Str str )
 | 
			
		||||
		{
 | 
			
		||||
			local_persist
 | 
			
		||||
			u32 keymap[ Spec_NumSpecifiers ];
 | 
			
		||||
			do_once_start
 | 
			
		||||
				for ( u32 index = 0; index < Spec_NumSpecifiers; index++ )
 | 
			
		||||
				{
 | 
			
		||||
					StrC enum_str = spec_to_str( (Specifier)index );
 | 
			
		||||
					Str enum_str = spec_to_str( (Specifier)index );
 | 
			
		||||
 | 
			
		||||
					// We subtract 1 to remove the null terminator
 | 
			
		||||
					// This is because the tokens lexed are not null terminated.
 | 
			
		||||
@@ -308,8 +305,8 @@ CodeBody gen_especifier( char const* path, bool use_c_definition = false )
 | 
			
		||||
	#pragma push_macro("forceinline")
 | 
			
		||||
	#undef forceinline
 | 
			
		||||
		CodeBody alias_mappings = parse_global_body(code(
 | 
			
		||||
			forceinline StrC      to_str (Specifier spec)            { return spec_to_str(spec); }
 | 
			
		||||
			forceinline Specifier to_type( StrC str )                { return strc_to_specifier(str); }
 | 
			
		||||
			forceinline Str      to_str (Specifier spec)            { return spec_to_str(spec); }
 | 
			
		||||
			forceinline Specifier to_type( Str str )                { return str_to_specifier(str); }
 | 
			
		||||
			forceinline bool      is_trailing( Specifier specifier ) { return spec_is_trailing(specifier); }
 | 
			
		||||
		));
 | 
			
		||||
	#pragma pop_macro("forceinline")
 | 
			
		||||
@@ -334,50 +331,50 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path, bool use_c_
 | 
			
		||||
	csv_parse( &csv_attr_nodes, rcast(char*, attrib_content.data), scratch_info, false );
 | 
			
		||||
 | 
			
		||||
	Array<ADT_Node> enum_strs          = csv_enum_nodes.nodes[0].nodes;
 | 
			
		||||
	Array<ADT_Node> enum_str_strs      = csv_enum_nodes.nodes[1].nodes;
 | 
			
		||||
	Array<ADT_Node> enum_c_str_strs      = csv_enum_nodes.nodes[1].nodes;
 | 
			
		||||
	Array<ADT_Node> attribute_strs     = csv_attr_nodes.nodes[0].nodes;
 | 
			
		||||
	Array<ADT_Node> attribute_str_strs = csv_attr_nodes.nodes[1].nodes;
 | 
			
		||||
	Array<ADT_Node> attribute_c_str_strs = csv_attr_nodes.nodes[1].nodes;
 | 
			
		||||
 | 
			
		||||
	String enum_entries             = string_make_reserve( scratch_info, kilobytes(2) );
 | 
			
		||||
	String to_str_entries           = string_make_reserve( scratch_info, kilobytes(4) );
 | 
			
		||||
	String attribute_entries        = string_make_reserve( scratch_info, kilobytes(2) );
 | 
			
		||||
	String to_str_attributes        = string_make_reserve( scratch_info, kilobytes(4) );
 | 
			
		||||
	String attribute_define_entries = string_make_reserve( scratch_info, kilobytes(4) );
 | 
			
		||||
	StrBuilder enum_entries             = strbuilder_make_reserve( scratch_info, kilobytes(2) );
 | 
			
		||||
	StrBuilder to_c_str_entries           = strbuilder_make_reserve( scratch_info, kilobytes(4) );
 | 
			
		||||
	StrBuilder attribute_entries        = strbuilder_make_reserve( scratch_info, kilobytes(2) );
 | 
			
		||||
	StrBuilder to_c_str_attributes        = strbuilder_make_reserve( scratch_info, kilobytes(4) );
 | 
			
		||||
	StrBuilder attribute_define_entries = strbuilder_make_reserve( scratch_info, kilobytes(4) );
 | 
			
		||||
 | 
			
		||||
	for (usize idx = 0; idx < array_num(enum_strs); idx++)
 | 
			
		||||
	{
 | 
			
		||||
		char const* enum_str     = enum_strs[idx].string;
 | 
			
		||||
		char const* entry_to_str = enum_str_strs [idx].string;
 | 
			
		||||
		char const* entry_to_str = enum_c_str_strs [idx].string;
 | 
			
		||||
 | 
			
		||||
		string_append_fmt( & enum_entries, "Tok_%s,\n", enum_str );
 | 
			
		||||
		string_append_fmt( & to_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
		strbuilder_append_fmt( & enum_entries, "Tok_%s,\n", enum_str );
 | 
			
		||||
		strbuilder_append_fmt( & to_c_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for ( usize idx = 0; idx < array_num(attribute_strs); idx++ )
 | 
			
		||||
	{
 | 
			
		||||
		char const* attribute_str = attribute_strs[idx].string;
 | 
			
		||||
		char const* entry_to_str  = attribute_str_strs [idx].string;
 | 
			
		||||
		char const* entry_to_str  = attribute_c_str_strs [idx].string;
 | 
			
		||||
 | 
			
		||||
		string_append_fmt( & attribute_entries, "Tok_Attribute_%s,\n", attribute_str );
 | 
			
		||||
		string_append_fmt( & to_str_attributes, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
		string_append_fmt( & attribute_define_entries, "Entry( Tok_Attribute_%s, \"%s\" )", attribute_str, entry_to_str );
 | 
			
		||||
		strbuilder_append_fmt( & attribute_entries, "Tok_Attribute_%s,\n", attribute_str );
 | 
			
		||||
		strbuilder_append_fmt( & to_c_str_attributes, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
 | 
			
		||||
		strbuilder_append_fmt( & attribute_define_entries, "Entry( Tok_Attribute_%s, \"%s\" )", attribute_str, entry_to_str );
 | 
			
		||||
 | 
			
		||||
		if ( idx < array_num(attribute_strs) - 1 )
 | 
			
		||||
			string_append_strc( & attribute_define_entries, txt(" \\\n"));
 | 
			
		||||
			strbuilder_append_str( & attribute_define_entries, txt(" \\\n"));
 | 
			
		||||
		else
 | 
			
		||||
			string_append_strc( & attribute_define_entries, txt("\n"));
 | 
			
		||||
			strbuilder_append_str( & attribute_define_entries, txt("\n"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#pragma push_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")
 | 
			
		||||
#undef GEN_DEFINE_ATTRIBUTE_TOKENS
 | 
			
		||||
	CodeDefine attribute_entires_def = def_define( name(GEN_DEFINE_ATTRIBUTE_TOKENS), string_to_strc(attribute_define_entries)  );
 | 
			
		||||
	CodeDefine attribute_entires_def = def_define( name(GEN_DEFINE_ATTRIBUTE_TOKENS), strbuilder_to_str(attribute_define_entries)  );
 | 
			
		||||
#pragma pop_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")
 | 
			
		||||
 | 
			
		||||
	// We cannot parse this enum, it has Attribute names as enums
 | 
			
		||||
	CodeEnum enum_code;
 | 
			
		||||
	if (use_c_definition)
 | 
			
		||||
	{
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", string_to_strc(enum_entries), "attribute_toks", string_to_strc(attribute_entries), stringize(
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", strbuilder_to_str(enum_entries), "attribute_toks", strbuilder_to_str(attribute_entries), stringize(
 | 
			
		||||
			enum TokType
 | 
			
		||||
			{
 | 
			
		||||
				<entries>
 | 
			
		||||
@@ -389,7 +386,7 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path, bool use_c_
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", string_to_strc(enum_entries), "attribute_toks", string_to_strc(attribute_entries), stringize(
 | 
			
		||||
		enum_code = parse_enum(token_fmt("entries", strbuilder_to_str(enum_entries), "attribute_toks", strbuilder_to_str(attribute_entries), stringize(
 | 
			
		||||
			enum TokType : u32
 | 
			
		||||
			{
 | 
			
		||||
				<entries>
 | 
			
		||||
@@ -405,12 +402,12 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path, bool use_c_
 | 
			
		||||
#undef local_persist
 | 
			
		||||
#undef do_once_start
 | 
			
		||||
#undef do_once_end
 | 
			
		||||
	CodeFn to_str = parse_function(token_fmt("entries", string_to_strc(to_str_entries), "attribute_toks", string_to_strc(to_str_attributes), stringize(
 | 
			
		||||
	CodeFn to_str = parse_function(token_fmt("entries", strbuilder_to_str(to_c_str_entries), "attribute_toks", strbuilder_to_str(to_c_str_attributes), stringize(
 | 
			
		||||
		inline
 | 
			
		||||
		StrC toktype_to_str( TokType type )
 | 
			
		||||
		Str toktype_to_str( TokType type )
 | 
			
		||||
		{
 | 
			
		||||
			local_persist
 | 
			
		||||
			StrC lookup[] = {
 | 
			
		||||
			Str lookup[] = {
 | 
			
		||||
				<entries>
 | 
			
		||||
				<attribute_toks>
 | 
			
		||||
			};
 | 
			
		||||
@@ -419,16 +416,16 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path, bool use_c_
 | 
			
		||||
		}
 | 
			
		||||
	)));
 | 
			
		||||
 | 
			
		||||
	CodeFn to_type = parse_function( token_fmt( "entries", string_to_strc(to_str_entries), stringize(
 | 
			
		||||
	CodeFn to_type = parse_function( token_fmt( "entries", strbuilder_to_str(to_c_str_entries), stringize(
 | 
			
		||||
		inline
 | 
			
		||||
		TokType strc_to_toktype( StrC str )
 | 
			
		||||
		TokType str_to_toktype( Str str )
 | 
			
		||||
		{
 | 
			
		||||
			local_persist
 | 
			
		||||
			u32 keymap[ Tok_NumTokens ];
 | 
			
		||||
			do_once_start
 | 
			
		||||
				for ( u32 index = 0; index < Tok_NumTokens; index++ )
 | 
			
		||||
				{
 | 
			
		||||
					StrC enum_str = toktype_to_str( (TokType)index );
 | 
			
		||||
					Str enum_str = toktype_to_str( (TokType)index );
 | 
			
		||||
 | 
			
		||||
					// We subtract 1 to remove the null terminator
 | 
			
		||||
					// This is because the tokens lexed are not null terminated.
 | 
			
		||||
@@ -518,59 +515,59 @@ CodeBody gen_ast_inlines()
 | 
			
		||||
#pragma pop_macro("GEN_NS")
 | 
			
		||||
#pragma pop_macro("CodeInvalid")
 | 
			
		||||
 | 
			
		||||
	CodeBody impl_code          = parse_global_body( token_fmt( "typename", StrC name(Code),               code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_body     = parse_global_body( token_fmt( "typename", StrC name(CodeBody),           code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_attr     = parse_global_body( token_fmt( "typename", StrC name(CodeAttributes),     code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_cmt      = parse_global_body( token_fmt( "typename", StrC name(CodeComment),        code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_constr   = parse_global_body( token_fmt( "typename", StrC name(CodeConstructor),    code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_class    = parse_global_body( token_fmt( "typename", StrC name(CodeClass),          code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_define   = parse_global_body( token_fmt( "typename", StrC name(CodeDefine),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_destruct = parse_global_body( token_fmt( "typename", StrC name(CodeDestructor),     code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_enum     = parse_global_body( token_fmt( "typename", StrC name(CodeEnum),           code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_exec     = parse_global_body( token_fmt( "typename", StrC name(CodeExec),           code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_extern   = parse_global_body( token_fmt( "typename", StrC name(CodeExtern),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_include  = parse_global_body( token_fmt( "typename", StrC name(CodeInclude),        code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_friend   = parse_global_body( token_fmt( "typename", StrC name(CodeFriend),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_fn	    = parse_global_body( token_fmt( "typename", StrC name(CodeFn),             code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_module   = parse_global_body( token_fmt( "typename", StrC name(CodeModule),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_ns       = parse_global_body( token_fmt( "typename", StrC name(CodeNS),             code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_op       = parse_global_body( token_fmt( "typename", StrC name(CodeOperator),       code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_opcast   = parse_global_body( token_fmt( "typename", StrC name(CodeOpCast),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_params   = parse_global_body( token_fmt( "typename", StrC name(CodeParams),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_pragma   = parse_global_body( token_fmt( "typename", StrC name(CodePragma),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_precond  = parse_global_body( token_fmt( "typename", StrC name(CodePreprocessCond), code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_specs    = parse_global_body( token_fmt( "typename", StrC name(CodeSpecifiers),     code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_struct   = parse_global_body( token_fmt( "typename", StrC name(CodeStruct),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_tmpl     = parse_global_body( token_fmt( "typename", StrC name(CodeTemplate),       code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_type     = parse_global_body( token_fmt( "typename", StrC name(CodeTypename),       code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_typedef  = parse_global_body( token_fmt( "typename", StrC name(CodeTypedef),        code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_union    = parse_global_body( token_fmt( "typename", StrC name(CodeUnion),          code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_using    = parse_global_body( token_fmt( "typename", StrC name(CodeUsing),          code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_var      = parse_global_body( token_fmt( "typename", StrC name(CodeVar),            code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code          = parse_global_body( token_fmt( "typename", Str name(Code),               code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_body     = parse_global_body( token_fmt( "typename", Str name(CodeBody),           code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_attr     = parse_global_body( token_fmt( "typename", Str name(CodeAttributes),     code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_cmt      = parse_global_body( token_fmt( "typename", Str name(CodeComment),        code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_constr   = parse_global_body( token_fmt( "typename", Str name(CodeConstructor),    code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_class    = parse_global_body( token_fmt( "typename", Str name(CodeClass),          code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_define   = parse_global_body( token_fmt( "typename", Str name(CodeDefine),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_destruct = parse_global_body( token_fmt( "typename", Str name(CodeDestructor),     code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_enum     = parse_global_body( token_fmt( "typename", Str name(CodeEnum),           code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_exec     = parse_global_body( token_fmt( "typename", Str name(CodeExec),           code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_extern   = parse_global_body( token_fmt( "typename", Str name(CodeExtern),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_include  = parse_global_body( token_fmt( "typename", Str name(CodeInclude),        code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_friend   = parse_global_body( token_fmt( "typename", Str name(CodeFriend),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_fn	    = parse_global_body( token_fmt( "typename", Str name(CodeFn),             code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_module   = parse_global_body( token_fmt( "typename", Str name(CodeModule),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_ns       = parse_global_body( token_fmt( "typename", Str name(CodeNS),             code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_op       = parse_global_body( token_fmt( "typename", Str name(CodeOperator),       code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_opcast   = parse_global_body( token_fmt( "typename", Str name(CodeOpCast),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_params   = parse_global_body( token_fmt( "typename", Str name(CodeParams),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_pragma   = parse_global_body( token_fmt( "typename", Str name(CodePragma),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_precond  = parse_global_body( token_fmt( "typename", Str name(CodePreprocessCond), code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_specs    = parse_global_body( token_fmt( "typename", Str name(CodeSpecifiers),     code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_struct   = parse_global_body( token_fmt( "typename", Str name(CodeStruct),         code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_tmpl     = parse_global_body( token_fmt( "typename", Str name(CodeTemplate),       code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_type     = parse_global_body( token_fmt( "typename", Str name(CodeTypename),       code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_typedef  = parse_global_body( token_fmt( "typename", Str name(CodeTypedef),        code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_union    = parse_global_body( token_fmt( "typename", Str name(CodeUnion),          code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_using    = parse_global_body( token_fmt( "typename", Str name(CodeUsing),          code_impl_tmpl ));
 | 
			
		||||
	CodeBody impl_code_var      = parse_global_body( token_fmt( "typename", Str name(CodeVar),            code_impl_tmpl ));
 | 
			
		||||
 | 
			
		||||
	body_append(impl_code_attr,     parse_global_body( token_fmt( "typename", StrC name(Attributes),     codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_cmt,      parse_global_body( token_fmt( "typename", StrC name(Comment),        codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_constr,   parse_global_body( token_fmt( "typename", StrC name(Constructor),    codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_define,   parse_global_body( token_fmt( "typename", StrC name(Define),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_destruct, parse_global_body( token_fmt( "typename", StrC name(Destructor),     codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_enum,     parse_global_body( token_fmt( "typename", StrC name(Enum),           codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_exec,     parse_global_body( token_fmt( "typename", StrC name(Exec),           codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_extern,   parse_global_body( token_fmt( "typename", StrC name(Extern),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_include,  parse_global_body( token_fmt( "typename", StrC name(Include),        codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_friend,   parse_global_body( token_fmt( "typename", StrC name(Friend),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_fn,       parse_global_body( token_fmt( "typename", StrC name(Fn),             codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_module,   parse_global_body( token_fmt( "typename", StrC name(Module),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_ns,       parse_global_body( token_fmt( "typename", StrC name(NS),             codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_op,       parse_global_body( token_fmt( "typename", StrC name(Operator),       codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_opcast,   parse_global_body( token_fmt( "typename", StrC name(OpCast),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_pragma,   parse_global_body( token_fmt( "typename", StrC name(Pragma),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_precond,  parse_global_body( token_fmt( "typename", StrC name(PreprocessCond), codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_tmpl,     parse_global_body( token_fmt( "typename", StrC name(Template),       codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_type,     parse_global_body( token_fmt( "typename", StrC name(Typename),       codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_typedef,  parse_global_body( token_fmt( "typename", StrC name(Typedef),        codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_union,    parse_global_body( token_fmt( "typename", StrC name(Union),          codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_using,    parse_global_body( token_fmt( "typename", StrC name(Using),          codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_var,      parse_global_body( token_fmt( "typename", StrC name(Var),            codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_attr,     parse_global_body( token_fmt( "typename", Str name(Attributes),     codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_cmt,      parse_global_body( token_fmt( "typename", Str name(Comment),        codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_constr,   parse_global_body( token_fmt( "typename", Str name(Constructor),    codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_define,   parse_global_body( token_fmt( "typename", Str name(Define),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_destruct, parse_global_body( token_fmt( "typename", Str name(Destructor),     codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_enum,     parse_global_body( token_fmt( "typename", Str name(Enum),           codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_exec,     parse_global_body( token_fmt( "typename", Str name(Exec),           codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_extern,   parse_global_body( token_fmt( "typename", Str name(Extern),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_include,  parse_global_body( token_fmt( "typename", Str name(Include),        codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_friend,   parse_global_body( token_fmt( "typename", Str name(Friend),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_fn,       parse_global_body( token_fmt( "typename", Str name(Fn),             codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_module,   parse_global_body( token_fmt( "typename", Str name(Module),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_ns,       parse_global_body( token_fmt( "typename", Str name(NS),             codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_op,       parse_global_body( token_fmt( "typename", Str name(Operator),       codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_opcast,   parse_global_body( token_fmt( "typename", Str name(OpCast),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_pragma,   parse_global_body( token_fmt( "typename", Str name(Pragma),         codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_precond,  parse_global_body( token_fmt( "typename", Str name(PreprocessCond), codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_tmpl,     parse_global_body( token_fmt( "typename", Str name(Template),       codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_type,     parse_global_body( token_fmt( "typename", Str name(Typename),       codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_typedef,  parse_global_body( token_fmt( "typename", Str name(Typedef),        codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_union,    parse_global_body( token_fmt( "typename", Str name(Union),          codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_using,    parse_global_body( token_fmt( "typename", Str name(Using),          codetype_impl_tmpl )));
 | 
			
		||||
	body_append(impl_code_var,      parse_global_body( token_fmt( "typename", Str name(Var),            codetype_impl_tmpl )));
 | 
			
		||||
 | 
			
		||||
	#pragma push_macro("forceinline")
 | 
			
		||||
	#undef forceinline
 | 
			
		||||
@@ -582,34 +579,34 @@ CodeBody gen_ast_inlines()
 | 
			
		||||
	);
 | 
			
		||||
	#pragma pop_macro("forceinline")
 | 
			
		||||
 | 
			
		||||
	CodeBody impl_cast_body      = parse_global_body( token_fmt( "typename", StrC name(Body),           cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_attribute = parse_global_body( token_fmt( "typename", StrC name(Attributes),     cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_cmt       = parse_global_body( token_fmt( "typename", StrC name(Comment),        cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_constr    = parse_global_body( token_fmt( "typename", StrC name(Constructor),    cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_class     = parse_global_body( token_fmt( "typename", StrC name(Class),          cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_define    = parse_global_body( token_fmt( "typename", StrC name(Define),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_destruct  = parse_global_body( token_fmt( "typename", StrC name(Destructor),     cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_enum      = parse_global_body( token_fmt( "typename", StrC name(Enum),           cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_exec      = parse_global_body( token_fmt( "typename", StrC name(Exec),           cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_extern    = parse_global_body( token_fmt( "typename", StrC name(Extern),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_friend    = parse_global_body( token_fmt( "typename", StrC name(Friend),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_fn        = parse_global_body( token_fmt( "typename", StrC name(Fn),             cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_include   = parse_global_body( token_fmt( "typename", StrC name(Include),        cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_module    = parse_global_body( token_fmt( "typename", StrC name(Module),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_ns        = parse_global_body( token_fmt( "typename", StrC name(NS),             cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_op        = parse_global_body( token_fmt( "typename", StrC name(Operator),       cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_opcast    = parse_global_body( token_fmt( "typename", StrC name(OpCast),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_params    = parse_global_body( token_fmt( "typename", StrC name(Params),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_pragma    = parse_global_body( token_fmt( "typename", StrC name(Pragma),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_precond   = parse_global_body( token_fmt( "typename", StrC name(PreprocessCond), cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_specs     = parse_global_body( token_fmt( "typename", StrC name(Specifiers),     cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_struct    = parse_global_body( token_fmt( "typename", StrC name(Struct),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_tmpl      = parse_global_body( token_fmt( "typename", StrC name(Template),       cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_type      = parse_global_body( token_fmt( "typename", StrC name(Typename),       cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_typedef   = parse_global_body( token_fmt( "typename", StrC name(Typedef),        cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_union     = parse_global_body( token_fmt( "typename", StrC name(Union),          cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_using     = parse_global_body( token_fmt( "typename", StrC name(Using),          cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_var       = parse_global_body( token_fmt( "typename", StrC name(Var),            cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_body      = parse_global_body( token_fmt( "typename", Str name(Body),           cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_attribute = parse_global_body( token_fmt( "typename", Str name(Attributes),     cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_cmt       = parse_global_body( token_fmt( "typename", Str name(Comment),        cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_constr    = parse_global_body( token_fmt( "typename", Str name(Constructor),    cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_class     = parse_global_body( token_fmt( "typename", Str name(Class),          cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_define    = parse_global_body( token_fmt( "typename", Str name(Define),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_destruct  = parse_global_body( token_fmt( "typename", Str name(Destructor),     cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_enum      = parse_global_body( token_fmt( "typename", Str name(Enum),           cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_exec      = parse_global_body( token_fmt( "typename", Str name(Exec),           cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_extern    = parse_global_body( token_fmt( "typename", Str name(Extern),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_friend    = parse_global_body( token_fmt( "typename", Str name(Friend),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_fn        = parse_global_body( token_fmt( "typename", Str name(Fn),             cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_include   = parse_global_body( token_fmt( "typename", Str name(Include),        cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_module    = parse_global_body( token_fmt( "typename", Str name(Module),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_ns        = parse_global_body( token_fmt( "typename", Str name(NS),             cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_op        = parse_global_body( token_fmt( "typename", Str name(Operator),       cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_opcast    = parse_global_body( token_fmt( "typename", Str name(OpCast),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_params    = parse_global_body( token_fmt( "typename", Str name(Params),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_pragma    = parse_global_body( token_fmt( "typename", Str name(Pragma),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_precond   = parse_global_body( token_fmt( "typename", Str name(PreprocessCond), cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_specs     = parse_global_body( token_fmt( "typename", Str name(Specifiers),     cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_struct    = parse_global_body( token_fmt( "typename", Str name(Struct),         cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_tmpl      = parse_global_body( token_fmt( "typename", Str name(Template),       cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_type      = parse_global_body( token_fmt( "typename", Str name(Typename),       cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_typedef   = parse_global_body( token_fmt( "typename", Str name(Typedef),        cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_union     = parse_global_body( token_fmt( "typename", Str name(Union),          cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_using     = parse_global_body( token_fmt( "typename", Str name(Using),          cast_tmpl ));
 | 
			
		||||
	CodeBody impl_cast_var       = parse_global_body( token_fmt( "typename", Str name(Var),            cast_tmpl ));
 | 
			
		||||
 | 
			
		||||
	CodeBody result = def_global_body( args(
 | 
			
		||||
		def_pragma( txt("region generated code inline implementation")),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user