// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreTypes.h" #include "Containers/StringFwd.h" #include "DerivedDataPayloadId.h" #include "IO/IoHash.h" #include "Templates/TypeHash.h" namespace UE::DerivedData { /** A key that uniquely identifies a build definition. */ struct FBuildKey { FIoHash Hash; /** A key with a zero hash. */ static const FBuildKey Empty; }; inline const FBuildKey FBuildKey::Empty; /** A key that uniquely identifies a build action. */ struct FBuildActionKey { FIoHash Hash; /** A key with a zero hash. */ static const FBuildActionKey Empty; }; inline const FBuildActionKey FBuildActionKey::Empty; /** A key that uniquely identifies a payload within a build output. */ struct FBuildPayloadKey { FBuildKey BuildKey; FPayloadId Id; /** A payload key with an empty build key and a null payload identifier. */ static const FBuildPayloadKey Empty; }; inline const FBuildPayloadKey FBuildPayloadKey::Empty; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// inline bool operator==(const FBuildKey& A, const FBuildKey& B) { return A.Hash == B.Hash; } inline bool operator!=(const FBuildKey& A, const FBuildKey& B) { return A.Hash != B.Hash; } inline bool operator<(const FBuildKey& A, const FBuildKey& B) { return A.Hash < B.Hash; } inline uint32 GetTypeHash(const FBuildKey& Key) { return GetTypeHash(Key.Hash); } template inline TStringBuilderBase& operator<<(TStringBuilderBase& Builder, const FBuildKey& Key) { return Builder << "Build/"_ASV << Key.Hash; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// inline bool operator==(const FBuildActionKey& A, const FBuildActionKey& B) { return A.Hash == B.Hash; } inline bool operator!=(const FBuildActionKey& A, const FBuildActionKey& B) { return A.Hash != B.Hash; } inline bool operator<(const FBuildActionKey& A, const FBuildActionKey& B) { return A.Hash < B.Hash; } inline uint32 GetTypeHash(const FBuildActionKey& Key) { return GetTypeHash(Key.Hash); } template inline TStringBuilderBase& operator<<(TStringBuilderBase& Builder, const FBuildActionKey& Key) { return Builder << "BuildAction/"_ASV << Key.Hash; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// inline bool operator==(const FBuildPayloadKey& A, const FBuildPayloadKey& B) { return A.BuildKey == B.BuildKey && A.Id == B.Id; } inline bool operator!=(const FBuildPayloadKey& A, const FBuildPayloadKey& B) { return A.BuildKey != B.BuildKey || A.Id != B.Id; } inline bool operator<(const FBuildPayloadKey& A, const FBuildPayloadKey& B) { const FBuildKey& KeyA = A.BuildKey; const FBuildKey& KeyB = B.BuildKey; return KeyA == KeyB ? A.Id < B.Id : KeyA < KeyB; } inline uint32 GetTypeHash(const FBuildPayloadKey& Key) { return HashCombine(GetTypeHash(Key.BuildKey), GetTypeHash(Key.Id)); } template inline TStringBuilderBase& operator<<(TStringBuilderBase& Builder, const FBuildPayloadKey& Key) { return Builder << Key.BuildKey << CharType('/') << Key.Id; } } // UE::DerivedData