2022-05-25 12:07:51 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
|
|
|
|
#include "Bindings/MVVMCompiledBindingLibrary.h"
|
|
|
|
|
#include "MVVMSubsystem.h"
|
|
|
|
|
#include "Templates/PimplPtr.h"
|
|
|
|
|
#include "Templates/TypeHash.h"
|
|
|
|
|
#include "Templates/ValueOrError.h"
|
|
|
|
|
#include "Types/MVVMFieldVariant.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace UE::MVVM::Private
|
|
|
|
|
{
|
|
|
|
|
class FCompiledBindingLibraryCompilerImpl;
|
|
|
|
|
} //namespace UE::MVVM::Private
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace UE::MVVM
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
class MODELVIEWVIEWMODELBLUEPRINT_API FCompiledBindingLibraryCompiler
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
/** */
|
|
|
|
|
struct FFieldPathHandle
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
explicit FFieldPathHandle()
|
|
|
|
|
: Id(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static FFieldPathHandle MakeHandle()
|
|
|
|
|
{
|
|
|
|
|
FFieldPathHandle Handle;
|
|
|
|
|
++IdGenerator;
|
|
|
|
|
Handle.Id = IdGenerator;
|
|
|
|
|
return Handle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool IsValid() const
|
|
|
|
|
{
|
|
|
|
|
return Id != 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool operator==(const FFieldPathHandle& Other) const
|
|
|
|
|
{
|
|
|
|
|
return Id == Other.Id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool operator!=(const FFieldPathHandle& Other) const
|
|
|
|
|
{
|
|
|
|
|
return Id != Other.Id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
friend uint32 GetTypeHash(const FFieldPathHandle& Handle)
|
|
|
|
|
{
|
|
|
|
|
return ::GetTypeHash(Handle.Id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
static int32 IdGenerator;
|
|
|
|
|
int32 Id;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
struct FBindingHandle
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
explicit FBindingHandle()
|
|
|
|
|
: Id(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static FBindingHandle MakeHandle()
|
|
|
|
|
{
|
|
|
|
|
FBindingHandle Handle;
|
|
|
|
|
++IdGenerator;
|
|
|
|
|
Handle.Id = IdGenerator;
|
|
|
|
|
return Handle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool IsValid() const
|
|
|
|
|
{
|
|
|
|
|
return Id != 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool operator==(const FBindingHandle& Other) const
|
|
|
|
|
{
|
|
|
|
|
return Id == Other.Id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool operator!=(const FBindingHandle& Other) const
|
|
|
|
|
{
|
|
|
|
|
return Id != Other.Id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
friend uint32 GetTypeHash(const FBindingHandle& Handle)
|
|
|
|
|
{
|
|
|
|
|
return ::GetTypeHash(Handle.Id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
static int32 IdGenerator;
|
|
|
|
|
int32 Id;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
struct FFieldIdHandle
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
explicit FFieldIdHandle()
|
|
|
|
|
: Id(0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static FFieldIdHandle MakeHandle()
|
|
|
|
|
{
|
|
|
|
|
FFieldIdHandle Handle;
|
|
|
|
|
++IdGenerator;
|
|
|
|
|
Handle.Id = IdGenerator;
|
|
|
|
|
return Handle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool IsValid() const
|
|
|
|
|
{
|
|
|
|
|
return Id != 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool operator==(const FFieldIdHandle& Other) const
|
|
|
|
|
{
|
|
|
|
|
return Id == Other.Id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool operator!=(const FFieldIdHandle& Other) const
|
|
|
|
|
{
|
|
|
|
|
return Id != Other.Id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
friend uint32 GetTypeHash(const FFieldIdHandle& Handle)
|
|
|
|
|
{
|
|
|
|
|
return ::GetTypeHash(Handle.Id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
static int32 IdGenerator;
|
|
|
|
|
int32 Id;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
FCompiledBindingLibraryCompiler();
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
/** */
|
|
|
|
|
TValueOrError<FFieldIdHandle, FString> AddFieldId(TSubclassOf<UObject> SourceClass, FName FieldName);
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
TValueOrError<FFieldPathHandle, FString> AddFieldPath(TSubclassOf<UObject> SourceClass, FStringView FieldPath, bool bRead);
|
|
|
|
|
|
|
|
|
|
/** */
|
2022-05-25 12:09:47 -04:00
|
|
|
TValueOrError<FFieldPathHandle, FString> AddFieldPath(TArrayView<const UE::MVVM::FMVVMConstFieldVariant> FieldPath, bool bRead);
|
2022-05-25 12:07:51 -04:00
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
TValueOrError<FFieldPathHandle, FString> AddObjectFieldPath(TSubclassOf<UObject> SourceClass, FStringView FieldPath, UClass* ExpectedType, bool bRead);
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
TValueOrError<FFieldPathHandle, FString> AddConversionFunctionFieldPath(TSubclassOf<UObject> SourceClass, const UFunction* Function);
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
TValueOrError<FBindingHandle, FString> AddBinding(FFieldPathHandle Source, FFieldPathHandle Destination);
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
TValueOrError<FBindingHandle, FString> AddBinding(FFieldPathHandle Source, FFieldPathHandle Destination, FFieldPathHandle ConversionFunction);
|
|
|
|
|
|
|
|
|
|
/** */
|
2022-05-25 12:09:47 -04:00
|
|
|
TValueOrError<FBindingHandle, FString> AddBinding(TArrayView<const FFieldPathHandle> Sources, FFieldPathHandle Destination, FFieldPathHandle ConversionFunction);
|
2022-05-25 12:07:51 -04:00
|
|
|
|
|
|
|
|
struct FCompileResult
|
|
|
|
|
{
|
|
|
|
|
FMVVMCompiledBindingLibrary Library;
|
|
|
|
|
TMap<FFieldPathHandle, FMVVMVCompiledFieldPath> FieldPaths;
|
|
|
|
|
TMap<FBindingHandle, FMVVMVCompiledBinding> Bindings;
|
|
|
|
|
TMap<FFieldIdHandle, FMVVMVCompiledFieldId> FieldIds;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** */
|
|
|
|
|
TValueOrError<FCompileResult, FString> Compile();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
/** */
|
2022-05-25 12:09:47 -04:00
|
|
|
TValueOrError<FFieldPathHandle, FString> AddFieldPathImpl(TArrayView<const UE::MVVM::FMVVMConstFieldVariant> FieldPath, bool bRead);
|
2022-05-25 12:07:51 -04:00
|
|
|
|
|
|
|
|
TPimplPtr<Private::FCompiledBindingLibraryCompilerImpl> Impl;
|
|
|
|
|
};
|
|
|
|
|
|
2022-04-01 14:21:11 -04:00
|
|
|
} //namespace UE::MVVM
|