Add Span<T> support for scripting fields

This commit is contained in:
Wojtek Figat
2023-04-14 15:01:22 +02:00
parent 62fdfe2519
commit 89704bebe9
3 changed files with 19 additions and 4 deletions

View File

@@ -8,7 +8,7 @@
/// Universal representation of a contiguous region of arbitrary memory.
/// </summary>
template<typename T>
class Span
API_CLASS(InBuild) class Span
{
protected:
T* _data;

View File

@@ -499,8 +499,8 @@ namespace MUtils
/// </summary>
/// <param name="data">The native array object.</param>
/// <returns>The output array pointer and size.</returns>
template<typename T>
FORCE_INLINE Span<T> ToSpan(const Array<T>& data)
template<typename T, typename AllocationType = HeapAllocation>
FORCE_INLINE Span<T> ToSpan(const Array<T, AllocationType>& data)
{
return Span<T>(data.Get(), data.Count());
}

View File

@@ -172,6 +172,10 @@ namespace Flax.Build.Bindings
CppVariantFromTypes[wrapperName] = typeInfo;
return $"VariantFrom{wrapperName}Dictionary({value})";
}
if (typeInfo.Type == "Span" && typeInfo.GenericArgs != null)
{
return "Variant()"; // TODO: Span to Variant converting (use utility method the same way as for arrays)
}
var apiType = FindApiTypeInfo(buildData, typeInfo, caller);
if (apiType != null)
@@ -218,6 +222,10 @@ namespace Flax.Build.Bindings
CppVariantToTypes.Add(typeInfo);
return $"MoveTemp(VariantTo{GenerateCppWrapperNativeToVariantMethodName(typeInfo)}({value}))";
}
if (typeInfo.Type == "Span" && typeInfo.GenericArgs != null)
{
return $"{typeInfo}()"; // Cannot be implemented since Variant stores array of Variants thus cannot get linear span of data
}
var apiType = FindApiTypeInfo(buildData, typeInfo, caller);
if (apiType != null)
@@ -482,13 +490,20 @@ namespace Flax.Build.Bindings
return "{0}.GetManagedInstance()";
}
// Array or Span or DataContainer
// Array or DataContainer
if ((typeInfo.Type == "Array" || typeInfo.Type == "Span" || typeInfo.Type == "DataContainer") && typeInfo.GenericArgs != null)
{
type = "MonoArray*";
return "MUtils::ToArray({0}, " + GenerateCppGetNativeClass(buildData, typeInfo.GenericArgs[0], caller, functionInfo) + ")";
}
// Span
if (typeInfo.Type == "Span" && typeInfo.GenericArgs != null)
{
type = "MonoArray*";
return "MUtils::Span({0}, " + GenerateCppGetNativeClass(buildData, typeInfo.GenericArgs[0], caller, functionInfo) + ")";
}
// BytesContainer
if (typeInfo.Type == "BytesContainer" && typeInfo.GenericArgs == null)
{