Files
UnrealEngine/Engine/Source/Developer/DerivedDataCache/Public/DerivedDataBuildAction.h
2025-05-18 13:04:45 +08:00

213 lines
7.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/StringFwd.h"
#include "Containers/StringView.h"
#include "CoreTypes.h"
#include "Misc/ScopeExit.h"
#include "Templates/Function.h"
#include "Templates/RefCounting.h"
#include "Templates/UniquePtr.h"
#include "Templates/UnrealTemplate.h"
#define UE_API DERIVEDDATACACHE_API
class FCbObject;
class FCbWriter;
struct FGuid;
struct FIoHash;
namespace UE::DerivedData { class FBuildAction; }
namespace UE::DerivedData { class FBuildActionBuilder; }
namespace UE::DerivedData { class FOptionalBuildAction; }
namespace UE::DerivedData { struct FBuildActionKey; }
namespace UE::DerivedData::Private
{
class IBuildActionInternal
{
public:
virtual ~IBuildActionInternal() = default;
virtual const FBuildActionKey& GetKey() const = 0;
virtual const FSharedString& GetName() const = 0;
virtual const FUtf8SharedString& GetFunction() const = 0;
virtual const FGuid& GetFunctionVersion() const = 0;
virtual const FGuid& GetBuildSystemVersion() const = 0;
virtual bool HasConstants() const = 0;
virtual bool HasInputs() const = 0;
virtual void IterateConstants(TFunctionRef<void (FUtf8StringView Key, FCbObject&& Value)> Visitor) const = 0;
virtual void IterateInputs(TFunctionRef<void (FUtf8StringView Key, const FIoHash& RawHash, uint64 RawSize)> Visitor) const = 0;
virtual void Save(FCbWriter& Writer) const = 0;
virtual void AddRef() const = 0;
virtual void Release() const = 0;
};
FBuildAction CreateBuildAction(IBuildActionInternal* Action);
class IBuildActionBuilderInternal
{
public:
virtual ~IBuildActionBuilderInternal() = default;
virtual void AddConstant(FUtf8StringView Key, const FCbObject& Value) = 0;
virtual void AddInput(FUtf8StringView Key, const FIoHash& RawHash, uint64 RawSize) = 0;
virtual FBuildAction Build() = 0;
};
FBuildActionBuilder CreateBuildActionBuilder(IBuildActionBuilderInternal* ActionBuilder);
} // UE::DerivedData::Private
namespace UE::DerivedData
{
/**
* A build action is an immutable reference to a build function and its inputs.
*
* The purpose of an action is to capture everything required to execute a derived data build for
* a fixed version of the build function and its constants and inputs.
*
* The key for the action uniquely identifies the action and is derived by hashing the serialized
* compact binary representation of the action.
*
* The keys for constants and inputs are names that are unique within the build action.
*
* @see FBuildDefinition
* @see FBuildSession
*/
class FBuildAction
{
public:
/** Returns the key that uniquely identifies this build action. */
inline const FBuildActionKey& GetKey() const { return Action->GetKey(); }
/** Returns the name by which to identify this action for logging and profiling. */
inline const FSharedString& GetName() const { return Action->GetName(); }
/** Returns the name of the build function with which to build this action. */
inline const FUtf8SharedString& GetFunction() const { return Action->GetFunction(); }
/** Returns whether the action has any constants. */
inline bool HasConstants() const { return Action->HasConstants(); }
/** Returns whether the action has any inputs. */
inline bool HasInputs() const { return Action->HasInputs(); }
/** Returns the version of the build function with which to build this action. */
inline const FGuid& GetFunctionVersion() const { return Action->GetFunctionVersion(); }
/** Returns the version of the build system required to build this action. */
inline const FGuid& GetBuildSystemVersion() const { return Action->GetBuildSystemVersion(); }
/** Visits every constant in order by key. The key view is valid for the lifetime of the action. */
inline void IterateConstants(TFunctionRef<void (FUtf8StringView Key, FCbObject&& Value)> Visitor) const
{
Action->IterateConstants(MoveTemp(Visitor));
}
/** Visits every input in order by key. The key view is valid for the lifetime of the action. */
inline void IterateInputs(TFunctionRef<void (FUtf8StringView Key, const FIoHash& RawHash, uint64 RawSize)> Visitor) const
{
Action->IterateInputs(MoveTemp(Visitor));
}
/** Saves the build action to a compact binary object. Calls BeginObject and EndObject. */
inline void Save(FCbWriter& Writer) const
{
return Action->Save(Writer);
}
/**
* Load a build action from compact binary.
*
* @param Name The name by which to identify this action for logging and profiling.
* @param Action The saved action to load.
* @return A valid build action, or null on error.
*/
UE_API static FOptionalBuildAction Load(const FSharedString& Name, FCbObject&& Action);
private:
friend class FOptionalBuildAction;
friend FBuildAction Private::CreateBuildAction(Private::IBuildActionInternal* Action);
/** Construct a build action. Use Build() on a builder from IBuild::CreateAction(). */
inline explicit FBuildAction(Private::IBuildActionInternal* InAction)
: Action(InAction)
{
}
TRefCountPtr<Private::IBuildActionInternal> Action;
};
/**
* A build action builder is used to construct a build action.
*
* Create using IBuild::CreateAction() which must be given a build function name.
*
* @see FBuildAction
*/
class FBuildActionBuilder
{
public:
/** Add a constant object with a key that is unique within this action. */
inline void AddConstant(FUtf8StringView Key, const FCbObject& Value)
{
ActionBuilder->AddConstant(Key, Value);
}
/** Add an input with a key that is unique within this action. */
inline void AddInput(FUtf8StringView Key, const FIoHash& RawHash, uint64 RawSize)
{
ActionBuilder->AddInput(Key, RawHash, RawSize);
}
/** Build a build action, which makes this builder subsequently unusable. */
inline FBuildAction Build()
{
ON_SCOPE_EXIT { ActionBuilder = nullptr; };
return ActionBuilder->Build();
}
private:
friend FBuildActionBuilder Private::CreateBuildActionBuilder(Private::IBuildActionBuilderInternal* ActionBuilder);
/** Construct a build action builder. Use IBuild::CreateAction(). */
inline explicit FBuildActionBuilder(Private::IBuildActionBuilderInternal* InActionBuilder)
: ActionBuilder(InActionBuilder)
{
}
TUniquePtr<Private::IBuildActionBuilderInternal> ActionBuilder;
};
/**
* A build action that can be null.
*
* @see FBuildAction
*/
class FOptionalBuildAction : private FBuildAction
{
public:
inline FOptionalBuildAction() : FBuildAction(nullptr) {}
inline FOptionalBuildAction(FBuildAction&& InAction) : FBuildAction(MoveTemp(InAction)) {}
inline FOptionalBuildAction(const FBuildAction& InAction) : FBuildAction(InAction) {}
inline FOptionalBuildAction& operator=(FBuildAction&& InAction) { FBuildAction::operator=(MoveTemp(InAction)); return *this; }
inline FOptionalBuildAction& operator=(const FBuildAction& InAction) { FBuildAction::operator=(InAction); return *this; }
/** Returns the build action. The caller must check for null before using this accessor. */
inline const FBuildAction& Get() const & { return *this; }
inline FBuildAction Get() && { return MoveTemp(*this); }
inline bool IsNull() const { return !IsValid(); }
inline bool IsValid() const { return Action.IsValid(); }
inline explicit operator bool() const { return IsValid(); }
inline void Reset() { *this = FOptionalBuildAction(); }
};
} // UE::DerivedData
#undef UE_API