mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-30 22:40:54 -07:00 
			
		
		
		
	C-library gen progress: Header files mostly done, starting dep c impl and fixes to generic selection generation
This commit is contained in:
		
							
								
								
									
										8
									
								
								gen_c_library/.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								gen_c_library/.editorconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| [*.c] | ||||
| indent_style = tab | ||||
| indent_size  = 4 | ||||
|  | ||||
| [*.cpp] | ||||
| indent_style = tab | ||||
| indent_size  = 2 | ||||
|  | ||||
| @@ -1,3 +1,5 @@ | ||||
| #include <cstdlib>   // for system() | ||||
|  | ||||
| #define GEN_DEFINE_LIBRARY_CODE_CONSTANTS | ||||
| #define GEN_ENFORCE_STRONG_CODE_TYPES | ||||
| #define GEN_EXPOSE_BACKEND | ||||
| @@ -16,7 +18,6 @@ GEN_NS_END | ||||
| #include "auxillary/builder.cpp" | ||||
| #include "auxillary/scanner.hpp" | ||||
|  | ||||
| #include <cstdlib>   // for system() | ||||
|  | ||||
| #include "components/memory.fixed_arena.hpp" | ||||
| #include "components/misc.hpp" | ||||
| @@ -113,6 +114,7 @@ int gen_main() | ||||
| 	PreprocessorDefines.append(txt("GEN_OPTIMIZE_MAPPINGS_BEGIN")); | ||||
| 	PreprocessorDefines.append(txt("GEN_OPITMIZE_MAPPINGS_END")); | ||||
| 	//PreprocessorDefines.append(txt("GEN_EXECUTION_EXPRESSION_SUPPORT")); | ||||
| 	PreprocessorDefines.append(txt("GEN_PARAM_DEFAULT")); | ||||
|  | ||||
| 	Code push_ignores           = scan_file( project_dir "helpers/push_ignores.inline.hpp" ); | ||||
| 	Code pop_ignores            = scan_file( project_dir "helpers/pop_ignores.inline.hpp" ); | ||||
| @@ -132,58 +134,57 @@ int gen_main() | ||||
| 		// Only has operator overload definitions that C doesn't need. | ||||
| 		// CodeBody ast_inlines = gen_ast_inlines(); | ||||
|  | ||||
| 		Code interface  = scan_file( project_dir "components/interface.hpp" ); | ||||
| 		Code inlines 	= scan_file( project_dir "components/inlines.hpp" ); | ||||
| 		Code header_end = scan_file( project_dir "components/header_end.hpp" ); | ||||
|  | ||||
| 		CodeBody ecode       = gen_ecode     ( project_dir "enums/ECodeTypes.csv", helper_use_c_definition ); | ||||
| 		CodeBody eoperator   = gen_eoperator ( project_dir "enums/EOperator.csv",  helper_use_c_definition ); | ||||
| 		CodeBody especifier  = gen_especifier( project_dir "enums/ESpecifier.csv", helper_use_c_definition ); | ||||
|  | ||||
| 		// The following pattern will be used throughout parsing: | ||||
| 		// for ( Code entry = parsed_<name_of_file>.begin(); entry != parsed_<name_of_file>.end(); ++ entry ) switch(entry->Type) | ||||
| 		// it provides a concise scope for inspecting a file scope ast and nested code bodies (struct bodies, etc) | ||||
|  | ||||
| 		CodeBody parsed_types = parse_file( project_dir "components/types.hpp" ); | ||||
| 		CodeBody types        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_types.begin(); entry != parsed_types.end(); ++ entry ) | ||||
| 		for ( Code entry = parsed_types.begin(); entry != parsed_types.end(); ++ entry ) switch(entry->Type) | ||||
| 		{ | ||||
| 			switch(entry->Type) | ||||
| 			case CT_Using: | ||||
| 			{ | ||||
| 				case CT_Using: | ||||
| 				{ | ||||
| 					CodeUsing using_ver = cast(CodeUsing, entry); | ||||
| 				CodeUsing using_ver = cast(CodeUsing, entry); | ||||
|  | ||||
| 					if (using_ver->UnderlyingType->ReturnType) | ||||
| 					{ | ||||
| 						CodeTypename type       = using_ver->UnderlyingType; | ||||
| 						CodeTypedef typedef_ver = parse_typedef(token_fmt( | ||||
| 							"ReturnType", to_string(type->ReturnType).to_strc() | ||||
| 						,	"Name"      , using_ver->Name | ||||
| 						,	"Parameters", to_string(type->Params).to_strc() | ||||
| 						,	stringize( | ||||
| 								typedef <ReturnType>( * <Name>)(<Parameters>); | ||||
| 						))); | ||||
| 						types.append(typedef_ver); | ||||
| 						break; | ||||
| 					} | ||||
| 					CodeTypedef typedef_ver = def_typedef(using_ver->Name, using_ver->UnderlyingType); | ||||
| 				if (using_ver->UnderlyingType->ReturnType) | ||||
| 				{ | ||||
| 					CodeTypename type       = using_ver->UnderlyingType; | ||||
| 					CodeTypedef typedef_ver = parse_typedef(token_fmt( | ||||
| 						"ReturnType", to_string(type->ReturnType).to_strc() | ||||
| 					,	"Name"      , using_ver->Name | ||||
| 					,	"Parameters", to_string(type->Params).to_strc() | ||||
| 					,	stringize( | ||||
| 							typedef <ReturnType>( * <Name>)(<Parameters>); | ||||
| 					))); | ||||
| 					types.append(typedef_ver); | ||||
| 					break; | ||||
| 				} | ||||
| 				break; | ||||
|  | ||||
| 				case CT_Enum: | ||||
| 				{ | ||||
| 					log_fmt("Detected ENUM: %S", entry->Name); | ||||
| 					convert_cpp_enum_to_c(cast(CodeEnum, entry), types); | ||||
| 				} | ||||
| 				break; | ||||
|  | ||||
| 				default: | ||||
| 					types.append(entry); | ||||
| 				break; | ||||
| 				CodeTypedef typedef_ver = def_typedef(using_ver->Name, using_ver->UnderlyingType); | ||||
| 				types.append(typedef_ver); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			case CT_Enum: | ||||
| 			{ | ||||
| 				//log_fmt("Detected ENUM: %S", entry->Name); | ||||
| 				convert_cpp_enum_to_c(cast(CodeEnum, entry), types); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			default: | ||||
| 				types.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		CodeBody parsed_ast = parse_file( project_dir "components/ast.hpp" ); | ||||
| 		CodeBody ast        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_ast.begin(); entry != parsed_ast.end(); ++ entry ) | ||||
| 		switch (entry->Type) | ||||
| 		for ( Code entry = parsed_ast.begin(); entry != parsed_ast.end(); ++ entry ) switch (entry->Type) | ||||
| 		{ | ||||
| 			case CT_Preprocess_If: | ||||
| 			{ | ||||
| @@ -230,21 +231,22 @@ int gen_main() | ||||
|  | ||||
| 				s32 constexpr_found = var->Specs ? var->Specs.remove( Spec_Constexpr ) : - 1; | ||||
| 				if (constexpr_found > -1) { | ||||
| 					log_fmt("Found constexpr: %S\n", entry.to_string()); | ||||
| 					//log_fmt("Found constexpr: %S\n", entry.to_string()); | ||||
| 					if (var->Name.contains(txt("AST_ArrSpecs_Cap"))) | ||||
| 					{ | ||||
| 						Code def = untyped_str(txt( | ||||
| R"(#define AST_ArrSpecs_Cap       \ | ||||
| (                                 \ | ||||
|         AST_POD_Size              \ | ||||
| 		- sizeof(StringCached)    \ | ||||
| 		- sizeof(AST*) * 3        \ | ||||
| 		- sizeof(Token*)          \ | ||||
| 		- sizeof(AST*)            \ | ||||
| 		- sizeof(CodeType)        \ | ||||
| 		- sizeof(ModuleFlag)      \ | ||||
| 		- sizeof(u32)             \ | ||||
| )                                 \ | ||||
| R"(#define AST_ArrSpecs_Cap    \ | ||||
| (                              \ | ||||
|         AST_POD_Size           \ | ||||
| 		- sizeof(Code)         \ | ||||
| 		- sizeof(StringCached) \ | ||||
| 		- sizeof(Code) * 2     \ | ||||
| 		- sizeof(Token*)       \ | ||||
| 		- sizeof(Code)         \ | ||||
| 		- sizeof(CodeType)     \ | ||||
| 		- sizeof(ModuleFlag)   \ | ||||
| 		- sizeof(u32)          \ | ||||
| )                              \ | ||||
| / sizeof(Specifier) - 1 | ||||
| )" | ||||
| 						)); | ||||
| @@ -263,6 +265,7 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
| 				ast.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		CodeBody parsed_code_types = parse_file( project_dir "components/code_types.hpp" ); | ||||
| 		CodeBody code_types        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_code_types.begin(); entry != parsed_code_types.end(); ++ entry ) switch( entry->Type ) | ||||
| @@ -286,6 +289,7 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
| 				code_types.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		CodeBody parsed_ast_types = parse_file( project_dir "components/ast_types.hpp" ); | ||||
| 		CodeBody ast_types        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_ast_types.begin(); entry != parsed_ast_types.end(); ++ entry ) switch( entry->Type ) | ||||
| @@ -302,9 +306,29 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
|  | ||||
| 			case CT_Struct: | ||||
| 			{ | ||||
| 				CodeStruct struct_def = cast(CodeStruct, entry); | ||||
| 				CodeTypedef tdef = parse_typedef(token_fmt("name", struct_def->Name, stringize( typedef struct <name> <name>; ))); | ||||
| 				ast_types.append(struct_def); | ||||
| 				CodeBody body = cast(CodeBody, entry->Body); | ||||
| 				for ( Code body_entry = body.begin(); body_entry != body.end(); ++ body_entry ) switch (body_entry->Type) | ||||
| 				{ | ||||
| 					case CT_Union: | ||||
| 					{ | ||||
| 						Code union_entry = body_entry->Body->Front; | ||||
| 						if ( body_entry && union_entry->Name.is_equal(txt("_PAD_")) ) | ||||
| 						{ | ||||
| 							char conversion_buf[32] = {}; | ||||
| 							u64_to_str(size_of(AST_Body::_PAD_), conversion_buf, 10); | ||||
|  | ||||
| 							StrC arr_exp  = union_entry->ValueType->ArrExpr->Content; | ||||
| 							StrC cpp_size = to_strc_from_c_str(conversion_buf); | ||||
| 							union_entry->ValueType->ArrExpr = untyped_str( cpp_size ); | ||||
| 							union_entry->InlineCmt          = untyped_str(token_fmt("arr_exp", arr_exp, | ||||
| 								"// Had to hardcode _PAD_ because (<arr_exp>) was 67 bytes in C\n" | ||||
| 								"// instead of 64 like C++'s AST_Body::_PAD_\n" | ||||
| 							)); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				CodeTypedef tdef = parse_typedef(token_fmt("name", entry->Name, stringize( typedef struct <name> <name>; ))); | ||||
| 				ast_types.append(entry); | ||||
| 				ast_types.append(tdef); | ||||
| 			} | ||||
| 			break; | ||||
| @@ -313,6 +337,73 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
| 				ast_types.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		CodeBody parsed_interface = parse_file( project_dir "components/interface.hpp" ); | ||||
| 		CodeBody interface        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_interface.begin(); entry != parsed_interface.end(); ++ entry ) switch( entry->Type ) | ||||
| 		{ | ||||
| 			case CT_Preprocess_IfDef: | ||||
| 			{ | ||||
| 				b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_code_types, code_types ); | ||||
| 				if (found) break; | ||||
|  | ||||
| 				interface.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			case CT_Function_Fwd: | ||||
| 			case CT_Function: | ||||
| 			{ | ||||
| 				CodeFn fn = cast(CodeFn, entry); | ||||
| 				Code prev = entry->Prev; | ||||
| 				if (prev && prev->Name.is_equal(entry->Name)) { | ||||
| 					String postfix_arr = String::fmt_buf(GlobalAllocator, "%SC_arr", entry->Name); | ||||
| 					entry->Name = get_cached_string(postfix_arr.to_strc()); | ||||
| 					postfix_arr.free(); | ||||
| 				} | ||||
| 				interface.append(fn); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			case CT_Struct: | ||||
| 			{ | ||||
| 				CodeTypedef tdef = parse_typedef(token_fmt("name", entry->Name, stringize( typedef struct <name> <name>; ))); | ||||
| 				interface.append(entry); | ||||
| 				interface.append(tdef); | ||||
| 				interface.append(fmt_newline); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			default: | ||||
| 				interface.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		s32 idx = 0; | ||||
| 		CodeBody parsed_header_end = parse_file( project_dir "components/header_end.hpp" ); | ||||
| 		CodeBody header_end        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_header_end.begin(); entry != parsed_header_end.end(); ++ entry, ++ idx ) switch( entry->Type ) | ||||
| 		{ | ||||
| 			case CT_Variable: | ||||
| 			{ | ||||
| 				CodeVar var = cast(CodeVar, entry); | ||||
| 				if (var->Specs) | ||||
| 				{ | ||||
| 					s32 constexpr_found = var->Specs.remove( Spec_Constexpr ); | ||||
| 					if (constexpr_found > -1) { | ||||
| 						CodeDefine define = def_define(entry->Name, entry->Value->Content); | ||||
| 						header_end.append(define); | ||||
| 						continue; | ||||
| 					} | ||||
| 				} | ||||
| 				header_end.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			default: | ||||
| 				header_end.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
| #pragma endregion Scan, Parse, and Generate Components | ||||
|  | ||||
| #pragma region Scan, Parse, and Generate Dependencies | ||||
| @@ -326,163 +417,157 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
|  | ||||
| 		CodeBody parsed_memory = parse_file( project_dir "dependencies/memory.hpp" ); | ||||
| 		CodeBody memory        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_memory.begin(); entry != parsed_memory.end(); ++ entry ) | ||||
| 		for ( Code entry = parsed_memory.begin(); entry != parsed_memory.end(); ++ entry ) switch (entry->Type) | ||||
| 		{ | ||||
| 			switch (entry->Type) | ||||
| 			case CT_Using: | ||||
| 			{ | ||||
| 				case CT_Using: | ||||
| 				{ | ||||
| 					log_fmt("REPLACE THIS MANUALLY: %SC\n", entry->Name); | ||||
| 					CodeUsing   using_ver   = cast(CodeUsing, entry); | ||||
| 					CodeTypedef typedef_ver = def_typedef(using_ver->Name, using_ver->UnderlyingType); | ||||
| 				log_fmt("REPLACE THIS MANUALLY: %SC\n", entry->Name); | ||||
| 				CodeUsing   using_ver   = cast(CodeUsing, entry); | ||||
| 				CodeTypedef typedef_ver = def_typedef(using_ver->Name, using_ver->UnderlyingType); | ||||
|  | ||||
| 					memory.append(typedef_ver); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Function_Fwd: | ||||
| 				{ | ||||
| 					CodeFn fn = cast(CodeFn, entry); | ||||
| 					// for ( StrC id : to_rename ) if (fn->Name.is_equal(id)) { | ||||
| 					// 	rename_function_to_unique_symbol(fn); | ||||
| 					// } | ||||
| 					memory.append(fn); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Function: | ||||
| 				{ | ||||
| 					CodeFn fn = cast(CodeFn, entry); | ||||
| 					if (fn->Specs) { | ||||
| 						s32 constexpr_found = fn->Specs.remove( Spec_Constexpr ); | ||||
| 						if (constexpr_found > -1) { | ||||
| 							log_fmt("Found constexpr: %S\n", entry.to_string()); | ||||
| 							fn->Specs.append(Spec_Inline); | ||||
| 						} | ||||
| 					} | ||||
| 					memory.append(fn); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Template: | ||||
| 				{ | ||||
| 					CodeTemplate tmpl = cast(CodeTemplate, entry); | ||||
| 					if ( tmpl->Declaration->Name.contains(txt("swap"))) | ||||
| 					{ | ||||
| 						CodeBody macro_swap = parse_global_body( txt(R"( | ||||
| #define swap( a, b )              \ | ||||
| 	do                            \ | ||||
| 	{                             \ | ||||
| 		typeof( a ) temp = ( a ); \ | ||||
| 		( a )            = ( b ); \ | ||||
| 		( b )            = temp;  \ | ||||
| 	} while ( 0 ) | ||||
| )" | ||||
| 						)); | ||||
| 						memory.append(macro_swap); | ||||
| 					} | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Enum: | ||||
| 				{ | ||||
| 					convert_cpp_enum_to_c(cast(CodeEnum, entry), memory); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Struct_Fwd: | ||||
| 				{ | ||||
| 					CodeTypedef tdef = parse_typedef(token_fmt("name", entry->Name, stringize( typedef struct <name> <name>; ))); | ||||
| 					memory.append(entry); | ||||
| 					memory.append(tdef); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Class: | ||||
| 				case CT_Struct: | ||||
| 				{ | ||||
| 					CodeBody body     = cast(CodeBody, entry->Body); | ||||
| 					CodeBody new_body = def_body( entry->Body->Type ); | ||||
| 					for ( Code body_entry = body.begin(); body_entry != body.end(); ++ body_entry ) switch | ||||
| 					(body_entry->Type) { | ||||
| 						case CT_Preprocess_If: | ||||
| 						{ | ||||
| 							b32 found = ignore_preprocess_cond_block(txt("GEN_COMPILER_CPP && ! GEN_C_LIKE_CPP"), body_entry, body, new_body ); | ||||
| 							if (found) break; | ||||
| 						} | ||||
| 						break; | ||||
|  | ||||
| 						default: | ||||
| 							new_body.append(body_entry); | ||||
| 						break; | ||||
| 					} | ||||
| 					entry->Body = new_body; | ||||
|  | ||||
| 					CodeTypedef tdef = parse_typedef(token_fmt("name", entry->Name, stringize( typedef struct <name> <name>; ))); | ||||
| 					memory.append(entry); | ||||
| 					memory.append(tdef); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Preprocess_If: | ||||
| 				{ | ||||
| 					b32 found = ignore_preprocess_cond_block(txt("! GEN_C_LIKE_CPP"), entry, parsed_memory, memory ); | ||||
| 					if (found) break; | ||||
|  | ||||
| 					memory.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Preprocess_IfDef: | ||||
| 				{ | ||||
| 					b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_memory, memory ); | ||||
| 					if (found) break; | ||||
|  | ||||
| 					memory.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Preprocess_Pragma: | ||||
| 				{ | ||||
| 					CodePragma pragma = cast(CodePragma, entry); | ||||
| 					// if (pragma->Content.starts_with(txt("region Memory"))) { | ||||
| 					// 	memory.append(generic_test); | ||||
| 					// 	break; | ||||
| 					// } | ||||
|  | ||||
| 					b32 found = swap_pragma_region_implementation( txt("FixedArena"), gen_fixed_arenas, entry, memory); | ||||
| 					if (found) break; | ||||
|  | ||||
| 					memory.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
| 				default: { | ||||
| 					memory.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
| 				memory.append(typedef_ver); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Function_Fwd: | ||||
| 			{ | ||||
| 				CodeFn fn = cast(CodeFn, entry); | ||||
| 				// for ( StrC id : to_rename ) if (fn->Name.is_equal(id)) { | ||||
| 				// 	rename_function_to_unique_symbol(fn); | ||||
| 				// } | ||||
| 				memory.append(fn); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Function: | ||||
| 			{ | ||||
| 				CodeFn fn = cast(CodeFn, entry); | ||||
| 				if (fn->Specs) { | ||||
| 					s32 constexpr_found = fn->Specs.remove( Spec_Constexpr ); | ||||
| 					if (constexpr_found > -1) { | ||||
| 						//log_fmt("Found constexpr: %S\n", entry.to_string()); | ||||
| 						fn->Specs.append(Spec_Inline); | ||||
| 					} | ||||
| 				} | ||||
| 				memory.append(fn); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Template: | ||||
| 			{ | ||||
| 				CodeTemplate tmpl = cast(CodeTemplate, entry); | ||||
| 				if ( tmpl->Declaration->Name.contains(txt("swap"))) | ||||
| 				{ | ||||
| 					CodeBody macro_swap = parse_global_body( txt(R"( | ||||
| #define swap( a, b )              \ | ||||
| do                            \ | ||||
| {                             \ | ||||
| 	typeof( a ) temp = ( a ); \ | ||||
| 	( a )            = ( b ); \ | ||||
| 	( b )            = temp;  \ | ||||
| } while ( 0 ) | ||||
| )" | ||||
| 					)); | ||||
| 					memory.append(macro_swap); | ||||
| 				} | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Enum: | ||||
| 			{ | ||||
| 				convert_cpp_enum_to_c(cast(CodeEnum, entry), memory); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Struct_Fwd: | ||||
| 			{ | ||||
| 				CodeTypedef tdef = parse_typedef(token_fmt("name", entry->Name, stringize( typedef struct <name> <name>; ))); | ||||
| 				memory.append(entry); | ||||
| 				memory.append(tdef); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Class: | ||||
| 			case CT_Struct: | ||||
| 			{ | ||||
| 				CodeBody body     = cast(CodeBody, entry->Body); | ||||
| 				CodeBody new_body = def_body( entry->Body->Type ); | ||||
| 				for ( Code body_entry = body.begin(); body_entry != body.end(); ++ body_entry ) switch | ||||
| 				(body_entry->Type) { | ||||
| 					case CT_Preprocess_If: | ||||
| 					{ | ||||
| 						b32 found = ignore_preprocess_cond_block(txt("GEN_COMPILER_CPP && ! GEN_C_LIKE_CPP"), body_entry, body, new_body ); | ||||
| 						if (found) break; | ||||
| 					} | ||||
| 					break; | ||||
|  | ||||
| 					default: | ||||
| 						new_body.append(body_entry); | ||||
| 					break; | ||||
| 				} | ||||
| 				entry->Body = new_body; | ||||
|  | ||||
| 				CodeTypedef tdef = parse_typedef(token_fmt("name", entry->Name, stringize( typedef struct <name> <name>; ))); | ||||
| 				memory.append(entry); | ||||
| 				memory.append(tdef); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Preprocess_If: | ||||
| 			{ | ||||
| 				b32 found = ignore_preprocess_cond_block(txt("! GEN_C_LIKE_CPP"), entry, parsed_memory, memory ); | ||||
| 				if (found) break; | ||||
|  | ||||
| 				memory.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Preprocess_IfDef: | ||||
| 			{ | ||||
| 				b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_memory, memory ); | ||||
| 				if (found) break; | ||||
|  | ||||
| 				memory.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Preprocess_Pragma: | ||||
| 			{ | ||||
| 				CodePragma pragma = cast(CodePragma, entry); | ||||
| 				// if (pragma->Content.starts_with(txt("region Memory"))) { | ||||
| 				// 	memory.append(generic_test); | ||||
| 				// 	break; | ||||
| 				// } | ||||
|  | ||||
| 				b32 found = swap_pragma_region_implementation( txt("FixedArena"), gen_fixed_arenas, entry, memory); | ||||
| 				if (found) break; | ||||
|  | ||||
| 				memory.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| 			default: { | ||||
| 				memory.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		CodeBody printing_parsed = parse_file( project_dir "dependencies/printing.hpp" ); | ||||
| 		CodeBody printing        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = printing_parsed.begin(); entry != printing_parsed.end(); ++ entry ) | ||||
| 		for ( Code entry = printing_parsed.begin(); entry != printing_parsed.end(); ++ entry ) switch (entry->Type) | ||||
| 		{ | ||||
| 			switch (entry->Type) | ||||
| 			case CT_Preprocess_IfDef: | ||||
| 			{ | ||||
| 				case CT_Preprocess_IfDef: | ||||
| 				{ | ||||
| 					b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, printing_parsed, printing ); | ||||
| 					if (found) break; | ||||
| 				b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, printing_parsed, printing ); | ||||
| 				if (found) break; | ||||
|  | ||||
| 					printing.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
| 				case CT_Variable: | ||||
| 				{ | ||||
| 					if ( strc_contains(entry->Name, txt("Msg_Invalid_Value"))) | ||||
| 					{ | ||||
| 						CodeDefine define = def_define(entry->Name, entry->Value->Content); | ||||
| 						printing.append(define); | ||||
| 						continue; | ||||
| 					} | ||||
| 					printing.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
| 				default: | ||||
| 					printing.append(entry); | ||||
| 				break; | ||||
| 				printing.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| 			case CT_Variable: | ||||
| 			{ | ||||
| 				if ( strc_contains(entry->Name, txt("Msg_Invalid_Value"))) | ||||
| 				{ | ||||
| 					CodeDefine define = def_define(entry->Name, entry->Value->Content); | ||||
| 					printing.append(define); | ||||
| 					continue; | ||||
| 				} | ||||
| 				printing.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| 			default: | ||||
| 				printing.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		CodeBody parsed_strings = parse_file( project_dir "dependencies/strings.hpp" ); | ||||
| @@ -520,7 +605,7 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
|  | ||||
| 			case CT_Preprocess_IfNotDef: | ||||
| 			{ | ||||
| 				log_fmt("\nIFNDEF: %SC\n", entry->Content); | ||||
| 				//log_fmt("\nIFNDEF: %SC\n", entry->Content); | ||||
| 				strings.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| @@ -589,73 +674,73 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
|  | ||||
| 		CodeBody parsed_filesystem = parse_file( project_dir "dependencies/filesystem.hpp" ); | ||||
| 		CodeBody filesystem        = def_body(CT_Global_Body); | ||||
| 		for ( Code entry = parsed_filesystem.begin(); entry != parsed_filesystem.end(); ++ entry ) | ||||
| 		for ( Code entry = parsed_filesystem.begin(); entry != parsed_filesystem.end(); ++ entry ) switch (entry->Type) | ||||
| 		{ | ||||
| 			switch (entry->Type) | ||||
| 			case CT_Preprocess_IfDef: | ||||
| 			{ | ||||
| 				case CT_Preprocess_IfDef: | ||||
| 				{ | ||||
| 					b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_filesystem, filesystem ); | ||||
| 					if (found) break; | ||||
| 				b32 found = ignore_preprocess_cond_block(txt("GEN_INTELLISENSE_DIRECTIVES"), entry, parsed_filesystem, filesystem ); | ||||
| 				if (found) break; | ||||
|  | ||||
| 					filesystem.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
|  | ||||
| 				case CT_Enum: | ||||
| 				{ | ||||
| 					if (entry->Name.is_equal(txt("FileOperations"))) | ||||
| 						continue; | ||||
| 					convert_cpp_enum_to_c(cast(CodeEnum, entry), filesystem); | ||||
| 				} | ||||
| 				break; | ||||
|  | ||||
| 				case CT_Enum_Fwd: | ||||
| 				case CT_Struct_Fwd: | ||||
| 				case CT_Struct: | ||||
| 				case CT_Union: | ||||
| 				case CT_Union_Fwd: | ||||
| 				{ | ||||
| 					StrC type_str      = codetype_to_keyword_str(entry->Type); | ||||
| 					StrC formated_tmpl = token_fmt_impl( 3, | ||||
| 						"type", type_str | ||||
| 					,	"name", entry->Name, | ||||
| 					stringize( | ||||
| 						typedef <type> <name> <name>; | ||||
| 					)); | ||||
| 					CodeTypedef tdef = parse_typedef(formated_tmpl); | ||||
| 					filesystem.append(entry); | ||||
| 					filesystem.append(tdef); | ||||
| 				} | ||||
| 				break; | ||||
|  | ||||
| 				case CT_Variable: | ||||
| 				{ | ||||
| 					CodeVar var = cast(CodeVar, entry); | ||||
| 					if (var->Specs.has(Spec_Constexpr) > -1) | ||||
| 					{ | ||||
| 						CodeDefine define = def_define(entry->Name, entry->Value->Content); | ||||
| 						filesystem.append(define); | ||||
| 						continue; | ||||
| 					} | ||||
| 					//if ( strc_contains(entry->Name, txt("Msg_Invalid_Value"))) | ||||
| 					//{ | ||||
| 					//	CodeDefine define = def_define(entry->Name, entry->Value->Content); | ||||
| 					//	printing.append(define); | ||||
| 					//	continue; | ||||
| 					//} | ||||
| 					filesystem.append(entry); | ||||
| 				} | ||||
| 				break; | ||||
| 				default: | ||||
| 					filesystem.append(entry); | ||||
| 				break; | ||||
| 				filesystem.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			case CT_Enum: | ||||
| 			{ | ||||
| 				if (entry->Name.is_equal(txt("FileOperations"))) | ||||
| 					continue; | ||||
| 				convert_cpp_enum_to_c(cast(CodeEnum, entry), filesystem); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			case CT_Enum_Fwd: | ||||
| 			case CT_Struct_Fwd: | ||||
| 			case CT_Struct: | ||||
| 			case CT_Union: | ||||
| 			case CT_Union_Fwd: | ||||
| 			{ | ||||
| 				StrC type_str      = codetype_to_keyword_str(entry->Type); | ||||
| 				StrC formated_tmpl = token_fmt_impl( 3, | ||||
| 					"type", type_str | ||||
| 				,	"name", entry->Name, | ||||
| 				stringize( | ||||
| 					typedef <type> <name> <name>; | ||||
| 				)); | ||||
| 				CodeTypedef tdef = parse_typedef(formated_tmpl); | ||||
| 				filesystem.append(entry); | ||||
| 				filesystem.append(tdef); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 			case CT_Variable: | ||||
| 			{ | ||||
| 				CodeVar var = cast(CodeVar, entry); | ||||
| 				if (var->Specs.has(Spec_Constexpr) > -1) | ||||
| 				{ | ||||
| 					CodeDefine define = def_define(entry->Name, entry->Value->Content); | ||||
| 					filesystem.append(define); | ||||
| 					continue; | ||||
| 				} | ||||
| 				//if ( strc_contains(entry->Name, txt("Msg_Invalid_Value"))) | ||||
| 				//{ | ||||
| 				//	CodeDefine define = def_define(entry->Name, entry->Value->Content); | ||||
| 				//	printing.append(define); | ||||
| 				//	continue; | ||||
| 				//} | ||||
| 				filesystem.append(entry); | ||||
| 			} | ||||
| 			break; | ||||
| 			default: | ||||
| 				filesystem.append(entry); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		CodeBody array_string_cached = gen_array(txt("StringCached"), txt("Array_StringCached")); | ||||
|  | ||||
| 		CodeBody containers = def_body(CT_Global_Body); | ||||
| 		{ | ||||
| 			CodeBody array_ssize = gen_array(txt("ssize"), txt("Array_ssize")); | ||||
| 			CodeBody array_u8    = gen_array(txt("u8"),    txt("Array_u8")); | ||||
|  | ||||
| 			containers.append( def_pragma(code(region Containers))); | ||||
|  | ||||
| @@ -667,6 +752,7 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
| 			containers.append( gen_hashtable_generic_selection_interface()); | ||||
|  | ||||
| 			containers.append(array_ssize); | ||||
| 			containers.append(array_u8); | ||||
|  | ||||
| 			containers.append( def_pragma(code(endregion Containers))); | ||||
| 			containers.append(fmt_newline); | ||||
| @@ -684,6 +770,7 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
| 		header.print( dump_to_scratch_and_retireve(memory) ); | ||||
| 		header.print( dump_to_scratch_and_retireve(printing)); | ||||
| 		header.print( string_ops ); | ||||
| 		header.print(fmt_newline); | ||||
| 		header.print( dump_to_scratch_and_retireve(containers)); | ||||
| 		header.print( hashing ); | ||||
| 		header.print( dump_to_scratch_and_retireve(strings)); | ||||
| @@ -695,7 +782,6 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
|  | ||||
| 		header.print(fmt_newline); | ||||
|  | ||||
| #if 1 | ||||
| #pragma region region Print Components | ||||
| 		header.print_fmt( "GEN_NS_BEGIN\n" ); | ||||
| 		header.print_fmt( "GEN_API_C_BEGIN\n\n" ); | ||||
| @@ -716,17 +802,87 @@ R"(#define AST_ArrSpecs_Cap       \ | ||||
| 		header.print( dump_to_scratch_and_retireve(ast_types) ); | ||||
| 		header.print_fmt("\n#pragma endregion AST\n"); | ||||
|  | ||||
| 		header.print( dump_to_scratch_and_retireve(interface) ); | ||||
|  | ||||
| 		header.print_fmt("#pragma region Inlines\n"); | ||||
| 		header.print( inlines ); | ||||
| 		header.print_fmt("#pragma endregion Inlines\n"); | ||||
|  | ||||
| 		header.print(fmt_newline); | ||||
| 		header.print( dump_to_scratch_and_retireve(array_string_cached)); | ||||
| 		header.print(fmt_newline); | ||||
|  | ||||
| 		header.print( dump_to_scratch_and_retireve(header_end) ); | ||||
|  | ||||
| 		header.print_fmt( "\nGEN_API_C_END\n" ); | ||||
|  | ||||
| 		header.print_fmt( "GEN_NS_END\n\n" ); | ||||
| #pragma endregion Print Compoennts | ||||
| #endif | ||||
| 	} | ||||
|  | ||||
| 	// Implementation | ||||
| 	{ | ||||
| 		header.print_fmt( implementation_guard_start ); | ||||
|  | ||||
| #pragma region Scan, Parse, and Generate Dependencies | ||||
| 			Code impl_start = scan_file( project_dir "dependencies/src_start.cpp" ); | ||||
| 			Code debug      = scan_file( project_dir "dependencies/debug.cpp" ); | ||||
| 			Code string_ops = scan_file( project_dir "dependencies/string_ops.cpp" ); | ||||
| 			Code printing   = scan_file( project_dir "dependencies/printing.cpp" ); | ||||
| 			Code memory     = scan_file( project_dir "dependencies/memory.cpp" ); | ||||
| 			Code hashing    = scan_file( project_dir "dependencies/hashing.cpp" ); | ||||
| 			Code strings    = scan_file( project_dir "dependencies/strings.cpp" ); | ||||
| 			Code filesystem = scan_file( project_dir "dependencies/filesystem.cpp" ); | ||||
| 			Code timing     = scan_file( project_dir "dependencies/timing.cpp" ); | ||||
| #pragma region Scan, Parse, and Generate Dependencies | ||||
|  | ||||
| #pragma region Scan, Parse, and Generate Components | ||||
| 		Code static_data 	   = scan_file( project_dir "components/static_data.cpp" ); | ||||
| 		Code ast_case_macros   = scan_file( project_dir "components/ast_case_macros.cpp" ); | ||||
| 		Code ast               = scan_file( project_dir "components/ast.cpp" ); | ||||
| 		Code code              = scan_file( project_dir "components/code_serialization.cpp" ); | ||||
| 		Code interface         = scan_file( project_dir "components/interface.cpp" ); | ||||
| 		Code upfront           = scan_file( project_dir "components/interface.upfront.cpp" ); | ||||
| 		Code lexer             = scan_file( project_dir "components/lexer.cpp" ); | ||||
| 		Code parser            = scan_file( project_dir "components/parser.cpp" ); | ||||
| 		Code parsing_interface = scan_file( project_dir "components/interface.parsing.cpp" ); | ||||
| 		Code untyped           = scan_file( project_dir "components/interface.untyped.cpp" ); | ||||
| #pragma endregion Scan, Parse, and Generate Components | ||||
|  | ||||
| #pragma region Print Dependencies | ||||
| 		header.print_fmt( roll_own_dependencies_guard_start ); | ||||
| 		header.print_fmt( "GEN_NS_BEGIN\n\n"); | ||||
|  | ||||
| 		header.print( impl_start ); | ||||
| 		header.print( debug ); | ||||
| 		header.print( string_ops ); | ||||
| 		header.print( printing ); | ||||
| 		header.print( memory ); | ||||
| 		header.print( hashing ); | ||||
| 		header.print( strings ); | ||||
| 		header.print( filesystem ); | ||||
| 		header.print( timing ); | ||||
|  | ||||
| 		header.print_fmt( "\n#pragma region Parsing\n" ); | ||||
| 		header.print( scan_file( project_dir "dependencies/parsing.cpp" ) ); | ||||
| 		header.print_fmt( "#pragma endregion Parsing\n\n" ); | ||||
|  | ||||
| 		header.print_fmt( "GEN_NS_END\n"); | ||||
| 		header.print_fmt( roll_own_dependencies_guard_end ); | ||||
|  | ||||
| #pragma endregion Print Dependencies | ||||
|  | ||||
| #pragma region Print Components | ||||
|  | ||||
| #pragma endregion Print Components | ||||
|  | ||||
| 		header.print_fmt( implementation_guard_end ); | ||||
| 	} | ||||
|  | ||||
| 	header.print( pop_ignores ); | ||||
| 	header.write(); | ||||
|  | ||||
| 	// format_file( "gen/gen.h" ); | ||||
| 	//k | ||||
|  | ||||
| 	gen::deinit(); | ||||
| 	return 0; | ||||
|   | ||||
| @@ -21,8 +21,9 @@ CodeBody gen_array_base() | ||||
|  | ||||
| 	Code grow_formula = untyped_str( txt( "#define array_grow_formula( value ) ( 2 * value + 8 )\n" )); | ||||
| 	Code get_header   = untyped_str( txt( "#define array_get_header( self ) ( (ArrayHeader*)( self ) - 1)\n" )); | ||||
| 	Code type_define  = untyped_str( txt( "#define Array(Type) Array_##Type\n")); | ||||
|  | ||||
| 	return def_global_body( args( fmt_newline, td_header, header, grow_formula, get_header, fmt_newline ) ); | ||||
| 	return def_global_body( args( fmt_newline, td_header, header, type_define, grow_formula, get_header, fmt_newline ) ); | ||||
| }; | ||||
|  | ||||
| CodeBody gen_array( StrC type, StrC array_name ) | ||||
| @@ -68,7 +69,7 @@ CodeBody gen_array( StrC type, StrC array_name ) | ||||
| 		<array_type> <fn>_init( AllocatorInfo allocator ) | ||||
| 		{ | ||||
| 			size_t initial_size = array_grow_formula(0); | ||||
| 			return array_init_reserve( <array_type>, allocator, initial_size ); | ||||
| 			return array_init_reserve( <type>, allocator, initial_size ); | ||||
| 		} | ||||
|  | ||||
| 		inline | ||||
| @@ -362,24 +363,24 @@ CodeBody gen_array( StrC type, StrC array_name ) | ||||
| 	++ Array_DefinitionCounter; | ||||
| 	StrC slot_str = String::fmt_buf(GlobalAllocator, "%d", Array_DefinitionCounter).to_strc(); | ||||
|  | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type_delimiter", (StrC)array_type, "slot", (StrC)slot_str, | ||||
| R"(#define GENERIC_SLOT_<slot>__array_init         <type_delimiter>,  <type_delimiter>_init | ||||
| #define GENERIC_SLOT_<slot>__array_init_reserve    <type_delimiter>,  <type_delimiter>_init_reserve | ||||
| #define GENERIC_SLOT_<slot>__array_append          <type_delimiter>,  <type_delimiter>_append | ||||
| #define GENERIC_SLOT_<slot>__array_append_items    <type_delimiter>,  <type_delimiter>_append_items | ||||
| #define GENERIC_SLOT_<slot>__array_append_at       <type_delimiter>,  <type_delimiter>_append_at | ||||
| #define GENERIC_SLOT_<slot>__array_append_items_at <type_delimiter>,  <type_delimiter>_append_items_at | ||||
| #define GENERIC_SLOT_<slot>__array_back            <type_delimiter>,  <type_delimiter>_back | ||||
| #define GENERIC_SLOT_<slot>__array_clear           <type_delimiter>,  <type_delimiter>_clear | ||||
| #define GENERIC_SLOT_<slot>__array_fill            <type_delimiter>,  <type_delimiter>_fill | ||||
| #define GENERIC_SLOT_<slot>__array_free            <type_delimiter>,  <type_delimiter>_free | ||||
| #define GENERIC_SLOT_<slot>__array_grow            <type_delimiter>*, <type_delimiter>_grow | ||||
| #define GENERIC_SLOT_<slot>__array_num             <type_delimiter>,  <type_delimiter>_num | ||||
| #define GENERIC_SLOT_<slot>__array_pop             <type_delimiter>,  <type_delimiter>_pop | ||||
| #define GENERIC_SLOT_<slot>__array_remove_at       <type_delimiter>,  <type_delimiter>_remove_at | ||||
| #define GENERIC_SLOT_<slot>__array_reserve         <type_delimiter>,  <type_delimiter>_reserve | ||||
| #define GENERIC_SLOT_<slot>__array_resize          <type_delimiter>,  <type_delimiter>_resize | ||||
| #define GENERIC_SLOT_<slot>__array_set_capacity    <type_delimiter>*, <type_delimiter>_set_capacity | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type", type, "array_type", (StrC)array_type, "slot", (StrC)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 | ||||
| #define GENERIC_SLOT_<slot>__array_append_items    <array_type>,  <array_type>_append_items | ||||
| #define GENERIC_SLOT_<slot>__array_append_at       <array_type>,  <array_type>_append_at | ||||
| #define GENERIC_SLOT_<slot>__array_append_items_at <array_type>,  <array_type>_append_items_at | ||||
| #define GENERIC_SLOT_<slot>__array_back            <array_type>,  <array_type>_back | ||||
| #define GENERIC_SLOT_<slot>__array_clear           <array_type>,  <array_type>_clear | ||||
| #define GENERIC_SLOT_<slot>__array_fill            <array_type>,  <array_type>_fill | ||||
| #define GENERIC_SLOT_<slot>__array_free            <array_type>,  <array_type>_free | ||||
| #define GENERIC_SLOT_<slot>__array_grow            <array_type>*, <array_type>_grow | ||||
| #define GENERIC_SLOT_<slot>__array_num             <array_type>,  <array_type>_num | ||||
| #define GENERIC_SLOT_<slot>__array_pop             <array_type>,  <array_type>_pop | ||||
| #define GENERIC_SLOT_<slot>__array_remove_at       <array_type>,  <array_type>_remove_at | ||||
| #define GENERIC_SLOT_<slot>__array_reserve         <array_type>,  <array_type>_reserve | ||||
| #define GENERIC_SLOT_<slot>__array_resize          <array_type>,  <array_type>_resize | ||||
| #define GENERIC_SLOT_<slot>__array_set_capacity    <array_type>*, <array_type>_set_capacity | ||||
| )" | ||||
| 	)); | ||||
|  | ||||
|   | ||||
| @@ -109,19 +109,19 @@ CodeBody gen_hashtable( StrC type, StrC hashtable_name ) | ||||
|  | ||||
| 		<tbl_type> <fn>init( AllocatorInfo allocator ) | ||||
| 		{ | ||||
| 			<tbl_type> result = hashtable_init_reserve(<tbl_type>, allocator, 8); | ||||
| 			<tbl_type> result = hashtable_init_reserve(<type>, allocator, 8); | ||||
| 			return result; | ||||
| 		} | ||||
|  | ||||
| 		<tbl_type> <fn>_init_reserve( AllocatorInfo allocator, ssize num ) | ||||
| 		{ | ||||
| 			<tbl_type> result = { NULL, NULL }; | ||||
| 			result.Hashes  = array_init_reserve(Array_ssize, allocator, num ); | ||||
| 			result.Hashes  = array_init_reserve(ssize, allocator, num ); | ||||
| 			array_get_header(result.Hashes)->Num = num; | ||||
| 			array_resize(result.Hashes, num); | ||||
| 			array_fill(result.Hashes, 0, num, -1); | ||||
|  | ||||
| 			result.Entries = array_init_reserve(<array_entry>, allocator, num ); | ||||
| 			result.Entries = array_init_reserve(<entry_type>, allocator, num ); | ||||
| 			return result; | ||||
| 		} | ||||
|  | ||||
| @@ -199,7 +199,7 @@ CodeBody gen_hashtable( StrC type, StrC hashtable_name ) | ||||
| 			ArrayHeader* old_hash_header    = array_get_header( self->Hashes ); | ||||
| 			ArrayHeader* old_entries_header = array_get_header( self->Entries ); | ||||
|  | ||||
| 			<tbl_type> new_tbl = hashtable_init_reserve( <tbl_type>, old_hash_header->Allocator, old_hash_header->Num ); | ||||
| 			<tbl_type> new_tbl = hashtable_init_reserve( <type>, old_hash_header->Allocator, old_hash_header->Num ); | ||||
|  | ||||
| 			ArrayHeader* new_hash_header = array_get_header( new_tbl.Hashes ); | ||||
|  | ||||
| @@ -375,24 +375,24 @@ CodeBody gen_hashtable( StrC type, StrC hashtable_name ) | ||||
| 	++ HashTable_DefinitionCounter; | ||||
| 	StrC slot_str = String::fmt_buf(GlobalAllocator, "%d", Array_DefinitionCounter).to_strc(); | ||||
|  | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type_delimiter", (StrC)tbl_type, "slot", (StrC)slot_str, | ||||
| R"(#define GENERIC_SLOT_<slot>__hashtable_init          <type_delimiter>,  <type_delimiter>_init | ||||
| #define GENERIC_SLOT_<slot>__hashtable_init_reserve     <type_delimiter>,  <type_delimiter>_init_reserve | ||||
| #define GENERIC_SLOT_<slot>__hashtable_clear            <type_delimiter>,  <type_delimiter>_clear | ||||
| #define GENERIC_SLOT_<slot>__hashtable_destroy          <type_delimiter>*, <type_delimiter>_destroy | ||||
| #define GENERIC_SLOT_<slot>__hashtable_get              <type_delimiter>,  <type_delimiter>_get | ||||
| #define GENERIC_SLOT_<slot>__hashtable_map              <type_delimiter>,  <type_delimiter>_map | ||||
| #define GENERIC_SLOT_<slot>__hashtable_map_mut          <type_delimiter>,  <type_delimiter>_map_mut | ||||
| #define GENERIC_SLOT_<slot>__hashtable_grow             <type_delimiter>*, <type_delimiter>_grow | ||||
| #define GENERIC_SLOT_<slot>__hashtable_rehash           <type_delimiter>*, <type_delimiter>_rehash | ||||
| #define GENERIC_SLOT_<slot>__hashtable_rehash_fast      <type_delimiter>,  <type_delimiter>_rehash_fast | ||||
| #define GENERIC_SLOT_<slot>__hashtable_remove_entry     <type_delimiter>,  <type_delimiter>_remove_entry | ||||
| #define GENERIC_SLOT_<slot>__hashtable_set              <type_delimiter>*, <type_delimiter>_set | ||||
| #define GENERIC_SLOT_<slot>__hashtable_slot             <type_delimiter>,  <type_delimiter>_slot | ||||
| 	Code generic_interface_slot = untyped_str(token_fmt( "type", type, "tbl_type", (StrC)tbl_type, "slot", (StrC)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 | ||||
| #define GENERIC_SLOT_<slot>__hashtable_destroy          <tbl_type>*, <tbl_type>_destroy | ||||
| #define GENERIC_SLOT_<slot>__hashtable_get              <tbl_type>,  <tbl_type>_get | ||||
| #define GENERIC_SLOT_<slot>__hashtable_map              <tbl_type>,  <tbl_type>_map | ||||
| #define GENERIC_SLOT_<slot>__hashtable_map_mut          <tbl_type>,  <tbl_type>_map_mut | ||||
| #define GENERIC_SLOT_<slot>__hashtable_grow             <tbl_type>*, <tbl_type>_grow | ||||
| #define GENERIC_SLOT_<slot>__hashtable_rehash           <tbl_type>*, <tbl_type>_rehash | ||||
| #define GENERIC_SLOT_<slot>__hashtable_rehash_fast      <tbl_type>,  <tbl_type>_rehash_fast | ||||
| #define GENERIC_SLOT_<slot>__hashtable_remove_entry     <tbl_type>,  <tbl_type>_remove_entry | ||||
| #define GENERIC_SLOT_<slot>__hashtable_set              <tbl_type>*, <tbl_type>_set | ||||
| #define GENERIC_SLOT_<slot>__hashtable_slot             <tbl_type>,  <tbl_type>_slot | ||||
|  | ||||
| #define GENERIC_SLOT_<slot>__hashtable__add_entry       <type_delimiter>*, <type_delimiter>__add_entry | ||||
| #define GENERIC_SLOT_<slot>__hashtable__find            <type_delimiter>,  <type_delimiter>__find | ||||
| #define GENERIC_SLOT_<slot>__hashtable__full            <type_delimiter>,  <type_delimiter>__full | ||||
| #define GENERIC_SLOT_<slot>__hashtable__add_entry       <tbl_type>*, <tbl_type>__add_entry | ||||
| #define GENERIC_SLOT_<slot>__hashtable__find            <tbl_type>,  <tbl_type>__find | ||||
| #define GENERIC_SLOT_<slot>__hashtable__full            <tbl_type>,  <tbl_type>__full | ||||
| )" | ||||
| 	)); | ||||
|  | ||||
|   | ||||
| @@ -4,16 +4,20 @@ | ||||
| 	See Readme.md for more information from the project repository. | ||||
|  | ||||
| 	Public Address: | ||||
| 	https://github.com/Ed94/gencpp | ||||
|  | ||||
| 	This is a single header C-Library variant. | ||||
| 	Define GEN_IMPLEMENTATION before including this file in a single compilation unit. | ||||
|  | ||||
| 	! ----------------------------------------------------------------------- VERSION: v0.20-Alpha ! | ||||
| 	! ============================================================================================ ! | ||||
| 	! WARNING: THIS IS AN ALPHA VERSION OF THE LIBRARY, USE AT YOUR OWN DISCRETION                 ! | ||||
| 	! NEVER DO CODE GENERATION WITHOUT AT LEAST HAVING CONTENT IN A CODEBASE UNDER VERSION CONTROL ! | ||||
| 	! ============================================================================================ ! | ||||
| 	https://github.com/Ed94/gencpp  ---------------------------------------------------------------. | ||||
| 	|   _____                               _____ _                       _      ___   __     __    | | ||||
| 	|  / ____)                             / ____} |                     | |   / ,__} /  |   /  |   | | ||||
| 	| | / ___  ___ _ __   ___ _ __  _ __  | {___ | l_ __ _  __ _, ___  __| |  | |    '-l |  '-l |   | | ||||
| 	| | |{_  \/ __\ '_ \ / __} '_ l| '_ l  \___ \| __/ _` |/ _` |/ __\/ _` |  | |      | |    | |   | | ||||
| 	| | l__j | ___/ | | | {__; ;_l } ;_l } ____} | l| (_} | {_| | ___j {_; |  | l___  _J l_  _J l_  | | ||||
| 	|  \_____|\___}_l |_|\___} .__/| .__/ {_____/ \__\__/_l\__. |\___/\__,_l   \____}{_____}{_____} | | ||||
| 	|                        | |   | |                      __} |                                   | | ||||
| 	|                        l_l   l_l                     {___/                                    | | ||||
| 	! ----------------------------------------------------------------------- VERSION: v0.20-Alpha  | | ||||
| 	! ============================================================================================= | | ||||
| 	! WARNING: THIS IS AN ALPHA VERSION OF THE LIBRARY, USE AT YOUR OWN DISCRETION                  | | ||||
| 	! NEVER DO CODE GENERATION WITHOUT AT LEAST HAVING CONTENT IN A CODEBASE UNDER VERSION CONTROL  | | ||||
| 	! ============================================================================================= / | ||||
| */ | ||||
| #if ! defined(GEN_DONT_ENFORCE_GEN_TIME_GUARD) && ! defined(GEN_TIME) | ||||
| #	error Gen.hpp : GEN_TIME not defined | ||||
|   | ||||
| @@ -24,7 +24,7 @@ b32 ignore_preprocess_cond_block( StrC cond_sig, Code& entry_iter, CodeBody& par | ||||
| 	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: %SC\n", cond->Content); | ||||
| 		found = true; | ||||
|  | ||||
| 		s32 depth = 1; | ||||
| @@ -105,7 +105,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(); | ||||
| 		if (slot == num_slots) | ||||
| 		if (slot == num_slots && false) | ||||
| 		{ | ||||
| 			define_builder.append( token_fmt( "macro_name", macro_name, "slot", slot_str, | ||||
| R"(		GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT_LAST(  GENERIC_SLOT_<slot>__<macro_name> ) \ | ||||
| @@ -128,6 +128,8 @@ R"(		GEN_IF_MACRO_DEFINED_INCLUDE_THIS_SLOT( GENERIC_SLOT_<slot>__<macro_name> ) | ||||
| 		)); | ||||
| 	} | ||||
|  | ||||
| 	define_builder.append( txt("default: gen_generic_selection_fail") ); | ||||
|  | ||||
| 	if ( ! one_arg ) | ||||
| 	{ | ||||
| 		if (opts == GenericSel_By_Ref) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user