functional2.hpp 1.38 KB
Newer Older
Umang Yadav's avatar
Umang Yadav committed
1
2
3

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Weverything"
Chao Liu's avatar
Chao Liu committed
4
// SPDX-License-Identifier: MIT
Illia Silin's avatar
Illia Silin committed
5
// Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved.
Chao Liu's avatar
Chao Liu committed
6

Chao Liu's avatar
Chao Liu committed
7
#pragma once
8

Chao Liu's avatar
Chao Liu committed
9
10
#include "ck/utility/functional.hpp"
#include "ck/utility/sequence.hpp"
11

12
13
namespace ck {

Chao Liu's avatar
Chao Liu committed
14
15
namespace detail {

Chao Liu's avatar
Chao Liu committed
16
17
template <class>
struct static_for_impl;
18

Chao Liu's avatar
Chao Liu committed
19
20
template <index_t... Is>
struct static_for_impl<Sequence<Is...>>
21
22
{
    template <class F>
Chao Liu's avatar
Chao Liu committed
23
    __host__ __device__ constexpr void operator()(F f) const
24
    {
Chao Liu's avatar
Chao Liu committed
25
        swallow{(f(Number<Is>{}), 0)...};
26
27
28
    }
};

Chao Liu's avatar
Chao Liu committed
29
30
} // namespace detail

Chao Liu's avatar
Chao Liu committed
31
32
33
// F signature: F(Number<Iter>)
template <index_t NBegin, index_t NEnd, index_t Increment>
struct static_for
34
{
35
    __host__ __device__ constexpr static_for()
36
    {
37
        static_assert(Increment != 0 && (NEnd - NBegin) % Increment == 0,
Chao Liu's avatar
Chao Liu committed
38
                      "Wrong! should satisfy (NEnd - NBegin) % Increment == 0");
39
        static_assert((Increment > 0 && NBegin <= NEnd) || (Increment < 0 && NBegin >= NEnd),
Chao Liu's avatar
Chao Liu committed
40
41
                      "wrongs! should (Increment > 0 && NBegin <= NEnd) || (Increment < 0 && "
                      "NBegin >= NEnd)");
42
    }
43

44
45
46
    template <class F>
    __host__ __device__ constexpr void operator()(F f) const
    {
Chao Liu's avatar
Chao Liu committed
47
48
        detail::static_for_impl<typename arithmetic_sequence_gen<NBegin, NEnd, Increment>::type>{}(
            f);
49
50
51
    }
};

52
} // namespace ck
Umang Yadav's avatar
Umang Yadav committed
53
54

#pragma clang diagnostic pop