guanaqo 1.0.0-alpha.24
Utilities for scientific software
Loading...
Searching...
No Matches
loop.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file
4/// @ingroup core
5/// Chunked iteration helpers.
6
7namespace guanaqo {
8
9/// Direction for chunked iteration.
10/// @ingroup core
11enum class LoopDir : bool {
14};
15
16/// @ingroup core
17template <class I>
18[[gnu::always_inline]] inline void
19foreach_chunked(I i_begin, I i_end, auto chunk_size, auto func_chunk,
20 auto func_rem, LoopDir dir = LoopDir::Forward) {
21 if (dir == LoopDir::Forward) {
22 I i;
23 for (i = i_begin; i + chunk_size <= i_end; i += chunk_size)
24 func_chunk(i);
25 I rem_i = i_end - i;
26 if (rem_i > 0)
27 func_rem(i, rem_i);
28 } else {
29 I rem_i = (i_end - i_begin) % chunk_size;
30 I i = i_end - rem_i;
31 if (rem_i > 0)
32 func_rem(i, rem_i);
33 for (i -= chunk_size; i >= i_begin; i -= chunk_size)
34 func_chunk(i);
35 }
36}
37
38/// @ingroup core
39template <class I>
40[[gnu::always_inline]] inline void
41foreach_chunked_merged(I i_begin, I i_end, auto chunk_size, auto func_chunk,
43 if (dir == LoopDir::Forward) {
44 I i;
45 for (i = i_begin; i + chunk_size <= i_end; i += chunk_size)
46 func_chunk(i, chunk_size);
47 I rem_i = i_end - i;
48 if (rem_i > 0)
49 func_chunk(i, rem_i);
50 } else {
51 I rem_i = (i_end - i_begin) % chunk_size;
52 I i = i_end - rem_i;
53 if (rem_i > 0)
54 func_chunk(i, rem_i);
55 for (i -= chunk_size; i >= i_begin; i -= chunk_size)
56 func_chunk(i, chunk_size);
57 }
58}
59
60} // namespace guanaqo
LoopDir
Direction for chunked iteration.
Definition loop.hpp:11
void foreach_chunked_merged(I i_begin, I i_end, auto chunk_size, auto func_chunk, LoopDir dir=LoopDir::Forward)
Definition loop.hpp:41
void foreach_chunked(I i_begin, I i_end, auto chunk_size, auto func_chunk, auto func_rem, LoopDir dir=LoopDir::Forward)
Definition loop.hpp:19