acme
Foundational cross-platform layer of the ca2 framework
Toggle main menu visibility
Loading...
Searching...
No Matches
tuple.h
1
// Created by camilo on 2022-05-19 18:00 <3ThomasBorregaardSorense!! and Mummi!!
2
#pragma once
3
4
5
template
<::collection::index i,
typename
TYPE >
6
class
tuple_item
7
{
8
public
:
9
tuple_item()
10
{
11
12
}
13
tuple_item(TYPE
const
& t)
14
{
15
tuple_item<i, TYPE>::m_element = t;
16
}
17
tuple_item(TYPE&& t)
18
{
19
tuple_item<i, TYPE>::m_element = ::transfer(t);
20
}
21
TYPE& get()
22
{
23
return
tuple_item<i, TYPE>::m_element;
24
}
25
TYPE m_element;
26
27
};
28
29
30
/*
31
General template class declaration.
32
*/
33
template
<::collection::index i,
typename
... types>
34
class
tuple_recursion
35
{
36
};
37
38
39
41
//This is a partial specialization, so as long as there is at least one template argument, apart from the index, this specialization is preferred to the previously defined _tuple_recurr_base<std::size_t, typename ...ypes>
42
//*/
43
//template <std::size_t _index, typename L, typename...types>
44
//class _tuple_recurr_base<_index, L, types...E :
45
// public _tuple_impl<_index, typename std::remove_reference<L>::type>,
46
// public _tuple_recurr_base<_index + 1, types...E
47
//{
48
//};
49
template
<::collection::index i,
typename
L,
typename
... types>
50
class
tuple_recursion < i, L, types... > :
51
public
tuple_item < i, typename ::non_reference<L>::TYPE >,
52
public
tuple_recursion<i + 1, types... >
53
{
54
public
:
55
tuple_recursion()
56
{
57
58
}
59
template
<
typename
CL,
typename
... CArgs>
60
tuple_recursion(CL&& arg, CArgs &&... args) : tuple_item<i, typename non_reference<CL>::TYPE>(std::forward<CL>(arg)),
61
tuple_recursion<i + 1, types...>(std::forward < CArgs(args)... > )
62
{
63
}
64
};
65
66
67
68
69
template
<
typename
L,
typename
... types>
70
class
tuple :
71
public
tuple_recursion
<0, L, types...>
72
{
73
public
:
74
75
tuple()
76
{
77
}
78
79
template
<
typename
... CArgs>
80
tuple(CArgs&&... args) :
/* Call base ctors */
81
tuple_recursion
<0, L, types...>(std::forward<CArgs>(args)...)
82
{
83
}
84
};
85
86
87
88
89
90
template
<::collection::index i,
typename
L,
typename
... Args>
91
struct
extract_type_at
92
{
93
94
using
type =
typename
extract_type_at
< i - 1, Args...>::type;
95
96
};
97
98
99
template
<
typename
L,
typename
... Args>
100
struct
extract_type_at
<0, L, Args... >
101
{
102
using
type = L;
103
};
104
105
template
<::collection::index i,
typename
... Args >
106
auto
& get(
tuple<Args...>
& t)
107
{
108
return
(
static_cast<
tuple_item
<i, typename
extract_type_at
< i, Args ...
>
::type> &>(t)).get();
109
}
110
111
112
113
114
// from acme/tuple.h Created by camilo on 2022-11-02 04:49 <3ThomasBorregaardSorensen!!
115
#pragma once
116
117
118
template
<
typename
TUPLE,
typename
FIND_CONDITION,
typename
CONTINUE_CONDITION >
119
inline
TUPLE* tuple_array_find(TUPLE* ptuple, FIND_CONDITION find_condition, CONTINUE_CONDITION continue_condition)
120
{
121
122
while
(continue_condition(ptuple))
123
{
124
125
if
(find_condition(ptuple))
126
{
127
128
return
ptuple;
129
130
}
131
132
ptuple++;
133
134
}
135
136
return
nullptr
;
137
138
}
139
140
141
tuple_item
Definition
tuple.h:7
tuple_recursion
Definition
tuple.h:35
tuple
Definition
tuple.h:72
extract_type_at
Definition
tuple.h:92
prototype
prototype
tuple.h
Generated by
1.17.0