Imported Upstream version 1.63.0
[platform/upstream/boost.git] / libs / context / doc / html / context / ecv1_class.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="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>