- //===--- SerializablePathCollection.h -- Index of paths ---------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_CLANG_INDEXSERIALIZATION_SERIALIZABLEPATHCOLLECTION_H 
- #define LLVM_CLANG_INDEXSERIALIZATION_SERIALIZABLEPATHCOLLECTION_H 
-   
- #include "clang/Basic/FileManager.h" 
- #include "llvm/ADT/APInt.h" 
- #include "llvm/ADT/DenseMap.h" 
- #include "llvm/ADT/SmallString.h" 
- #include "llvm/ADT/StringMap.h" 
- #include "llvm/ADT/StringRef.h" 
- #include "llvm/ADT/iterator.h" 
-   
- #include <string> 
- #include <vector> 
-   
- namespace clang { 
- namespace index { 
-   
- /// Pool of strings 
- class StringPool { 
-   llvm::SmallString<512> Buffer; 
-   
- public: 
-   struct StringOffsetSize { 
-     std::size_t Offset; 
-     std::size_t Size; 
-   
-     StringOffsetSize(size_t Offset, size_t Size) : Offset(Offset), Size(Size) {} 
-   }; 
-   
-   StringOffsetSize add(StringRef Str); 
-   StringRef getBuffer() const { return Buffer; } 
- }; 
-   
- /// Pool of filesystem paths backed by a StringPool 
- class PathPool { 
- public: 
-   /// Special root directory of a filesystem path. 
-   enum class RootDirKind { 
-     Regular = 0, 
-     CurrentWorkDir = 1, 
-     SysRoot = 2, 
-   }; 
-   
-   struct DirPath { 
-     RootDirKind Root; 
-     StringPool::StringOffsetSize Path; 
-   
-     DirPath(RootDirKind Root, const StringPool::StringOffsetSize &Path) 
-         : Root(Root), Path(Path) {} 
-   }; 
-   
-   struct FilePath { 
-     DirPath Dir; 
-     StringPool::StringOffsetSize Filename; 
-   
-     FilePath(const DirPath &Dir, const StringPool::StringOffsetSize &Filename) 
-         : Dir(Dir), Filename(Filename) {} 
-   }; 
-   
-   /// \returns index of the newly added file in FilePaths. 
-   size_t addFilePath(RootDirKind Root, const StringPool::StringOffsetSize &Dir, 
-                      StringRef Filename); 
-   
-   /// \returns offset in Paths and size of newly added directory. 
-   StringPool::StringOffsetSize addDirPath(StringRef Dir); 
-   
-   llvm::ArrayRef<FilePath> getFilePaths() const; 
-   
-   StringRef getPaths() const; 
-   
- private: 
-   StringPool Paths; 
-   std::vector<FilePath> FilePaths; 
- }; 
-   
- /// Stores file paths and produces serialization-friendly representation. 
- class SerializablePathCollection { 
-   std::string WorkDir; 
-   std::string SysRoot; 
-   
-   PathPool Paths; 
-   llvm::DenseMap<const clang::FileEntry *, std::size_t> UniqueFiles; 
-   llvm::StringMap<PathPool::DirPath, llvm::BumpPtrAllocator> UniqueDirs; 
-   
- public: 
-   const StringPool::StringOffsetSize WorkDirPath; 
-   const StringPool::StringOffsetSize SysRootPath; 
-   const StringPool::StringOffsetSize OutputFilePath; 
-   
-   SerializablePathCollection(llvm::StringRef CurrentWorkDir, 
-                              llvm::StringRef SysRoot, 
-                              llvm::StringRef OutputFile); 
-   
-   /// \returns buffer containing all the paths. 
-   llvm::StringRef getPathsBuffer() const { return Paths.getPaths(); } 
-   
-   /// \returns file paths (no directories) backed by buffer exposed in 
-   /// getPathsBuffer. 
-   ArrayRef<PathPool::FilePath> getFilePaths() const { 
-     return Paths.getFilePaths(); 
-   } 
-   
-   /// Stores path to \p FE if it hasn't been stored yet. 
-   /// \returns index to array exposed by getPathsBuffer(). 
-   size_t tryStoreFilePath(const clang::FileEntry &FE); 
-   
- private: 
-   /// Stores \p Path if it is non-empty. 
-   /// Warning: this method doesn't check for uniqueness. 
-   /// \returns offset of \p Path value begin in buffer with stored paths. 
-   StringPool::StringOffsetSize storePath(llvm::StringRef Path); 
-   
-   /// Stores \p dirStr path if it hasn't been stored yet. 
-   PathPool::DirPath tryStoreDirPath(llvm::StringRef dirStr); 
- }; 
-   
- } // namespace index 
- } // namespace clang 
-   
- #endif // LLVM_CLANG_INDEXSERIALIZATION_SERIALIZABLEPATHCOLLECTION_H 
-