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;
 | 
						|
    }
 | 
						|
} |