]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/context/doc/html/context/ecv2_class.html
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / context / doc / html / context / ecv2_class.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Class execution_context (version 2)</title>
5 <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
7 <link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
8 <link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
9 <link rel="prev" href="ecv1_class.html" title="Class execution_context (version 1)">
10 <link rel="next" href="stack.html" title="Stack allocation">
11 </head>
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../more/index.htm">More</a></td>
20 </tr></table>
21 <hr>
22 <div class="spirit-nav">
23 <a accesskey="p" href="ecv1_class.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24 </div>
25 <div class="section">
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="context.ecv2_class"></a><a name="ecv2"></a><a class="link" href="ecv2_class.html" title="Class execution_context (version 2)">Class execution_context
28 (version 2)</a>
29 </h2></div></div></div>
30 <div class="note"><table border="0" summary="Note">
31 <tr>
32 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
33 <th align="left">Note</th>
34 </tr>
35 <tr><td align="left" valign="top"><p>
36 This class is enabled per default.
37 </p></td></tr>
38 </table></div>
39 <p>
40 Class <span class="emphasis"><em>execution_context</em></span> encapsulates context switching
41 and manages the associated context' stack (allocation/deallocation).
42 </p>
43 <p>
44 <span class="emphasis"><em>execution_context</em></span> allocates the context stack (using its
45 <a class="link" href="stack.html#stack"><span class="emphasis"><em>StackAllocator</em></span></a> argument)
46 and creates a control structure on top of it. This structure is responsible
47 for managing context' stack. The address of the control structure is stored
48 in the first frame of context' stack (e.g. it can not directly accessed from
49 within <span class="emphasis"><em>execution_context</em></span>). In contrast to <a class="link" href="ecv1_class.html#ecv1"><span class="emphasis"><em>execution_context</em></span>
50 (v1)</a> the ownership of the control structure is not shared (no member
51 variable to control structure in <span class="emphasis"><em>execution_context</em></span>).
52 <span class="emphasis"><em>execution_context</em></span> keeps internally a state that is moved
53 by a call of <span class="emphasis"><em>execution_context::operator()</em></span> (<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> will be
54 invalidated), e.g. after a calling <span class="emphasis"><em>execution_context::operator()</em></span>,
55 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
56 can not be used for an additional context switch.
57 </p>
58 <p>
59 <span class="emphasis"><em>execution_context</em></span> is only move-constructible and move-assignable.
60 </p>
61 <p>
62 The moved state is assigned to a new instance of <span class="emphasis"><em>execution_context</em></span>.
63 This object becomes the first argument of the context-function, if the context
64 was resumed the first time, or the first element in a tuple returned by <span class="emphasis"><em>execution_context::operator()</em></span>
65 that has been called in the resumed context. In contrast to <a class="link" href="ecv1_class.html#ecv1"><span class="emphasis"><em>execution_context</em></span>
66 (v1)</a>, the context switch is faster because no global pointer etc. is
67 involved.
68 </p>
69 <div class="important"><table border="0" summary="Important">
70 <tr>
71 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
72 <th align="left">Important</th>
73 </tr>
74 <tr><td align="left" valign="top"><p>
75 Segmented stacks are not supported by <span class="emphasis"><em>execution_context</em></span>
76 (v2).
77 </p></td></tr>
78 </table></div>
79 <p>
80 On return the context-function of the current context has to specify an <span class="emphasis"><em>execution_context</em></span>
81 to which the execution cotnrol is transferred after termination of the current
82 context.
83 </p>
84 <p>
85 If an instance with valid state goes out of scope and the context-function
86 has not yet returned, the stack is traversed in order to access the control
87 structure (address stored at the first stack frame) and to deallocate context'
88 stack via the <span class="emphasis"><em>StackAllocator</em></span>. The stack walking makes
89 the destruction of <span class="emphasis"><em>execution_context</em></span> very slow and should
90 be prevented if possible.
91 </p>
92 <p>
93 <span class="emphasis"><em>execution_context</em></span> expects a function/functor with signature
94 <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">(</span><span class="identifier">execution_context</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="keyword">void</span><span class="special">*</span>
95 <span class="identifier">vp</span><span class="special">)</span></code>.
96 The parameter <code class="computeroutput"><span class="identifier">ctx</span></code> represents
97 the context from which this context was resumed (e.g. that has called <span class="emphasis"><em>execution_context::operator()</em></span>
98 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>)
99 and <code class="computeroutput"><span class="identifier">vp</span></code> is the data passed to
100 <span class="emphasis"><em>execution_context::operator()</em></span>. The return value is the
101 execution_context that has to be resumed, while this context terminates.
102 </p>
103 <h4>
104 <a name="context.ecv2_class.h0"></a>
105 <span><a name="context.ecv2_class.usage_of__emphasis_execution_context__emphasis_"></a></span><a class="link" href="ecv2_class.html#context.ecv2_class.usage_of__emphasis_execution_context__emphasis_">usage
106 of <span class="emphasis"><em>execution_context</em></span></a>
107 </h4>
108 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">n</span><span class="special">=</span><span class="number">35</span><span class="special">;</span>
109 <span class="identifier">ctx</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">source</span><span class="special">(</span>
110 <span class="special">[</span><span class="identifier">n</span><span class="special">](</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">sink</span><span class="special">,</span><span class="keyword">void</span><span class="special">*)</span><span class="keyword">mutable</span><span class="special">{</span>
111 <span class="keyword">int</span> <span class="identifier">a</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
112 <span class="keyword">int</span> <span class="identifier">b</span><span class="special">=</span><span class="number">1</span><span class="special">;</span>
113 <span class="keyword">while</span><span class="special">(</span><span class="identifier">n</span><span class="special">--&gt;</span><span class="number">0</span><span class="special">){</span>
114 <span class="keyword">auto</span> <span class="identifier">result</span><span class="special">=</span><span class="identifier">sink</span><span class="special">(&amp;</span><span class="identifier">a</span><span class="special">);</span>
115 <span class="identifier">sink</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">));</span>
116 <span class="keyword">auto</span> <span class="identifier">next</span><span class="special">=</span><span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">;</span>
117 <span class="identifier">a</span><span class="special">=</span><span class="identifier">b</span><span class="special">;</span>
118 <span class="identifier">b</span><span class="special">=</span><span class="identifier">next</span><span class="special">;</span>
119 <span class="special">}</span>
120 <span class="keyword">return</span> <span class="identifier">sink</span><span class="special">;</span>
121 <span class="special">});</span>
122 <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="number">0</span><span class="special">;</span><span class="identifier">i</span><span class="special">&lt;</span><span class="number">10</span><span class="special">;++</span><span class="identifier">i</span><span class="special">){</span>
123 <span class="keyword">auto</span> <span class="identifier">result</span><span class="special">=</span><span class="identifier">source</span><span class="special">();</span>
124 <span class="identifier">source</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">));</span>
125 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;*(</span><span class="keyword">int</span><span class="special">*)</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">)&lt;&lt;</span><span class="string">" "</span><span class="special">;</span>
126 <span class="special">}</span>
127
128 <span class="identifier">output</span><span class="special">:</span>
129 <span class="number">0</span> <span class="number">1</span> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span> <span class="number">5</span> <span class="number">8</span> <span class="number">13</span> <span class="number">21</span> <span class="number">34</span>
130 </pre>
131 <p>
132 This simple example demonstrates the basic usage of <span class="emphasis"><em>execution_context</em></span>.
133 The context <code class="computeroutput"><span class="identifier">sink</span></code> represents
134 the <span class="emphasis"><em>main</em></span>-context (function <span class="emphasis"><em>main()</em></span>
135 running). <code class="computeroutput"><span class="identifier">sink</span></code> is generated
136 by the framework (first element of lambda's parameter list). Because the state
137 is invalidated (== changed) by each call of <span class="emphasis"><em>execution_context::operator()</em></span>,
138 <code class="computeroutput"><span class="identifier">sink</span></code> has to be assigned the
139 new state of the <span class="emphasis"><em>execution_context</em></span> returned by <span class="emphasis"><em>execution_context::operator()</em></span>.
140 </p>
141 <p>
142 The lambda that calculates the Fibonacci numbers is executed inside the context
143 represented by <code class="computeroutput"><span class="identifier">source</span></code>. Calculated
144 Fibonacci numbers are transferred between the two context' via expression
145 <span class="emphasis"><em>sink(&amp;a)</em></span> (and returned by <span class="emphasis"><em>source()</em></span>).
146 </p>
147 <p>
148 The locale variables <code class="computeroutput"><span class="identifier">a</span></code>, <code class="computeroutput"><span class="identifier">b</span></code> and <code class="computeroutput"> <span class="identifier">next</span></code>
149 remain their values during each context switch (<span class="emphasis"><em>yield(a)</em></span>).
150 This is possible due <code class="computeroutput"><span class="identifier">ctx</span></code> has
151 its own stack and the stack is exchanged by each context switch.
152 </p>
153 <h4>
154 <a name="context.ecv2_class.h1"></a>
155 <span><a name="context.ecv2_class.inverting_the_control_flow"></a></span><a class="link" href="ecv2_class.html#context.ecv2_class.inverting_the_control_flow">inverting
156 the control flow</a>
157 </h4>
158 <pre class="programlisting"><span class="comment">/*
159 * grammar:
160 * P ---&gt; E '\0'
161 * E ---&gt; T {('+'|'-') T}
162 * T ---&gt; S {('*'|'/') S}
163 * S ---&gt; digit | '(' E ')'
164 */</span>
165 <span class="keyword">class</span> <span class="identifier">Parser</span><span class="special">{</span>
166 <span class="comment">// implementation omitted; see examples directory</span>
167 <span class="special">};</span>
168
169 <span class="identifier">std</span><span class="special">::</span><span class="identifier">istringstream</span> <span class="identifier">is</span><span class="special">(</span><span class="string">"1+1"</span><span class="special">);</span>
170 <span class="keyword">bool</span> <span class="identifier">done</span><span class="special">=</span><span class="keyword">false</span><span class="special">;</span>
171 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">except</span><span class="special">;</span>
172
173 <span class="comment">// execute parser in new execution context</span>
174 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">source</span><span class="special">(</span>
175 <span class="special">[&amp;</span><span class="identifier">is</span><span class="special">,&amp;</span><span class="identifier">done</span><span class="special">,&amp;</span><span class="identifier">except</span><span class="special">](</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">sink</span><span class="special">,</span><span class="keyword">void</span><span class="special">*){</span>
176 <span class="comment">// create parser with callback function</span>
177 <span class="identifier">Parser</span> <span class="identifier">p</span><span class="special">(</span> <span class="identifier">is</span><span class="special">,</span>
178 <span class="special">[&amp;</span><span class="identifier">sink</span><span class="special">](</span><span class="keyword">char</span> <span class="identifier">ch</span><span class="special">){</span>
179 <span class="comment">// resume main execution context</span>
180 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">sink</span><span class="special">(&amp;</span><span class="identifier">ch</span><span class="special">);</span>
181 <span class="identifier">sink</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">));</span>
182 <span class="special">});</span>
183 <span class="keyword">try</span> <span class="special">{</span>
184 <span class="comment">// start recursive parsing</span>
185 <span class="identifier">p</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span>
186 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
187 <span class="comment">// store other exceptions in exception-pointer</span>
188 <span class="identifier">except</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
189 <span class="special">}</span>
190 <span class="comment">// set termination flag</span>
191 <span class="identifier">done</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
192 <span class="comment">// resume main execution context</span>
193 <span class="keyword">return</span> <span class="identifier">sink</span><span class="special">;</span>
194 <span class="special">});</span>
195
196 <span class="comment">// user-code pulls parsed data from parser</span>
197 <span class="comment">// invert control flow</span>
198 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">();</span>
199 <span class="identifier">source</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">));</span>
200 <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">);</span>
201 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
202 <span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span><span class="identifier">except</span><span class="special">);</span>
203 <span class="special">}</span>
204 <span class="keyword">while</span><span class="special">(</span> <span class="special">!</span> <span class="identifier">done</span><span class="special">)</span> <span class="special">{</span>
205 <span class="identifier">printf</span><span class="special">(</span><span class="string">"Parsed: %c\n"</span><span class="special">,*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">*&gt;(</span><span class="identifier">vp</span><span class="special">));</span>
206 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">source</span><span class="special">,</span><span class="identifier">vp</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">();</span>
207 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
208 <span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span><span class="identifier">except</span><span class="special">);</span>
209 <span class="special">}</span>
210 <span class="special">}</span>
211
212 <span class="identifier">output</span><span class="special">:</span>
213 <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
214 <span class="identifier">Parsed</span><span class="special">:</span> <span class="special">+</span>
215 <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
216 </pre>
217 <p>
218 In this example a recursive descent parser uses a callback to emit a newly
219 passed symbol. Using <span class="emphasis"><em>execution_context</em></span> the control flow
220 can be inverted, e.g. the user-code pulls parsed symbols from the parser -
221 instead to get pushed from the parser (via callback).
222 </p>
223 <p>
224 The data (character) is transferred between the two <span class="emphasis"><em>execution_context</em></span>.
225 </p>
226 <p>
227 If the code executed by <span class="emphasis"><em>execution_context</em></span> emits an exception,
228 the application is terminated. <span class="emphasis"><em>std::exception_ptr</em></span> can
229 be used to transfer exceptions between different execution contexts.
230 </p>
231 <p>
232 Sometimes it is necessary to unwind the stack of an unfinished context to destroy
233 local stack variables so they can release allocated resources (RAII pattern).
234 The user is responsible for this task.
235 </p>
236 <a name="ecv2_prealloc"></a><h4>
237 <a name="context.ecv2_class.h2"></a>
238 <span><a name="context.ecv2_class.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="ecv2_class.html#context.ecv2_class.allocating_control_structures_on_top_of_stack">allocating
239 control structures on top of stack</a>
240 </h4>
241 <p>
242 Allocating control structures on top of the stack requires to allocated the
243 <span class="emphasis"><em>stack_context</em></span> and create the control structure with placement
244 new before <span class="emphasis"><em>execution_context</em></span> is created.
245 </p>
246 <div class="note"><table border="0" summary="Note">
247 <tr>
248 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
249 <th align="left">Note</th>
250 </tr>
251 <tr><td align="left" valign="top"><p>
252 The user is responsible for destructing the control structure at the top
253 of the stack.
254 </p></td></tr>
255 </table></div>
256 <pre class="programlisting"><span class="comment">// stack-allocator used for (de-)allocating stack</span>
257 <span class="identifier">fixedsize_stack</span> <span class="identifier">salloc</span><span class="special">(</span> <span class="number">4048</span><span class="special">);</span>
258 <span class="comment">// allocate stack space</span>
259 <span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">(</span> <span class="identifier">salloc</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span> <span class="special">);</span>
260 <span class="comment">// reserve space for control structure on top of the stack</span>
261 <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">char</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span><span class="special">)</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
262 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
263 <span class="comment">// placement new creates control structure on reserved space</span>
264 <span class="identifier">my_control_structure</span> <span class="special">*</span> <span class="identifier">cs</span> <span class="special">=</span> <span class="keyword">new</span> <span class="special">(</span> <span class="identifier">sp</span><span class="special">)</span> <span class="identifier">my_control_structure</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">salloc</span><span class="special">);</span>
265 <span class="special">...</span>
266 <span class="comment">// destructing the control structure</span>
267 <span class="identifier">cs</span><span class="special">-&gt;~</span><span class="identifier">my_control_structure</span><span class="special">();</span>
268 <span class="special">...</span>
269 <span class="keyword">struct</span> <span class="identifier">my_control_structure</span> <span class="special">{</span>
270 <span class="comment">// captured context</span>
271 <span class="identifier">execution_context</span> <span class="identifier">cctx</span><span class="special">;</span>
272
273 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">&gt;</span>
274 <span class="identifier">my_control_structure</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">StackAllocator</span> <span class="identifier">salloc</span><span class="special">)</span> <span class="special">:</span>
275 <span class="comment">// create captured context</span>
276 <span class="identifier">cctx</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg</span><span class="special">,</span> <span class="identifier">preallocated</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">),</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">entry_func</span><span class="special">)</span> <span class="special">{</span>
277 <span class="special">}</span>
278 <span class="special">...</span>
279 <span class="special">};</span>
280 </pre>
281 <h4>
282 <a name="context.ecv2_class.h3"></a>
283 <span><a name="context.ecv2_class.exception_handling"></a></span><a class="link" href="ecv2_class.html#context.ecv2_class.exception_handling">exception
284 handling</a>
285 </h4>
286 <p>
287 If the function executed inside a <span class="emphasis"><em>execution_context</em></span> emits
288 ans exception, the application is terminated by calling <span class="emphasis"><em>std::terminate()</em></span>.
289 <span class="emphasis"><em>std::exception_ptr</em></span> can be used to transfer exceptions
290 between different execution contexts.
291 </p>
292 <h4>
293 <a name="context.ecv2_class.h4"></a>
294 <span><a name="context.ecv2_class.parameter_passing"></a></span><a class="link" href="ecv2_class.html#context.ecv2_class.parameter_passing">parameter
295 passing</a>
296 </h4>
297 <p>
298 The void pointer argument passed to <span class="emphasis"><em>execution_context::operator()</em></span>,
299 in one context, is passed as the last argument of the <span class="emphasis"><em>context-function</em></span>
300 if the context is started for the first time. In all following invocations
301 of <span class="emphasis"><em>execution_context::operator()</em></span> the void pointer passed
302 to <span class="emphasis"><em>execution_context::operator()</em></span>, in one context, is returned
303 by <span class="emphasis"><em>execution_context::operator()</em></span> in the other context.
304 </p>
305 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span>
306 <span class="keyword">private</span><span class="special">:</span>
307 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span>
308 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">ctx_</span><span class="special">;</span>
309
310 <span class="keyword">public</span><span class="special">:</span>
311 <span class="identifier">X</span><span class="special">()</span> <span class="special">:</span>
312 <span class="identifier">excptr_</span><span class="special">(),</span>
313 <span class="identifier">ctx_</span><span class="special">([=](</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="keyword">void</span><span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span><span class="keyword">mutable</span><span class="special">{</span>
314 <span class="keyword">try</span> <span class="special">{</span>
315 <span class="keyword">for</span> <span class="special">(;;)</span> <span class="special">{</span>
316 <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">*&gt;(</span><span class="identifier">vp</span><span class="special">);</span>
317 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">i</span><span class="special">);</span>
318 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(&amp;</span> <span class="identifier">str</span><span class="special">);</span>
319 <span class="identifier">ctx</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
320 <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">);</span>
321 <span class="special">}</span>
322 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">forced_unwind</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">{</span>
323 <span class="keyword">throw</span><span class="special">;</span>
324 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
325 <span class="identifier">excptr_</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
326 <span class="special">}</span>
327 <span class="keyword">return</span> <span class="identifier">ctx</span><span class="special">;</span>
328 <span class="special">})</span>
329 <span class="special">{}</span>
330
331 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
332 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx_</span><span class="special">(&amp;</span><span class="identifier">i</span><span class="special">);</span>
333 <span class="identifier">ctx_</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">));</span>
334 <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">ret</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span><span class="identifier">result</span><span class="special">);</span>
335 <span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span>
336 <span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">);</span>
337 <span class="special">}</span>
338 <span class="keyword">return</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">*&gt;(</span><span class="identifier">ret</span><span class="special">);</span>
339 <span class="special">}</span>
340 <span class="special">};</span>
341
342 <span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
343 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
344
345 <span class="identifier">output</span><span class="special">:</span>
346 <span class="number">7</span>
347 </pre>
348 <h4>
349 <a name="context.ecv2_class.h5"></a>
350 <span><a name="context.ecv2_class.class__code__phrase_role__identifier__execution_context__phrase___code_"></a></span><a class="link" href="ecv2_class.html#context.ecv2_class.class__code__phrase_role__identifier__execution_context__phrase___code_">Class
351 <code class="computeroutput"><span class="identifier">execution_context</span></code></a>
352 </h4>
353 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">execution_context</span> <span class="special">{</span>
354 <span class="keyword">public</span><span class="special">:</span>
355 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
356 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
357
358 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
359 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
360
361 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
362 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
363
364
365 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
366 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">segemented_stack</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
367
368 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
369 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">segmented</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">)=</span> <span class="keyword">delete</span><span class="special">;</span>
370 <span class="special">~</span><span class="identifier">execution_context</span><span class="special">();</span>
371
372 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
373 <span class="identifier">execution_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
374
375 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
376 <span class="identifier">execution_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
377
378 <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
379 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
380
381 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
382
383 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
384 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
385
386 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
387 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
388
389 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
390
391 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
392
393 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
394
395 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
396
397 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
398
399 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
400
401 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
402 <span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
403 <span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
404 <span class="special">};</span>
405 </pre>
406 <p>
407 </p>
408 <h5>
409 <a name="ecv2_constructor_bridgehead"></a>
410 <span><a name="ecv2_constructor"></a></span>
411 <a class="link" href="ecv2_class.html#ecv2_constructor">Constructor</a>
412 </h5>
413 <p>
414 </p>
415 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
416 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
417
418 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
419 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
420
421 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
422 <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
423 </pre>
424 <div class="variablelist">
425 <p class="title"><b></b></p>
426 <dl>
427 <dt><span class="term">Effects:</span></dt>
428 <dd><p>
429 Creates a new execution context and prepares the context to execute
430 <code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code>
431 is used as default stack allocator (stack size == fixedsize_stack::traits::default_size()).
432 The constructor with argument type <code class="computeroutput"><span class="identifier">preallocated</span></code>,
433 is used to create a user defined data <a class="link" href="../">(for
434 instance additional control structures)</a> on top of the stack.
435 </p></dd>
436 </dl>
437 </div>
438 <p>
439 </p>
440 <h5>
441 <a name="ecv2_move%20constructor_bridgehead"></a>
442 <span><a name="ecv2_move%20constructor"></a></span>
443 <a class="link" href="ecv2_class.html#ecv2_move%20constructor">Move
444 constructor</a>
445 </h5>
446 <p>
447 </p>
448 <pre class="programlisting"><span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
449 </pre>
450 <div class="variablelist">
451 <p class="title"><b></b></p>
452 <dl>
453 <dt><span class="term">Effects:</span></dt>
454 <dd><p>
455 Moves underlying capture record to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
456 </p></dd>
457 <dt><span class="term">Throws:</span></dt>
458 <dd><p>
459 Nothing.
460 </p></dd>
461 </dl>
462 </div>
463 <p>
464 </p>
465 <h5>
466 <a name="ecv2_move%20assignment_bridgehead"></a>
467 <span><a name="ecv2_move%20assignment"></a></span>
468 <a class="link" href="ecv2_class.html#ecv2_move%20assignment">Move
469 assignment operator</a>
470 </h5>
471 <p>
472 </p>
473 <pre class="programlisting"><span class="identifier">execution_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
474 </pre>
475 <div class="variablelist">
476 <p class="title"><b></b></p>
477 <dl>
478 <dt><span class="term">Effects:</span></dt>
479 <dd><p>
480 Moves the state of <code class="computeroutput"><span class="identifier">other</span></code>
481 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
482 using move semantics.
483 </p></dd>
484 <dt><span class="term">Throws:</span></dt>
485 <dd><p>
486 Nothing.
487 </p></dd>
488 </dl>
489 </div>
490 <p>
491 </p>
492 <h5>
493 <a name="ecv2_operator_bool_bridgehead"></a>
494 <span><a name="ecv2_operator_bool"></a></span>
495 <a class="link" href="ecv2_class.html#ecv2_operator_bool">Member function
496 <code class="computeroutput">operator bool</code>()</a>
497 </h5>
498 <p>
499 </p>
500 <pre class="programlisting"><span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
501 </pre>
502 <div class="variablelist">
503 <p class="title"><b></b></p>
504 <dl>
505 <dt><span class="term">Returns:</span></dt>
506 <dd><p>
507 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> points to a capture record.
508 </p></dd>
509 <dt><span class="term">Throws:</span></dt>
510 <dd><p>
511 Nothing.
512 </p></dd>
513 </dl>
514 </div>
515 <p>
516 </p>
517 <h5>
518 <a name="ecv2_operator_not_bridgehead"></a>
519 <span><a name="ecv2_operator_not"></a></span>
520 <a class="link" href="ecv2_class.html#ecv2_operator_not">Member function
521 <code class="computeroutput">operator!</code>()</a>
522 </h5>
523 <p>
524 </p>
525 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
526 </pre>
527 <div class="variablelist">
528 <p class="title"><b></b></p>
529 <dl>
530 <dt><span class="term">Returns:</span></dt>
531 <dd><p>
532 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not point to a capture record.
533 </p></dd>
534 <dt><span class="term">Throws:</span></dt>
535 <dd><p>
536 Nothing.
537 </p></dd>
538 </dl>
539 </div>
540 <p>
541 </p>
542 <h5>
543 <a name="ecv2_operator_call_bridgehead"></a>
544 <span><a name="ecv2_operator_call"></a></span>
545 <a class="link" href="ecv2_class.html#ecv2_operator_call">Member function
546 <code class="computeroutput">operator()</code>()</a>
547 </h5>
548 <p>
549 </p>
550 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
551 </pre>
552 <div class="variablelist">
553 <p class="title"><b></b></p>
554 <dl>
555 <dt><span class="term">Effects:</span></dt>
556 <dd><p>
557 Stores internally the current context data (stack pointer, instruction
558 pointer, and CPU registers) of the current active context and restores
559 the context data from <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, which implies jumping to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>'s
560 context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
561 is passed to the current context to be returned by the most recent call
562 to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> in the same thread. <code class="computeroutput"><span class="identifier">fn</span></code>
563 is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code>
564 on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>.
565 </p></dd>
566 <dt><span class="term">Note:</span></dt>
567 <dd><p>
568 The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (e.g. resuming an already running
569 context). If the top-level context function returns, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span><span class="special">()</span></code> is called.
570 </p></dd>
571 <dt><span class="term">Returns:</span></dt>
572 <dd><p>
573 The tuple of void pointer argument passed to the most recent call to
574 <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>,
575 if any and a execution_context representing the context that has been
576 suspended .
577 </p></dd>
578 </dl>
579 </div>
580 <p>
581 </p>
582 <h5>
583 <a name="ecv2_operator_call_ontop_bridgehead"></a>
584 <span><a name="ecv2_operator_call_ontop"></a></span>
585 <a class="link" href="ecv2_class.html#ecv2_operator_call_ontop">Member
586 function <code class="computeroutput">operator()</code>()</a>
587 </h5>
588 <p>
589 </p>
590 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
591 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
592
593 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
594 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
595 </pre>
596 <div class="variablelist">
597 <p class="title"><b></b></p>
598 <dl>
599 <dt><span class="term">Effects:</span></dt>
600 <dd><p>
601 Same as <span class="emphasis"><em>execution_context::operator()</em></span>. Additionally,
602 function <code class="computeroutput"><span class="identifier">fn</span></code> is executed
603 with arguments <code class="computeroutput"><span class="identifier">args</span></code> in
604 the context of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
605 (e.g. the stack frame of <code class="computeroutput"><span class="identifier">fn</span></code>
606 is allocated on stack of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>).
607 </p></dd>
608 <dt><span class="term">Returns:</span></dt>
609 <dd><p>
610 The tuple of void pointer argument passed to the most recent call to
611 <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>,
612 if any and a execution_context representing the context that has been
613 suspended .
614 </p></dd>
615 </dl>
616 </div>
617 <p>
618 </p>
619 <h5>
620 <a name="ecv2_operator_equal_bridgehead"></a>
621 <span><a name="ecv2_operator_equal"></a></span>
622 <a class="link" href="ecv2_class.html#ecv2_operator_equal">Member
623 function <code class="computeroutput">operator==</code>()</a>
624 </h5>
625 <p>
626 </p>
627 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
628 </pre>
629 <div class="variablelist">
630 <p class="title"><b></b></p>
631 <dl>
632 <dt><span class="term">Returns:</span></dt>
633 <dd><p>
634 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">other</span></code>
635 represent the same execution context, <code class="computeroutput"><span class="keyword">false</span></code>
636 otherwise.
637 </p></dd>
638 <dt><span class="term">Throws:</span></dt>
639 <dd><p>
640 Nothing.
641 </p></dd>
642 </dl>
643 </div>
644 <p>
645 </p>
646 <h5>
647 <a name="ecv2_operator_notequal_bridgehead"></a>
648 <span><a name="ecv2_operator_notequal"></a></span>
649 <a class="link" href="ecv2_class.html#ecv2_operator_notequal">Member
650 function <code class="computeroutput">operator!=</code>()</a>
651 </h5>
652 <p>
653 </p>
654 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
655 </pre>
656 <div class="variablelist">
657 <p class="title"><b></b></p>
658 <dl>
659 <dt><span class="term">Returns:</span></dt>
660 <dd><p>
661 <code class="computeroutput">! (other == * this)</code>
662 </p></dd>
663 <dt><span class="term">Throws:</span></dt>
664 <dd><p>
665 Nothing.
666 </p></dd>
667 </dl>
668 </div>
669 <p>
670 </p>
671 <h5>
672 <a name="ecv2_operator_less_bridgehead"></a>
673 <span><a name="ecv2_operator_less"></a></span>
674 <a class="link" href="ecv2_class.html#ecv2_operator_less">Member function
675 <code class="computeroutput">operator&lt;</code>()</a>
676 </h5>
677 <p>
678 </p>
679 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
680 </pre>
681 <div class="variablelist">
682 <p class="title"><b></b></p>
683 <dl>
684 <dt><span class="term">Returns:</span></dt>
685 <dd><p>
686 <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="identifier">other</span></code> is true and the implementation-defined
687 total order of <code class="computeroutput"><span class="identifier">execution_context</span></code>
688 values places <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
689 before <code class="computeroutput"><span class="identifier">other</span></code>, false otherwise.
690 </p></dd>
691 <dt><span class="term">Throws:</span></dt>
692 <dd><p>
693 Nothing.
694 </p></dd>
695 </dl>
696 </div>
697 <p>
698 </p>
699 <h5>
700 <a name="ecv2_operator_greater_bridgehead"></a>
701 <span><a name="ecv2_operator_greater"></a></span>
702 <a class="link" href="ecv2_class.html#ecv2_operator_greater">Member
703 function <code class="computeroutput">operator&gt;</code>()</a>
704 </h5>
705 <p>
706 </p>
707 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
708 </pre>
709 <div class="variablelist">
710 <p class="title"><b></b></p>
711 <dl>
712 <dt><span class="term">Returns:</span></dt>
713 <dd><p>
714 <code class="computeroutput"><span class="identifier">other</span> <span class="special">&lt;</span>
715 <span class="special">*</span> <span class="keyword">this</span></code>
716 </p></dd>
717 <dt><span class="term">Throws:</span></dt>
718 <dd><p>
719 Nothing.
720 </p></dd>
721 </dl>
722 </div>
723 <p>
724 </p>
725 <h5>
726 <a name="ecv2_operator_lesseq_bridgehead"></a>
727 <span><a name="ecv2_operator_lesseq"></a></span>
728 <a class="link" href="ecv2_class.html#ecv2_operator_lesseq">Member
729 function <code class="computeroutput">operator&lt;=</code>()</a>
730 </h5>
731 <p>
732 </p>
733 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
734 </pre>
735 <div class="variablelist">
736 <p class="title"><b></b></p>
737 <dl>
738 <dt><span class="term">Returns:</span></dt>
739 <dd><p>
740 <code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special">&lt;</span>
741 <span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code>
742 </p></dd>
743 <dt><span class="term">Throws:</span></dt>
744 <dd><p>
745 Nothing.
746 </p></dd>
747 </dl>
748 </div>
749 <p>
750 </p>
751 <h5>
752 <a name="ecv2_operator_greatereq_bridgehead"></a>
753 <span><a name="ecv2_operator_greatereq"></a></span>
754 <a class="link" href="ecv2_class.html#ecv2_operator_greatereq">Member
755 function <code class="computeroutput">operator&gt;=</code>()</a>
756 </h5>
757 <p>
758 </p>
759 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
760 </pre>
761 <div class="variablelist">
762 <p class="title"><b></b></p>
763 <dl>
764 <dt><span class="term">Returns:</span></dt>
765 <dd><p>
766 <code class="computeroutput"><span class="special">!</span> <span class="special">(*</span>
767 <span class="keyword">this</span> <span class="special">&lt;</span>
768 <span class="identifier">other</span><span class="special">)</span></code>
769 </p></dd>
770 <dt><span class="term">Throws:</span></dt>
771 <dd><p>
772 Nothing.
773 </p></dd>
774 </dl>
775 </div>
776 <p>
777 </p>
778 <h5>
779 <a name="ecv2_bridgehead"></a>
780 <span><a name="ecv2"></a></span>
781 <a class="link" href="ecv2_class.html#ecv2">Non-member function <code class="computeroutput">operator&lt;&lt;()</code></a>
782 </h5>
783 <p>
784 </p>
785 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
786 <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
787 <span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
788 </pre>
789 <div class="variablelist">
790 <p class="title"><b></b></p>
791 <dl>
792 <dt><span class="term">Efects:</span></dt>
793 <dd><p>
794 Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code>
795 to stream <code class="computeroutput"><span class="identifier">os</span></code>.
796 </p></dd>
797 <dt><span class="term">Returns:</span></dt>
798 <dd><p>
799 <code class="computeroutput"><span class="identifier">os</span></code>
800 </p></dd>
801 </dl>
802 </div>
803 </div>
804 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
805 <td align="left"></td>
806 <td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
807 Distributed under the Boost Software License, Version 1.0. (See accompanying
808 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
809 </p>
810 </div></td>
811 </tr></table>
812 <hr>
813 <div class="spirit-nav">
814 <a accesskey="p" href="ecv1_class.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
815 </div>
816 </body>
817 </html>