/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/utility/integral_constant.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/utility/integral_constant.hpp Source File#

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/utility/integral_constant.hpp Source File
integral_constant.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: MIT
2 // Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved.
3 
4 #pragma once
5 
6 namespace ck {
7 
8 template <auto v>
9 struct constant
10 {
11  using value_type = decltype(v);
12  using type = constant; // using injected-class-name
13  static constexpr value_type value = v;
14  __host__ __device__ constexpr operator value_type() const noexcept { return value; }
15  __host__ __device__ constexpr value_type operator()() const noexcept { return value; }
16 };
17 
18 template <class T, T v>
20 {
21  static constexpr T value = v;
22  typedef T value_type;
24 };
25 
26 template <typename TX, TX X, typename TY, TY Y>
27 __host__ __device__ constexpr auto operator+(integral_constant<TX, X>, integral_constant<TY, Y>)
28 {
29  return integral_constant<decltype(X + Y), X + Y>{};
30 }
31 
32 template <typename TX, TX X, typename TY, TY Y>
33 __host__ __device__ constexpr auto operator-(integral_constant<TX, X>, integral_constant<TY, Y>)
34 {
35  static_assert(Y <= X, "wrong!");
36  return integral_constant<decltype(X - Y), X - Y>{};
37 }
38 
39 template <typename TX, TX X, typename TY, TY Y>
40 __host__ __device__ constexpr auto operator*(integral_constant<TX, X>, integral_constant<TY, Y>)
41 {
42  return integral_constant<decltype(X * Y), X * Y>{};
43 }
44 
45 template <typename TX, TX X, typename TY, TY Y>
46 __host__ __device__ constexpr auto operator/(integral_constant<TX, X>, integral_constant<TY, Y>)
47 {
48  static_assert(Y > 0, "wrong!");
49  return integral_constant<decltype(X / Y), X / Y>{};
50 }
51 
52 template <typename TX, TX X, typename TY, TY Y>
53 __host__ __device__ constexpr auto operator%(integral_constant<TX, X>, integral_constant<TY, Y>)
54 {
55  static_assert(Y > 0, "wrong!");
56  return integral_constant<decltype(X % Y), X % Y>{};
57 }
58 
59 template <bool B>
61 
64 } // namespace ck
Definition: ck.hpp:267
__host__ constexpr __device__ auto operator+(const MultiIndex< NSize > &a, const T &b)
Definition: array_multi_index.hpp:50
__host__ constexpr __device__ auto operator/(integral_constant< TX, X >, integral_constant< TY, Y >)
Definition: integral_constant.hpp:46
__host__ constexpr __device__ auto operator-(const MultiIndex< NSize > &a, const T &b)
Definition: array_multi_index.hpp:60
__host__ constexpr __device__ auto operator*(const MultiIndex< NSize > &a, const T &b)
Definition: array_multi_index.hpp:70
__host__ constexpr __device__ auto operator%(integral_constant< TX, X >, integral_constant< TY, Y >)
Definition: integral_constant.hpp:53
Definition: integral_constant.hpp:10
decltype(v) value_type
Definition: integral_constant.hpp:11
__host__ constexpr __device__ value_type operator()() const noexcept
Definition: integral_constant.hpp:15
static constexpr value_type value
Definition: integral_constant.hpp:13
Definition: integral_constant.hpp:20
static constexpr T value
Definition: integral_constant.hpp:21
integral_constant type
Definition: integral_constant.hpp:23
T value_type
Definition: integral_constant.hpp:22