fennec
Loading...
Searching...
No Matches
metasequences.h
Go to the documentation of this file.
1// =====================================================================================================================
2// fennec, a free and open source game engine
3// Copyright © 2025 Medusa Slockbower
4//
5// This program is free software: you can redistribute it and/or modify
6// it under the terms of the GNU General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License
16// along with this program. If not, see <https://www.gnu.org/licenses/>.
17// =====================================================================================================================
18
30
31#ifndef FENNEC_LANG_SEQUENCES_H
32#define FENNEC_LANG_SEQUENCES_H
33
72
74
75namespace fennec
76{
77
78// fennec::metasequence ====================================================================================================
79
94template<typename ValueT, ValueT...Values> struct metasequence
95{
97 using value_type = ValueT;
98
101
106 inline static constexpr size_t size() noexcept {
107 return sizeof...(Values);
108 }
109};
110
111
112
113// fennec::integer_metasequence ============================================================================================
114
121template<typename IntT, IntT...Values> requires(is_integral_v<IntT>)
122struct integer_metasequence : metasequence<IntT, Values...>
123{
125 using value_type = IntT;
126
129
134 inline static constexpr size_t size() noexcept {
135 return sizeof...(Values);
136 }
137};
138
139
146template<typename IntT, size_t N> struct make_integer_metasequence;
147
150template<typename IntT, size_t N> using make_integer_metasequence_t = typename make_integer_metasequence<IntT, N>::type;
151
152
153
154// fennec::index_metasequence ==============================================================================================
155
161template<size_t...Indices> struct index_metasequence : integer_metasequence<size_t, Indices...>
162{
165
168
173 inline static constexpr size_t size() noexcept {
174 return sizeof...(Indices);
175 }
176};
177
178
185template<size_t N> struct make_index_metasequence;
186
190
191
192
193// fennec::concat_metasequence =============================================================================================
194
201template<typename SequenceT0, typename SequenceT1> struct concat_metasequence;
202
205template<typename SequenceT0, typename SequenceT1> using concat_metasequence_t
207
208
209
210// Internal ============================================================================================================
211
212// Implementation for Generating an integer_sequence
213template<typename T, size_t N> struct make_integer_metasequence : concat_metasequence_t<make_integer_metasequence_t<T, N / 2>, make_integer_metasequence_t<T, N - N / 2>>{};
214
215// Base Case of N=0
216template<typename T> struct make_integer_metasequence<T, 0> : integer_metasequence<T> {};
217
218// Base Case of N=1
219template<typename T> struct make_integer_metasequence<T, 1> : integer_metasequence<T, 0>{};
220
221
222// Implementation for Generating an index_sequence
223template<size_t N> struct make_index_metasequence : concat_metasequence_t<make_index_metasequence_t<N / 2>, make_index_metasequence_t<N - N / 2>>{};
224
225// Base Case of N=0
226template<> struct make_index_metasequence<0> : index_metasequence<> {};
227
228// Base Case of N=1
229template<> struct make_index_metasequence<1> : index_metasequence<0>{};
230
231
232// Specialization for integer sequences
233template<typename T, T...SequenceV0, T...SequenceV1>
234struct concat_metasequence<integer_metasequence<T, SequenceV0...>, integer_metasequence<T, SequenceV1...>>
235 : integer_metasequence<T, SequenceV0..., (sizeof...(SequenceV0) + SequenceV1)...>{};
236
237// Specialization for index sequences
238template<size_t...SequenceV0, size_t...SequenceV1>
239struct concat_metasequence<index_metasequence<SequenceV0...>, index_metasequence<SequenceV1...>>
240 : index_metasequence<SequenceV0..., (sizeof...(SequenceV0) + SequenceV1)...>{};
241
242
243
244}
245
246#endif // FENNEC_LANG_SEQUENCES_H
typename make_integer_metasequence< IntT, N >::type make_integer_metasequence_t
shorthand for typename make_integer_sequence<T, N>::type
Definition metasequences.h:150
typename concat_metasequence< SequenceT0, SequenceT1 >::type concat_metasequence_t
shorthand for typename concat_metasequence<SequenceT0, SequenceT1>::type
Definition metasequences.h:206
typename make_index_metasequence< N >::type make_index_metasequence_t
shorthand for typename make_index_metasequence<N>::type
Definition metasequences.h:189
concatenate two metasequences
Definition metasequences.h:201
metaprogramming integral metasequence
Definition metasequences.h:162
size_t value_type
type of the sequence
Definition metasequences.h:164
static constexpr size_t size() noexcept
returns the number of elements
Definition metasequences.h:173
metaprogramming integral metasequence
Definition metasequences.h:123
static constexpr size_t size() noexcept
returns the number of elements
Definition metasequences.h:134
IntT value_type
type of the sequence
Definition metasequences.h:125
generate a fennec::index_metasequence
Definition metasequences.h:223
generate a fennec::integer_metasequence
Definition metasequences.h:213
metaprogramming sequence
Definition metasequences.h:95
static constexpr size_t size() noexcept
returns the number of elements
Definition metasequences.h:106
ValueT value_type
type of the metasequence
Definition metasequences.h:97
Type Traits
size_t size_t
Unsigned Integer Type Returned By sizeof, sizeof..., and alignof
Definition types.h:250