type_traits.hpp Source File

type_traits.hpp Source File#

Composable Kernel: type_traits.hpp Source File
type_traits.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2018-2024, Advanced Micro Devices, Inc. All rights reserved.
3
4#pragma once
5
7#include <tuple>
8#include <type_traits>
9#include <stdint.h>
10
11namespace ck_tile {
12
13// remove_cvref_t
14template <typename T>
15using remove_reference_t = typename std::remove_reference<T>::type;
16
17template <typename T>
18using remove_cv_t = typename std::remove_cv<T>::type;
19
20template <typename T>
22
23template <typename T>
24using remove_pointer_t = typename std::remove_pointer<T>::type;
25
26template <typename From, typename To>
28{
29 static_assert(!std::is_const_v<From>);
30
31 using type = To;
32};
33
34template <typename From, typename To>
35struct copy_const<const From, To>
36{
37 using type = std::add_const_t<typename copy_const<From, To>::type>;
38};
39
40template <typename From, typename To>
42
43namespace detail {
44template <class Default, class AlwaysVoid, template <class...> class Op, class... Args>
46{
47 using value_t = std::false_type;
48 using type = Default;
49};
50
51template <class Default, template <class...> class Op, class... Args>
52struct detector<Default, std::void_t<Op<Args...>>, Op, Args...>
53{
54 using value_t = std::true_type;
55 using type = Op<Args...>;
56};
57} // namespace detail
58
60{
61 ~nonesuch() = delete;
62 nonesuch(nonesuch const&) = delete;
63 void operator=(nonesuch const&) = delete;
64};
65
66template <template <class...> class Op, class... Args>
67using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
68
69namespace impl {
70
71template <typename T>
72using has_is_static = decltype(T::is_static());
73
74template <typename T>
76{
77 static constexpr bool value = []() {
78 if constexpr(is_detected<has_is_static, T>{})
79 return T::is_static();
80 else
81 return std::is_arithmetic<T>::value;
82 }();
83};
84} // namespace impl
85
86template <typename T>
88
89template <typename T>
90inline constexpr bool is_static_v = is_static<T>::value;
91
92// TODO: deprecate this
93template <typename T>
95// TODO: if evaluating a rvalue, e.g. a const integer
96// , this helper will also return false, which is not good(?)
97// do we need something like is_constexpr()?
98
99// FIXME: do we need this anymore?
100template <
101 typename PY,
102 typename PX,
103 typename std::enable_if<std::is_pointer_v<PY> && std::is_pointer_v<PX>, bool>::type = false>
105{
106#pragma clang diagnostic push
107#pragma clang diagnostic ignored "-Wold-style-cast"
108#pragma clang diagnostic ignored "-Wcast-align"
109 return (PY)p_x; // NOLINT(old-style-cast, cast-align)
110#pragma clang diagnostic pop
111}
112
113template <typename CompareTo, typename... Rest>
114struct is_any_of : std::false_type
115{
116};
117
118template <typename CompareTo, typename FirstType>
119struct is_any_of<CompareTo, FirstType> : std::is_same<CompareTo, FirstType>
120{
121};
122
123template <typename CompareTo, typename FirstType, typename... Rest>
124struct is_any_of<CompareTo, FirstType, Rest...>
125 : std::integral_constant<bool,
126 std::is_same<CompareTo, FirstType>::value ||
127 is_any_of<CompareTo, Rest...>::value>
128{
129};
130
131// Helper to check if a type is a specialization of a given template
132template <typename Test, template <typename...> class RefTemplate>
133struct is_specialization_of : std::false_type
134{
135};
136
137template <template <typename...> class RefTemplate, typename... Args>
138struct is_specialization_of<RefTemplate<Args...>, RefTemplate> : std::true_type
139{
140};
141
142// Helper to get a tuple element or default type
143namespace detail {
144
145template <bool IsWithinBounds, std::size_t Idx, typename Tuple, typename DefaultType>
147{
148 using type = DefaultType;
149};
150
151template <std::size_t Idx, typename Tuple, typename DefaultType>
152struct tuple_element_or_default_dispatch<true, Idx, Tuple, DefaultType>
153{
154 using type = std::tuple_element_t<Idx, Tuple>;
155};
156
157} // namespace detail
158
159template <typename Tuple_, std::size_t Idx, typename DefaultType>
161{
163 static constexpr bool is_within_bounds = Idx < std::tuple_size_v<Tuple>;
164 using type = typename detail::
165 tuple_element_or_default_dispatch<is_within_bounds, Idx, Tuple, DefaultType>::type;
166};
167template <typename Tuple_, std::size_t Idx, typename DefaultType>
170
171} // namespace ck_tile
#define CK_TILE_HOST_DEVICE
Definition config.hpp:42
Definition arch.hpp:385
Definition tile/core/arch/amd_buffer_addressing.hpp:110
decltype(T::is_static()) has_is_static
Definition type_traits.hpp:72
Definition tile/core/algorithm/cluster_descriptor.hpp:13
remove_cv_t< std::remove_reference_t< T > > remove_cvref_t
Definition type_traits.hpp:21
typename std::remove_reference< T >::type remove_reference_t
Definition type_traits.hpp:15
typename detail::detector< nonesuch, void, Op, Args... >::value_t is_detected
Definition type_traits.hpp:67
typename std::remove_pointer< T >::type remove_pointer_t
Definition type_traits.hpp:24
CK_TILE_HOST_DEVICE PY c_style_pointer_cast(PX p_x)
Definition type_traits.hpp:104
constexpr bool is_static_v
Definition type_traits.hpp:90
typename std::remove_cv< T >::type remove_cv_t
Definition type_traits.hpp:18
typename tuple_element_or_default< Tuple_, Idx, DefaultType >::type tuple_element_or_default_t
Definition type_traits.hpp:168
typename copy_const< From, To >::type copy_const_t
Definition type_traits.hpp:41
is_static< T > is_known_at_compile_time
Definition type_traits.hpp:94
impl::is_static_impl< remove_cvref_t< T > > is_static
Definition type_traits.hpp:87
@ Default
Definition gemm_pipeline_ag_bg_cr_scheduler.hpp:15
STL namespace.
std::add_const_t< typename copy_const< From, To >::type > type
Definition type_traits.hpp:37
Definition type_traits.hpp:28
To type
Definition type_traits.hpp:31
Definition type_traits.hpp:46
Default type
Definition type_traits.hpp:48
std::false_type value_t
Definition type_traits.hpp:47
std::tuple_element_t< Idx, Tuple > type
Definition type_traits.hpp:154
DefaultType type
Definition type_traits.hpp:148
Definition type_traits.hpp:76
static constexpr bool value
Definition type_traits.hpp:77
Definition type_traits.hpp:115
Definition type_traits.hpp:134
Definition type_traits.hpp:60
nonesuch(nonesuch const &)=delete
void operator=(nonesuch const &)=delete
Definition type_traits.hpp:161
remove_cvref_t< Tuple_ > Tuple
Definition type_traits.hpp:162
static constexpr bool is_within_bounds
Definition type_traits.hpp:163
typename detail:: tuple_element_or_default_dispatch< is_within_bounds, Idx, Tuple, DefaultType >::type type
Definition type_traits.hpp:164