32 #ifndef MCKL_RANDOM_INTERNAL_INCREMENT_GENERIC_HPP 33 #define MCKL_RANDOM_INTERNAL_INCREMENT_GENERIC_HPP 41 template <std::
size_t,
typename T, std::
size_t K>
42 inline void increment1(std::array<T, K> &, std::false_type)
46 template <std::
size_t N,
typename T, std::
size_t K>
47 inline void increment1(std::array<T, K> &ctr, std::true_type)
49 if (++std::get<N>(ctr)) {
53 increment1<N + 1>(ctr, std::integral_constant<bool, N + 1 < K>());
56 template <
typename T, std::
size_t K>
60 static void eval(std::array<T, K> &ctr)
62 internal::increment1<0>(ctr, std::true_type());
70 static void eval(std::array<T, 1> &ctr) { ++std::get<0>(ctr); }
77 static void eval(std::array<T, 2> &ctr)
79 if (++std::get<0>(ctr)) {
90 static void eval(std::array<T, 4> &ctr)
92 if (++std::get<0>(ctr)) {
95 if (++std::get<1>(ctr)) {
98 if (++std::get<2>(ctr)) {
105 template <
typename T>
109 static void eval(std::array<T, 8> &ctr)
111 if (++std::get<0>(ctr)) {
114 if (++std::get<1>(ctr)) {
117 if (++std::get<2>(ctr)) {
120 if (++std::get<3>(ctr)) {
123 if (++std::get<4>(ctr)) {
126 if (++std::get<5>(ctr)) {
129 if (++std::get<6>(ctr)) {
136 template <
typename T>
140 static void eval(std::array<T, 16> &ctr)
142 if (++std::get<0x0>(ctr)) {
145 if (++std::get<0x1>(ctr)) {
148 if (++std::get<0x2>(ctr)) {
151 if (++std::get<0x3>(ctr)) {
154 if (++std::get<0x4>(ctr)) {
157 if (++std::get<0x5>(ctr)) {
160 if (++std::get<0x6>(ctr)) {
163 if (++std::get<0x7>(ctr)) {
166 if (++std::get<0x8>(ctr)) {
169 if (++std::get<0x9>(ctr)) {
172 if (++std::get<0xA>(ctr)) {
175 if (++std::get<0xB>(ctr)) {
178 if (++std::get<0xC>(ctr)) {
181 if (++std::get<0xD>(ctr)) {
184 if (++std::get<0xE>(ctr)) {
187 ++std::get<0xF>(ctr);
195 template <
typename T, std::
size_t K, T NSkip>
196 inline void increment(std::array<T, K> &ctr, std::integral_constant<T, NSkip>)
198 if (std::get<0>(ctr) < std::numeric_limits<T>::max() - NSkip) {
199 std::get<0>(ctr) += NSkip;
201 std::get<0>(ctr) += NSkip;
202 internal::increment1<1>(ctr, std::integral_constant<bool, 1 < K>());
208 template <
typename T, std::
size_t K>
211 if (std::get<0>(ctr) < std::numeric_limits<T>::max() - nskip) {
212 std::get<0>(ctr) += nskip;
214 std::get<0>(ctr) += nskip;
215 internal::increment1<1>(ctr, std::integral_constant<bool, 1 < K>());
221 template <
typename T, std::
size_t K, std::
size_t Blocks>
226 std::array<T, K> &ctr, std::array<std::array<T, K>, Blocks> &ctr_block)
228 eval<0>(ctr, ctr_block, std::integral_constant<bool, 0 < Blocks>());
232 template <std::
size_t>
233 static void eval(std::array<T, K> &,
234 std::array<std::array<T, K>, Blocks> &, std::false_type)
238 template <std::
size_t N>
239 static void eval(std::array<T, K> &ctr,
240 std::array<std::array<T, K>, Blocks> &ctr_block, std::true_type)
243 std::get<N>(ctr_block) = ctr;
245 ctr, ctr_block, std::integral_constant<bool, N + 1 < Blocks>());
249 template <
typename T, std::
size_t K>
254 std::array<T, K> &ctr, std::array<std::array<T, K>, 1> &ctr_block)
257 std::get<0>(ctr_block) = ctr;
261 template <
typename T, std::
size_t K>
266 std::array<T, K> &ctr, std::array<std::array<T, K>, 2> &ctr_block)
268 std::get<0>(ctr_block) = ctr;
269 std::get<1>(ctr_block) = ctr;
270 increment(std::get<0>(ctr_block), std::integral_constant<T, 1>());
271 increment(std::get<1>(ctr_block), std::integral_constant<T, 2>());
272 ctr = std::get<1>(ctr_block);
276 template <
typename T, std::
size_t K>
281 std::array<T, K> &ctr, std::array<std::array<T, K>, 4> &ctr_block)
283 std::get<0>(ctr_block) = ctr;
284 std::get<1>(ctr_block) = ctr;
285 std::get<2>(ctr_block) = ctr;
286 std::get<3>(ctr_block) = ctr;
287 increment(std::get<0>(ctr_block), std::integral_constant<T, 1>());
288 increment(std::get<1>(ctr_block), std::integral_constant<T, 2>());
289 increment(std::get<2>(ctr_block), std::integral_constant<T, 3>());
290 increment(std::get<3>(ctr_block), std::integral_constant<T, 4>());
291 ctr = std::get<3>(ctr_block);
295 template <
typename T, std::
size_t K>
300 std::array<T, K> &ctr, std::array<std::array<T, K>, 8> &ctr_block)
302 std::get<0>(ctr_block) = ctr;
303 std::get<1>(ctr_block) = ctr;
304 std::get<2>(ctr_block) = ctr;
305 std::get<3>(ctr_block) = ctr;
306 std::get<4>(ctr_block) = ctr;
307 std::get<5>(ctr_block) = ctr;
308 std::get<6>(ctr_block) = ctr;
309 std::get<7>(ctr_block) = ctr;
310 increment(std::get<0>(ctr_block), std::integral_constant<T, 1>());
311 increment(std::get<1>(ctr_block), std::integral_constant<T, 2>());
312 increment(std::get<2>(ctr_block), std::integral_constant<T, 3>());
313 increment(std::get<3>(ctr_block), std::integral_constant<T, 4>());
314 increment(std::get<4>(ctr_block), std::integral_constant<T, 5>());
315 increment(std::get<5>(ctr_block), std::integral_constant<T, 6>());
316 increment(std::get<6>(ctr_block), std::integral_constant<T, 7>());
317 increment(std::get<7>(ctr_block), std::integral_constant<T, 8>());
318 ctr = std::get<7>(ctr_block);
322 template <
typename T, std::
size_t K>
327 std::array<T, K> &ctr, std::array<std::array<T, K>, 16> &ctr_block)
329 std::get<0x0>(ctr_block) = ctr;
330 std::get<0x1>(ctr_block) = ctr;
331 std::get<0x2>(ctr_block) = ctr;
332 std::get<0x3>(ctr_block) = ctr;
333 std::get<0x4>(ctr_block) = ctr;
334 std::get<0x5>(ctr_block) = ctr;
335 std::get<0x6>(ctr_block) = ctr;
336 std::get<0x7>(ctr_block) = ctr;
337 std::get<0x8>(ctr_block) = ctr;
338 std::get<0x9>(ctr_block) = ctr;
339 std::get<0xA>(ctr_block) = ctr;
340 std::get<0xB>(ctr_block) = ctr;
341 std::get<0xC>(ctr_block) = ctr;
342 std::get<0xD>(ctr_block) = ctr;
343 std::get<0xE>(ctr_block) = ctr;
344 std::get<0xF>(ctr_block) = ctr;
345 increment(std::get<0x0>(ctr_block), std::integral_constant<T, 0x01>());
346 increment(std::get<0x1>(ctr_block), std::integral_constant<T, 0x02>());
347 increment(std::get<0x2>(ctr_block), std::integral_constant<T, 0x03>());
348 increment(std::get<0x3>(ctr_block), std::integral_constant<T, 0x04>());
349 increment(std::get<0x4>(ctr_block), std::integral_constant<T, 0x05>());
350 increment(std::get<0x5>(ctr_block), std::integral_constant<T, 0x06>());
351 increment(std::get<0x6>(ctr_block), std::integral_constant<T, 0x07>());
352 increment(std::get<0x7>(ctr_block), std::integral_constant<T, 0x08>());
353 increment(std::get<0x8>(ctr_block), std::integral_constant<T, 0x09>());
354 increment(std::get<0x9>(ctr_block), std::integral_constant<T, 0x0A>());
355 increment(std::get<0xA>(ctr_block), std::integral_constant<T, 0x0B>());
356 increment(std::get<0xB>(ctr_block), std::integral_constant<T, 0x0C>());
357 increment(std::get<0xC>(ctr_block), std::integral_constant<T, 0x0D>());
358 increment(std::get<0xD>(ctr_block), std::integral_constant<T, 0x0E>());
359 increment(std::get<0xE>(ctr_block), std::integral_constant<T, 0x0F>());
360 increment(std::get<0xF>(ctr_block), std::integral_constant<T, 0x10>());
361 ctr = std::get<0xF>(ctr_block);
369 template <
typename T, std::
size_t K>
378 template <
typename T, std::
size_t K, std::
size_t Blocks>
380 std::array<T, K> &ctr, std::array<std::array<T, K>, Blocks> &ctr_block)
387 #endif // MCKL_RANDOM_INTERNAL_INCREMENT_GENERIC_HPP static void eval(std::array< T, K > &ctr)
static void eval(std::array< T, 4 > &ctr)
static void eval(std::array< T, K > &ctr, std::array< std::array< T, K >, Blocks > &ctr_block)
void increment1(std::array< T, K > &, std::false_type)
static void eval(std::array< T, 8 > &ctr)
static void eval(std::array< T, 2 > &ctr)
static void eval(std::array< T, K > &ctr, std::array< std::array< T, K >, 4 > &ctr_block)
static void eval(std::array< T, K > &ctr, std::array< std::array< T, K >, 16 > &ctr_block)
void increment(std::array< T, K > &ctr, std::integral_constant< T, NSkip >)
Increment a counter by given steps.
static void eval(std::array< T, 1 > &ctr)
static void eval(std::array< T, K > &ctr, std::array< std::array< T, K >, 8 > &ctr_block)
static void eval(std::array< T, 16 > &ctr)
static void eval(std::array< T, K > &ctr, std::array< std::array< T, K >, 1 > &ctr_block)
static void eval(std::array< T, K > &ctr, std::array< std::array< T, K >, 2 > &ctr_block)