]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/context/doc/html/context/ecv1_class.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / context / doc / html / context / ecv1_class.html
CommitLineData
7c673cae
FG
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="requirements.html" title="Requirements">
10<link rel="next" href="ecv2_class.html" title="Class execution_context (version 2)">
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="requirements.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="ecv2_class.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_class"></a><a name="ecv1"></a><a class="link" href="ecv1_class.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 enabled if segmented stacks (property <span class="emphasis"><em>segmented-stacks=on</em></span>)
37 are used or <span class="emphasis"><em>BOOST_EXECUTION_CONTEXT=1</em></span> is specified at
38 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="../"> <code class="computeroutput">execution_context::operator()()</code></a>).
73 </p>
74<h4>
75<a name="context.ecv1_class.h0"></a>
76 <span><a name="context.ecv1_class.usage_of__emphasis_execution_context__emphasis_"></a></span><a class="link" href="ecv1_class.html#context.ecv1_class.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_class.h1"></a>
117 <span><a name="context.ecv1_class.inverting_the_control_flow"></a></span><a class="link" href="ecv1_class.html#context.ecv1_class.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_class.h2"></a>
199 <span><a name="context.ecv1_class.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="ecv1_class.html#context.ecv1_class.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_class.h3"></a>
244 <span><a name="context.ecv1_class.exception_handling"></a></span><a class="link" href="ecv1_class.html#context.ecv1_class.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<h4>
254<a name="context.ecv1_class.h4"></a>
255 <span><a name="context.ecv1_class.parameter_passing"></a></span><a class="link" href="ecv1_class.html#context.ecv1_class.parameter_passing">parameter
256 passing</a>
257 </h4>
258<p>
259 The void pointer argument passed to <span class="emphasis"><em>execution_context::operator()</em></span>,
260 in one context, is passed as the last argument of the <span class="emphasis"><em>context-function</em></span>
261 if the context is started for the first time. In all following invocations
262 of <span class="emphasis"><em>execution_context::operator()</em></span> the void pointer passed
263 to <span class="emphasis"><em>execution_context::operator()</em></span>, in one context, is returned
264 by <span class="emphasis"><em>execution_context::operator()</em></span> in the other context.
265 </p>
266<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span>
267<span class="keyword">private</span><span class="special">:</span>
268 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span>
269 <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>
270 <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>
271
272<span class="keyword">public</span><span class="special">:</span>
273 <span class="identifier">X</span><span class="special">()</span> <span class="special">:</span>
274 <span class="identifier">excptr_</span><span class="special">(),</span>
275 <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>
276 <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>
277 <span class="keyword">try</span> <span class="special">{</span>
278 <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>
279 <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>
280 <span class="identifier">caller_</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
281 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
282 <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>
283 <span class="special">}</span>
284 <span class="special">})</span>
285 <span class="special">{}</span>
286
287 <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>
288 <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>
289 <span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span>
290 <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>
291 <span class="special">}</span>
292 <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>
293 <span class="special">}</span>
294<span class="special">};</span>
295
296<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
297<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>
298
299<span class="identifier">output</span><span class="special">:</span>
300 <span class="number">7</span>
301</pre>
302<h4>
303<a name="context.ecv1_class.h5"></a>
304 <span><a name="context.ecv1_class.class__code__phrase_role__identifier__execution_context__phrase___code_"></a></span><a class="link" href="ecv1_class.html#context.ecv1_class.class__code__phrase_role__identifier__execution_context__phrase___code_">Class
305 <code class="computeroutput"><span class="identifier">execution_context</span></code></a>
306 </h4>
307<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">execution_context</span> <span class="special">{</span>
308<span class="keyword">public</span><span class="special">:</span>
309 <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>
310
311 <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>
312 <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>
313
314 <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>
315 <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>
316
317 <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>
318 <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>
319
320 <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>
321 <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>
322
323 <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>
324 <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>
325
326 <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>
327 <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>
328
329 <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>
330
331 <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>
332 <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="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
333
334 <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>
335 <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="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
336
337 <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>
338
339 <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>
340
341 <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>
342
343 <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>
344
345 <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>
346
347 <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>
348
349 <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>
350 <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>
351 <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>
352<span class="special">};</span>
353</pre>
354<p>
355 </p>
356<h5>
357<a name="ecv1_current_bridgehead"></a>
358 <span><a name="ecv1_current"></a></span>
359 <a class="link" href="ecv1_class.html#ecv1_current">Static member function <code class="computeroutput">current</code>()</a>
360</h5>
361<p>
362 </p>
363<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>
364</pre>
365<div class="variablelist">
366<p class="title"><b></b></p>
367<dl>
368<dt><span class="term">Returns:</span></dt>
369<dd><p>
370 Returns an instance of excution_context pointing to the active execution
371 context.
372 </p></dd>
373<dt><span class="term">Throws:</span></dt>
374<dd><p>
375 Nothing.
376 </p></dd>
377</dl>
378</div>
379<p>
380 </p>
381<h5>
382<a name="ecv1_constructor_bridgehead"></a>
383 <span><a name="ecv1_constructor"></a></span>
384 <a class="link" href="ecv1_class.html#ecv1_constructor">Constructor</a>
385</h5>
386<p>
387 </p>
388<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>
389<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>
390
391<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>
392<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>
393
394<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>
395<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>
396</pre>
397<div class="variablelist">
398<p class="title"><b></b></p>
399<dl>
400<dt><span class="term">Effects:</span></dt>
401<dd><p>
402 Creates a new execution context and prepares the context to execute
403 <code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code>
404 is used as default stack allocator (stack size == fixedsize_stack::traits::default_size()).
405 The constructor with argument type <code class="computeroutput"><span class="identifier">preallocated</span></code>,
406 is used to create a user defined data <a class="link" href="../">(for
407 instance additional control structures)</a> on top of the stack.
408 </p></dd>
409</dl>
410</div>
411<p>
412 </p>
413<h5>
414<a name="ecv1_copy%20constructor_bridgehead"></a>
415 <span><a name="ecv1_copy%20constructor"></a></span>
416 <a class="link" href="ecv1_class.html#ecv1_copy%20constructor">Copy
417 constructor</a>
418</h5>
419<p>
420 </p>
421<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>
422</pre>
423<div class="variablelist">
424<p class="title"><b></b></p>
425<dl>
426<dt><span class="term">Effects:</span></dt>
427<dd><p>
428 Copies <code class="computeroutput"><span class="identifier">other</span></code>, e.g. underlying
429 control structure is shared with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
430 </p></dd>
431<dt><span class="term">Throws:</span></dt>
432<dd><p>
433 Nothing.
434 </p></dd>
435</dl>
436</div>
437<p>
438 </p>
439<h5>
440<a name="ecv1_move%20constructor_bridgehead"></a>
441 <span><a name="ecv1_move%20constructor"></a></span>
442 <a class="link" href="ecv1_class.html#ecv1_move%20constructor">Move
443 constructor</a>
444</h5>
445<p>
446 </p>
447<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>
448</pre>
449<div class="variablelist">
450<p class="title"><b></b></p>
451<dl>
452<dt><span class="term">Effects:</span></dt>
453<dd><p>
454 Moves underlying control structure to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
455 </p></dd>
456<dt><span class="term">Throws:</span></dt>
457<dd><p>
458 Nothing.
459 </p></dd>
460</dl>
461</div>
462<p>
463 </p>
464<h5>
465<a name="ecv1_copy%20assignment_bridgehead"></a>
466 <span><a name="ecv1_copy%20assignment"></a></span>
467 <a class="link" href="ecv1_class.html#ecv1_copy%20assignment">Copy
468 assignment operator</a>
469</h5>
470<p>
471 </p>
472<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>
473</pre>
474<div class="variablelist">
475<p class="title"><b></b></p>
476<dl>
477<dt><span class="term">Effects:</span></dt>
478<dd><p>
479 Copies the state of <code class="computeroutput"><span class="identifier">other</span></code>
480 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
481 control structure is shared.
482 </p></dd>
483<dt><span class="term">Throws:</span></dt>
484<dd><p>
485 Nothing.
486 </p></dd>
487</dl>
488</div>
489<p>
490 </p>
491<h5>
492<a name="ecv1_move%20assignment_bridgehead"></a>
493 <span><a name="ecv1_move%20assignment"></a></span>
494 <a class="link" href="ecv1_class.html#ecv1_move%20assignment">Move
495 assignment operator</a>
496</h5>
497<p>
498 </p>
499<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>
500</pre>
501<div class="variablelist">
502<p class="title"><b></b></p>
503<dl>
504<dt><span class="term">Effects:</span></dt>
505<dd><p>
506 Moves the control structure of <code class="computeroutput"><span class="identifier">other</span></code>
507 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
508 using move semantics.
509 </p></dd>
510<dt><span class="term">Throws:</span></dt>
511<dd><p>
512 Nothing.
513 </p></dd>
514</dl>
515</div>
516<p>
517 </p>
518<h5>
519<a name="ecv1_operator_bool_bridgehead"></a>
520 <span><a name="ecv1_operator_bool"></a></span>
521 <a class="link" href="ecv1_class.html#ecv1_operator_bool">Member function
522 <code class="computeroutput">operator bool</code>()</a>
523</h5>
524<p>
525 </p>
526<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>
527</pre>
528<div class="variablelist">
529<p class="title"><b></b></p>
530<dl>
531<dt><span class="term">Returns:</span></dt>
532<dd><p>
533 <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.
534 </p></dd>
535<dt><span class="term">Throws:</span></dt>
536<dd><p>
537 Nothing.
538 </p></dd>
539</dl>
540</div>
541<p>
542 </p>
543<h5>
544<a name="ecv1_operator_not_bridgehead"></a>
545 <span><a name="ecv1_operator_not"></a></span>
546 <a class="link" href="ecv1_class.html#ecv1_operator_not">Member function
547 <code class="computeroutput">operator!</code>()</a>
548</h5>
549<p>
550 </p>
551<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>
552</pre>
553<div class="variablelist">
554<p class="title"><b></b></p>
555<dl>
556<dt><span class="term">Returns:</span></dt>
557<dd><p>
558 <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.
559 </p></dd>
560<dt><span class="term">Throws:</span></dt>
561<dd><p>
562 Nothing.
563 </p></dd>
564</dl>
565</div>
566<p>
567 </p>
568<h5>
569<a name="ecv1_operator_call_bridgehead"></a>
570 <span><a name="ecv1_operator_call"></a></span>
571 <a class="link" href="ecv1_class.html#ecv1_operator_call">Member function
572 <code class="computeroutput">operator()</code>()</a>
573</h5>
574<p>
575 </p>
576<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>
577</pre>
578<div class="variablelist">
579<p class="title"><b></b></p>
580<dl>
581<dt><span class="term">Effects:</span></dt>
582<dd><p>
583 Stores internally the current context data (stack pointer, instruction
584 pointer, and CPU registers) of the current active context and restores
585 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
586 context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
587 is passed to the current context to be returned by the most recent call
588 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>
589 is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code>
590 on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>.
591 </p></dd>
592<dt><span class="term">Note:</span></dt>
593<dd><p>
594 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>
595 returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
596 (e.g. resuming an already running context). If the top-level context
597 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.
598 </p></dd>
599<dt><span class="term">Returns:</span></dt>
600<dd><p>
601 The void pointer argument passed to the most recent call to <span class="emphasis"><em>execution_context::operator()</em></span>,
602 if any.
603 </p></dd>
604</dl>
605</div>
606<p>
607 </p>
608<h5>
609<a name="ecv1_operator_call_ontop_bridgehead"></a>
610 <span><a name="ecv1_operator_call_ontop"></a></span>
611 <a class="link" href="ecv1_class.html#ecv1_operator_call_ontop">Member
612 function <code class="computeroutput">operator(exec_ontop_arg_t)</code>()</a>
613</h5>
614<p>
615 </p>
616<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>
617<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="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
618
619<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>
620<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">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
621</pre>
622<div class="variablelist">
623<p class="title"><b></b></p>
624<dl>
625<dt><span class="term">Effects:</span></dt>
626<dd><p>
627 Same as <span class="emphasis"><em>execution_context::operator()</em></span>. Additionally,
628 function <code class="computeroutput"><span class="identifier">fn</span></code> is executed
629 with arguments <code class="computeroutput"><span class="identifier">args</span></code> in
630 the context of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
631 (e.g. the stack frame of <code class="computeroutput"><span class="identifier">fn</span></code>
632 is allocated on stack of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>).
633 </p></dd>
634<dt><span class="term">Returns:</span></dt>
635<dd><p>
636 The void pointer argument passed to the most recent call to <span class="emphasis"><em>execution_context::operator()</em></span>,
637 if any.
638 </p></dd>
639</dl>
640</div>
641<p>
642 </p>
643<h5>
644<a name="ecv1_operator_equal_bridgehead"></a>
645 <span><a name="ecv1_operator_equal"></a></span>
646 <a class="link" href="ecv1_class.html#ecv1_operator_equal">Member
647 function <code class="computeroutput">operator==</code>()</a>
648</h5>
649<p>
650 </p>
651<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>
652</pre>
653<div class="variablelist">
654<p class="title"><b></b></p>
655<dl>
656<dt><span class="term">Returns:</span></dt>
657<dd><p>
658 <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>
659 represent the same execution context, <code class="computeroutput"><span class="keyword">false</span></code>
660 otherwise.
661 </p></dd>
662<dt><span class="term">Throws:</span></dt>
663<dd><p>
664 Nothing.
665 </p></dd>
666</dl>
667</div>
668<p>
669 </p>
670<h5>
671<a name="ecv1_operator_notequal_bridgehead"></a>
672 <span><a name="ecv1_operator_notequal"></a></span>
673 <a class="link" href="ecv1_class.html#ecv1_operator_notequal">Member
674 function <code class="computeroutput">operator!=</code>()</a>
675</h5>
676<p>
677 </p>
678<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>
679</pre>
680<div class="variablelist">
681<p class="title"><b></b></p>
682<dl>
683<dt><span class="term">Returns:</span></dt>
684<dd><p>
685 <code class="computeroutput">! (other == * this)</code>
686 </p></dd>
687<dt><span class="term">Throws:</span></dt>
688<dd><p>
689 Nothing.
690 </p></dd>
691</dl>
692</div>
693<p>
694 </p>
695<h5>
696<a name="ecv1_operator_less_bridgehead"></a>
697 <span><a name="ecv1_operator_less"></a></span>
698 <a class="link" href="ecv1_class.html#ecv1_operator_less">Member function
699 <code class="computeroutput">operator&lt;</code>()</a>
700</h5>
701<p>
702 </p>
703<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>
704</pre>
705<div class="variablelist">
706<p class="title"><b></b></p>
707<dl>
708<dt><span class="term">Returns:</span></dt>
709<dd><p>
710 <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
711 total order of <code class="computeroutput"><span class="identifier">execution_context</span></code>
712 values places <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
713 before <code class="computeroutput"><span class="identifier">other</span></code>, false otherwise.
714 </p></dd>
715<dt><span class="term">Throws:</span></dt>
716<dd><p>
717 Nothing.
718 </p></dd>
719</dl>
720</div>
721<p>
722 </p>
723<h5>
724<a name="ecv1_operator_greater_bridgehead"></a>
725 <span><a name="ecv1_operator_greater"></a></span>
726 <a class="link" href="ecv1_class.html#ecv1_operator_greater">Member
727 function <code class="computeroutput">operator&gt;</code>()</a>
728</h5>
729<p>
730 </p>
731<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>
732</pre>
733<div class="variablelist">
734<p class="title"><b></b></p>
735<dl>
736<dt><span class="term">Returns:</span></dt>
737<dd><p>
738 <code class="computeroutput"><span class="identifier">other</span> <span class="special">&lt;</span>
739 <span class="special">*</span> <span class="keyword">this</span></code>
740 </p></dd>
741<dt><span class="term">Throws:</span></dt>
742<dd><p>
743 Nothing.
744 </p></dd>
745</dl>
746</div>
747<p>
748 </p>
749<h5>
750<a name="ecv1_operator_lesseq_bridgehead"></a>
751 <span><a name="ecv1_operator_lesseq"></a></span>
752 <a class="link" href="ecv1_class.html#ecv1_operator_lesseq">Member
753 function <code class="computeroutput">operator&lt;=</code>()</a>
754</h5>
755<p>
756 </p>
757<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>
758</pre>
759<div class="variablelist">
760<p class="title"><b></b></p>
761<dl>
762<dt><span class="term">Returns:</span></dt>
763<dd><p>
764 <code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special">&lt;</span>
765 <span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code>
766 </p></dd>
767<dt><span class="term">Throws:</span></dt>
768<dd><p>
769 Nothing.
770 </p></dd>
771</dl>
772</div>
773<p>
774 </p>
775<h5>
776<a name="ecv1_operator_greatereq_bridgehead"></a>
777 <span><a name="ecv1_operator_greatereq"></a></span>
778 <a class="link" href="ecv1_class.html#ecv1_operator_greatereq">Member
779 function <code class="computeroutput">operator&gt;=</code>()</a>
780</h5>
781<p>
782 </p>
783<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>
784</pre>
785<div class="variablelist">
786<p class="title"><b></b></p>
787<dl>
788<dt><span class="term">Returns:</span></dt>
789<dd><p>
790 <code class="computeroutput"><span class="special">!</span> <span class="special">(*</span>
791 <span class="keyword">this</span> <span class="special">&lt;</span>
792 <span class="identifier">other</span><span class="special">)</span></code>
793 </p></dd>
794<dt><span class="term">Throws:</span></dt>
795<dd><p>
796 Nothing.
797 </p></dd>
798</dl>
799</div>
800<p>
801 </p>
802<h5>
803<a name="ecv1_bridgehead"></a>
804 <span><a name="ecv1"></a></span>
805 <a class="link" href="ecv1_class.html#ecv1">Non-member function <code class="computeroutput">operator&lt;&lt;()</code></a>
806</h5>
807<p>
808 </p>
809<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>
810<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>
811<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>
812</pre>
813<div class="variablelist">
814<p class="title"><b></b></p>
815<dl>
816<dt><span class="term">Efects:</span></dt>
817<dd><p>
818 Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code>
819 to stream <code class="computeroutput"><span class="identifier">os</span></code>.
820 </p></dd>
821<dt><span class="term">Returns:</span></dt>
822<dd><p>
823 <code class="computeroutput"><span class="identifier">os</span></code>
824 </p></dd>
825</dl>
826</div>
827</div>
828<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
829<td align="left"></td>
830<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
831 Distributed under the Boost Software License, Version 1.0. (See accompanying
832 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>)
833 </p>
834</div></td>
835</tr></table>
836<hr>
837<div class="spirit-nav">
838<a accesskey="p" href="requirements.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="ecv2_class.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
839</div>
840</body>
841</html>