@@ -29,6 +29,13 @@ class FlowBuilder {
2929 template <typename T, typename C, std::enable_if_t <is_iterable_v<T>, void >* = nullptr >
3030 auto parallel_for (T&, C&&, size_t = 0 );
3131
32+ template <
33+ typename I,
34+ typename C,
35+ std::enable_if_t <std::is_arithmetic_v<I>, void >* = nullptr
36+ >
37+ auto parallel_for (I, I, I, C&&, size_t = 0 );
38+
3239 template <typename I, typename T, typename B>
3340 auto reduce (I, I, T&, B&&);
3441
@@ -118,7 +125,6 @@ auto FlowBuilder::silent_emplace(C&&... cs) {
118125 return std::make_tuple (silent_emplace (std::forward<C>(cs))...);
119126}
120127
121-
122128// Function: parallel_for
123129template <typename I, typename C>
124130auto FlowBuilder::parallel_for (I beg, I end, C&& c, size_t g) {
@@ -168,6 +174,47 @@ auto FlowBuilder::parallel_for(T& t, C&& c, size_t group) {
168174 return parallel_for (t.begin (), t.end (), std::forward<C>(c), group);
169175}
170176
177+ // Function: parallel_for
178+ template <
179+ typename I,
180+ typename C,
181+ std::enable_if_t <std::is_arithmetic_v<I>, void >* = nullptr
182+ >
183+ auto FlowBuilder::parallel_for (I beg, I end, I step, C&& c, size_t g) {
184+
185+ if (g == 0 ) {
186+ auto N = (end - beg + step - 1 ) / step;
187+ auto w = std::max (unsigned {1 }, std::thread::hardware_concurrency ());
188+ g = (N + w - 1 ) / w;
189+ }
190+
191+ auto source = placeholder ();
192+ auto target = placeholder ();
193+
194+ std::cout << " g is " << g << std::endl;
195+
196+ while (beg < end) {
197+
198+ auto e = beg + static_cast <I>(g) * step;
199+
200+ std::cout << beg << " " << e << std::endl;
201+
202+ // Create a task
203+ auto task = silent_emplace ([beg, e, step, c] () mutable {
204+ for (auto i=beg; i<e; i+=step) {
205+ c (i);
206+ }
207+ });
208+ source.precede (task);
209+ task.precede (target);
210+
211+ // adjust the pointer
212+ beg = e;
213+ }
214+
215+ return std::make_pair (source, target);
216+ }
217+
171218// Function: reduce_min
172219// Find the minimum element over a range of items.
173220template <typename I, typename T>
0 commit comments