blob: 816bd8b79bfc4daf521522f4bcd1d9e9f281bd73 [file] [log] [blame]
//===--- UIdent.h - ---------------------------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SOURCEKIT_SUPPORT_UIDENT_H
#define LLVM_SOURCEKIT_SUPPORT_UIDENT_H
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Compiler.h"
#include <atomic>
namespace llvm {
class raw_ostream;
}
namespace SourceKit {
/// \brief A string identifier that is uniqued for the process lifetime.
/// The string identifier should not contain any spaces.
class UIdent {
void *Ptr = 0;
explicit UIdent(void *Ptr) : Ptr(Ptr) { }
public:
UIdent() = default;
explicit UIdent(llvm::StringRef Str);
bool isValid() const { return Ptr != 0; }
bool isInvalid() const { return !isValid(); }
void *getAsOpaqueValue() const { return Ptr; }
static UIdent getFromOpaqueValue(void *Val) {
return UIdent(Val);
}
void setTag(void *Tag);
void *getTag() const;
friend bool operator==(const UIdent &LHS, const UIdent &RHS) {
return LHS.Ptr == RHS.Ptr;
}
friend bool operator!=(const UIdent &LHS, const UIdent &RHS) {
return !(LHS == RHS);
}
llvm::StringRef getName() const;
const char *c_str() const;
LLVM_ATTRIBUTE_USED void dump() const;
void print(llvm::raw_ostream &OS) const;
};
class LazyUIdent {
const char *Name;
mutable std::atomic<UIdent> UID;
public:
LazyUIdent(const char *Name) : Name(Name) { }
UIdent get() const {
if (UID.load().isInvalid())
UID = UIdent(Name);
return UID;
}
operator UIdent() const {
return get();
}
};
} // namespace SourceKit
#endif