co_ecs 0.9.0
Cobalt ECS
Loading...
Searching...
No Matches
type_traits.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <tuple>
5#include <type_traits>
6
7namespace co_ecs::detail {
8
13template<std::size_t I, typename... Args>
14using nth_type_t = std::tuple_element_t<I, std::tuple<Args...>>;
15
19template<typename... Args>
20using first_type_t = nth_type_t<0, Args...>;
21
25template<typename... Args>
26using second_type_t = nth_type_t<1, Args...>;
27
31template<typename F>
32struct function_traits : public function_traits<decltype(std::function{ std::declval<F>() })> {};
33
38template<typename R, typename... Args>
39struct function_traits<std::function<R(Args...)>> {
40 using return_type = R;
41
42 using arguments_tuple_type = std::tuple<Args...>;
43
44 template<std::size_t I>
45 using argument_type = nth_type_t<I, Args...>;
46
47 static constexpr std::size_t arity = sizeof...(Args);
48};
49
53template<typename... Rest>
54struct unique_types;
55
57template<>
58struct unique_types<> {};
59
63template<typename T1>
64struct unique_types<T1> {};
65
70template<class T1, class T2>
71struct unique_types<T1, T2> {
72 static_assert(!std::is_same<T1, T2>::value, "Types must be unique within parameter pack");
73};
74
80template<typename T1, typename T2, typename... Rest>
81struct unique_types<T1, T2, Rest...>
82 : unique_types<T1, T2>
83 , unique_types<T1, Rest...>
84 , unique_types<T2, Rest...> {};
85
86} // namespace co_ecs::detail
Definition component.hpp:17
std::tuple_element_t< I, std::tuple< Args... > > nth_type_t
Extracts Nth type parameter from parameter pack.
Definition type_traits.hpp:14
nth_type_t< 1, Args... > second_type_t
Extracts the second type parameter in parameter pack.
Definition type_traits.hpp:26
nth_type_t< 0, Args... > first_type_t
Extracts the first type parameter in parameter pack.
Definition type_traits.hpp:20
STL namespace.