MLIR  20.0.0git
TemplateExtras.h
Go to the documentation of this file.
1 //===- TemplateExtras.h -----------------------------------------*- 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 #ifndef MLIR_DIALECT_SPARSETENSOR_IR_DETAIL_TEMPLATEEXTRAS_H
10 #define MLIR_DIALECT_SPARSETENSOR_IR_DETAIL_TEMPLATEEXTRAS_H
11 
12 #include <utility>
13 
14 #include "llvm/ADT/STLExtras.h"
15 #include "llvm/Support/raw_ostream.h"
16 
17 namespace mlir {
18 namespace sparse_tensor {
19 namespace ir_detail {
20 
21 //===----------------------------------------------------------------------===//
22 template <typename T>
24  decltype(std::declval<T>().print(std::declval<llvm::raw_ostream &>()));
25 template <typename T>
26 using detect_has_print_method = llvm::is_detected<has_print_method, T>;
27 template <typename T, typename R = void>
29  std::enable_if_t<detect_has_print_method<T>::value, R>;
30 
31 /// Generic template for defining `operator<<` overloads which delegate
32 /// to `T::print(raw_ostream&) const`.
33 template <typename T>
35 operator<<(llvm::raw_ostream &os, T const &t) {
36  t.print(os);
37  return os;
38 }
39 
40 //===----------------------------------------------------------------------===//
41 template <typename T>
42 static constexpr bool IsZeroCostAbstraction =
43  // These two predicates license the compiler to make optimizations.
44  std::is_trivially_copyable_v<T> && std::is_trivially_destructible_v<T> &&
45  // This helps ensure ABI compatibility (e.g., padding and alignment).
46  std::is_standard_layout_v<T> &&
47  // These two are what SmallVector uses to determine whether it can
48  // use memcpy.
49  std::is_trivially_copy_constructible<T>::value &&
50  std::is_trivially_move_constructible<T>::value;
51 
52 //===----------------------------------------------------------------------===//
53 
54 } // namespace ir_detail
55 } // namespace sparse_tensor
56 } // namespace mlir
57 
58 #endif // MLIR_DIALECT_SPARSETENSOR_IR_DETAIL_TEMPLATEEXTRAS_H
static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer)
decltype(std::declval< T >().print(std::declval< llvm::raw_ostream & >())) has_print_method
enable_if_has_print_method< T, llvm::raw_ostream & > operator<<(llvm::raw_ostream &os, T const &t)
Generic template for defining operator<< overloads which delegate to T::print(raw_ostream&) const.
llvm::is_detected< has_print_method, T > detect_has_print_method
std::enable_if_t< detect_has_print_method< T >::value, R > enable_if_has_print_method
static constexpr bool IsZeroCostAbstraction
Include the generated interface declarations.