mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-30 14:30:53 -07:00 
			
		
		
		
	Setup workaround with type casting for POD with assignment overload restriction on varadic args.
This commit is contained in:
		| @@ -2587,10 +2587,25 @@ namespace gen | |||||||
| 		return Code::Invalid;                                                \ | 		return Code::Invalid;                                                \ | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #	define def_body_code_validation_start( Name_, Get_Code_Expr_ )          \ | #	define def_body_code_validation_start( Name_ )                          \ | ||||||
| 	do                                                                      \ | 	do                                                                      \ | ||||||
| 	{                                                                       \ | 	{                                                                       \ | ||||||
| 		Code entry = Get_Code_Expr_;                                        \ | 		Code_POD pod   = va_arg(va, Code_POD);                              \ | ||||||
|  | 		Code     entry = pcast(Code, pod);                                  \ | ||||||
|  |                                                                             \ | ||||||
|  | 		if ( ! entry )                                                      \ | ||||||
|  | 		{                                                                   \ | ||||||
|  | 			log_failure("gen::" txt(Name_) ": Provided an null entry");     \ | ||||||
|  | 			return Code::Invalid;                                           \ | ||||||
|  | 		}                                                                   \ | ||||||
|  |                                                                             \ | ||||||
|  | 		switch ( entry->Type )                                              \ | ||||||
|  | 		{ | ||||||
|  |  | ||||||
|  | #	define def_body_code_array_validation_start( Name_ )                    \ | ||||||
|  | 	do                                                                      \ | ||||||
|  | 	{                                                                       \ | ||||||
|  | 		Code entry = *codes; codes++;                                       \ | ||||||
|                                                                             \ |                                                                             \ | ||||||
| 		if ( ! entry )                                                      \ | 		if ( ! entry )                                                      \ | ||||||
| 		{                                                                   \ | 		{                                                                   \ | ||||||
| @@ -2624,7 +2639,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		def_body_code_validation_start( def_class_body, va_arg( va, Code ) ); | 		def_body_code_validation_start( def_class_body ); | ||||||
| 			AST_BODY_CLASS_UNALLOWED_TYPES | 			AST_BODY_CLASS_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_class_body ); | 		def_body_code_validation_end( def_class_body ); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
| @@ -2641,7 +2656,7 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Type = Function_Body; | 		result->Type = Function_Body; | ||||||
|  |  | ||||||
| 		def_body_code_validation_start( def_class_body, *codes; codes++ ); | 		def_body_code_array_validation_start( def_class_body ); | ||||||
| 			AST_BODY_CLASS_UNALLOWED_TYPES | 			AST_BODY_CLASS_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_class_body ); | 		def_body_code_validation_end( def_class_body ); | ||||||
|  |  | ||||||
| @@ -2661,7 +2676,8 @@ namespace gen | |||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		do | 		do | ||||||
| 		{ | 		{ | ||||||
| 			Code entry = va_arg(va, Code); | 			Code_POD pod   = va_arg(va, Code_POD); | ||||||
|  | 			Code     entry = pcast(Code, pod); | ||||||
|  |  | ||||||
| 			if ( ! entry ) | 			if ( ! entry ) | ||||||
| 			{ | 			{ | ||||||
| @@ -2726,7 +2742,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		def_body_code_validation_start( def_export_body, va_arg(va, Code) ); | 		def_body_code_validation_start( def_export_body ); | ||||||
| 			AST_BODY_EXPORT_UNALLOWED_TYPES | 			AST_BODY_EXPORT_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_export_body ); | 		def_body_code_validation_end( def_export_body ); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
| @@ -2743,7 +2759,7 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Type = Export_Body; | 		result->Type = Export_Body; | ||||||
|  |  | ||||||
| 		def_body_code_validation_start( def_export_body, *codes; codes++ ); | 		def_body_code_array_validation_start( def_export_body ); | ||||||
| 			AST_BODY_EXPORT_UNALLOWED_TYPES | 			AST_BODY_EXPORT_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_export_body ); | 		def_body_code_validation_end( def_export_body ); | ||||||
|  |  | ||||||
| @@ -2761,7 +2777,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		def_body_code_validation_start( def_extern_linkage_body, va_arg(va, Code) ); | 		def_body_code_validation_start( def_extern_linkage_body ); | ||||||
| 			AST_BODY_EXTERN_LINKAGE_UNALLOWED_TYPES | 			AST_BODY_EXTERN_LINKAGE_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_extern_linkage_body ); | 		def_body_code_validation_end( def_extern_linkage_body ); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
| @@ -2778,7 +2794,7 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Type = Extern_Linkage_Body; | 		result->Type = Extern_Linkage_Body; | ||||||
|  |  | ||||||
| 		def_body_code_validation_start( def_extern_linkage_body, *codes; codes++ ); | 		def_body_code_array_validation_start( def_extern_linkage_body ); | ||||||
| 			AST_BODY_EXTERN_LINKAGE_UNALLOWED_TYPES | 			AST_BODY_EXTERN_LINKAGE_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_extern_linkage_body ); | 		def_body_code_validation_end( def_extern_linkage_body ); | ||||||
|  |  | ||||||
| @@ -2796,7 +2812,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		def_body_code_validation_start( def_function_body, va_arg(va, Code) ); | 		def_body_code_validation_start( def_function_body ); | ||||||
| 			AST_BODY_FUNCTION_UNALLOWED_TYPES | 			AST_BODY_FUNCTION_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_function_body ); | 		def_body_code_validation_end( def_function_body ); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
| @@ -2813,7 +2829,7 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Type = Function_Body; | 		result->Type = Function_Body; | ||||||
|  |  | ||||||
| 		def_body_code_validation_start( def_function_body, *codes; codes++ ); | 		def_body_code_array_validation_start( def_function_body ); | ||||||
| 			AST_BODY_FUNCTION_UNALLOWED_TYPES | 			AST_BODY_FUNCTION_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_function_body ); | 		def_body_code_validation_end( def_function_body ); | ||||||
|  |  | ||||||
| @@ -2831,7 +2847,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		def_body_code_validation_start( def_global_body, va_arg(va, Code) ); | 		def_body_code_validation_start( def_global_body ); | ||||||
| 			AST_BODY_GLOBAL_UNALLOWED_TYPES | 			AST_BODY_GLOBAL_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_global_body ); | 		def_body_code_validation_end( def_global_body ); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
| @@ -2848,7 +2864,7 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Type = Global_Body; | 		result->Type = Global_Body; | ||||||
|  |  | ||||||
| 		def_body_code_validation_start( def_global_body, *codes; codes++ ); | 		def_body_code_array_validation_start( def_global_body ); | ||||||
| 			AST_BODY_GLOBAL_UNALLOWED_TYPES | 			AST_BODY_GLOBAL_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_global_body ); | 		def_body_code_validation_end( def_global_body ); | ||||||
|  |  | ||||||
| @@ -2866,7 +2882,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		def_body_code_validation_start( def_namespace_body, va_arg(va, Code) ); | 		def_body_code_validation_start( def_namespace_body ); | ||||||
| 			AST_BODY_NAMESPACE_UNALLOWED_TYPES | 			AST_BODY_NAMESPACE_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_namespace_body ); | 		def_body_code_validation_end( def_namespace_body ); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
| @@ -2883,7 +2899,7 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Type = Global_Body; | 		result->Type = Global_Body; | ||||||
|  |  | ||||||
| 		def_body_code_validation_start( def_namespace_body, *codes; codes++ ); | 		def_body_code_array_validation_start( def_namespace_body ); | ||||||
| 			AST_BODY_NAMESPACE_UNALLOWED_TYPES | 			AST_BODY_NAMESPACE_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_namespace_body ); | 		def_body_code_validation_end( def_namespace_body ); | ||||||
|  |  | ||||||
| @@ -2908,7 +2924,8 @@ namespace gen | |||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
|  |  | ||||||
| 		Code        type        = va_arg(va, Code); | 		Code_POD    pod         = va_arg(va, Code_POD); | ||||||
|  | 		Code        type        = pcast( Code, pod ); | ||||||
| 		s32         name_length = va_arg(va, s32 ); | 		s32         name_length = va_arg(va, s32 ); | ||||||
| 		char const* name        = va_arg(va, char const*); | 		char const* name        = va_arg(va, char const*); | ||||||
|  |  | ||||||
| @@ -2924,7 +2941,8 @@ namespace gen | |||||||
|  |  | ||||||
| 		while( num -= 3, num && num % 3 == 0 ) | 		while( num -= 3, num && num % 3 == 0 ) | ||||||
| 		{ | 		{ | ||||||
| 			type        = va_arg(va, Code); | 			pod         = va_arg(va, Code_POD); | ||||||
|  | 			type        = pcast( Code, pod ); | ||||||
| 			name_length = va_arg(va, u32); | 			name_length = va_arg(va, u32); | ||||||
| 			name        = va_arg(va, char const*); | 			name        = va_arg(va, char const*); | ||||||
|  |  | ||||||
| @@ -3029,7 +3047,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		def_body_code_validation_start( def_struct_body, va_arg(va, Code) ); | 		def_body_code_validation_start( def_struct_body ); | ||||||
| 			AST_BODY_STRUCT_UNALLOWED_TYPES | 			AST_BODY_STRUCT_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_struct_body ); | 		def_body_code_validation_end( def_struct_body ); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
| @@ -3046,7 +3064,7 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Type = Struct_Body; | 		result->Type = Struct_Body; | ||||||
|  |  | ||||||
| 		def_body_code_validation_start( def_struct_body, *codes; codes++ ); | 		def_body_code_array_validation_start( def_struct_body ); | ||||||
| 			AST_BODY_STRUCT_UNALLOWED_TYPES | 			AST_BODY_STRUCT_UNALLOWED_TYPES | ||||||
| 		def_body_code_validation_end( def_struct_body ); | 		def_body_code_validation_end( def_struct_body ); | ||||||
|  |  | ||||||
| @@ -3066,7 +3084,8 @@ namespace gen | |||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| 		do | 		do | ||||||
| 		{ | 		{ | ||||||
| 			Code entry = va_arg(va, Code); | 			Code_POD pod   = va_arg(va, Code_POD); | ||||||
|  | 			Code     entry = pcast( Code, pod ); | ||||||
|  |  | ||||||
| 			if ( ! entry ) | 			if ( ! entry ) | ||||||
| 			{ | 			{ | ||||||
| @@ -3187,7 +3206,7 @@ namespace gen | |||||||
| 			return Code::Invalid; | 			return Code::Invalid; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if ( type && type != Typename ) | 		if ( type && type->Type != Typename ) | ||||||
| 		{ | 		{ | ||||||
| 			log_failure("gen::make_enum: type provided is not of code type typename - %s", type->debug_str() ); | 			log_failure("gen::make_enum: type provided is not of code type typename - %s", type->debug_str() ); | ||||||
| 			return Code::Invalid; | 			return Code::Invalid; | ||||||
|   | |||||||
| @@ -547,7 +547,7 @@ namespace gen | |||||||
| 		constexpr static | 		constexpr static | ||||||
| 		uw ArrSpecs_Cap = ArrS_Cap * (sizeof(AST*) / sizeof(SpecifierT)); | 		uw ArrSpecs_Cap = ArrS_Cap * (sizeof(AST*) / sizeof(SpecifierT)); | ||||||
|  |  | ||||||
| 	#	define Using_Code_POD                          \ | 	#	define Using_AST_POD                           \ | ||||||
| 		union {                                        \ | 		union {                                        \ | ||||||
| 			AST*          ArrStatic[AST::ArrS_Cap];    \ | 			AST*          ArrStatic[AST::ArrS_Cap];    \ | ||||||
| 			Array(AST*)   Entries;                     \ | 			Array(AST*)   Entries;                     \ | ||||||
| @@ -565,22 +565,22 @@ namespace gen | |||||||
| 		bool              DynamicEntries;              \ | 		bool              DynamicEntries;              \ | ||||||
| 		u8                _Align_Pad[2]; | 		u8                _Align_Pad[2]; | ||||||
|  |  | ||||||
| 		Using_Code_POD | 		Using_AST_POD | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	struct CodePOD | 	struct AST_POD | ||||||
| 	{ | 	{ | ||||||
| 		Using_Code_POD | 		Using_AST_POD | ||||||
| 	#	undef Using_CodePOD | 	#	undef Using_CodePOD | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	constexpr sw size_AST = sizeof(AST); | 	constexpr sw size_AST = sizeof(AST); | ||||||
| 	constexpr sw size_POD = sizeof(CodePOD); | 	constexpr sw size_POD = sizeof(AST_POD); | ||||||
|  |  | ||||||
| 	// Its intended for the AST to have equivalent size to its POD. | 	// Its intended for the AST to have equivalent size to its POD. | ||||||
| 	// All extra functionality within the AST namespace should just be syntatic sugar. | 	// All extra functionality within the AST namespace should just be syntatic sugar. | ||||||
| 	static_assert( sizeof(AST)     == sizeof(CodePOD), "ERROR: AST IS NOT POD" ); | 	static_assert( sizeof(AST)     == sizeof(AST_POD), "ERROR: AST IS NOT POD" ); | ||||||
| 	static_assert( sizeof(CodePOD) == AST_POD_Size,    "ERROR: AST POD is not size of AST_POD_Size" ); | 	static_assert( sizeof(AST_POD) == AST_POD_Size,    "ERROR: AST POD is not size of AST_POD_Size" ); | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 		AST* typedef as to not constantly have to add the '*' as this is written often.. | 		AST* typedef as to not constantly have to add the '*' as this is written often.. | ||||||
| @@ -666,8 +666,6 @@ namespace gen | |||||||
| 			return ast; | 			return ast; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	// Cannot be done unfortunately c++ sucks. (Will lose POD by doing so) |  | ||||||
| 	#if 0 |  | ||||||
| 		inline | 		inline | ||||||
| 		Code& operator=( Code other ) | 		Code& operator=( Code other ) | ||||||
| 		{ | 		{ | ||||||
| @@ -689,7 +687,6 @@ namespace gen | |||||||
|  |  | ||||||
| 			return *this; | 			return *this; | ||||||
| 		} | 		} | ||||||
| 	#endif |  | ||||||
|  |  | ||||||
| 		inline | 		inline | ||||||
| 		AST* operator->() | 		AST* operator->() | ||||||
| @@ -714,7 +711,13 @@ namespace gen | |||||||
|  |  | ||||||
| 		AST* ast; | 		AST* ast; | ||||||
| 	}; | 	}; | ||||||
| 	static_assert( sizeof(Code) == sizeof(AST*), "ERROR: Code is not POD" ); |  | ||||||
|  | 	struct Code_POD | ||||||
|  | 	{ | ||||||
|  | 		AST_POD* ast; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	static_assert( sizeof(Code) == sizeof(Code_POD), "ERROR: Code is not POD" ); | ||||||
|  |  | ||||||
| 	// Used when the its desired when omission is allowed in a definition. | 	// Used when the its desired when omission is allowed in a definition. | ||||||
| 	constexpr Code NoCode = { nullptr }; | 	constexpr Code NoCode = { nullptr }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user