//===--- 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 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 { 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 { static const bool value = true;}; } // end namespace llvm #endif