summaryrefslogtreecommitdiff
path: root/src/core/templates.h
blob: c363a1651852d357eac4bd04847ce03cc4f24544 (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
#pragma once

namespace saw {

template <class T, class... TL> struct parameter_pack_index;

template <class T, class... TL> struct parameter_pack_index<T, T, TL...> {
	static constexpr size_t value = 0u;
};

template <class T, class TL0, class... TL>
struct parameter_pack_index<T, TL0, TL...> {
	static constexpr size_t value =
		1u + parameter_pack_index<T, TL...>::value;
};

template <size_t N, class... T> struct parameter_pack_type;

template <class TN, class... T> struct parameter_pack_type<0, TN, T...> {
	using type = TN;
};

template <size_t N, class TN, class... T>
struct parameter_pack_type<N, TN, T...> {
	static_assert(sizeof...(T) > 0, "Exhausted parameters");
	using type = typename parameter_pack_type<N - 1, T...>::type;
};

}