summaryrefslogtreecommitdiff
path: root/include/SSVOpenHexagon/Utils/ArgExtractor.hpp
blob: d28d7c88eb98b266b9f2a40e4f3e386305e0f4db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Copyright (c) 2013-2020 Vittorio Romeo
// License: Academic Free License ("AFL") v. 3.0
// AFL License page: https://opensource.org/licenses/AFL-3.0

#pragma once

#include <cstddef>
#include <tuple>

namespace hg::Utils {

template <typename>
struct ArgExtractor;

template <typename R, typename F, typename... Args>
struct ArgExtractor<R (F::*)(Args...)>
{
    using Return = R;
    using Function = F;

    enum
    {
        numArgs = sizeof...(Args)
    };

    template <std::size_t I>
    using NthArg = std::tuple_element_t<I, std::tuple<Args...>>;
};

template <typename R, typename F, typename... Args>
struct ArgExtractor<R (F::*)(Args...) const> : ArgExtractor<R (F::*)(Args...)>
{
    using ArgExtractor<R (F::*)(Args...)>::NthArg;
};

} // namespace hg::Utils