forked from taskflow/taskflow
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflow__builder_8hpp_source.html
More file actions
140 lines (138 loc) · 134 KB
/
flow__builder_8hpp_source.html
File metadata and controls
140 lines (138 loc) · 134 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Cpp-Taskflow</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname"><a href="https://github.com/cpp-taskflow/cpp-taskflow">Cpp-Taskflow</a>
 <span id="projectnumber">2.2.0</span>
</div>
</td>
<td> <div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('flow__builder_8hpp_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">flow_builder.hpp</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="preprocessor">#pragma once</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="preprocessor">#include "task.hpp"</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> </div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="keyword">namespace </span><a class="code" href="namespacetf.html">tf</a> {</div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> </div><div class="line"><a name="l00013"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html"> 13</a></span> <span class="keyword">class </span><a class="code" href="classtf_1_1FlowBuilder.html">FlowBuilder</a> {</div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> </div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <a class="code" href="classtf_1_1FlowBuilder.html#a67d023d5493da1594a1d2eaea89da179">FlowBuilder</a>(Graph& graph);</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <a class="code" href="classtf_1_1Task.html">Task</a> <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>(C&& callable);</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keyword">template</span> <<span class="keyword">typename</span>... C, std::enable_if_t<(<span class="keyword">sizeof</span>...(C)>1), <span class="keywordtype">void</span>>* = <span class="keyword">nullptr</span>></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="keyword">auto</span> <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>(C&&... callables);</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  </div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <a class="code" href="classtf_1_1Task.html">Task</a> <a class="code" href="classtf_1_1FlowBuilder.html#abf3da84e99b67248d6d8fdba48267caf">silent_emplace</a>(C&& callable);</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keyword">template</span> <<span class="keyword">typename</span>... C, std::enable_if_t<(<span class="keyword">sizeof</span>...(C)>1), <span class="keywordtype">void</span>>* = <span class="keyword">nullptr</span>></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keyword">auto</span> <a class="code" href="classtf_1_1FlowBuilder.html#abf3da84e99b67248d6d8fdba48267caf">silent_emplace</a>(C&&... callables);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> C></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a644d7ff0f19ca155a2e7d56b1cdb3a0b">parallel_for</a>(I beg, I end, C&& callable, <span class="keywordtype">size_t</span> partitions = 0);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  </div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> C, std::enable_if_t<std::is_arithmetic_v<I>, <span class="keywordtype">void</span>>* = <span class="keywordtype">nullptr</span> ></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a644d7ff0f19ca155a2e7d56b1cdb3a0b">parallel_for</a>(I beg, I end, I step, C&& callable, <span class="keywordtype">size_t</span> partitions = 0);</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  </div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T, <span class="keyword">typename</span> B></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a06b06b57f8ec8bb060951fc71dd375fb">reduce</a>(I beg, I end, T& result, B&& bop);</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#ae10e34cf00f7128d23e24c524c18d970">reduce_min</a>(I beg, I end, T& result);</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  </div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a076fa5b55e0ef6eba3c962e85727f218">reduce_max</a>(I beg, I end, T& result);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  </div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T, <span class="keyword">typename</span> B, <span class="keyword">typename</span> U></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a08d669f2286cb90fd5ba7dade1e93fef">transform_reduce</a>(I beg, I end, T& result, B&& bop, U&& uop);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  </div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T, <span class="keyword">typename</span> B, <span class="keyword">typename</span> P, <span class="keyword">typename</span> U></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a08d669f2286cb90fd5ba7dade1e93fef">transform_reduce</a>(I beg, I end, T& result, B&& bop1, P&& bop2, U&& uop);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  </div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <a class="code" href="classtf_1_1Task.html">Task</a> <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  </div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#af7c4a5d732d49bd63d554a92cd240f3f">precede</a>(<a class="code" href="classtf_1_1Task.html">Task</a> A, <a class="code" href="classtf_1_1Task.html">Task</a> B);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> </div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a90f3d9b9d6fcf4df8e7d7878dfdd130d">linearize</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<Task></a>& tasks);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a90f3d9b9d6fcf4df8e7d7878dfdd130d">linearize</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/initializer_list.html">std::initializer_list<Task></a> tasks);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> </div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a3be7d982efad780eb6adbd1cf11a3d97">broadcast</a>(<a class="code" href="classtf_1_1Task.html">Task</a> A, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<Task></a>& others);</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> </div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a3be7d982efad780eb6adbd1cf11a3d97">broadcast</a>(<a class="code" href="classtf_1_1Task.html">Task</a> A, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/initializer_list.html">std::initializer_list<Task></a> others);</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a8871a9277dad477a69fb3a323d9c7bdb">gather</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<Task></a>& others, <a class="code" href="classtf_1_1Task.html">Task</a> A);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a8871a9277dad477a69fb3a323d9c7bdb">gather</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/initializer_list.html">std::initializer_list<Task></a> others, <a class="code" href="classtf_1_1Task.html">Task</a> A);</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  </div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> </div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  Graph& _graph;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> </div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> L></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordtype">void</span> _linearize(L&);</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> };</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span> </div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> <span class="comment">// Constructor</span></div><div class="line"><a name="l00277"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a67d023d5493da1594a1d2eaea89da179"> 277</a></span> <span class="keyword">inline</span> <a class="code" href="classtf_1_1FlowBuilder.html#a67d023d5493da1594a1d2eaea89da179">FlowBuilder::FlowBuilder</a>(Graph& graph) :</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  _graph {graph} {</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> <span class="comment">// Procedure: precede</span></div><div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#af7c4a5d732d49bd63d554a92cd240f3f"> 282</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#af7c4a5d732d49bd63d554a92cd240f3f">FlowBuilder::precede</a>(<a class="code" href="classtf_1_1Task.html">Task</a> from, <a class="code" href="classtf_1_1Task.html">Task</a> to) {</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  from._node->precede(*(to._node));</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> }</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> </div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> <span class="comment">// Procedure: broadcast</span></div><div class="line"><a name="l00287"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a3be7d982efad780eb6adbd1cf11a3d97"> 287</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a3be7d982efad780eb6adbd1cf11a3d97">FlowBuilder::broadcast</a>(<a class="code" href="classtf_1_1Task.html">Task</a> from, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<Task></a>& keys) {</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  from.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(keys);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> }</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> </div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> <span class="comment">// Procedure: broadcast</span></div><div class="line"><a name="l00292"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#add973c333ea0d51dcefd5ebaef71cff8"> 292</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a3be7d982efad780eb6adbd1cf11a3d97">FlowBuilder::broadcast</a>(<a class="code" href="classtf_1_1Task.html">Task</a> from, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/initializer_list.html">std::initializer_list<Task></a> keys) {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  from.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(keys);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> }</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> <span class="comment">// Function: gather</span></div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a8871a9277dad477a69fb3a323d9c7bdb"> 297</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a8871a9277dad477a69fb3a323d9c7bdb">FlowBuilder::gather</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<Task></a>& keys, <a class="code" href="classtf_1_1Task.html">Task</a> to) {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  to.<a class="code" href="classtf_1_1Task.html#a40d627bd34014eb6f981014f209c304c">gather</a>(keys);</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> <span class="comment">// Function: gather</span></div><div class="line"><a name="l00302"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#ae62feb52131f930695357dca68ea2acb"> 302</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a8871a9277dad477a69fb3a323d9c7bdb">FlowBuilder::gather</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/initializer_list.html">std::initializer_list<Task></a> keys, <a class="code" href="classtf_1_1Task.html">Task</a> to) {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  to.<a class="code" href="classtf_1_1Task.html#a40d627bd34014eb6f981014f209c304c">gather</a>(keys);</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> <span class="comment">// Function: placeholder</span></div><div class="line"><a name="l00307"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf"> 307</a></span> <span class="keyword">inline</span> <a class="code" href="classtf_1_1Task.html">Task</a> <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">FlowBuilder::placeholder</a>() {</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keyword">auto</span>& node = _graph.emplace_back();</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keywordflow">return</span> <a class="code" href="classtf_1_1Task.html">Task</a>(node);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> }</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> </div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> <span class="comment">// Function: parallel_for</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> C></div><div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a644d7ff0f19ca155a2e7d56b1cdb3a0b"> 314</a></span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a644d7ff0f19ca155a2e7d56b1cdb3a0b">FlowBuilder::parallel_for</a>(I beg, I end, C&& c, <span class="keywordtype">size_t</span> p){</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> </div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keyword">using</span> category = <span class="keyword">typename</span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/iterator/iterator_traits.html">std::iterator_traits<I>::iterator_category</a>;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  </div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keyword">auto</span> S = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keyword">auto</span> T = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keyword">auto</span> D = std::distance(beg, end);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  </div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="comment">// special case</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">if</span>(D == 0) {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  S.precede(T);</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordflow">return</span> std::make_pair(S, T);</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  }</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  </div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="comment">// default partition equals to the worker count</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <span class="keywordflow">if</span>(p == 0) {</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  p = std::max(<span class="keywordtype">unsigned</span>{1}, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a>());</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  }</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> </div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordtype">size_t</span> b = (D + p - 1) / p; <span class="comment">// block size</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordtype">size_t</span> r = (D % p) ? D % p : p; <span class="comment">// workers to take b</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordtype">size_t</span> w = 0; <span class="comment">// worker id</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> </div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">while</span>(beg != end) {</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> </div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keyword">auto</span> e = beg;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordtype">size_t</span> g = (w++ >= r) ? b - 1 : b;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  </div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="comment">// Case 1: random access iterator</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">if</span> constexpr(std::is_same_v<category, std::random_access_iterator_tag>) {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keywordtype">size_t</span> x = std::distance(beg, end);</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  std::advance(e, std::min(x, g));</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  }</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="comment">// Case 2: non-random access iterator</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0; i<g && e != end; ++e, ++i);</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  </div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="comment">// Create a task</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([beg, e, c] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  std::for_each(beg, e, c);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  });</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  S.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(T);</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> </div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="comment">// adjust the pointer</span></div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  beg = e;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  }</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  </div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">return</span> std::make_pair(S, T); </div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> }</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> <span class="comment">/*// Function: parallel_for </span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> <span class="comment">template <typename I, typename C></span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> <span class="comment">std::pair<Task, Task> FlowBuilder::parallel_for(I beg, I end, C&& c, size_t g) {</span></div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span> <span class="comment"></span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> <span class="comment"> using category = typename std::iterator_traits<I>::iterator_category;</span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> <span class="comment"> </span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> <span class="comment"> if(g == 0) {</span></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> <span class="comment"> auto d = std::distance(beg, end);</span></div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> <span class="comment"> auto w = std::max(unsigned{1}, std::thread::hardware_concurrency());</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> <span class="comment"> g = (d + w - 1) / w;</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> <span class="comment"> }</span></div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> <span class="comment"></span></div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> <span class="comment"> auto source = placeholder();</span></div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> <span class="comment"> auto target = placeholder();</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> <span class="comment"> </span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> <span class="comment"> while(beg != end) {</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> <span class="comment"></span></div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span> <span class="comment"> auto e = beg;</span></div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> <span class="comment"> </span></div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> <span class="comment"> // Case 1: random access iterator</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span> <span class="comment"> if constexpr(std::is_same_v<category, std::random_access_iterator_tag>) {</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> <span class="comment"> size_t r = std::distance(beg, end);</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> <span class="comment"> std::advance(e, std::min(r, g));</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> <span class="comment"> }</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> <span class="comment"> // Case 2: non-random access iterator</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> <span class="comment"> else {</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span> <span class="comment"> for(size_t i=0; i<g && e != end; ++e, ++i);</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span> <span class="comment"> }</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> <span class="comment"> </span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> <span class="comment"> // Create a task</span></div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> <span class="comment"> auto task = emplace([beg, e, c] () mutable {</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span> <span class="comment"> std::for_each(beg, e, c);</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> <span class="comment"> });</span></div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> <span class="comment"> source.precede(task);</span></div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span> <span class="comment"> task.precede(target);</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span> <span class="comment"></span></div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> <span class="comment"> // adjust the pointer</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span> <span class="comment"> beg = e;</span></div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> <span class="comment"> }</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> <span class="comment"></span></div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span> <span class="comment"> return std::make_pair(source, target); </span></div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> <span class="comment">}*/</span></div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span> </div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span> <span class="comment">// Function: parallel_for</span></div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span> <span class="keyword">template</span> <</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keyword">typename</span> I, </div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keyword">typename</span> C, </div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  std::enable_if_t<std::is_arithmetic_v<I>, <span class="keywordtype">void</span>>*</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span> ></div><div class="line"><a name="l00415"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#acfce9d2800a097202bdd4047f205dacf"> 415</a></span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a644d7ff0f19ca155a2e7d56b1cdb3a0b">FlowBuilder::parallel_for</a>(I beg, I end, I s, C&& c, <span class="keywordtype">size_t</span> p) {</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span> </div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keyword">using</span> T = std::decay_t<I>;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> </div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">if</span>((s == 0) || (beg < end && s <= 0) || (beg > end && s >=0) ) {</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  TF_THROW(Error::TASKFLOW, </div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="stringliteral">"invalid range ["</span>, beg, <span class="stringliteral">", "</span>, end, <span class="stringliteral">") with step size "</span>, s</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  );</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  }</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> </div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="comment">// compute the distance</span></div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keywordtype">size_t</span> D;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span> </div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">if</span> constexpr(std::is_integral_v<T>) {</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keywordflow">if</span>(beg <= end) { </div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  D = (end - beg + s - 1) / s;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  }</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  D = (end - beg + s + 1) / s;</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  }</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> constexpr(std::is_floating_point_v<T>) {</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  D = <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(std::ceil((end - beg) / s));</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  }</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  static_assert(dependent_false_v<T>, <span class="stringliteral">"can't deduce distance"</span>);</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  }</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span> </div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="comment">// source and target </span></div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keyword">auto</span> source = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="keyword">auto</span> target = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> </div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="comment">// special case</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="keywordflow">if</span>(D == 0) {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  source.precede(target);</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">return</span> std::make_pair(source, target);</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  }</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  </div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="comment">// default partition equals to the worker count</span></div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keywordflow">if</span>(p == 0) {</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  p = std::max(<span class="keywordtype">unsigned</span>{1}, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a>());</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  }</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  </div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordtype">size_t</span> b = (D + p - 1) / p; <span class="comment">// block size</span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordtype">size_t</span> r = (D % p) ? D % p : p; <span class="comment">// workers to take b</span></div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordtype">size_t</span> w = 0; <span class="comment">// worker id</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> </div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="comment">// Integer indices</span></div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">if</span> constexpr(std::is_integral_v<T>) {</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="comment">// positive case</span></div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">if</span>(beg < end) {</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordflow">while</span>(beg != end) {</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keyword">auto</span> g = (w++ >= r) ? b - 1 : b;</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keyword">auto</span> o = <span class="keyword">static_cast<</span>T<span class="keyword">></span>(g) * s;</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="keyword">auto</span> e = std::min(beg + o, end);</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([=] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> i=beg; i<e; i+=s) {</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  c(i);</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  }</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  });</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  source.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(target);</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  beg = e;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  }</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="comment">// negative case</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(beg > end) {</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="keywordflow">while</span>(beg != end) {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keyword">auto</span> g = (w++ >= r) ? b - 1 : b;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keyword">auto</span> o = <span class="keyword">static_cast<</span>T<span class="keyword">></span>(g) * s;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keyword">auto</span> e = std::max(beg + o, end);</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([=] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> i=beg; i>e; i+=s) {</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  c(i);</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  }</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  });</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  source.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(target);</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  beg = e;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  }</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="comment">// We enumerate the entire sequence to avoid floating error</span></div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> constexpr(std::is_floating_point_v<T>) {</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keywordtype">size_t</span> N = 0;</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordtype">size_t</span> g = b;</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keyword">auto</span> B = beg;</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> i=beg; (beg<end ? i<end : i>end); i+=s, ++N) {</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">if</span>(N == g) {</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([=] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keyword">auto</span> b = B;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> n=0; n<N; ++n) {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  c(b);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  b += s; </div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  });</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  N = 0;</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  B = i;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  source.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(target);</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordflow">if</span>(++w >= r) {</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  g = b - 1;</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  }</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  }</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  }</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span> </div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="comment">// the last pices</span></div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordflow">if</span>(N != 0) {</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([=] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keyword">auto</span> b = B;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> n=0; n<N; ++n) {</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  c(b);</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  b += s; </div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  });</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  source.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(target);</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  }</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  </div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keywordflow">return</span> std::make_pair(source, target); </div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span> <span class="comment">// Function: reduce_min</span></div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="comment">// Find the minimum element over a range of items.</span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T></div><div class="line"><a name="l00541"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#ae10e34cf00f7128d23e24c524c18d970"> 541</a></span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#ae10e34cf00f7128d23e24c524c18d970">FlowBuilder::reduce_min</a>(I beg, I end, T& result) {</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <a class="code" href="classtf_1_1FlowBuilder.html#a06b06b57f8ec8bb060951fc71dd375fb">reduce</a>(beg, end, result, [] (<span class="keyword">const</span> <span class="keyword">auto</span>& l, <span class="keyword">const</span> <span class="keyword">auto</span>& r) {</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="keywordflow">return</span> std::min(l, r);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  });</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> }</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> <span class="comment">// Function: reduce_max</span></div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> <span class="comment">// Find the maximum element over a range of items.</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T></div><div class="line"><a name="l00550"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a076fa5b55e0ef6eba3c962e85727f218"> 550</a></span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a076fa5b55e0ef6eba3c962e85727f218">FlowBuilder::reduce_max</a>(I beg, I end, T& result) {</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">return</span> <a class="code" href="classtf_1_1FlowBuilder.html#a06b06b57f8ec8bb060951fc71dd375fb">reduce</a>(beg, end, result, [] (<span class="keyword">const</span> <span class="keyword">auto</span>& l, <span class="keyword">const</span> <span class="keyword">auto</span>& r) {</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordflow">return</span> std::max(l, r);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  });</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> }</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> </div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> <span class="comment">// Function: transform_reduce </span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T, <span class="keyword">typename</span> B, <span class="keyword">typename</span> U></div><div class="line"><a name="l00558"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a08d669f2286cb90fd5ba7dade1e93fef"> 558</a></span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a08d669f2286cb90fd5ba7dade1e93fef">FlowBuilder::transform_reduce</a>(I beg, I end, T& result, B&& bop, U&& uop) {</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> </div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keyword">using</span> category = <span class="keyword">typename</span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/iterator/iterator_traits.html">std::iterator_traits<I>::iterator_category</a>;</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  </div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="comment">// Even partition</span></div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordtype">size_t</span> d = std::distance(beg, end);</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordtype">size_t</span> w = std::max(<span class="keywordtype">unsigned</span>{1}, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a>());</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="keywordtype">size_t</span> g = std::max((d + w - 1) / w, <span class="keywordtype">size_t</span>{2});</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> </div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <span class="keyword">auto</span> source = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keyword">auto</span> target = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span> </div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="comment">//std::vector<std::future<T>> futures;</span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keyword">auto</span> g_results = std::make_unique<T[]>(w);</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordtype">size_t</span> <span class="keywordtype">id</span> {0};</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span> </div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="keywordflow">while</span>(beg != end) {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> </div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="keyword">auto</span> e = beg;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  </div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="comment">// Case 1: random access iterator</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordflow">if</span> constexpr(std::is_same_v<category, std::random_access_iterator_tag>) {</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordtype">size_t</span> r = std::distance(beg, end);</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  std::advance(e, std::min(r, g));</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  }</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="comment">// Case 2: non-random access iterator</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0; i<g && e != end; ++e, ++i);</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  }</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  </div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="comment">// Create a task </span></div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([beg, e, bop, uop, res=&(g_results[<span class="keywordtype">id</span>])] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  *res = uop(*beg);</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">for</span>(++beg; beg != e; ++beg) {</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  *res = bop(std::move(*res), uop(*beg)); </div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  }</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  });</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span> </div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  source.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(target);</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="comment">// adjust the pointer</span></div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  beg = e;</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keywordtype">id</span> ++;</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  }</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span> </div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="comment">// target synchronizer </span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  target.<a class="code" href="classtf_1_1Task.html#a2f6f4cec42d016e5eb89390f362ffe99">work</a>([&result, bop, res=MoC{std::move(g_results)}, w=id] () {</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> i=0u; i<w; i++) {</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  result = bop(std::move(result), res.object[i]);</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  }</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  });</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> </div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordflow">return</span> std::make_pair(source, target); </div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> </div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment">// Function: transform_reduce </span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T, <span class="keyword">typename</span> B, <span class="keyword">typename</span> P, <span class="keyword">typename</span> U></div><div class="line"><a name="l00616"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a9b81ad3b206a63adff8b8bc423f8c425"> 616</a></span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a08d669f2286cb90fd5ba7dade1e93fef">FlowBuilder::transform_reduce</a>(</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  I beg, I end, T& result, B&& bop, P&& pop, U&& uop</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> ) {</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> </div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keyword">using</span> category = <span class="keyword">typename</span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/iterator/iterator_traits.html">std::iterator_traits<I>::iterator_category</a>;</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  </div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="comment">// Even partition</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordtype">size_t</span> d = std::distance(beg, end);</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordtype">size_t</span> w = std::max(<span class="keywordtype">unsigned</span>{1}, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a>());</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordtype">size_t</span> g = std::max((d + w - 1) / w, <span class="keywordtype">size_t</span>{2});</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> </div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keyword">auto</span> source = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="keyword">auto</span> target = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> </div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keyword">auto</span> g_results = std::make_unique<T[]>(w);</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> </div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordtype">size_t</span> <span class="keywordtype">id</span> {0};</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">while</span>(beg != end) {</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> </div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keyword">auto</span> e = beg;</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  </div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="comment">// Case 1: random access iterator</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keywordflow">if</span> constexpr(std::is_same_v<category, std::random_access_iterator_tag>) {</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="keywordtype">size_t</span> r = std::distance(beg, end);</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  std::advance(e, std::min(r, g));</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="comment">// Case 2: non-random access iterator</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0; i<g && e != end; ++e, ++i);</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  }</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  </div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <span class="comment">// Create a task </span></div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([beg, e, uop, pop, res= &g_results[<span class="keywordtype">id</span>]] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  *res = uop(*beg);</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keywordflow">for</span>(++beg; beg != e; ++beg) {</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  *res = pop(std::move(*res), *beg);</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  });</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="comment">//auto [task, future] = emplace([beg, e, uop, pop] () mutable {</span></div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="comment">// auto init = uop(*beg);</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="comment">// for(++beg; beg != e; ++beg) {</span></div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="comment">// init = pop(std::move(init), *beg);</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="comment">// }</span></div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="comment">// return init;</span></div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="comment">//});</span></div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  source.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(target);</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="comment">//futures.push_back(std::move(future));</span></div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> </div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="comment">// adjust the pointer</span></div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  beg = e;</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordtype">id</span> ++;</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  }</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span> </div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <span class="comment">// target synchronizer </span></div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  target.<a class="code" href="classtf_1_1Task.html#a2f6f4cec42d016e5eb89390f362ffe99">work</a>([&result, bop, g_results=MoC{std::move(g_results)}, w=id] () {</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> i=0u; i<w; i++) {</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  result = bop(std::move(result), std::move(g_results.object[i]));</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  }</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  });</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <span class="comment">//target.work([&result, futures=MoC{std::move(futures)}, bop] () {</span></div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="comment">// for(auto& fu : futures.object) {</span></div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="comment">// result = bop(std::move(result), fu.get());</span></div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="comment">// }</span></div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="comment">//});</span></div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span> </div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">return</span> std::make_pair(source, target); </div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span> }</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span> <span class="comment">//template <typename I></span></div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span> <span class="comment">//size_t FlowBuilder::_estimate_chunk_size(I beg, I end, I step) {</span></div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span> <span class="comment">//</span></div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span> <span class="comment">// using T = std::decay_t<I>;</span></div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span> <span class="comment">// </span></div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span> <span class="comment">// size_t w = std::max(unsigned{1}, std::thread::hardware_concurrency());</span></div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span> <span class="comment">// size_t N = 0;</span></div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span> <span class="comment">//</span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span> <span class="comment">// if constexpr(std::is_integral_v<T>) {</span></div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span> <span class="comment">// if(beg <= end) { </span></div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span> <span class="comment">// N = (end - beg + step - 1) / step;</span></div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span> <span class="comment">// }</span></div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span> <span class="comment">// else {</span></div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span> <span class="comment">// N = (end - beg + step + 1) / step;</span></div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span> <span class="comment">// }</span></div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span> <span class="comment">// }</span></div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span> <span class="comment">// else if constexpr(std::is_floating_point_v<T>) {</span></div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span> <span class="comment">// N = static_cast<size_t>(std::ceil((end - beg) / step));</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span> <span class="comment">// }</span></div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span> <span class="comment">// else {</span></div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span> <span class="comment">// static_assert(dependent_false_v<T>, "can't deduce chunk size");</span></div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span> <span class="comment">// }</span></div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span> <span class="comment">//</span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span> <span class="comment">// return (N + w - 1) / w;</span></div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span> <span class="comment">//}</span></div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span> </div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span> <span class="comment">// Procedure: _linearize</span></div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span> <span class="keyword">template</span> <<span class="keyword">typename</span> L></div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span> <span class="keywordtype">void</span> FlowBuilder::_linearize(L& keys) {</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span> </div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  <span class="keyword">auto</span> itr = keys.begin();</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keyword">auto</span> end = keys.end();</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span> </div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordflow">if</span>(itr == end) {</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  }</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span> </div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keyword">auto</span> nxt = itr;</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span> </div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="keywordflow">for</span>(++nxt; nxt != end; ++nxt, ++itr) {</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  itr->_node->precede(*(nxt->_node));</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  }</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span> }</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span> </div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span> <span class="comment">// Procedure: linearize</span></div><div class="line"><a name="l00732"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a90f3d9b9d6fcf4df8e7d7878dfdd130d"> 732</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a90f3d9b9d6fcf4df8e7d7878dfdd130d">FlowBuilder::linearize</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector<Task></a>& keys) {</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  _linearize(keys); </div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span> }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> </div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span> <span class="comment">// Procedure: linearize</span></div><div class="line"><a name="l00737"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a4ec89b554d15ad5fb96f4fdb10dbbb16"> 737</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1FlowBuilder.html#a90f3d9b9d6fcf4df8e7d7878dfdd130d">FlowBuilder::linearize</a>(<a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/initializer_list.html">std::initializer_list<Task></a> keys) {</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  _linearize(keys);</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span> }</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span> </div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span> <span class="comment">// Proceduer: reduce</span></div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span> <span class="keyword">template</span> <<span class="keyword">typename</span> I, <span class="keyword">typename</span> T, <span class="keyword">typename</span> B></div><div class="line"><a name="l00743"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a06b06b57f8ec8bb060951fc71dd375fb"> 743</a></span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair<Task, Task></a> <a class="code" href="classtf_1_1FlowBuilder.html#a06b06b57f8ec8bb060951fc71dd375fb">FlowBuilder::reduce</a>(I beg, I end, T& result, B&& op) {</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  </div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  <span class="keyword">using</span> category = <span class="keyword">typename</span> <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/iterator/iterator_traits.html">std::iterator_traits<I>::iterator_category</a>;</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  </div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordtype">size_t</span> d = std::distance(beg, end);</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keywordtype">size_t</span> w = std::max(<span class="keywordtype">unsigned</span>{1}, <a class="codeRef" doxygen="/home/tsung-wei/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a>());</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keywordtype">size_t</span> g = std::max((d + w - 1) / w, <span class="keywordtype">size_t</span>{2});</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keyword">auto</span> source = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="keyword">auto</span> target = <a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>();</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span> </div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="comment">//T* g_results = static_cast<T*>(malloc(sizeof(T)*w));</span></div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <span class="keyword">auto</span> g_results = std::make_unique<T[]>(w);</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <span class="comment">//std::vector<std::future<T>> futures;</span></div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  </div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="keywordtype">size_t</span> <span class="keywordtype">id</span> {0};</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  <span class="keywordflow">while</span>(beg != end) {</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span> </div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <span class="keyword">auto</span> e = beg;</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  </div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="comment">// Case 1: random access iterator</span></div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <span class="keywordflow">if</span> constexpr(std::is_same_v<category, std::random_access_iterator_tag>) {</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  <span class="keywordtype">size_t</span> r = std::distance(beg, end);</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  std::advance(e, std::min(r, g));</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  }</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="comment">// Case 2: non-random access iterator</span></div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i=0; i<g && e != end; ++e, ++i);</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  }</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  </div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="comment">// Create a task</span></div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="comment">//auto [task, future] = emplace([beg, e, op] () mutable {</span></div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keyword">auto</span> task = <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([beg, e, op, res = &g_results[<span class="keywordtype">id</span>]] () <span class="keyword">mutable</span> {</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  *res = *beg;</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keywordflow">for</span>(++beg; beg != e; ++beg) {</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  *res = op(std::move(*res), *beg); </div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  }</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  <span class="comment">//auto init = *beg;</span></div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="comment">//for(++beg; beg != e; ++beg) {</span></div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="comment">// init = op(std::move(init), *beg); </span></div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="comment">//}</span></div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="comment">//return init;</span></div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  });</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  source.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(task);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  task.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(target);</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="comment">//futures.push_back(std::move(future));</span></div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="comment">// adjust the pointer</span></div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  beg = e;</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  <span class="keywordtype">id</span> ++;</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  }</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  </div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  <span class="comment">// target synchronizer</span></div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <span class="comment">//target.work([&result, futures=MoC{std::move(futures)}, op] () {</span></div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="comment">// for(auto& fu : futures.object) {</span></div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="comment">// result = op(std::move(result), fu.get());</span></div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="comment">// }</span></div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  <span class="comment">//});</span></div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  target.<a class="code" href="classtf_1_1Task.html#a2f6f4cec42d016e5eb89390f362ffe99">work</a>([g_results=MoC{std::move(g_results)}, &result, op, w=id] () {</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> i=0u; i<w; i++) {</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  result = op(std::move(result), g_results.object[i]);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  }</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  });</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> </div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="keywordflow">return</span> std::make_pair(source, target); </div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> }</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span> </div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span> <span class="comment">// ----------------------------------------------------------------------------</span></div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span> </div><div class="line"><a name="l00817"></a><span class="lineno"><a class="line" href="classtf_1_1Subflow.html"> 817</a></span> <span class="keyword">class </span><a class="code" href="classtf_1_1Subflow.html">Subflow</a> : <span class="keyword">public</span> <a class="code" href="classtf_1_1FlowBuilder.html">FlowBuilder</a> {</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> </div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  </div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="keyword">template</span> <<span class="keyword">typename</span>... Args></div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  <a class="code" href="classtf_1_1Subflow.html">Subflow</a>(Args&&... args);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  </div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordtype">void</span> join();</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span> </div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  <span class="keywordtype">void</span> detach();</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  </div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <span class="keywordtype">bool</span> detached() <span class="keyword">const</span>;</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span> </div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="keywordtype">bool</span> joined() <span class="keyword">const</span>;</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span> </div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span> </div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="keywordtype">bool</span> _detached {<span class="keyword">false</span>};</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span> };</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span> </div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> <span class="comment">// Constructor</span></div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... Args></div><div class="line"><a name="l00854"></a><span class="lineno"><a class="line" href="classtf_1_1Subflow.html#abe853a60943b8ecbf10ab2e27d6769e1"> 854</a></span> <a class="code" href="classtf_1_1Subflow.html#abe853a60943b8ecbf10ab2e27d6769e1">Subflow::Subflow</a>(Args&&... args) :</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <a class="code" href="classtf_1_1FlowBuilder.html">FlowBuilder</a> {std::forward<Args>(args)...} {</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span> }</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span> </div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span> <span class="comment">// Procedure: join</span></div><div class="line"><a name="l00859"></a><span class="lineno"><a class="line" href="classtf_1_1Subflow.html#a59fcac1323e70d920088dd37bd0be245"> 859</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1Subflow.html#a59fcac1323e70d920088dd37bd0be245">Subflow::join</a>() {</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  _detached = <span class="keyword">false</span>;</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span> }</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span> </div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span> <span class="comment">// Procedure: detach</span></div><div class="line"><a name="l00864"></a><span class="lineno"><a class="line" href="classtf_1_1Subflow.html#acfdedc7e9676126e9a38ecf7b5a37864"> 864</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classtf_1_1Subflow.html#acfdedc7e9676126e9a38ecf7b5a37864">Subflow::detach</a>() {</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  _detached = <span class="keyword">true</span>;</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span> }</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span> </div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span> <span class="comment">// Function: detached</span></div><div class="line"><a name="l00869"></a><span class="lineno"><a class="line" href="classtf_1_1Subflow.html#a185a0cba35c5f208029ea207e9be0b5f"> 869</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classtf_1_1Subflow.html#a185a0cba35c5f208029ea207e9be0b5f">Subflow::detached</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="keywordflow">return</span> _detached;</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span> }</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span> </div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span> <span class="comment">// Function: joined</span></div><div class="line"><a name="l00874"></a><span class="lineno"><a class="line" href="classtf_1_1Subflow.html#afb178f1e81f2d37652803023da5847ce"> 874</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classtf_1_1Subflow.html#afb178f1e81f2d37652803023da5847ce">Subflow::joined</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="keywordflow">return</span> !_detached;</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span> }</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span> </div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span> <span class="comment">// -----</span></div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span> </div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span> <span class="comment">// Function: emplace</span></div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... C, std::enable_if_t<(<span class="keyword">sizeof</span>...(C)>1), <span class="keywordtype">void</span>>*></div><div class="line"><a name="l00882"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a1f6118326ad434f6c839007a1a79fe1b"> 882</a></span> <span class="keyword">auto</span> <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">FlowBuilder::emplace</a>(C&&... cs) {</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="keywordflow">return</span> std::make_tuple(<a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>(std::forward<C>(cs))...);</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span> }</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span> </div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span> <span class="comment">// Function: emplace</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span> <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l00888"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c"> 888</a></span> <a class="code" href="classtf_1_1Task.html">Task</a> <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">FlowBuilder::emplace</a>(C&& c) {</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="comment">// dynamic tasking</span></div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordflow">if</span> constexpr(std::is_invocable_v<C, Subflow&>) {</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="keyword">auto</span>& n = _graph.emplace_back(</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  [c=std::forward<C>(c)] (<a class="code" href="classtf_1_1Subflow.html">Subflow</a>& fb) <span class="keyword">mutable</span> {</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="comment">// first time execution</span></div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="keywordflow">if</span>(fb._graph.empty()) {</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  c(fb);</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  }</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  });</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">return</span> <a class="code" href="classtf_1_1Task.html">Task</a>(n);</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  }</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="comment">// static tasking</span></div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> constexpr(std::is_invocable_v<C>) {</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  <span class="keyword">auto</span>& n = _graph.emplace_back(std::forward<C>(c));</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="keywordflow">return</span> <a class="code" href="classtf_1_1Task.html">Task</a>(n);</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  }</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  static_assert(dependent_false_v<C>, <span class="stringliteral">"invalid task work type"</span>);</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  }</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span> }</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span> </div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> <span class="comment">// Function: silent_emplace</span></div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span> <span class="keyword">template</span> <<span class="keyword">typename</span>... C, std::enable_if_t<(<span class="keyword">sizeof</span>...(C)>1), <span class="keywordtype">void</span>>*></div><div class="line"><a name="l00912"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#acf423e2775a25c2b8be4dce7dae8880a"> 912</a></span> <span class="keyword">auto</span> <a class="code" href="classtf_1_1FlowBuilder.html#abf3da84e99b67248d6d8fdba48267caf">FlowBuilder::silent_emplace</a>(C&&... cs) {</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="keywordflow">return</span> std::make_tuple(<a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>(std::forward<C>(cs))...);</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span> }</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span> </div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> <span class="comment">// Function: silent_emplace</span></div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span> <span class="keyword">template</span> <<span class="keyword">typename</span> C></div><div class="line"><a name="l00918"></a><span class="lineno"><a class="line" href="classtf_1_1FlowBuilder.html#abf3da84e99b67248d6d8fdba48267caf"> 918</a></span> <a class="code" href="classtf_1_1Task.html">Task</a> <a class="code" href="classtf_1_1FlowBuilder.html#abf3da84e99b67248d6d8fdba48267caf">FlowBuilder::silent_emplace</a>(C&& c) {</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="keywordflow">return</span> <a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>(std::forward<C>(c));</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span> }</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span> </div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span> <span class="comment">// ---------- deprecated ----------</span></div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span> </div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span> <span class="comment">//template <typename C></span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span> <span class="comment">//auto FlowBuilder::emplace(C&& c) {</span></div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span> <span class="comment">// // subflow task</span></div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span> <span class="comment">// if constexpr(std::is_invocable_v<C, Subflow&>) {</span></div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span> <span class="comment">//</span></div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span> <span class="comment">// using R = std::invoke_result_t<C, Subflow&>;</span></div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span> <span class="comment">// std::promise<R> p;</span></div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span> <span class="comment">// auto fu = p.get_future();</span></div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span> <span class="comment">// </span></div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span> <span class="comment">// if constexpr(std::is_same_v<void, R>) {</span></div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span> <span class="comment">// auto& node = _graph.emplace_back([p=MoC(std::move(p)), c=std::forward<C>(c)]</span></div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span> <span class="comment">// (Subflow& fb) mutable {</span></div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span> <span class="comment">// if(fb._graph.empty()) {</span></div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span> <span class="comment">// c(fb);</span></div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span> <span class="comment">// // if subgraph is detached or empty after invoked</span></div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span> <span class="comment">// if(fb.detached() || fb._graph.empty()) {</span></div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span> <span class="comment">// p.get().set_value();</span></div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span> <span class="comment">// }</span></div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span> <span class="comment">// }</span></div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span> <span class="comment">// else {</span></div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span> <span class="comment">// p.get().set_value();</span></div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span> <span class="comment">// }</span></div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span> <span class="comment">// });</span></div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span> <span class="comment">// return std::make_pair(Task(node), std::move(fu));</span></div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span> <span class="comment">// }</span></div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span> <span class="comment">// else {</span></div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span> <span class="comment">// auto& node = _graph.emplace_back(</span></div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span> <span class="comment">// [p=MoC(std::move(p)), c=std::forward<C>(c), r=std::optional<R>()]</span></div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span> <span class="comment">// (Subflow& fb) mutable {</span></div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span> <span class="comment">// if(fb._graph.empty()) {</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span> <span class="comment">// r.emplace(c(fb));</span></div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span> <span class="comment">// if(fb.detached() || fb._graph.empty()) {</span></div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span> <span class="comment">// p.get().set_value(std::move(*r)); </span></div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span> <span class="comment">// }</span></div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span> <span class="comment">// }</span></div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span> <span class="comment">// else {</span></div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span> <span class="comment">// assert(r);</span></div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span> <span class="comment">// p.get().set_value(std::move(*r));</span></div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span> <span class="comment">// }</span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span> <span class="comment">// });</span></div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span> <span class="comment">// return std::make_pair(Task(node), std::move(fu));</span></div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span> <span class="comment">// }</span></div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span> <span class="comment">// }</span></div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span> <span class="comment">// // regular task</span></div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span> <span class="comment">// else if constexpr(std::is_invocable_v<C>) {</span></div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span> <span class="comment">//</span></div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span> <span class="comment">// using R = std::invoke_result_t<C>;</span></div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="comment">// std::promise<R> p;</span></div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span> <span class="comment">// auto fu = p.get_future();</span></div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span> <span class="comment">//</span></div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="comment">// if constexpr(std::is_same_v<void, R>) {</span></div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> <span class="comment">// auto& node = _graph.emplace_back(</span></div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span> <span class="comment">// [p=MoC(std::move(p)), c=std::forward<C>(c)]() mutable {</span></div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span> <span class="comment">// c(); </span></div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span> <span class="comment">// p.get().set_value();</span></div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span> <span class="comment">// }</span></div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span> <span class="comment">// );</span></div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span> <span class="comment">// return std::make_pair(Task(node), std::move(fu));</span></div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span> <span class="comment">// }</span></div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span> <span class="comment">// else {</span></div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span> <span class="comment">// auto& node = _graph.emplace_back(</span></div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span> <span class="comment">// [p=MoC(std::move(p)), c=std::forward<C>(c)]() mutable {</span></div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span> <span class="comment">// p.get().set_value(c());</span></div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span> <span class="comment">// }</span></div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span> <span class="comment">// );</span></div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span> <span class="comment">// return std::make_pair(Task(node), std::move(fu));</span></div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span> <span class="comment">// }</span></div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span> <span class="comment">// }</span></div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span> <span class="comment">// else {</span></div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span> <span class="comment">// static_assert(dependent_false_v<C>, "invalid task work type");</span></div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span> <span class="comment">// }</span></div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span> <span class="comment">//}</span></div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span> </div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span> <span class="keyword">using</span> <a class="code" href="classtf_1_1Subflow.html">SubflowBuilder</a> = <a class="code" href="classtf_1_1Subflow.html#abe853a60943b8ecbf10ab2e27d6769e1">Subflow</a>;</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span> </div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span> } <span class="comment">// end of namespace tf. ---------------------------------------------------</span></div><div class="ttc" id="classtf_1_1FlowBuilder_html_a90f3d9b9d6fcf4df8e7d7878dfdd130d"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a90f3d9b9d6fcf4df8e7d7878dfdd130d">tf::FlowBuilder::linearize</a></div><div class="ttdeci">void linearize(std::vector< Task > &tasks)</div><div class="ttdoc">adds adjacent dependency links to a linear list of tasks </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:732</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a4d52a7fe2814b264846a2085e931652c"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">tf::FlowBuilder::emplace</a></div><div class="ttdeci">Task emplace(C &&callable)</div><div class="ttdoc">creates a task from a given callable object </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:888</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a644d7ff0f19ca155a2e7d56b1cdb3a0b"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a644d7ff0f19ca155a2e7d56b1cdb3a0b">tf::FlowBuilder::parallel_for</a></div><div class="ttdeci">std::pair< Task, Task > parallel_for(I beg, I end, C &&callable, size_t partitions=0)</div><div class="ttdoc">constructs a task dependency graph of range-based parallel_for </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:314</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a3be7d982efad780eb6adbd1cf11a3d97"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a3be7d982efad780eb6adbd1cf11a3d97">tf::FlowBuilder::broadcast</a></div><div class="ttdeci">void broadcast(Task A, std::vector< Task > &others)</div><div class="ttdoc">adds dependency links from one task A to many tasks </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:287</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a08d669f2286cb90fd5ba7dade1e93fef"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a08d669f2286cb90fd5ba7dade1e93fef">tf::FlowBuilder::transform_reduce</a></div><div class="ttdeci">std::pair< Task, Task > transform_reduce(I beg, I end, T &result, B &&bop, U &&uop)</div><div class="ttdoc">constructs a task dependency graph of parallel transformation and reduction </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:558</div></div>
<div class="ttc" id="classtf_1_1Task_html_a40d627bd34014eb6f981014f209c304c"><div class="ttname"><a href="classtf_1_1Task.html#a40d627bd34014eb6f981014f209c304c">tf::Task::gather</a></div><div class="ttdeci">Task & gather(Ts &&... tasks)</div><div class="ttdoc">adds precedence links from other tasks to this (same as succeed) </div><div class="ttdef"><b>Definition:</b> task.hpp:247</div></div>
<div class="ttc" id="namespacetf_html"><div class="ttname"><a href="namespacetf.html">tf</a></div><div class="ttdef"><b>Definition:</b> taskflow.hpp:5</div></div>
<div class="ttc" id="hardware_concurrency_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a></div><div class="ttdeci">T hardware_concurrency(T... args)</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_acab0b4ac82260f47fdb36a3244ee3aaf"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">tf::FlowBuilder::placeholder</a></div><div class="ttdeci">Task placeholder()</div><div class="ttdoc">creates an empty task </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:307</div></div>
<div class="ttc" id="classtf_1_1Subflow_html_abe853a60943b8ecbf10ab2e27d6769e1"><div class="ttname"><a href="classtf_1_1Subflow.html#abe853a60943b8ecbf10ab2e27d6769e1">tf::Subflow::Subflow</a></div><div class="ttdeci">Subflow(Args &&... args)</div><div class="ttdoc">constructs a subflow builder object </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:854</div></div>
<div class="ttc" id="classtf_1_1Subflow_html_acfdedc7e9676126e9a38ecf7b5a37864"><div class="ttname"><a href="classtf_1_1Subflow.html#acfdedc7e9676126e9a38ecf7b5a37864">tf::Subflow::detach</a></div><div class="ttdeci">void detach()</div><div class="ttdoc">enables the subflow to detach from its parent task </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:864</div></div>
<div class="ttc" id="classtf_1_1Subflow_html_a185a0cba35c5f208029ea207e9be0b5f"><div class="ttname"><a href="classtf_1_1Subflow.html#a185a0cba35c5f208029ea207e9be0b5f">tf::Subflow::detached</a></div><div class="ttdeci">bool detached() const</div><div class="ttdoc">queries if the subflow will be detached from its parent task </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:869</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a076fa5b55e0ef6eba3c962e85727f218"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a076fa5b55e0ef6eba3c962e85727f218">tf::FlowBuilder::reduce_max</a></div><div class="ttdeci">std::pair< Task, Task > reduce_max(I beg, I end, T &result)</div><div class="ttdoc">constructs a task dependency graph of parallel reduction through std::max </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:550</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_af7c4a5d732d49bd63d554a92cd240f3f"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#af7c4a5d732d49bd63d554a92cd240f3f">tf::FlowBuilder::precede</a></div><div class="ttdeci">void precede(Task A, Task B)</div><div class="ttdoc">adds a dependency link from task A to task B </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:282</div></div>
<div class="ttc" id="iterator_traits_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/iterator/iterator_traits.html">std::iterator_traits</a></div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a8871a9277dad477a69fb3a323d9c7bdb"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a8871a9277dad477a69fb3a323d9c7bdb">tf::FlowBuilder::gather</a></div><div class="ttdeci">void gather(std::vector< Task > &others, Task A)</div><div class="ttdoc">adds dependency links from many tasks to one task A </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:297</div></div>
<div class="ttc" id="pair_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair</a></div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a67d023d5493da1594a1d2eaea89da179"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a67d023d5493da1594a1d2eaea89da179">tf::FlowBuilder::FlowBuilder</a></div><div class="ttdeci">FlowBuilder(Graph &graph)</div><div class="ttdoc">construct a flow builder object </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:277</div></div>
<div class="ttc" id="vector_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a></div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html"><div class="ttname"><a href="classtf_1_1FlowBuilder.html">tf::FlowBuilder</a></div><div class="ttdoc">Building blocks of a task dependency graph. </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:13</div></div>
<div class="ttc" id="classtf_1_1Subflow_html_afb178f1e81f2d37652803023da5847ce"><div class="ttname"><a href="classtf_1_1Subflow.html#afb178f1e81f2d37652803023da5847ce">tf::Subflow::joined</a></div><div class="ttdeci">bool joined() const</div><div class="ttdoc">queries if the subflow will join its parent task </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:874</div></div>
<div class="ttc" id="classtf_1_1Task_html"><div class="ttname"><a href="classtf_1_1Task.html">tf::Task</a></div><div class="ttdoc">Handle to modify and access a task. </div><div class="ttdef"><b>Definition:</b> task.hpp:18</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_abf3da84e99b67248d6d8fdba48267caf"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#abf3da84e99b67248d6d8fdba48267caf">tf::FlowBuilder::silent_emplace</a></div><div class="ttdeci">Task silent_emplace(C &&callable)</div><div class="ttdoc">the same as tf::FlowBuilder::emplace (starting at 2.1.0) </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:918</div></div>
<div class="ttc" id="classtf_1_1Task_html_a8c78c453295a553c1c016e4062da8588"><div class="ttname"><a href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">tf::Task::precede</a></div><div class="ttdeci">Task & precede(Ts &&... tasks)</div><div class="ttdoc">adds precedence links from this to other tasks </div><div class="ttdef"><b>Definition:</b> task.hpp:220</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_a06b06b57f8ec8bb060951fc71dd375fb"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#a06b06b57f8ec8bb060951fc71dd375fb">tf::FlowBuilder::reduce</a></div><div class="ttdeci">std::pair< Task, Task > reduce(I beg, I end, T &result, B &&bop)</div><div class="ttdoc">construct a task dependency graph of parallel reduction </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:743</div></div>
<div class="ttc" id="classtf_1_1Task_html_a2f6f4cec42d016e5eb89390f362ffe99"><div class="ttname"><a href="classtf_1_1Task.html#a2f6f4cec42d016e5eb89390f362ffe99">tf::Task::work</a></div><div class="ttdeci">Task & work(C &&callable)</div><div class="ttdoc">assigns a new callable object to the task </div><div class="ttdef"><b>Definition:</b> task.hpp:313</div></div>
<div class="ttc" id="initializer_list_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/initializer_list.html">std::initializer_list</a></div></div>
<div class="ttc" id="classtf_1_1Subflow_html"><div class="ttname"><a href="classtf_1_1Subflow.html">tf::Subflow</a></div><div class="ttdoc">The building blocks of dynamic tasking. </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:817</div></div>
<div class="ttc" id="classtf_1_1Subflow_html_a59fcac1323e70d920088dd37bd0be245"><div class="ttname"><a href="classtf_1_1Subflow.html#a59fcac1323e70d920088dd37bd0be245">tf::Subflow::join</a></div><div class="ttdeci">void join()</div><div class="ttdoc">enables the subflow to join its parent task </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:859</div></div>
<div class="ttc" id="classtf_1_1FlowBuilder_html_ae10e34cf00f7128d23e24c524c18d970"><div class="ttname"><a href="classtf_1_1FlowBuilder.html#ae10e34cf00f7128d23e24c524c18d970">tf::FlowBuilder::reduce_min</a></div><div class="ttdeci">std::pair< Task, Task > reduce_min(I beg, I end, T &result)</div><div class="ttdoc">constructs a task dependency graph of parallel reduction through std::min </div><div class="ttdef"><b>Definition:</b> flow_builder.hpp:541</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_88dad41ea55ca2177e141d32a93e931c.html">taskflow</a></li><li class="navelem"><a class="el" href="dir_220cd4d9b8cb38c840b455d5d75c25bb.html">core</a></li><li class="navelem"><b>flow_builder.hpp</b></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
</ul>
</div>
</body>
</html>