1 //===-------------- TypeOrdering.h - Total ordering for types ---*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// Allows QualTypes to be sorted and hence used in maps and sets. 11 /// 12 /// Defines clang::QualTypeOrdering, a total ordering on clang::QualType, 13 /// and hence enables QualType values to be sorted and to be used in 14 /// std::maps, std::sets, llvm::DenseMaps, and llvm::DenseSets. 15 /// 16 //===----------------------------------------------------------------------===// 17 18 #ifndef LLVM_CLANG_AST_TYPEORDERING_H 19 #define LLVM_CLANG_AST_TYPEORDERING_H 20 21 #include "clang/AST/CanonicalType.h" 22 #include "clang/AST/Type.h" 23 #include <functional> 24 25 namespace clang { 26 27 /// Function object that provides a total ordering on QualType values. 28 struct QualTypeOrdering { operatorQualTypeOrdering29 bool operator()(QualType T1, QualType T2) const { 30 return std::less<void*>()(T1.getAsOpaquePtr(), T2.getAsOpaquePtr()); 31 } 32 }; 33 34 } 35 36 namespace llvm { 37 38 template<> struct DenseMapInfo<clang::QualType> { 39 static inline clang::QualType getEmptyKey() { return clang::QualType(); } 40 41 static inline clang::QualType getTombstoneKey() { 42 using clang::QualType; 43 return QualType::getFromOpaquePtr(reinterpret_cast<clang::Type *>(-1)); 44 } 45 46 static unsigned getHashValue(clang::QualType Val) { 47 return (unsigned)((uintptr_t)Val.getAsOpaquePtr()) ^ 48 ((unsigned)((uintptr_t)Val.getAsOpaquePtr() >> 9)); 49 } 50 51 static bool isEqual(clang::QualType LHS, clang::QualType RHS) { 52 return LHS == RHS; 53 } 54 }; 55 56 template<> struct DenseMapInfo<clang::CanQualType> { 57 static inline clang::CanQualType getEmptyKey() { 58 return clang::CanQualType(); 59 } 60 61 static inline clang::CanQualType getTombstoneKey() { 62 using clang::CanQualType; 63 return CanQualType::getFromOpaquePtr(reinterpret_cast<clang::Type *>(-1)); 64 } 65 66 static unsigned getHashValue(clang::CanQualType Val) { 67 return (unsigned)((uintptr_t)Val.getAsOpaquePtr()) ^ 68 ((unsigned)((uintptr_t)Val.getAsOpaquePtr() >> 9)); 69 } 70 71 static bool isEqual(clang::CanQualType LHS, clang::CanQualType RHS) { 72 return LHS == RHS; 73 } 74 }; 75 } 76 77 #endif 78