// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "StringUtils.h" #include "UnrealSourceFile.h" #include "UnrealTypeDefinitionInfo.h" #include "UObject/Stack.h" class UField; class UClass; class FProperty; class UPackage; class UEnum; class FArchive; struct FManifestModule; class FUnrealSourceFile; class FUnrealTypeDefinitionInfo; // Helper class to support freezing of the container struct FFreezableContainer { public: void Freeze() { bFrozen = true; } protected: bool bFrozen = false; }; // Wrapper class around TypeDefinition map so we can maintain a parallel by name map struct FTypeDefinitionInfoMap { void AddNameLookup(FUnrealObjectDefinitionInfo& Definition) { DefinitionsByName.Add(Definition.GetFName(), Definition.AsShared()); } // Finding by name must be done on the stripped name for classes and script structs TSharedRef* FindByName(const TCHAR* Name) { FName SearchName(Name, EFindName::FNAME_Find); if (SearchName != NAME_None) { return DefinitionsByName.Find(SearchName); } return nullptr; } template To* FindByName(const TCHAR* Name) { return UHTCast(FindByName(Name)); } FUnrealTypeDefinitionInfo& FindByNameChecked(const TCHAR* Name) { TSharedRef* TypeDef = FindByName(Name); check(TypeDef); return **TypeDef; } template To& FindByNameChecked(const TCHAR* Name) { To* TypeDef = FindByName(Name); check(TypeDef); return *TypeDef; } template void ForAllTypesByName(Lambda&& InLambda) { for (const TPair>& KVP : DefinitionsByName) { InLambda(*KVP.Value); } } template Type* Find(Lambda&& InLambda) { for (const TPair>& KVP : DefinitionsByName) { if (Type* TypeDef = UHTCast(*KVP.Value)) { if (InLambda(*TypeDef)) { return TypeDef; } } } return nullptr; } void Reset() { DefinitionsByName.Reset(); } private: TMap> DefinitionsByName; }; // Wrapper class around SourceFiles map so we can quickly get a list of source files for a given package struct FUnrealSourceFiles : public FFreezableContainer { TSharedPtr AddByHash(uint32 Hash, FString&& Filename, TSharedRef SourceFile) { check(!bFrozen); TSharedRef* Existing = SourceFilesByString.FindByHash(Hash, Filename); TSharedPtr Return(Existing != nullptr ? TSharedPtr(*Existing) : TSharedPtr()); AllSourceFiles.Add(&SourceFile.Get()); SourceFilesByString.AddByHash(Hash, MoveTemp(Filename), MoveTemp(SourceFile)); return Return; } const TSharedRef* Find(const FString& Id) const { check(bFrozen); return SourceFilesByString.Find(Id); } const TArray& GetAllSourceFiles() const { check(bFrozen); return AllSourceFiles; } void Reset() { AllSourceFiles.Reset(); SourceFilesByString.Reset(); } private: // A map of all source files indexed by string. TMap> SourceFilesByString; // Total collection of sources TArray AllSourceFiles; }; extern FUnrealSourceFiles GUnrealSourceFilesMap; extern FTypeDefinitionInfoMap GTypeDefinitionInfoMap;