86 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using EpicGames.UHT.Types;
 | |
| using System.Collections.Generic;
 | |
| using UnrealSharpScriptGenerator.PropertyTranslators;
 | |
| 
 | |
| namespace UnrealSharpScriptGenerator.Utilities;
 | |
| 
 | |
| public static class StructUtilities
 | |
| {
 | |
|     public static bool IsStructBlittable(this UhtStruct structObj)
 | |
|     {
 | |
|         if (PropertyTranslatorManager.SpecialTypeInfo.Structs.BlittableTypes.ContainsKey(structObj.SourceName))
 | |
|         {
 | |
|             return true;
 | |
|         }
 | |
|         
 | |
|         // Any struct we haven't manually exported is not blittable, yet.
 | |
|         // The fix for this is to add a header parser to check for non-UPROPERTY properties in the struct.
 | |
|         // Because a struct can be recognized as blittable by the reflection data,
 | |
|         // but have a non-UPROPERTY property that is not picked up by UHT, that makes it not blittable causing a mismatch in memory layout.
 | |
|         // This is a temporary solution until we can get that working.
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public static bool IsStructNativelyCopyable(this UhtStruct structObj)
 | |
|     {
 | |
|         return PropertyTranslatorManager.SpecialTypeInfo.Structs.NativelyCopyableTypes.ContainsKey(structObj.SourceName);
 | |
|     }
 | |
|     
 | |
|     public static bool IsStructNativelyDestructible(this UhtStruct structObj)
 | |
|     {
 | |
|         return PropertyTranslatorManager.SpecialTypeInfo.Structs.NativelyCopyableTypes.TryGetValue(structObj.SourceName, out var info) && info.HasDestructor;
 | |
|     }
 | |
| 
 | |
|     public static bool IsStructEquatable(this UhtStruct structObj, List<UhtProperty> exportedProperties)
 | |
|     {
 | |
|         if (InclusionLists.HasBannedEquality(structObj))
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         if (exportedProperties.Count == 0)
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         foreach (UhtProperty property in exportedProperties)
 | |
|         {
 | |
|             PropertyTranslator translator = PropertyTranslatorManager.GetTranslator(property)!;
 | |
| 
 | |
|             if (!translator.IsPrimitive)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public static bool CanSupportArithmetic(this UhtStruct structObj, List<UhtProperty> exportedProperties)
 | |
|     {
 | |
|         if (InclusionLists.HasBannedEquality(structObj))
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         if (InclusionLists.HasBannedArithmetic(structObj))
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         if (exportedProperties.Count == 0)
 | |
|         {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         foreach (UhtProperty property in exportedProperties)
 | |
|         {
 | |
|             PropertyTranslator translator = PropertyTranslatorManager.GetTranslator(property)!;
 | |
|             if (!translator.IsNumeric)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
|         return true;
 | |
|     }
 | |
| } |