// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. using System; using System.IO; using System.Collections.Generic; namespace UnrealBuildTool { class DirectoryCache { public readonly DirectoryReference Directory; public readonly bool Exists; HashSet Files; HashSet Directories; public DirectoryCache(DirectoryReference InDirectory) { Directory = InDirectory; Exists = Directory.Exists(); if (!Exists) { Files = new HashSet(); Directories = new HashSet(); } } private void CacheFiles() { if (Files == null) { Files = new HashSet(Directory.EnumerateFileReferences()); } } public bool HasFile(FileReference CheckFile) { CacheFiles(); return Files.Contains(CheckFile); } public IEnumerable EnumerateFiles() { CacheFiles(); return Files; } private void CacheDirectories() { if (Directories == null) { Directories = new HashSet(Directory.EnumerateDirectoryReferences()); } } public IEnumerable EnumerateDirectories() { CacheDirectories(); return Directories; } } public static class DirectoryLookupCache { static DirectoryCache FindOrCreateDirectoryCache(DirectoryReference Directory) { DirectoryCache FoundDirectoryCache; if (!Directories.TryGetValue(Directory, out FoundDirectoryCache)) { FoundDirectoryCache = new DirectoryCache(Directory); Directories.Add(Directory, FoundDirectoryCache); } return FoundDirectoryCache; } static public bool FileExists(FileReference File) { DirectoryCache FoundDirectoryCache = FindOrCreateDirectoryCache(File.Directory); return FoundDirectoryCache.HasFile(File); } static public bool DirectoryExists(DirectoryReference Directory) { DirectoryCache FoundDirectoryCache = FindOrCreateDirectoryCache(Directory); return FoundDirectoryCache.Exists; } static public IEnumerable EnumerateFiles(DirectoryReference Directory) { DirectoryCache FoundDirectoryCache = FindOrCreateDirectoryCache(Directory); return FoundDirectoryCache.EnumerateFiles(); } static public IEnumerable EnumerateDirectories(DirectoryReference Directory) { DirectoryCache FoundDirectoryCache = FindOrCreateDirectoryCache(Directory); return FoundDirectoryCache.EnumerateDirectories(); } static public IEnumerable EnumerateDirectoriesRecursively(DirectoryReference Directory) { DirectoryCache FoundDirectoryCache = FindOrCreateDirectoryCache(Directory); foreach (DirectoryReference SubDirectory in FoundDirectoryCache.EnumerateDirectories()) { yield return SubDirectory; foreach (DirectoryReference ChildSubDirectory in EnumerateDirectoriesRecursively(SubDirectory)) { yield return ChildSubDirectory; } } } static Dictionary Directories = new Dictionary(); } }