Tatooine
type_counter.h
Go to the documentation of this file.
1#ifndef TATOOINE_TYPE_COUNTER_H
2#define TATOOINE_TYPE_COUNTER_H
3//==============================================================================
5#include <tatooine/type_set.h>
6//==============================================================================
7namespace tatooine {
8//==============================================================================
14//==============================================================================
15template <typename Counter, typename T>
17//------------------------------------------------------------------------------
18template <typename Counter, typename T>
19static auto constexpr type_counter_get_count =
21//------------------------------------------------------------------------------
22template <typename HeadCounter, typename... Counters, typename T>
23struct type_counter_get_count_impl<type_list_impl<HeadCounter, Counters...>, T> {
24 static auto constexpr value =
25 type_counter_get_count_impl<type_list_impl<Counters...>, T>::value;
26};
27//------------------------------------------------------------------------------
28template <typename HeadCounter, typename... Counters, typename T>
29struct type_counter_get_count_impl<type_set_impl<HeadCounter, Counters...>, T> {
30 static auto constexpr value =
31 type_counter_get_count_impl<type_list_impl<Counters...>, T>::value;
32};
33//------------------------------------------------------------------------------
34template <std::size_t N, typename... Counters, typename T>
36 type_list_impl<type_number_pair<T, N>, Counters...>, T> {
37 static auto constexpr value = N;
38};
39//------------------------------------------------------------------------------
40template <typename T>
42 // static_assert(false, "T not found in counter.");
43 static auto constexpr value = 0;
44};
45//------------------------------------------------------------------------------
46template <std::size_t N, typename... Counters, typename T>
48 type_set_impl<type_number_pair<T, N>, Counters...>, T> {
49 static auto constexpr value = N;
50};
51//------------------------------------------------------------------------------
52template <typename T>
54 // static_assert(false, "T not found in counter.");
55 static auto constexpr value = 0;
56};
57//==============================================================================
58template <typename Counter, typename T>
60//------------------------------------------------------------------------------
61template <typename T, std::size_t N, typename OtherT>
64};
65//------------------------------------------------------------------------------
66template <typename T, std::size_t N>
69};
70//------------------------------------------------------------------------------
71template <typename Counter, typename T>
74//==============================================================================
75template <typename Counter, typename... Ts>
77
78template <typename... Counters, typename Head, typename... Rest>
79struct type_counter_insert_impl<type_list_impl<Counters...>, Head, Rest...> {
82 Rest...>::type;
83};
84
85template <typename... Counters>
87 using type = type_list<Counters...>;
88};
89template <typename... Counters, typename Head, typename... Rest>
90struct type_counter_insert_impl<type_set_impl<Counters...>, Head, Rest...> {
93 Rest...>::type;
94};
95
96template <typename... Counters>
98 using type = type_set<Counters...>;
99};
100
101template <typename Counter, typename... Ts>
103 typename type_counter_insert_impl<Counter, Ts...>::type;
104//==============================================================================
105template <typename StaticTypeSet, typename... Ts>
107
108template <typename... UniqueTypes, typename... Ts>
109struct count_types_impl<type_list_impl<UniqueTypes...>, Ts...> {
110 using type =
112 Ts...>;
113};
114template <typename... UniqueTypes, typename... Ts>
115struct count_types_impl<type_set_impl<UniqueTypes...>, Ts...> {
116 using type =
118 Ts...>;
119};
120template <typename... Ts>
121using count_types = typename count_types_impl<type_list<Ts...>, Ts...>::type;
123//==============================================================================
124} // namespace tatooine
125//==============================================================================
126#endif
typename type_counter_insert_impl< Counter, Ts... >::type type_counter_insert
Definition: type_counter.h:103
static auto constexpr type_counter_get_count
Definition: type_counter.h:19
typename count_types_impl< type_list< Ts... >, Ts... >::type count_types
Definition: type_counter.h:121
typename type_counter_increase_if_equal_impl< Counter, T >::type type_counter_increase_if_equal
Definition: type_counter.h:73
typename type_set_constructor< type_list<>, Ts... >::type type_set
Definition: type_set.h:132
Definition: algorithm.h:6
T type
Definition: common_type.h:13
type_counter_insert< type_list_impl< type_number_pair< UniqueTypes, 0 >... >, Ts... > type
Definition: type_counter.h:112
type_counter_insert< type_set_impl< type_number_pair< UniqueTypes, 0 >... >, Ts... > type
Definition: type_counter.h:118
Definition: type_counter.h:106
Definition: type_counter.h:16
typename type_counter_insert_impl< type_list_impl< type_counter_increase_if_equal< Counters, Head >... >, Rest... >::type type
Definition: type_counter.h:82
typename type_counter_insert_impl< type_set_impl< type_counter_increase_if_equal< Counters, Head >... >, Rest... >::type type
Definition: type_counter.h:93
type_set< Counters... > type
Definition: type_counter.h:98
Definition: type_counter.h:76
An empty struct that holds types.
Definition: type_list.h:248
Definition: type_number_pair.h:9
Inherits from a type_list with only unique types.
Definition: type_set.h:138