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