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"
49 StringRef
getName()
const {
return Name; }
58 StringRef
getName()
const {
return ME->getKey(); }
66 using MapEntry = llvm::StringMapEntry<llvm::ErrorOr<DirectoryEntry &>>;
97 struct optional_none_tag {};
101 bool hasOptionalValue()
const {
return ME; }
104 struct dense_map_empty_tag {};
105 struct dense_map_tombstone_tag {};
109 : ME(
llvm::DenseMapInfo<const
MapEntry *>::getEmptyKey()) {}
111 : ME(
llvm::DenseMapInfo<const
MapEntry *>::getTombstoneKey()) {}
112 bool isSpecialDenseMapKey()
const {
127 using optional_none_tag =
typename RefTy::optional_none_tag;
133 template <
class... ArgTypes>
135 : MaybeRef(
std::forward<ArgTypes>(Args)...) {}
137 void reset() { MaybeRef = optional_none_tag(); }
139 bool has_value()
const {
return MaybeRef.hasOptionalValue(); }
151 return std::move(MaybeRef);
154 template <
class... Args>
void emplace(Args &&...args) {
155 MaybeRef = RefTy(std::forward<Args>(args)...);
166namespace optional_detail {
179 template <
class... ArgTypes>
184 StorageImpl::operator=(Ref);
190 "OptionalDirectoryEntryRef must avoid size overhead");
192static_assert(std::is_trivially_copyable<OptionalDirectoryEntryRef>::value,
193 "OptionalDirectoryEntryRef should be trivially copyable");
200template <>
struct DenseMapInfo<
clang::DirectoryEntryRef> {
203 clang::DirectoryEntryRef::dense_map_empty_tag());
208 clang::DirectoryEntryRef::dense_map_tombstone_tag());
212 return hash_value(Val);
222 if (LHS.isSpecialDenseMapKey() || RHS.isSpecialDenseMapKey())
295 return has_value() ? &(*this)->getDirEntry() :
nullptr;
299static_assert(std::is_trivially_copyable<
300 OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr>::value,
301 "OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr should be "
302 "trivially copyable");
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
constexpr bool has_value() const
CustomizableOptional & operator=(DirectoryEntryRef &&y)
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
DirectoryEntryRef()=delete
friend llvm::hash_code hash_value(DirectoryEntryRef Ref)
Hash code is based on the DirectoryEntry, not the specific named reference.
bool isSameRef(DirectoryEntryRef RHS) const
Check if RHS referenced the file in exactly the same way.
const MapEntry & getMapEntry() const
const DirectoryEntry & getDirEntry() const
Cached information about one directory (either on disk or in the virtual file system).
StringRef getName() const
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()
void emplace(Args &&...args)
MapEntryOptionalStorage & operator=(RefTy Ref)
RefTy const & value() const &
Wrapper around OptionalDirectoryEntryRef that degrades to 'const DirectoryEntry*',...
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr(std::nullopt_t)
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr & operator=(const OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr &)=default
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr & operator=(std::nullopt_t)
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr(DirectoryEntryRef Ref)
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr()=default
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr(OptionalDirectoryEntryRef MaybeRef)
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr(OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr &&)=default
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr & operator=(OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr &&)=default
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr & operator=(OptionalDirectoryEntryRef MaybeRef)
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr(const OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr &)=default
OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr & operator=(DirectoryEntryRef Ref)
OptionalStorage(std::in_place_t, ArgTypes &&...Args)
OptionalStorage & operator=(clang::DirectoryEntryRef Ref)
OptionalStorage()=default
CustomizableOptional< DirectoryEntryRef > OptionalDirectoryEntryRef
YAML serialization mapping.
static clang::DirectoryEntryRef getTombstoneKey()
static clang::DirectoryEntryRef getEmptyKey()
static unsigned getHashValue(clang::DirectoryEntryRef Val)
static bool isEqual(clang::DirectoryEntryRef LHS, clang::DirectoryEntryRef RHS)