diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2014-04-15 07:08:40 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2014-04-15 07:08:40 +0000 |
commit | 9393eb354ff7cc08a8cc0a4ec6ed5c55b100abf5 (patch) | |
tree | 9a0a7461ad25346356ea311bc014066718dcffca /include/llvm/ADT | |
parent | 0b6cb7104b15504cd41f48cc2babcbcee70775f3 (diff) | |
download | llvm-9393eb354ff7cc08a8cc0a4ec6ed5c55b100abf5.tar.gz llvm-9393eb354ff7cc08a8cc0a4ec6ed5c55b100abf5.tar.bz2 llvm-9393eb354ff7cc08a8cc0a4ec6ed5c55b100abf5.tar.xz |
Add a DenseMapInfo specialization for PointerUnion. In tree user to land shortly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206253 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT')
-rw-r--r-- | include/llvm/ADT/PointerUnion.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/include/llvm/ADT/PointerUnion.h b/include/llvm/ADT/PointerUnion.h index 8cbe8d1df7..dafd0e0510 100644 --- a/include/llvm/ADT/PointerUnion.h +++ b/include/llvm/ADT/PointerUnion.h @@ -15,6 +15,7 @@ #ifndef LLVM_ADT_POINTERUNION_H #define LLVM_ADT_POINTERUNION_H +#include "llvm/ADT/DenseMapInfo.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/Support/Compiler.h" @@ -455,6 +456,33 @@ namespace llvm { ::NumLowBitsAvailable }; }; + + // Teach DenseMap how to use PointerUnions as keys. + template<typename T, typename U> + struct DenseMapInfo<PointerUnion<T, U> > { + typedef PointerUnion<T, U> Pair; + typedef DenseMapInfo<T> FirstInfo; + typedef DenseMapInfo<U> SecondInfo; + + static inline Pair getEmptyKey() { + return Pair(FirstInfo::getEmptyKey()); + } + static inline Pair getTombstoneKey() { + return Pair(FirstInfo::getTombstoneKey()); + } + static unsigned getHashValue(const Pair &PairVal) { + intptr_t key = (intptr_t)PairVal.getOpaqueValue(); + return DenseMapInfo<intptr_t>::getHashValue(key); + } + static bool isEqual(const Pair &LHS, const Pair &RHS) { + return LHS.template is<T>() == RHS.template is<T>() && + (LHS.template is<T>() ? + FirstInfo::isEqual(LHS.template get<T>(), + RHS.template get<T>()) : + SecondInfo::isEqual(LHS.template get<U>(), + RHS.template get<U>())); + } + }; } #endif |