mirror of
https://github.com/opnsense/src.git
synced 2026-02-27 20:01:13 -05:00
100 lines
2.7 KiB
C++
100 lines
2.7 KiB
C++
//===--- GlobalSelector.h - Cross-translation-unit "token" for selectors --===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// GlobalSelector is a ASTContext-independent way to refer to selectors.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_INDEX_GLOBALSELECTOR_H
|
|
#define LLVM_CLANG_INDEX_GLOBALSELECTOR_H
|
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include <string>
|
|
|
|
namespace clang {
|
|
class ASTContext;
|
|
class Selector;
|
|
|
|
namespace idx {
|
|
class Program;
|
|
|
|
/// \brief A ASTContext-independent way to refer to selectors.
|
|
class GlobalSelector {
|
|
void *Val;
|
|
|
|
explicit GlobalSelector(void *val) : Val(val) { }
|
|
|
|
public:
|
|
GlobalSelector() : Val(0) { }
|
|
|
|
/// \brief Get the ASTContext-specific selector.
|
|
Selector getSelector(ASTContext &AST) const;
|
|
|
|
bool isValid() const { return Val != 0; }
|
|
bool isInvalid() const { return !isValid(); }
|
|
|
|
/// \brief Get a printable name for debugging purpose.
|
|
std::string getPrintableName() const;
|
|
|
|
/// \brief Get a GlobalSelector for the ASTContext-specific selector.
|
|
static GlobalSelector get(Selector Sel, Program &Prog);
|
|
|
|
void *getAsOpaquePtr() const { return Val; }
|
|
|
|
static GlobalSelector getFromOpaquePtr(void *Ptr) {
|
|
return GlobalSelector(Ptr);
|
|
}
|
|
|
|
friend bool operator==(const GlobalSelector &LHS, const GlobalSelector &RHS) {
|
|
return LHS.getAsOpaquePtr() == RHS.getAsOpaquePtr();
|
|
}
|
|
|
|
// For use in a std::map.
|
|
friend bool operator< (const GlobalSelector &LHS, const GlobalSelector &RHS) {
|
|
return LHS.getAsOpaquePtr() < RHS.getAsOpaquePtr();
|
|
}
|
|
|
|
// For use in DenseMap/DenseSet.
|
|
static GlobalSelector getEmptyMarker() { return GlobalSelector((void*)-1); }
|
|
static GlobalSelector getTombstoneMarker() {
|
|
return GlobalSelector((void*)-2);
|
|
}
|
|
};
|
|
|
|
} // namespace idx
|
|
|
|
} // namespace clang
|
|
|
|
namespace llvm {
|
|
/// Define DenseMapInfo so that GlobalSelectors can be used as keys in DenseMap
|
|
/// and DenseSets.
|
|
template<>
|
|
struct DenseMapInfo<clang::idx::GlobalSelector> {
|
|
static inline clang::idx::GlobalSelector getEmptyKey() {
|
|
return clang::idx::GlobalSelector::getEmptyMarker();
|
|
}
|
|
|
|
static inline clang::idx::GlobalSelector getTombstoneKey() {
|
|
return clang::idx::GlobalSelector::getTombstoneMarker();
|
|
}
|
|
|
|
static unsigned getHashValue(clang::idx::GlobalSelector);
|
|
|
|
static inline bool
|
|
isEqual(clang::idx::GlobalSelector LHS, clang::idx::GlobalSelector RHS) {
|
|
return LHS == RHS;
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct isPodLike<clang::idx::GlobalSelector> { static const bool value = true;};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|