14 #ifndef LLVM_CLANG_BASIC_DIRECTORYENTRY_H
15 #define LLVM_CLANG_BASIC_DIRECTORYENTRY_H
19 #include "llvm/ADT/DenseMapInfo.h"
20 #include "llvm/ADT/Hashing.h"
21 #include "llvm/ADT/STLExtras.h"
22 #include "llvm/ADT/StringMap.h"
23 #include "llvm/ADT/StringRef.h"
24 #include "llvm/Support/ErrorOr.h"
52 StringRef
getName()
const {
return ME->getKey(); }
60 using MapEntry = llvm::StringMapEntry<llvm::ErrorOr<DirectoryEntry &>>;
91 struct optional_none_tag {};
95 bool hasOptionalValue()
const {
return ME; }
98 struct dense_map_empty_tag {};
99 struct dense_map_tombstone_tag {};
103 : ME(
llvm::DenseMapInfo<const
MapEntry *>::getEmptyKey()) {}
105 : ME(
llvm::DenseMapInfo<const
MapEntry *>::getTombstoneKey()) {}
106 bool isSpecialDenseMapKey()
const {
121 using optional_none_tag =
typename RefTy::optional_none_tag;
127 template <
class... ArgTypes>
129 : MaybeRef(
std::
forward<ArgTypes>(Args)...) {}
131 void reset() { MaybeRef = optional_none_tag(); }
133 bool has_value()
const {
return MaybeRef.hasOptionalValue(); }
145 return std::move(MaybeRef);
148 template <
class... Args>
void emplace(Args &&...args) {
149 MaybeRef = RefTy(std::forward<Args>(args)...);
160 namespace optional_detail {
173 template <
class... ArgTypes>
178 StorageImpl::operator=(Ref);
184 "OptionalDirectoryEntryRef must avoid size overhead");
186 static_assert(std::is_trivially_copyable<OptionalDirectoryEntryRef>::value,
187 "OptionalDirectoryEntryRef should be trivially copyable");
209 template <>
struct DenseMapInfo<
clang::DirectoryEntryRef> {
212 clang::DirectoryEntryRef::dense_map_empty_tag());
217 clang::DirectoryEntryRef::dense_map_tombstone_tag());
231 if (LHS.isSpecialDenseMapKey() || RHS.isSpecialDenseMapKey())
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
A reference to a DirectoryEntry that includes the name of the directory as it was accessed by the Fil...
StringRef getName() const
DirectoryEntryRef(const MapEntry &ME)
llvm::StringMapEntry< llvm::ErrorOr< DirectoryEntry & > > MapEntry
const MapEntry & getMapEntry() const
DirectoryEntryRef()=delete
friend llvm::hash_code hash_value(DirectoryEntryRef Ref)
Hash code is based on the DirectoryEntry, not the specific named reference.
const DirectoryEntry & getDirEntry() const
bool isSameRef(DirectoryEntryRef RHS) const
Check if RHS referenced the file in exactly the same way.
Cached information about one directory (either on disk or in the virtual file system).
friend class FileEntryTestHelper
Implements support for file system lookup, file system caching, and directory search management.
Customized storage for refs derived from map entires in FileManager, using the private optional_none_...
MapEntryOptionalStorage(std::in_place_t, ArgTypes &&...Args)
MapEntryOptionalStorage()
RefTy const & value() const &
MapEntryOptionalStorage & operator=(RefTy Ref)
void emplace(Args &&...args)
OptionalStorage(std::in_place_t, ArgTypes &&...Args)
OptionalStorage()=default
OptionalStorage & operator=(clang::DirectoryEntryRef Ref)
The JSON file list parser is used to communicate input to InstallAPI.
Diagnostic wrappers for TextAPI types for error reporting.
hash_code hash_value(const clang::tooling::dependencies::ModuleID &ID)
static clang::DirectoryEntryRef getTombstoneKey()
static clang::DirectoryEntryRef getEmptyKey()
static unsigned getHashValue(clang::DirectoryEntryRef Val)
static bool isEqual(clang::DirectoryEntryRef LHS, clang::DirectoryEntryRef RHS)
static clang::DirectoryEntryRef getFromVoidPointer(void *Ptr)
static void * getAsVoidPointer(clang::DirectoryEntryRef Dir)