Files
UnrealEngineUWP/Engine/Plugins/Runtime/ModelViewViewModel/Source/ModelViewViewModelBlueprint/Public/Bindings/MVVMCompiledBindingLibraryCompiler.h
patrick boutot 0051f8228b MVVM: Fix for range loop bind to temporary constructed type.
#rb none
#rnx none

#ROBOMERGE-AUTHOR: patrick.boutot
#ROBOMERGE-SOURCE: CL 20364466 via CL 20364472 via CL 20364475
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v949-20362246)

[CL 20366301 by patrick boutot in ue5-main branch]
2022-05-25 12:09:47 -04:00

200 lines
4.2 KiB
C++

// 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);
/** */
TValueOrError<FFieldPathHandle, FString> AddFieldPath(TArrayView<const UE::MVVM::FMVVMConstFieldVariant> FieldPath, bool bRead);
/** */
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);
/** */
TValueOrError<FBindingHandle, FString> AddBinding(TArrayView<const FFieldPathHandle> Sources, FFieldPathHandle Destination, FFieldPathHandle ConversionFunction);
struct FCompileResult
{
FMVVMCompiledBindingLibrary Library;
TMap<FFieldPathHandle, FMVVMVCompiledFieldPath> FieldPaths;
TMap<FBindingHandle, FMVVMVCompiledBinding> Bindings;
TMap<FFieldIdHandle, FMVVMVCompiledFieldId> FieldIds;
};
/** */
TValueOrError<FCompileResult, FString> Compile();
private:
/** */
TValueOrError<FFieldPathHandle, FString> AddFieldPathImpl(TArrayView<const UE::MVVM::FMVVMConstFieldVariant> FieldPath, bool bRead);
TPimplPtr<Private::FCompiledBindingLibraryCompilerImpl> Impl;
};
} //namespace UE::MVVM