Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Private/Cooker/DiffWriterZenHeader.h
2025-05-18 13:04:45 +08:00

94 lines
3.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "DiffWriterArchive.h"
#include "Serialization/ZenPackageHeader.h"
namespace UE::DiffWriter
{
/**
* Helper object for FDiffWriterZenHeader: Stores the map from PublicExportHash to package-relative
* objectpath for all of the objects in a package, used to convert a ZenPackageHeader's import's
* FPackageObjectIndex into the full path to the imported object
*/
class FZenPackageExportsForDiff
{
public:
void Initialize(FAccumulatorGlobals& Globals, FName InPackageName, bool bUseZenStore);
FStringView GetExportPackageRelativePath(uint64 PublicExportHash);
private:
void InitializeFromZenStore(FAccumulatorGlobals& Globals);
void InitializeFromMemory(FAccumulatorGlobals& Globals);
private:
FName PackageName = NAME_None;
TMap<uint64, FString> ExportPaths;
};
/** Adapter type for FDiffWriterZenHeader to represent its exports in DumpTableDifferences. */
struct FZenHeaderIndexIntoExportMap
{
/** Index of the given export in FZenPackageHeader::ExportMap. */
int32 Index;
};
/**
* Context object for DumpTableDifferences when we are using EPackageHeaderFormat::ZenPackageSummary and so the
* header information comes from ZenStore's optimized package format parsed into FZenPackageHeader.
*/
class FDiffWriterZenHeader
{
public:
// Constructor and simple data readers
FDiffWriterZenHeader(FAccumulatorGlobals& InGlobals, const FMessageCallback& InMessageCallback,
bool bInUseZenStoreForImports, const FPackageData& Package, const FString& AssetFilename,
const TCHAR* WhichComparisonPackage);
bool IsValid() const;
const FZenPackageHeader& GetPackageHeader() const;
// Optional data loaded on demand
FStringView GetObjectIndexPathName(FPackageObjectIndex PackageObjectIndex);
// API for DumpTableDifferences
bool IsNameMapIdentical(FDiffWriterZenHeader& DestContext,
const TArray<FString>& SourceNames, const TArray<FString>& DestNames);
FString GetTableKey(const FString& Id);
bool CompareTableItem(FDiffWriterZenHeader& DestContext, const FString& SourceText, const FString& DestText);
FString ConvertItemToText(const FString& Id);
bool IsImportMapIdentical(FDiffWriterZenHeader& DestContext);
FString GetTableKey(FPackageObjectIndex Id);
bool CompareTableItem(FDiffWriterZenHeader& DestContext, const FPackageObjectIndex& SourceIndex,
const FPackageObjectIndex& DestIndex);
FString ConvertItemToText(FPackageObjectIndex Id);
bool IsExportMapIdentical(FDiffWriterZenHeader& DestContext);
FString GetTableKey(const FZenHeaderIndexIntoExportMap& Id);
bool CompareTableItem(FDiffWriterZenHeader& DestContext, const FZenHeaderIndexIntoExportMap& SourceExport,
const FZenHeaderIndexIntoExportMap& DestExport);
FString ConvertItemToText(const FZenHeaderIndexIntoExportMap& Id);
bool IsExportBundlesIdentical(FDiffWriterZenHeader& DestContext);
bool IsExportBundleIdentical(FDiffWriterZenHeader& DestContext, int32 Index);
FString ConvertExportBundleToText(int32 Index);
bool IsDependencyBundlesIdentical(FDiffWriterZenHeader& DestContext);
bool IsDependencyBundleIdentical(FDiffWriterZenHeader& DestContext, int32 Index);
FString ConvertDependencyBundleToText(int32 Index);
void LogMessage(ELogVerbosity::Type Verbosity, FStringView Message);
private:
FZenPackageHeader PackageHeader;
TMap<FName, FZenPackageExportsForDiff> ImportedPackageExports;
TMap<FPackageObjectIndex, FString> ObjectIndexPathNames;
FAccumulatorGlobals& Globals;
const FMessageCallback& MessageCallback;
bool bUseZenStoreForImports = false;
bool bValid = true;
};
}