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