acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
tuple.h
1// Created by camilo on 2022-05-19 18:00 <3ThomasBorregaardSorense!! and Mummi!!
2#pragma once
3
4
5template <::collection::index i, typename TYPE >
6class tuple_item
7{
8public:
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/*
31General template class declaration.
32*/
33template <::collection::index i, typename... types>
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//};
49template <::collection::index i, typename L, typename... types>
50class tuple_recursion < i, L, types... > :
51 public tuple_item < i, typename ::non_reference<L>::TYPE >,
52 public tuple_recursion<i + 1, types... >
53{
54public:
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
69template <typename L, typename... types>
70class tuple :
71 public tuple_recursion<0, L, types...>
72{
73public:
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
90template <::collection::index i, typename L, typename... Args>
92{
93
94 using type = typename extract_type_at < i - 1, Args...>::type;
95
96};
97
98
99template <typename L, typename... Args>
100struct extract_type_at<0, L, Args... >
101{
102 using type = L;
103};
104
105template <::collection::index i, typename... Args >
106auto& 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
118template < typename TUPLE, typename FIND_CONDITION, typename CONTINUE_CONDITION >
119inline 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
Definition tuple.h:7
Definition tuple.h:35
Definition tuple.h:72
Definition tuple.h:92