[MLIR] Simplify key construction/hashing in StorageUniquer
`getKey` and `getHash` use mutually exclusive overloads based on existence of methods to determine how to compute get the key or hash, respectively. This is a bit verbose with `std::enable_if_t`. Simplify it a bit by using `if constexpr` directly. As an added bonus, this is slightly quicker to compile. Differential Revision: https://reviews.llvm.org/D139245
This commit is contained in:
parent
1623aee41a
commit
4509fb9c00
|
@ -294,45 +294,32 @@ private:
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
|
||||||
/// Used to construct an instance of 'ImplTy::KeyTy' if there is an
|
/// Used to construct an instance of 'ImplTy::KeyTy' if there is an
|
||||||
/// 'ImplTy::getKey' function for the provided arguments.
|
/// 'ImplTy::getKey' function for the provided arguments. Otherwise, then we
|
||||||
|
/// try to directly construct the 'ImplTy::KeyTy' with the provided arguments.
|
||||||
template <typename ImplTy, typename... Args>
|
template <typename ImplTy, typename... Args>
|
||||||
static std::enable_if_t<
|
static typename ImplTy::KeyTy getKey(Args &&...args) {
|
||||||
llvm::is_detected<detail::has_impltype_getkey_t, ImplTy, Args...>::value,
|
if constexpr (llvm::is_detected<detail::has_impltype_getkey_t, ImplTy,
|
||||||
typename ImplTy::KeyTy>
|
Args...>::value)
|
||||||
getKey(Args &&...args) {
|
return ImplTy::getKey(args...);
|
||||||
return ImplTy::getKey(args...);
|
else
|
||||||
}
|
return typename ImplTy::KeyTy(args...);
|
||||||
/// If there is no 'ImplTy::getKey' method, then we try to directly construct
|
|
||||||
/// the 'ImplTy::KeyTy' with the provided arguments.
|
|
||||||
template <typename ImplTy, typename... Args>
|
|
||||||
static std::enable_if_t<
|
|
||||||
!llvm::is_detected<detail::has_impltype_getkey_t, ImplTy, Args...>::value,
|
|
||||||
typename ImplTy::KeyTy>
|
|
||||||
getKey(Args &&...args) {
|
|
||||||
return typename ImplTy::KeyTy(args...);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Key Hashing
|
// Key Hashing
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
|
||||||
/// Used to generate a hash for the 'ImplTy::KeyTy' of a storage instance if
|
/// Used to generate a hash for the `ImplTy` of a storage instance if
|
||||||
/// there is an 'ImplTy::hashKey' overload for 'DerivedKey'.
|
/// there is a `ImplTy::hashKey. Otherwise, if there is no `ImplTy::hashKey`
|
||||||
|
/// then default to using the 'llvm::DenseMapInfo' definition for
|
||||||
|
/// 'DerivedKey' for generating a hash.
|
||||||
template <typename ImplTy, typename DerivedKey>
|
template <typename ImplTy, typename DerivedKey>
|
||||||
static std::enable_if_t<
|
static ::llvm::hash_code getHash(const DerivedKey &derivedKey) {
|
||||||
llvm::is_detected<detail::has_impltype_hash_t, ImplTy, DerivedKey>::value,
|
if constexpr (llvm::is_detected<detail::has_impltype_hash_t, ImplTy,
|
||||||
::llvm::hash_code>
|
DerivedKey>::value)
|
||||||
getHash(const DerivedKey &derivedKey) {
|
return ImplTy::hashKey(derivedKey);
|
||||||
return ImplTy::hashKey(derivedKey);
|
else
|
||||||
}
|
return DenseMapInfo<DerivedKey>::getHashValue(derivedKey);
|
||||||
/// If there is no 'ImplTy::hashKey' default to using the 'llvm::DenseMapInfo'
|
|
||||||
/// definition for 'DerivedKey' for generating a hash.
|
|
||||||
template <typename ImplTy, typename DerivedKey>
|
|
||||||
static std::enable_if_t<!llvm::is_detected<detail::has_impltype_hash_t,
|
|
||||||
ImplTy, DerivedKey>::value,
|
|
||||||
::llvm::hash_code>
|
|
||||||
getHash(const DerivedKey &derivedKey) {
|
|
||||||
return DenseMapInfo<DerivedKey>::getHashValue(derivedKey);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace mlir
|
} // namespace mlir
|
||||||
|
|
Loading…
Reference in New Issue