[MLIR] Simplify key construction/hashing in StorageUniquer
authorJoe Loser <joeloser@fastmail.com>
Sat, 3 Dec 2022 05:18:24 +0000 (22:18 -0700)
committerJoe Loser <joeloser@fastmail.com>
Sun, 4 Dec 2022 00:19:46 +0000 (17:19 -0700)
`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

mlir/include/mlir/Support/StorageUniquer.h

index dc4a692..39fe1e5 100644 (file)
@@ -294,45 +294,32 @@ private:
   //===--------------------------------------------------------------------===//
 
   /// 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>
-  static std::enable_if_t<
-      llvm::is_detected<detail::has_impltype_getkey_t, ImplTy, Args...>::value,
-      typename ImplTy::KeyTy>
-  getKey(Args &&...args) {
-    return ImplTy::getKey(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...);
+  static typename ImplTy::KeyTy getKey(Args &&...args) {
+    if constexpr (llvm::is_detected<detail::has_impltype_getkey_t, ImplTy,
+                                    Args...>::value)
+      return ImplTy::getKey(args...);
+    else
+      return typename ImplTy::KeyTy(args...);
   }
 
   //===--------------------------------------------------------------------===//
   // Key Hashing
   //===--------------------------------------------------------------------===//
 
-  /// Used to generate a hash for the 'ImplTy::KeyTy' of a storage instance if
-  /// there is an 'ImplTy::hashKey' overload for 'DerivedKey'.
-  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 ImplTy::hashKey(derivedKey);
-  }
-  /// If there is no 'ImplTy::hashKey' default to using the 'llvm::DenseMapInfo'
-  /// definition for 'DerivedKey' for generating a hash.
+  /// Used to generate a hash for the `ImplTy` of a storage instance if
+  /// 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>
-  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);
+  static ::llvm::hash_code getHash(const DerivedKey &derivedKey) {
+    if constexpr (llvm::is_detected<detail::has_impltype_hash_t, ImplTy,
+                                    DerivedKey>::value)
+      return ImplTy::hashKey(derivedKey);
+    else
+      return DenseMapInfo<DerivedKey>::getHashValue(derivedKey);
   }
 };
 } // namespace mlir