Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / context / doc / html / context / ecv1.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Class execution_context (version 1)</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="ecv2.html" title="Class execution_context (version 2)">
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="ecv2.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.ecv1"></a><a name="ecv1"></a><a class="link" href="ecv1.html" title="Class execution_context (version 1)">Class execution_context
28     (version 1)</a>
29 </h2></div></div></div>
30 <div class="warning"><table border="0" summary="Warning">
31 <tr>
32 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../doc/src/images/warning.png"></td>
33 <th align="left">Warning</th>
34 </tr>
35 <tr><td align="left" valign="top"><p>
36         <span class="emphasis"><em>execution_context</em></span> (v1) is deprecated (does not prevent
37         UB).
38       </p></td></tr>
39 </table></div>
40 <div class="note"><table border="0" summary="Note">
41 <tr>
42 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
43 <th align="left">Note</th>
44 </tr>
45 <tr><td align="left" valign="top"><p>
46         <span class="emphasis"><em>execution_context</em></span> (v1) is the reference implementation
47         of C++ proposal <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0099r0.pdf" target="_top">P099R0:
48         A low-level API for stackful context switching</a>.
49       </p></td></tr>
50 </table></div>
51 <div class="note"><table border="0" summary="Note">
52 <tr>
53 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
54 <th align="left">Note</th>
55 </tr>
56 <tr><td align="left" valign="top"><p>
57         <span class="emphasis"><em>execution_context</em></span> (v1) resides in sub-namespace <code class="computeroutput"><span class="identifier">v1</span></code>.
58       </p></td></tr>
59 </table></div>
60 <div class="note"><table border="0" summary="Note">
61 <tr>
62 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
63 <th align="left">Note</th>
64 </tr>
65 <tr><td align="left" valign="top"><p>
66         Segmented stacks (<span class="emphasis"><em>segmented-stacks=on</em></span>), e.g. on demand
67         growing stacks, can be used with <span class="emphasis"><em>execution_context</em></span> (v1).
68       </p></td></tr>
69 </table></div>
70 <p>
71       Class <span class="emphasis"><em>execution_context</em></span> encapsulates context switching
72       and manages the associated context' stack (allocation/deallocation).
73     </p>
74 <p>
75       <span class="emphasis"><em>execution_context</em></span> allocates the context stack (using its
76       <a class="link" href="stack.html#stack"><span class="emphasis"><em>StackAllocator</em></span></a> argument)
77       and creates a control structure on top of it. This structure is responsible
78       for managing context' stack. Instances of <span class="emphasis"><em>execution_context</em></span>,
79       associated with a specific context, share the ownership of the control structure.
80       If the last reference goes out of scope, the control structure is destroyed
81       and the stack gets deallocated via the <span class="emphasis"><em>StackAllocator</em></span>.
82     </p>
83 <p>
84       <span class="emphasis"><em>execution_context</em></span> is copy-constructible, move-constructible,
85       copy-assignable and move-assignable.
86     </p>
87 <p>
88       <span class="emphasis"><em>execution_context</em></span> maintains a static (thread-local) pointer,
89       accessed by <span class="emphasis"><em>execution_context::current()</em></span>, pointing to
90       the active context. On each context switch the pointer is updated. The usage
91       of this global pointer makes the context switch a little bit slower (due access
92       of thread local storage) but has some advantages. It allows to access the control
93       structure of the current active context from arbitrary code paths required
94       in order to support segmented stacks, which require to call certain maintenance
95       functions (like __splitstack_getcontext() etc.) before each context switch
96       (each context switch exchanges the stack).
97     </p>
98 <p>
99       <span class="emphasis"><em>execution_context</em></span> expects a function/functor with signature
100       <code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span></code> (<code class="computeroutput"><span class="identifier">vp</span></code>
101       is the data passed at the first invocation of <a class="link" href="ecv1.html#ecv1_operator_call"> <code class="computeroutput">ecv1::operator()()</code></a>).
102     </p>
103 <h4>
104 <a name="context.ecv1.h0"></a>
105       <span><a name="context.ecv1.usage_of__emphasis_execution_context__emphasis_"></a></span><a class="link" href="ecv1.html#context.ecv1.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">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">sink</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">());</span>
110 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">source</span><span class="special">(</span>
111     <span class="special">[</span><span class="identifier">n</span><span class="special">,&amp;</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>
112         <span class="keyword">int</span> <span class="identifier">a</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
113         <span class="keyword">int</span> <span class="identifier">b</span><span class="special">=</span><span class="number">1</span><span class="special">;</span>
114         <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>
115             <span class="identifier">sink</span><span class="special">(&amp;</span><span class="identifier">a</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="special">});</span>
121 <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>
122     <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">source</span><span class="special">()&lt;&lt;</span><span class="string">" "</span><span class="special">;</span>
123 <span class="special">}</span>
124
125 <span class="identifier">output</span><span class="special">:</span>
126     <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>
127 </pre>
128 <p>
129       This simple example demonstrates the basic usage of <span class="emphasis"><em>execution_context</em></span>.
130       The context <code class="computeroutput"><span class="identifier">sink</span></code>, returned
131       by <span class="emphasis"><em>execution_context::current()</em></span>, represents the <span class="emphasis"><em>main</em></span>-context
132       (function <span class="emphasis"><em>main()</em></span> running) and is one of the captured parameters
133       in the lambda expression. The lambda that calculates the Fibonacci numbers
134       is executed inside the context represented by <code class="computeroutput"><span class="identifier">source</span></code>.
135       Calculated Fibonacci numbers are transferred between the two context' via expression
136       <span class="emphasis"><em>sink(&amp;a)</em></span> (and returned by <span class="emphasis"><em>source()</em></span>).
137     </p>
138 <p>
139       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>
140       remain their values during each context switch (<span class="emphasis"><em>yield(a)</em></span>).
141       This is possible because <code class="computeroutput"><span class="identifier">ctx</span></code>
142       owns a stack (exchanged by context switch).
143     </p>
144 <h4>
145 <a name="context.ecv1.h1"></a>
146       <span><a name="context.ecv1.inverting_the_control_flow"></a></span><a class="link" href="ecv1.html#context.ecv1.inverting_the_control_flow">inverting
147       the control flow</a>
148     </h4>
149 <pre class="programlisting"><span class="comment">/*
150  * grammar:
151  *   P ---&gt; E '\0'
152  *   E ---&gt; T {('+'|'-') T}
153  *   T ---&gt; S {('*'|'/') S}
154  *   S ---&gt; digit | '(' E ')'
155  */</span>
156 <span class="keyword">class</span> <span class="identifier">Parser</span><span class="special">{</span>
157     <span class="comment">// implementation omitted; see examples directory</span>
158 <span class="special">};</span>
159
160 <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>
161 <span class="keyword">bool</span> <span class="identifier">done</span><span class="special">=</span><span class="keyword">false</span><span class="special">;</span>
162 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">except</span><span class="special">;</span>
163
164 <span class="comment">// create handle to main execution context</span>
165 <span class="keyword">auto</span> <span class="identifier">main_ctx</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">());</span>
166 <span class="comment">// execute parser in new execution context</span>
167 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">source</span><span class="special">(</span>
168         <span class="special">[&amp;</span><span class="identifier">sink</span><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="keyword">void</span><span class="special">*){</span>
169         <span class="comment">// create parser with callback function</span>
170         <span class="identifier">Parser</span> <span class="identifier">p</span><span class="special">(</span><span class="identifier">is</span><span class="special">,</span>
171                  <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>
172                         <span class="comment">// resume main execution context</span>
173                         <span class="identifier">sink</span><span class="special">(&amp;</span><span class="identifier">ch</span><span class="special">);</span>
174                 <span class="special">});</span>
175             <span class="keyword">try</span> <span class="special">{</span>
176                 <span class="comment">// start recursive parsing</span>
177                 <span class="identifier">p</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span>
178             <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
179                 <span class="comment">// store other exceptions in exception-pointer</span>
180                 <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>
181             <span class="special">}</span>
182             <span class="comment">// set termination flag</span>
183             <span class="identifier">done</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
184             <span class="comment">// resume main execution context</span>
185             <span class="identifier">sink</span><span class="special">();</span>
186         <span class="special">});</span>
187
188 <span class="comment">// user-code pulls parsed data from parser</span>
189 <span class="comment">// invert control flow</span>
190 <span class="keyword">void</span><span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">();</span>
191 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
192     <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>
193 <span class="special">}</span>
194 <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>
195     <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>
196     <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">();</span>
197     <span class="keyword">if</span> <span class="special">(</span><span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
198         <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>
199     <span class="special">}</span>
200 <span class="special">}</span>
201
202 <span class="identifier">output</span><span class="special">:</span>
203     <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
204     <span class="identifier">Parsed</span><span class="special">:</span> <span class="special">+</span>
205     <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
206 </pre>
207 <p>
208       In this example a recursive descent parser uses a callback to emit a newly
209       passed symbol. Using <span class="emphasis"><em>execution_context</em></span> the control flow
210       can be inverted, e.g. the user-code pulls parsed symbols from the parser -
211       instead to get pushed from the parser (via callback).
212     </p>
213 <p>
214       The data (character) is transferred between the two <span class="emphasis"><em>execution_context</em></span>.
215     </p>
216 <p>
217       If the code executed by <span class="emphasis"><em>execution_context</em></span> emits an exception,
218       the application is terminated. <span class="emphasis"><em>std::exception_ptr</em></span> can
219       be used to transfer exceptions between different execution contexts.
220     </p>
221 <h4>
222 <a name="context.ecv1.h2"></a>
223       <span><a name="context.ecv1.stack_unwinding"></a></span><a class="link" href="ecv1.html#context.ecv1.stack_unwinding">stack
224       unwinding</a>
225     </h4>
226 <p>
227       Sometimes it is necessary to unwind the stack of an unfinished context to destroy
228       local stack variables so they can release allocated resources (RAII pattern).
229       The user is responsible for this task.
230     </p>
231 <a name="ecv1_prealloc"></a><h4>
232 <a name="context.ecv1.h3"></a>
233       <span><a name="context.ecv1.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="ecv1.html#context.ecv1.allocating_control_structures_on_top_of_stack">allocating
234       control structures on top of stack</a>
235     </h4>
236 <p>
237       Allocating control structures on top of the stack requires to allocated the
238       <span class="emphasis"><em>stack_context</em></span> and create the control structure with placement
239       new before <span class="emphasis"><em>execution_context</em></span> is created.
240     </p>
241 <div class="note"><table border="0" summary="Note">
242 <tr>
243 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
244 <th align="left">Note</th>
245 </tr>
246 <tr><td align="left" valign="top"><p>
247         The user is responsible for destructing the control structure at the top
248         of the stack.
249       </p></td></tr>
250 </table></div>
251 <pre class="programlisting"><span class="comment">// stack-allocator used for (de-)allocating stack</span>
252 <span class="identifier">fixedsize_stack</span> <span class="identifier">salloc</span><span class="special">(</span> <span class="number">4048</span><span class="special">);</span>
253 <span class="comment">// allocate stack space</span>
254 <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>
255 <span class="comment">// reserve space for control structure on top of the stack</span>
256 <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>
257 <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>
258 <span class="comment">// placement new creates control structure on reserved space</span>
259 <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>
260 <span class="special">...</span>
261 <span class="comment">// destructing the control structure</span>
262 <span class="identifier">cs</span><span class="special">-&gt;~</span><span class="identifier">my_control_structure</span><span class="special">();</span>
263 <span class="special">...</span>
264 <span class="keyword">struct</span> <span class="identifier">my_control_structure</span>  <span class="special">{</span>
265     <span class="comment">// execution context</span>
266     <span class="identifier">execution_context</span> <span class="identifier">ectx</span><span class="special">;</span>
267
268     <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>
269     <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>
270         <span class="comment">// create execution context</span>
271         <span class="identifier">ectx</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>
272     <span class="special">}</span>
273     <span class="special">...</span>
274 <span class="special">};</span>
275 </pre>
276 <h4>
277 <a name="context.ecv1.h4"></a>
278       <span><a name="context.ecv1.exception_handling"></a></span><a class="link" href="ecv1.html#context.ecv1.exception_handling">exception
279       handling</a>
280     </h4>
281 <p>
282       If the function executed inside a <span class="emphasis"><em>execution_context</em></span> emits
283       ans exception, the application is terminated by calling <span class="emphasis"><em>std::terminate()</em></span>.
284       <span class="emphasis"><em>std::exception_ptr</em></span> can be used to transfer exceptions
285       between different execution contexts.
286     </p>
287 <div class="important"><table border="0" summary="Important">
288 <tr>
289 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
290 <th align="left">Important</th>
291 </tr>
292 <tr><td align="left" valign="top"><p>
293         Do not jump from inside a catch block and then re-throw the exception in
294         another execution context.
295       </p></td></tr>
296 </table></div>
297 <h4>
298 <a name="context.ecv1.h5"></a>
299       <span><a name="context.ecv1.parameter_passing"></a></span><a class="link" href="ecv1.html#context.ecv1.parameter_passing">parameter
300       passing</a>
301     </h4>
302 <p>
303       The void pointer argument passed to <span class="emphasis"><em>execution_context::operator()</em></span>,
304       in one context, is passed as the last argument of the <span class="emphasis"><em>context-function</em></span>
305       if the context is started for the first time. In all following invocations
306       of <span class="emphasis"><em>execution_context::operator()</em></span> the void pointer passed
307       to <span class="emphasis"><em>execution_context::operator()</em></span>, in one context, is returned
308       by <span class="emphasis"><em>execution_context::operator()</em></span> in the other context.
309     </p>
310 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span>
311 <span class="keyword">private</span><span class="special">:</span>
312     <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span>
313     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">caller_</span><span class="special">;</span>
314     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">callee_</span><span class="special">;</span>
315
316 <span class="keyword">public</span><span class="special">:</span>
317     <span class="identifier">X</span><span class="special">()</span> <span class="special">:</span>
318         <span class="identifier">excptr_</span><span class="special">(),</span>
319         <span class="identifier">caller_</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span> <span class="special">),</span>
320         <span class="identifier">callee_</span><span class="special">(</span> <span class="special">[=]</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="special">{</span>
321                     <span class="keyword">try</span> <span class="special">{</span>
322                         <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">*</span> <span class="special">&gt;(</span> <span class="identifier">vp</span><span class="special">);</span>
323                         <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>
324                         <span class="identifier">caller_</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
325                     <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_cast</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">{</span>
326                         <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>
327                     <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">void</span> <span class="special">*</span> <span class="identifier">ret</span> <span class="special">=</span> <span class="identifier">callee_</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">i</span><span class="special">);</span>
333         <span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span>
334             <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>
335         <span class="special">}</span>
336         <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">*</span> <span class="special">&gt;(</span> <span class="identifier">ret</span><span class="special">);</span>
337     <span class="special">}</span>
338 <span class="special">};</span>
339
340 <span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
341 <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>
342
343 <span class="identifier">output</span><span class="special">:</span>
344     <span class="number">7</span>
345 </pre>
346 <h4>
347 <a name="context.ecv1.h6"></a>
348       <span><a name="context.ecv1.class__code__phrase_role__identifier__execution_context__phrase___code_"></a></span><a class="link" href="ecv1.html#context.ecv1.class__code__phrase_role__identifier__execution_context__phrase___code_">Class
349       <code class="computeroutput"><span class="identifier">execution_context</span></code></a>
350     </h4>
351 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">execution_context</span> <span class="special">{</span>
352 <span class="keyword">public</span><span class="special">:</span>
353     <span class="keyword">static</span> <span class="identifier">execution_context</span> <span class="identifier">current</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
354
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     <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>
365     <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>
366
367     <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>
368     <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>
369
370     <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>
371     <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>
372
373     <span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</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">nullptr</span><span class="special">);</span>
374
375     <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span> <span class="special">&gt;</span>
376     <span class="keyword">void</span> <span class="special">*</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="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
377
378     <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>
379
380     <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>
381
382     <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>
383
384     <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>
385
386     <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>
387
388     <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>
389
390     <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>
391     <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>
392     <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>
393 <span class="special">};</span>
394 </pre>
395 <p>
396       </p>
397 <h5>
398 <a name="ecv1_current_bridgehead"></a>
399   <span><a name="ecv1_current"></a></span>
400   <a class="link" href="ecv1.html#ecv1_current">Static member function <code class="computeroutput">current</code>()</a>
401 </h5>
402 <p>
403     </p>
404 <pre class="programlisting"><span class="keyword">static</span> <span class="identifier">execution_context</span> <span class="identifier">current</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
405 </pre>
406 <div class="variablelist">
407 <p class="title"><b></b></p>
408 <dl>
409 <dt><span class="term">Returns:</span></dt>
410 <dd><p>
411             Returns an instance of excution_context pointing to the active execution
412             context.
413           </p></dd>
414 <dt><span class="term">Throws:</span></dt>
415 <dd><p>
416             Nothing.
417           </p></dd>
418 </dl>
419 </div>
420 <p>
421       </p>
422 <h5>
423 <a name="ecv1_constructor_bridgehead"></a>
424   <span><a name="ecv1_constructor"></a></span>
425   <a class="link" href="ecv1.html#ecv1_constructor">Constructor</a>
426 </h5>
427 <p>
428     </p>
429 <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>
430 <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>
431
432 <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>
433 <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>
434
435 <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>
436 <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>
437 </pre>
438 <div class="variablelist">
439 <p class="title"><b></b></p>
440 <dl>
441 <dt><span class="term">Effects:</span></dt>
442 <dd><p>
443             Creates a new execution context and prepares the context to execute
444             <code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code>
445             is used as default stack allocator (stack size == fixedsize_stack::traits::default_size()).
446             The constructor with argument type <code class="computeroutput"><span class="identifier">preallocated</span></code>,
447             is used to create a user defined data <a class="link" href="ecv1.html#ecv1_prealloc">(for
448             instance additional control structures)</a> on top of the stack.
449           </p></dd>
450 </dl>
451 </div>
452 <p>
453       </p>
454 <h5>
455 <a name="ecv1_copy%20constructor_bridgehead"></a>
456   <span><a name="ecv1_copy%20constructor"></a></span>
457   <a class="link" href="ecv1.html#ecv1_copy%20constructor">Copy
458       constructor</a>
459 </h5>
460 <p>
461     </p>
462 <pre class="programlisting"><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>
463 </pre>
464 <div class="variablelist">
465 <p class="title"><b></b></p>
466 <dl>
467 <dt><span class="term">Effects:</span></dt>
468 <dd><p>
469             Copies <code class="computeroutput"><span class="identifier">other</span></code>, e.g. underlying
470             control structure is shared with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
471           </p></dd>
472 <dt><span class="term">Throws:</span></dt>
473 <dd><p>
474             Nothing.
475           </p></dd>
476 </dl>
477 </div>
478 <p>
479       </p>
480 <h5>
481 <a name="ecv1_move%20constructor_bridgehead"></a>
482   <span><a name="ecv1_move%20constructor"></a></span>
483   <a class="link" href="ecv1.html#ecv1_move%20constructor">Move
484       constructor</a>
485 </h5>
486 <p>
487     </p>
488 <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>
489 </pre>
490 <div class="variablelist">
491 <p class="title"><b></b></p>
492 <dl>
493 <dt><span class="term">Effects:</span></dt>
494 <dd><p>
495             Moves underlying control structure to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
496           </p></dd>
497 <dt><span class="term">Throws:</span></dt>
498 <dd><p>
499             Nothing.
500           </p></dd>
501 </dl>
502 </div>
503 <p>
504       </p>
505 <h5>
506 <a name="ecv1_copy%20assignment_bridgehead"></a>
507   <span><a name="ecv1_copy%20assignment"></a></span>
508   <a class="link" href="ecv1.html#ecv1_copy%20assignment">Copy
509       assignment operator</a>
510 </h5>
511 <p>
512     </p>
513 <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="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>
514 </pre>
515 <div class="variablelist">
516 <p class="title"><b></b></p>
517 <dl>
518 <dt><span class="term">Effects:</span></dt>
519 <dd><p>
520             Copies the state of <code class="computeroutput"><span class="identifier">other</span></code>
521             to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
522             control structure is shared.
523           </p></dd>
524 <dt><span class="term">Throws:</span></dt>
525 <dd><p>
526             Nothing.
527           </p></dd>
528 </dl>
529 </div>
530 <p>
531       </p>
532 <h5>
533 <a name="ecv1_move%20assignment_bridgehead"></a>
534   <span><a name="ecv1_move%20assignment"></a></span>
535   <a class="link" href="ecv1.html#ecv1_move%20assignment">Move
536       assignment operator</a>
537 </h5>
538 <p>
539     </p>
540 <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>
541 </pre>
542 <div class="variablelist">
543 <p class="title"><b></b></p>
544 <dl>
545 <dt><span class="term">Effects:</span></dt>
546 <dd><p>
547             Moves the control structure of <code class="computeroutput"><span class="identifier">other</span></code>
548             to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
549             using move semantics.
550           </p></dd>
551 <dt><span class="term">Throws:</span></dt>
552 <dd><p>
553             Nothing.
554           </p></dd>
555 </dl>
556 </div>
557 <p>
558       </p>
559 <h5>
560 <a name="ecv1_operator_bool_bridgehead"></a>
561   <span><a name="ecv1_operator_bool"></a></span>
562   <a class="link" href="ecv1.html#ecv1_operator_bool">Member function
563       <code class="computeroutput">operator bool</code>()</a>
564 </h5>
565 <p>
566     </p>
567 <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>
568 </pre>
569 <div class="variablelist">
570 <p class="title"><b></b></p>
571 <dl>
572 <dt><span class="term">Returns:</span></dt>
573 <dd><p>
574             <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 control structure.
575           </p></dd>
576 <dt><span class="term">Throws:</span></dt>
577 <dd><p>
578             Nothing.
579           </p></dd>
580 </dl>
581 </div>
582 <p>
583       </p>
584 <h5>
585 <a name="ecv1_operator_not_bridgehead"></a>
586   <span><a name="ecv1_operator_not"></a></span>
587   <a class="link" href="ecv1.html#ecv1_operator_not">Member function
588       <code class="computeroutput">operator!</code>()</a>
589 </h5>
590 <p>
591     </p>
592 <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>
593 </pre>
594 <div class="variablelist">
595 <p class="title"><b></b></p>
596 <dl>
597 <dt><span class="term">Returns:</span></dt>
598 <dd><p>
599             <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 control structure.
600           </p></dd>
601 <dt><span class="term">Throws:</span></dt>
602 <dd><p>
603             Nothing.
604           </p></dd>
605 </dl>
606 </div>
607 <p>
608       </p>
609 <h5>
610 <a name="ecv1_operator_call_bridgehead"></a>
611   <span><a name="ecv1_operator_call"></a></span>
612   <a class="link" href="ecv1.html#ecv1_operator_call">Member function
613       <code class="computeroutput">operator()</code>()</a>
614 </h5>
615 <p>
616     </p>
617 <pre class="programlisting"><span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</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">nullptr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
618 </pre>
619 <div class="variablelist">
620 <p class="title"><b></b></p>
621 <dl>
622 <dt><span class="term">Effects:</span></dt>
623 <dd><p>
624             Stores internally the current context data (stack pointer, instruction
625             pointer, and CPU registers) of the current active context and restores
626             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
627             context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
628             is passed to the current context to be returned by the most recent call
629             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>
630             is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code>
631             on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>.
632           </p></dd>
633 <dt><span class="term">Note:</span></dt>
634 <dd><p>
635             The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <span class="emphasis"><em>execution_context::current()</em></span>
636             returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
637             (e.g. resuming an already running context). If the top-level context
638             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.
639           </p></dd>
640 <dt><span class="term">Returns:</span></dt>
641 <dd><p>
642             The void pointer argument passed to the most recent call to <span class="emphasis"><em>execution_context::operator()</em></span>,
643             if any.
644           </p></dd>
645 </dl>
646 </div>
647 <p>
648       </p>
649 <h5>
650 <a name="ecv1_operator_call_ontop_bridgehead"></a>
651   <span><a name="ecv1_operator_call_ontop"></a></span>
652   <a class="link" href="ecv1.html#ecv1_operator_call_ontop">Member
653       function <code class="computeroutput">operator(exec_ontop_arg_t)</code>()</a>
654 </h5>
655 <p>
656     </p>
657 <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">&gt;</span>
658 <span class="keyword">void</span> <span class="special">*</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="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
659 </pre>
660 <div class="variablelist">
661 <p class="title"><b></b></p>
662 <dl>
663 <dt><span class="term">Effects:</span></dt>
664 <dd><p>
665             Same as <span class="emphasis"><em>execution_context::operator()</em></span>. Additionally,
666             function <code class="computeroutput"><span class="identifier">fn</span></code> is executed
667             with arguments <code class="computeroutput"><span class="identifier">vp</span></code> in
668             the context of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
669             (e.g. the stack frame of <code class="computeroutput"><span class="identifier">fn</span></code>
670             is allocated on stack of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>).
671           </p></dd>
672 <dt><span class="term">Returns:</span></dt>
673 <dd><p>
674             The void pointer argument passed to the most recent call to <span class="emphasis"><em>execution_context::operator()</em></span>,
675             if any.
676           </p></dd>
677 </dl>
678 </div>
679 <p>
680       </p>
681 <h5>
682 <a name="ecv1_operator_equal_bridgehead"></a>
683   <span><a name="ecv1_operator_equal"></a></span>
684   <a class="link" href="ecv1.html#ecv1_operator_equal">Member
685       function <code class="computeroutput">operator==</code>()</a>
686 </h5>
687 <p>
688     </p>
689 <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>
690 </pre>
691 <div class="variablelist">
692 <p class="title"><b></b></p>
693 <dl>
694 <dt><span class="term">Returns:</span></dt>
695 <dd><p>
696             <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>
697             represent the same execution context, <code class="computeroutput"><span class="keyword">false</span></code>
698             otherwise.
699           </p></dd>
700 <dt><span class="term">Throws:</span></dt>
701 <dd><p>
702             Nothing.
703           </p></dd>
704 </dl>
705 </div>
706 <p>
707       </p>
708 <h5>
709 <a name="ecv1_operator_notequal_bridgehead"></a>
710   <span><a name="ecv1_operator_notequal"></a></span>
711   <a class="link" href="ecv1.html#ecv1_operator_notequal">Member
712       function <code class="computeroutput">operator!=</code>()</a>
713 </h5>
714 <p>
715     </p>
716 <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>
717 </pre>
718 <div class="variablelist">
719 <p class="title"><b></b></p>
720 <dl>
721 <dt><span class="term">Returns:</span></dt>
722 <dd><p>
723             <code class="computeroutput">! (other == * this)</code>
724           </p></dd>
725 <dt><span class="term">Throws:</span></dt>
726 <dd><p>
727             Nothing.
728           </p></dd>
729 </dl>
730 </div>
731 <p>
732       </p>
733 <h5>
734 <a name="ecv1_operator_less_bridgehead"></a>
735   <span><a name="ecv1_operator_less"></a></span>
736   <a class="link" href="ecv1.html#ecv1_operator_less">Member function
737       <code class="computeroutput">operator&lt;</code>()</a>
738 </h5>
739 <p>
740     </p>
741 <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>
742 </pre>
743 <div class="variablelist">
744 <p class="title"><b></b></p>
745 <dl>
746 <dt><span class="term">Returns:</span></dt>
747 <dd><p>
748             <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
749             total order of <code class="computeroutput"><span class="identifier">execution_context</span></code>
750             values places <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
751             before <code class="computeroutput"><span class="identifier">other</span></code>, false otherwise.
752           </p></dd>
753 <dt><span class="term">Throws:</span></dt>
754 <dd><p>
755             Nothing.
756           </p></dd>
757 </dl>
758 </div>
759 <p>
760       </p>
761 <h5>
762 <a name="ecv1_operator_greater_bridgehead"></a>
763   <span><a name="ecv1_operator_greater"></a></span>
764   <a class="link" href="ecv1.html#ecv1_operator_greater">Member
765       function <code class="computeroutput">operator&gt;</code>()</a>
766 </h5>
767 <p>
768     </p>
769 <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>
770 </pre>
771 <div class="variablelist">
772 <p class="title"><b></b></p>
773 <dl>
774 <dt><span class="term">Returns:</span></dt>
775 <dd><p>
776             <code class="computeroutput"><span class="identifier">other</span> <span class="special">&lt;</span>
777             <span class="special">*</span> <span class="keyword">this</span></code>
778           </p></dd>
779 <dt><span class="term">Throws:</span></dt>
780 <dd><p>
781             Nothing.
782           </p></dd>
783 </dl>
784 </div>
785 <p>
786       </p>
787 <h5>
788 <a name="ecv1_operator_lesseq_bridgehead"></a>
789   <span><a name="ecv1_operator_lesseq"></a></span>
790   <a class="link" href="ecv1.html#ecv1_operator_lesseq">Member
791       function <code class="computeroutput">operator&lt;=</code>()</a>
792 </h5>
793 <p>
794     </p>
795 <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>
796 </pre>
797 <div class="variablelist">
798 <p class="title"><b></b></p>
799 <dl>
800 <dt><span class="term">Returns:</span></dt>
801 <dd><p>
802             <code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special">&lt;</span>
803             <span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code>
804           </p></dd>
805 <dt><span class="term">Throws:</span></dt>
806 <dd><p>
807             Nothing.
808           </p></dd>
809 </dl>
810 </div>
811 <p>
812       </p>
813 <h5>
814 <a name="ecv1_operator_greatereq_bridgehead"></a>
815   <span><a name="ecv1_operator_greatereq"></a></span>
816   <a class="link" href="ecv1.html#ecv1_operator_greatereq">Member
817       function <code class="computeroutput">operator&gt;=</code>()</a>
818 </h5>
819 <p>
820     </p>
821 <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>
822 </pre>
823 <div class="variablelist">
824 <p class="title"><b></b></p>
825 <dl>
826 <dt><span class="term">Returns:</span></dt>
827 <dd><p>
828             <code class="computeroutput"><span class="special">!</span> <span class="special">(*</span>
829             <span class="keyword">this</span> <span class="special">&lt;</span>
830             <span class="identifier">other</span><span class="special">)</span></code>
831           </p></dd>
832 <dt><span class="term">Throws:</span></dt>
833 <dd><p>
834             Nothing.
835           </p></dd>
836 </dl>
837 </div>
838 <p>
839       </p>
840 <h5>
841 <a name="ecv1__bridgehead"></a>
842   <span><a name="ecv1_"></a></span>
843   <a class="link" href="ecv1.html#ecv1_">Non-member function <code class="computeroutput">operator&lt;&lt;()</code></a>
844 </h5>
845 <p>
846     </p>
847 <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>
848 <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>
849 <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>
850 </pre>
851 <div class="variablelist">
852 <p class="title"><b></b></p>
853 <dl>
854 <dt><span class="term">Efects:</span></dt>
855 <dd><p>
856             Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code>
857             to stream <code class="computeroutput"><span class="identifier">os</span></code>.
858           </p></dd>
859 <dt><span class="term">Returns:</span></dt>
860 <dd><p>
861             <code class="computeroutput"><span class="identifier">os</span></code>
862           </p></dd>
863 </dl>
864 </div>
865 </div>
866 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
867 <td align="left"></td>
868 <td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
869         Distributed under the Boost Software License, Version 1.0. (See accompanying
870         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>)
871       </p>
872 </div></td>
873 </tr></table>
874 <hr>
875 <div class="spirit-nav">
876 <a accesskey="p" href="ecv2.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>
877 </div>
878 </body>
879 </html>