]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/context/doc/html/context/ecv2.html
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / context / doc / html / context / ecv2.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Class execution_context (version 2)</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="ecv1.html" title="Class execution_context (version 1)">
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="ecv1.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.ecv2"></a><a name="ecv2"></a><a class="link" href="ecv2.html" title="Class execution_context (version 2)">Class execution_context
28 (version 2)</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 per default.
37 </p></td></tr>
38 </table></div>
39 <p>
40 Class <span class="emphasis"><em>execution_context</em></span> encapsulates context switching
41 and manages the associated context' stack (allocation/deallocation).
42 </p>
43 <p>
44 <span class="emphasis"><em>execution_context</em></span> allocates the context stack (using its
45 <a class="link" href="stack.html#stack"><span class="emphasis"><em>StackAllocator</em></span></a> argument)
46 and creates a control structure on top of it. This structure is responsible
47 for managing context' stack. The address of the control structure is stored
48 in the first frame of context' stack (e.g. it can not directly accessed from
49 within <span class="emphasis"><em>execution_context</em></span>). In contrast to <a class="link" href="ecv1.html#ecv1"><span class="emphasis"><em>execution_context</em></span>
50 (v1)</a> the ownership of the control structure is not shared (no member
51 variable to control structure in <span class="emphasis"><em>execution_context</em></span>).
52 <span class="emphasis"><em>execution_context</em></span> keeps internally a state that is moved
53 by a call of <span class="emphasis"><em>execution_context::operator()</em></span> (<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> will be
54 invalidated), e.g. after a calling <span class="emphasis"><em>execution_context::operator()</em></span>,
55 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
56 can not be used for an additional context switch.
57 </p>
58 <p>
59 <span class="emphasis"><em>execution_context</em></span> is only move-constructible and move-assignable.
60 </p>
61 <p>
62 The moved state is assigned to a new instance of <span class="emphasis"><em>execution_context</em></span>.
63 This object becomes the first argument of the context-function, if the context
64 was resumed the first time, or the first element in a tuple returned by <span class="emphasis"><em>execution_context::operator()</em></span>
65 that has been called in the resumed context. In contrast to <a class="link" href="ecv1.html#ecv1"><span class="emphasis"><em>execution_context</em></span>
66 (v1)</a>, the context switch is faster because no global pointer etc. is
67 involved.
68 </p>
69 <div class="important"><table border="0" summary="Important">
70 <tr>
71 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
72 <th align="left">Important</th>
73 </tr>
74 <tr><td align="left" valign="top"><p>
75 Segmented stacks are not supported by <span class="emphasis"><em>execution_context</em></span>
76 (v2).
77 </p></td></tr>
78 </table></div>
79 <p>
80 On return the context-function of the current context has to specify an <span class="emphasis"><em>execution_context</em></span>
81 to which the execution control is transferred after termination of the current
82 context.
83 </p>
84 <p>
85 If an instance with valid state goes out of scope and the context-function
86 has not yet returned, the stack is traversed in order to access the control
87 structure (address stored at the first stack frame) and context' stack is deallocated
88 via the <span class="emphasis"><em>StackAllocator</em></span>. The stack walking makes the destruction
89 of <span class="emphasis"><em>execution_context</em></span> slow and should be prevented if possible.
90 </p>
91 <p>
92 <span class="emphasis"><em>execution_context</em></span> expects a <span class="emphasis"><em>context-function</em></span>
93 with signature <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">(</span><span class="identifier">execution_context</span>
94 <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code>. The
95 parameter <code class="computeroutput"><span class="identifier">ctx</span></code> represents the
96 context from which this context was resumed (e.g. that has called <span class="emphasis"><em>execution_context::operator()</em></span>
97 on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>)
98 and <code class="computeroutput"><span class="identifier">args</span></code> are the data passed
99 to <span class="emphasis"><em>execution_context::operator()</em></span>. The return value represents
100 the execution_context that has to be resumed, after termiantion of this context.
101 </p>
102 <p>
103 Benefits of <a class="link" href="ecv2.html#ecv2"><span class="emphasis"><em>execution_context</em></span> (v2)</a>
104 over <a class="link" href="ecv1.html#ecv1"><span class="emphasis"><em>execution_context</em></span> (v1)</a>
105 are: faster context switch, type-safety of passed/returned arguments.
106 </p>
107 <h4>
108 <a name="context.ecv2.h0"></a>
109 <span><a name="context.ecv2.usage_of__emphasis_execution_context__emphasis_"></a></span><a class="link" href="ecv2.html#context.ecv2.usage_of__emphasis_execution_context__emphasis_">usage
110 of <span class="emphasis"><em>execution_context</em></span></a>
111 </h4>
112 <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>
113 <span class="identifier">ctx</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">source</span><span class="special">(</span>
114 <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">execution_context</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">sink</span><span class="special">,</span> <span class="keyword">int</span><span class="special">)</span> <span class="keyword">mutable</span> <span class="special">{</span>
115 <span class="keyword">int</span> <span class="identifier">a</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
116 <span class="keyword">int</span> <span class="identifier">b</span><span class="special">=</span><span class="number">1</span><span class="special">;</span>
117 <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>
118 <span class="keyword">auto</span> <span class="identifier">result</span><span class="special">=</span><span class="identifier">sink</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
119 <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>
120 <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>
121 <span class="identifier">a</span><span class="special">=</span><span class="identifier">b</span><span class="special">;</span>
122 <span class="identifier">b</span><span class="special">=</span><span class="identifier">next</span><span class="special">;</span>
123 <span class="special">}</span>
124 <span class="keyword">return</span> <span class="identifier">sink</span><span class="special">;</span>
125 <span class="special">});</span>
126 <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>
127 <span class="keyword">auto</span> <span class="identifier">result</span><span class="special">=</span><span class="identifier">source</span><span class="special">(</span><span class="identifier">i</span><span class="special">);</span>
128 <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>
129 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</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>
130 <span class="special">}</span>
131
132 <span class="identifier">output</span><span class="special">:</span>
133 <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>
134 </pre>
135 <p>
136 This simple example demonstrates the basic usage of <span class="emphasis"><em>execution_context</em></span>
137 as a generator. The context <code class="computeroutput"><span class="identifier">sink</span></code>
138 represents the <span class="emphasis"><em>main</em></span>-context (function <span class="emphasis"><em>main()</em></span>
139 running). <code class="computeroutput"><span class="identifier">sink</span></code> is generated
140 by the framework (first element of lambda's parameter list). Because the state
141 is invalidated (== changed) by each call of <span class="emphasis"><em>execution_context::operator()</em></span>,
142 the new state of the <span class="emphasis"><em>execution_context</em></span>, returned by <span class="emphasis"><em>execution_context::operator()</em></span>,
143 needs to be assigned to <code class="computeroutput"><span class="identifier">sink</span></code>
144 after each call.
145 </p>
146 <p>
147 The lambda that calculates the Fibonacci numbers is executed inside the context
148 represented by <code class="computeroutput"><span class="identifier">source</span></code>. Calculated
149 Fibonacci numbers are transferred between the two context' via expression
150 <span class="emphasis"><em>sink(a)</em></span> (and returned by <span class="emphasis"><em>source()</em></span>).
151 Note that this example represents a <span class="emphasis"><em>generator</em></span> thus the
152 value transferred into the lambda via <span class="emphasis"><em>source()</em></span> is not
153 used. Using <span class="emphasis"><em>boost::optional&lt;&gt;</em></span> as transferred type,
154 might also appropriate to express this fact.
155 </p>
156 <p>
157 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>
158 remain their values during each context switch (<span class="emphasis"><em>yield(a)</em></span>).
159 This is possible due <code class="computeroutput"><span class="identifier">source</span></code>
160 has its own stack and the stack is exchanged by each context switch.
161 </p>
162 <h4>
163 <a name="context.ecv2.h1"></a>
164 <span><a name="context.ecv2.parameter_passing"></a></span><a class="link" href="ecv2.html#context.ecv2.parameter_passing">parameter
165 passing</a>
166 </h4>
167 <p>
168 With <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span></code> no
169 data will be transferred, only the context switch is executed.
170 </p>
171 <pre class="programlisting"><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">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">ctx1</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">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">ctx2</span><span class="special">){</span>
172 <span class="identifier">std</span><span class="special">::</span><span class="identifier">printf</span><span class="special">(</span><span class="string">"inside ctx1\n"</span><span class="special">);</span>
173 <span class="keyword">return</span> <span class="identifier">ctx2</span><span class="special">();</span>
174 <span class="special">});</span>
175 <span class="identifier">ctx1</span><span class="special">();</span>
176
177 <span class="identifier">output</span><span class="special">:</span>
178 <span class="identifier">inside</span> <span class="identifier">ctx1</span>
179 </pre>
180 <p>
181 <code class="computeroutput"><span class="identifier">ctx1</span><span class="special">()</span></code>
182 resumes <code class="computeroutput"><span class="identifier">ctx1</span></code>, e.g. the lambda
183 passed at the constructor of <code class="computeroutput"><span class="identifier">ctx1</span></code>
184 is entered. Argument <code class="computeroutput"><span class="identifier">ctx2</span></code> represents
185 the context that has been suspended with the invocation of <code class="computeroutput"><span class="identifier">ctx1</span><span class="special">()</span></code>. When the lambda returns <code class="computeroutput"><span class="identifier">ctx2</span></code>,
186 context <code class="computeroutput"><span class="identifier">ctx1</span></code> will be terminated
187 while the context represented by <code class="computeroutput"><span class="identifier">ctx2</span></code>
188 is resumed, hence the control of execution returns from <code class="computeroutput"><span class="identifier">ctx1</span><span class="special">()</span></code>.
189 </p>
190 <p>
191 The arguments passed to <span class="emphasis"><em>execution_context::operator()</em></span>,
192 in one context, is passed as the last arguments of the <span class="emphasis"><em>context-function</em></span>
193 if the context is started for the first time. In all following invocations
194 of <span class="emphasis"><em>execution_context::operator()</em></span> the arguments passed
195 to <span class="emphasis"><em>execution_context::operator()</em></span>, in one context, is returned
196 by <span class="emphasis"><em>execution_context::operator()</em></span> in the other context.
197 </p>
198 <pre class="programlisting"><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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ctx1</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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ctx2</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">j</span><span class="special">){</span>
199 <span class="identifier">std</span><span class="special">::</span><span class="identifier">printf</span><span class="special">(</span><span class="string">"inside ctx1, j == %d\n"</span><span class="special">,</span> <span class="identifier">j</span><span class="special">);</span>
200 <span class="keyword">return</span> <span class="identifier">ctx2</span><span class="special">(</span><span class="identifier">j</span><span class="special">+</span><span class="number">1</span><span class="special">);</span>
201 <span class="special">});</span>
202 <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
203 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">ctx1</span><span class="special">,</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">ctx1</span><span class="special">(</span><span class="identifier">i</span><span class="special">);</span>
204 <span class="identifier">std</span><span class="special">::</span><span class="identifier">printf</span><span class="special">(</span><span class="string">"i == %d\n"</span><span class="special">,</span> <span class="identifier">i</span><span class="special">);</span>
205
206 <span class="identifier">output</span><span class="special">:</span>
207 <span class="identifier">inside</span> <span class="identifier">ctx1</span><span class="special">,</span> <span class="identifier">j</span> <span class="special">==</span> <span class="number">1</span>
208 <span class="identifier">i</span> <span class="special">==</span> <span class="number">2</span>
209 </pre>
210 <p>
211 <code class="computeroutput"><span class="identifier">ctx1</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span></code> enters
212 the lambda in context <code class="computeroutput"><span class="identifier">ctx1</span></code>
213 with argument <code class="computeroutput"><span class="identifier">j</span><span class="special">=</span><span class="number">1</span></code>. The expression <code class="computeroutput"><span class="identifier">ctx2</span><span class="special">(</span><span class="identifier">j</span><span class="special">+</span><span class="number">1</span><span class="special">)</span></code> resumes the
214 context represented by <code class="computeroutput"><span class="identifier">ctx2</span></code>
215 and transfers back an integer of <code class="computeroutput"><span class="identifier">j</span><span class="special">+</span><span class="number">1</span></code>. On return
216 of <code class="computeroutput"><span class="identifier">ctx1</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span></code>, the variable
217 <code class="computeroutput"><span class="identifier">i</span></code> contains the value of <code class="computeroutput"><span class="identifier">j</span><span class="special">+</span><span class="number">1</span></code>.
218 </p>
219 <p>
220 If more than one argument has to be transferred, the signature of the context-function
221 is simply extended.
222 </p>
223 <pre class="programlisting"><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">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ctx1</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">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ctx2</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">i</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">j</span><span class="special">){</span>
224 <span class="identifier">std</span><span class="special">::</span><span class="identifier">printf</span><span class="special">(</span><span class="string">"inside ctx1, i == %d j == %d\n"</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">);</span>
225 <span class="keyword">return</span> <span class="identifier">ctx2</span><span class="special">(</span><span class="identifier">i</span><span class="special">+</span><span class="identifier">j</span><span class="special">,</span><span class="identifier">i</span><span class="special">-</span><span class="identifier">j</span><span class="special">);</span>
226 <span class="special">});</span>
227 <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
228 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">ctx1</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">ctx1</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span><span class="identifier">j</span><span class="special">);</span>
229 <span class="identifier">std</span><span class="special">::</span><span class="identifier">printf</span><span class="special">(</span><span class="string">"i == %d j == %d\n"</span><span class="special">,</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">);</span>
230
231 <span class="identifier">output</span><span class="special">:</span>
232 <span class="identifier">inside</span> <span class="identifier">ctx1</span><span class="special">,</span> <span class="identifier">i</span> <span class="special">==</span> <span class="number">2</span> <span class="identifier">j</span> <span class="special">==</span> <span class="number">1</span>
233 <span class="identifier">i</span> <span class="special">==</span> <span class="number">3</span> <span class="identifier">j</span> <span class="special">==</span> <span class="number">1</span>
234 </pre>
235 <p>
236 For use-cases, that require to transfer data of different type in each direction,
237 <span class="emphasis"><em>boost::variant&lt;&gt;</em></span> could be used.
238 </p>
239 <pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span><span class="special">{</span>
240 <span class="keyword">private</span><span class="special">:</span>
241 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span>
242 <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;&gt;</span> <span class="identifier">ctx_</span><span class="special">;</span>
243
244 <span class="keyword">public</span><span class="special">:</span>
245 <span class="identifier">X</span><span class="special">():</span>
246 <span class="identifier">excptr_</span><span class="special">(),</span>
247 <span class="identifier">ctx_</span><span class="special">(</span>
248 <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">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;&gt;</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">data</span><span class="special">){</span>
249 <span class="keyword">try</span> <span class="special">{</span>
250 <span class="keyword">for</span> <span class="special">(;;)</span> <span class="special">{</span>
251 <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;(</span><span class="identifier">data</span><span class="special">);</span>
252 <span class="identifier">data</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>
253 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span> <span class="identifier">data</span><span class="special">);</span>
254 <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>
255 <span class="identifier">data</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>
256 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_cast</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">{</span>
257 <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>
258 <span class="special">}</span>
259 <span class="keyword">return</span> <span class="identifier">ctx</span><span class="special">;</span>
260 <span class="special">})</span>
261 <span class="special">{}</span>
262
263 <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>
264 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">data</span> <span class="special">=</span> <span class="identifier">i</span><span class="special">;</span>
265 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx_</span><span class="special">(</span> <span class="identifier">data</span><span class="special">);</span>
266 <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>
267 <span class="identifier">data</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>
268 <span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span>
269 <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>
270 <span class="special">}</span>
271 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">get</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">data</span><span class="special">);</span>
272 <span class="special">}</span>
273 <span class="special">};</span>
274
275 <span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
276 <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>
277
278 <span class="identifier">output</span><span class="special">:</span>
279 <span class="number">7</span>
280 </pre>
281 <p>
282 In the case of unidirectional transfer of data, <span class="emphasis"><em>boost::optional&lt;&gt;</em></span>
283 or a pointer are appropriate.
284 </p>
285 <h4>
286 <a name="context.ecv2.h2"></a>
287 <span><a name="context.ecv2.exception_handling"></a></span><a class="link" href="ecv2.html#context.ecv2.exception_handling">exception
288 handling</a>
289 </h4>
290 <p>
291 If the function executed inside a <span class="emphasis"><em>execution_context</em></span> emits
292 ans exception, the application is terminated by calling <span class="emphasis"><em>std::terminate()</em></span>.
293 <span class="emphasis"><em>std::exception_ptr</em></span> can be used to transfer exceptions
294 between different execution contexts.
295 </p>
296 <div class="important"><table border="0" summary="Important">
297 <tr>
298 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
299 <th align="left">Important</th>
300 </tr>
301 <tr><td align="left" valign="top"><p>
302 Do not jump from inside a catch block and then re-throw the exception in
303 another execution context.
304 </p></td></tr>
305 </table></div>
306 <a name="ecv2_ontop"></a><h4>
307 <a name="context.ecv2.h3"></a>
308 <span><a name="context.ecv2.executing_function_on_top_of_a_context"></a></span><a class="link" href="ecv2.html#context.ecv2.executing_function_on_top_of_a_context">Executing
309 function on top of a context</a>
310 </h4>
311 <p>
312 Sometimes it is useful to execute a new function on top of a resumed context.
313 For this purpose <span class="emphasis"><em>execution_context::operator()</em></span> with first
314 argument <code class="computeroutput"><span class="identifier">exec_ontop_arg</span></code> has
315 to be used. The function passed as argument must return a tuple of execution_context
316 and arguments.
317 </p>
318 <pre class="programlisting"><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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">f1</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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ctx</span><span class="special">,</span><span class="keyword">int</span> <span class="identifier">data</span><span class="special">)</span> <span class="special">{</span>
319 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f1: entered first time: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">data</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>
320 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">,</span><span class="identifier">data</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span><span class="identifier">data</span><span class="special">+</span><span class="number">1</span><span class="special">);</span>
321 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f1: entered second time: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">data</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>
322 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">,</span><span class="identifier">data</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span><span class="identifier">data</span><span class="special">+</span><span class="number">1</span><span class="special">);</span>
323 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f1: entered third time: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">data</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>
324 <span class="keyword">return</span> <span class="identifier">ctx</span><span class="special">;</span>
325 <span class="special">}</span>
326
327 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</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">&lt;</span><span class="keyword">int</span><span class="special">&gt;,</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">f2</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">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ctx</span><span class="special">,</span><span class="keyword">int</span> <span class="identifier">data</span><span class="special">)</span> <span class="special">{</span>
328 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f2: entered: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">data</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>
329 <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_tuple</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">ctx</span><span class="special">),-</span><span class="number">1</span><span class="special">);</span>
330 <span class="special">}</span>
331
332 <span class="keyword">int</span> <span class="identifier">data</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
333 <span class="identifier">ctx</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">&gt;</span> <span class="identifier">ctx</span><span class="special">(</span><span class="identifier">f1</span><span class="special">);</span>
334 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">,</span><span class="identifier">data</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span><span class="identifier">data</span><span class="special">+</span><span class="number">1</span><span class="special">);</span>
335 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f1: returned first time: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">data</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>
336 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">,</span><span class="identifier">data</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span><span class="identifier">data</span><span class="special">+</span><span class="number">1</span><span class="special">);</span>
337 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f1: returned second time: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">data</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>
338 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">,</span><span class="identifier">data</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">exec_ontop_arg</span><span class="special">,</span><span class="identifier">f2</span><span class="special">,</span><span class="identifier">data</span><span class="special">+</span><span class="number">1</span><span class="special">);</span>
339
340 <span class="identifier">output</span><span class="special">:</span>
341 <span class="identifier">f1</span><span class="special">:</span> <span class="identifier">entered</span> <span class="identifier">first</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">1</span>
342 <span class="identifier">f1</span><span class="special">:</span> <span class="identifier">returned</span> <span class="identifier">first</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">2</span>
343 <span class="identifier">f1</span><span class="special">:</span> <span class="identifier">entered</span> <span class="identifier">second</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">3</span>
344 <span class="identifier">f1</span><span class="special">:</span> <span class="identifier">returned</span> <span class="identifier">second</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">4</span>
345 <span class="identifier">f2</span><span class="special">:</span> <span class="identifier">entered</span><span class="special">:</span> <span class="number">5</span>
346 <span class="identifier">f1</span><span class="special">:</span> <span class="identifier">entered</span> <span class="identifier">third</span> <span class="identifier">time</span><span class="special">:</span> <span class="special">-</span><span class="number">1</span>
347 </pre>
348 <p>
349 The expression <code class="computeroutput"><span class="identifier">ctx</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">exec_ontop_arg</span><span class="special">,</span><span class="identifier">f2</span><span class="special">,</span><span class="identifier">data</span><span class="special">+</span><span class="number">1</span><span class="special">)</span></code> executes <code class="computeroutput"><span class="identifier">f2</span><span class="special">()</span></code> on top of context <code class="computeroutput"><span class="identifier">ctx</span></code>,
350 e.g. an additional stack frame is allocated on top of the context stack (in
351 front of <code class="computeroutput"><span class="identifier">f1</span><span class="special">()</span></code>).
352 <code class="computeroutput"><span class="identifier">f2</span><span class="special">()</span></code>
353 returns argument <code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>
354 that will returned by the second invocation of <code class="computeroutput"><span class="identifier">ctx</span><span class="special">(</span><span class="identifier">data</span><span class="special">+</span><span class="number">1</span><span class="special">)</span></code> in <code class="computeroutput"><span class="identifier">f1</span><span class="special">()</span></code>.
355 </p>
356 <p>
357 Another option is to execute a function on top of the context that throws an
358 exception.
359 </p>
360 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">interrupt</span> <span class="special">{</span>
361 <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">&lt;</span> <span class="keyword">void</span> <span class="special">&gt;</span> <span class="identifier">ctx</span><span class="special">;</span>
362
363 <span class="identifier">interrupt</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">&lt;</span> <span class="keyword">void</span> <span class="special">&gt;</span> <span class="special">&amp;&amp;</span> <span class="identifier">ctx_</span><span class="special">)</span> <span class="special">:</span>
364 <span class="identifier">ctx</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special">&lt;</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">&lt;</span> <span class="keyword">void</span> <span class="special">&gt;</span> <span class="special">&gt;(</span> <span class="identifier">ctx_</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span>
365 <span class="special">}</span>
366 <span class="special">};</span>
367
368 <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">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">f1</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">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">ctx</span><span class="special">)</span> <span class="special">{</span>
369 <span class="keyword">try</span> <span class="special">{</span>
370 <span class="keyword">for</span> <span class="special">(;;)</span> <span class="special">{</span>
371 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f1()"</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>
372 <span class="identifier">ctx</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">();</span>
373 <span class="special">}</span>
374 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">interrupt</span> <span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
375 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"f1(): interrupted"</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>
376 <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">e</span><span class="special">.</span><span class="identifier">ctx</span><span class="special">);</span>
377 <span class="special">}</span>
378 <span class="keyword">return</span> <span class="identifier">ctx</span><span class="special">;</span>
379 <span class="special">}</span>
380
381 <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">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">f2</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">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="identifier">ctx</span><span class="special">)</span> <span class="special">{</span>
382 <span class="keyword">throw</span> <span class="identifier">interrupt</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">ctx</span><span class="special">));</span>
383 <span class="keyword">return</span> <span class="identifier">ctx</span><span class="special">;</span>
384 <span class="special">}</span>
385
386 <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">&lt;</span> <span class="keyword">void</span> <span class="special">&gt;</span> <span class="identifier">ctx</span><span class="special">(</span><span class="identifier">f1</span><span class="special">);</span>
387 <span class="identifier">ctx</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">();</span>
388 <span class="identifier">ctx</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">();</span>
389 <span class="identifier">ctx</span> <span class="special">=</span> <span class="identifier">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">exec_ontop_arg</span><span class="special">,</span><span class="identifier">f2</span><span class="special">);</span>
390
391 <span class="identifier">output</span><span class="special">:</span>
392 <span class="identifier">f1</span><span class="special">()</span>
393 <span class="identifier">f1</span><span class="special">()</span>
394 <span class="identifier">f1</span><span class="special">():</span> <span class="identifier">interrupted</span>
395 </pre>
396 <p>
397 In this example <code class="computeroutput"><span class="identifier">f2</span><span class="special">()</span></code>
398 is used to interrupt the <code class="computeroutput"><span class="keyword">for</span></code>-loop
399 in <code class="computeroutput"><span class="identifier">f1</span><span class="special">()</span></code>.
400 </p>
401 <h4>
402 <a name="context.ecv2.h4"></a>
403 <span><a name="context.ecv2.stack_destruction"></a></span><a class="link" href="ecv2.html#context.ecv2.stack_destruction">Stack
404 destruction</a>
405 </h4>
406 <p>
407 On construction of <span class="emphasis"><em>execution_context</em></span> a stack is allocated.
408 If the <span class="emphasis"><em>context-function</em></span> returns the stack will be destructed.
409 If the <span class="emphasis"><em>context-function</em></span> has not yet returned and the destructor
410 of an valid <span class="emphasis"><em>execution_context</em></span> instance (e.g. <span class="emphasis"><em>execution_context::operator
411 bool()</em></span> returns <code class="computeroutput"><span class="keyword">true</span></code>)
412 is called, the stack will be destructed too.
413 </p>
414 <a name="ecv2_prealloc"></a><h4>
415 <a name="context.ecv2.h5"></a>
416 <span><a name="context.ecv2.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="ecv2.html#context.ecv2.allocating_control_structures_on_top_of_stack">allocating
417 control structures on top of stack</a>
418 </h4>
419 <p>
420 Allocating control structures on top of the stack requires to allocated the
421 <span class="emphasis"><em>stack_context</em></span> and create the control structure with placement
422 new before <span class="emphasis"><em>execution_context</em></span> is created.
423 </p>
424 <div class="note"><table border="0" summary="Note">
425 <tr>
426 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
427 <th align="left">Note</th>
428 </tr>
429 <tr><td align="left" valign="top"><p>
430 The user is responsible for destructing the control structure at the top
431 of the stack.
432 </p></td></tr>
433 </table></div>
434 <pre class="programlisting"><span class="comment">// stack-allocator used for (de-)allocating stack</span>
435 <span class="identifier">fixedsize_stack</span> <span class="identifier">salloc</span><span class="special">(</span> <span class="number">4048</span><span class="special">);</span>
436 <span class="comment">// allocate stack space</span>
437 <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>
438 <span class="comment">// reserve space for control structure on top of the stack</span>
439 <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>
440 <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>
441 <span class="comment">// placement new creates control structure on reserved space</span>
442 <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>
443 <span class="special">...</span>
444 <span class="comment">// destructing the control structure</span>
445 <span class="identifier">cs</span><span class="special">-&gt;~</span><span class="identifier">my_control_structure</span><span class="special">();</span>
446 <span class="special">...</span>
447 <span class="keyword">struct</span> <span class="identifier">my_control_structure</span> <span class="special">{</span>
448 <span class="comment">// captured context</span>
449 <span class="identifier">execution_context</span> <span class="identifier">cctx</span><span class="special">;</span>
450
451 <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>
452 <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>
453 <span class="comment">// create captured context</span>
454 <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>
455 <span class="special">}</span>
456 <span class="special">...</span>
457 <span class="special">};</span>
458 </pre>
459 <h4>
460 <a name="context.ecv2.h6"></a>
461 <span><a name="context.ecv2.inverting_the_control_flow"></a></span><a class="link" href="ecv2.html#context.ecv2.inverting_the_control_flow">inverting
462 the control flow</a>
463 </h4>
464 <pre class="programlisting"><span class="comment">/*
465 * grammar:
466 * P ---&gt; E '\0'
467 * E ---&gt; T {('+'|'-') T}
468 * T ---&gt; S {('*'|'/') S}
469 * S ---&gt; digit | '(' E ')'
470 */</span>
471 <span class="keyword">class</span> <span class="identifier">Parser</span><span class="special">{</span>
472 <span class="comment">// implementation omitted; see examples directory</span>
473 <span class="special">};</span>
474
475 <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>
476 <span class="keyword">bool</span> <span class="identifier">done</span><span class="special">=</span><span class="keyword">false</span><span class="special">;</span>
477 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">except</span><span class="special">;</span>
478
479 <span class="comment">// execute parser in new execution context</span>
480 <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">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">source</span><span class="special">(</span>
481 <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">execution_context</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">sink</span><span class="special">,</span><span class="keyword">char</span><span class="special">){</span>
482 <span class="comment">// create parser with callback function</span>
483 <span class="identifier">Parser</span> <span class="identifier">p</span><span class="special">(</span> <span class="identifier">is</span><span class="special">,</span>
484 <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>
485 <span class="comment">// resume main execution context</span>
486 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">sink</span><span class="special">(</span><span class="identifier">ch</span><span class="special">);</span>
487 <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>
488 <span class="special">});</span>
489 <span class="keyword">try</span> <span class="special">{</span>
490 <span class="comment">// start recursive parsing</span>
491 <span class="identifier">p</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span>
492 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
493 <span class="comment">// store other exceptions in exception-pointer</span>
494 <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>
495 <span class="special">}</span>
496 <span class="comment">// set termination flag</span>
497 <span class="identifier">done</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
498 <span class="comment">// resume main execution context</span>
499 <span class="keyword">return</span> <span class="identifier">sink</span><span class="special">;</span>
500 <span class="special">});</span>
501
502 <span class="comment">// user-code pulls parsed data from parser</span>
503 <span class="comment">// invert control flow</span>
504 <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">(</span><span class="char">'\0'</span><span class="special">);</span>
505 <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>
506 <span class="keyword">char</span> <span class="identifier">c</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>
507 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
508 <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>
509 <span class="special">}</span>
510 <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>
511 <span class="identifier">printf</span><span class="special">(</span><span class="string">"Parsed: %c\n"</span><span class="special">,</span><span class="identifier">c</span><span class="special">);</span>
512 <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">c</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">(</span><span class="char">'\0'</span><span class="special">);</span>
513 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
514 <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>
515 <span class="special">}</span>
516 <span class="special">}</span>
517
518 <span class="identifier">output</span><span class="special">:</span>
519 <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
520 <span class="identifier">Parsed</span><span class="special">:</span> <span class="special">+</span>
521 <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
522 </pre>
523 <p>
524 In this example a recursive descent parser uses a callback to emit a newly
525 passed symbol. Using <span class="emphasis"><em>execution_context</em></span> the control flow
526 can be inverted, e.g. the user-code pulls parsed symbols from the parser -
527 instead to get pushed from the parser (via callback).
528 </p>
529 <p>
530 The data (character) is transferred between the two <span class="emphasis"><em>execution_context</em></span>.
531 </p>
532 <p>
533 If the code executed by <span class="emphasis"><em>execution_context</em></span> emits an exception,
534 the application is terminated. <span class="emphasis"><em>std::exception_ptr</em></span> can
535 be used to transfer exceptions between different execution contexts.
536 </p>
537 <p>
538 Sometimes it is necessary to unwind the stack of an unfinished context to destroy
539 local stack variables so they can release allocated resources (RAII pattern).
540 The user is responsible for this task.
541 </p>
542 <h4>
543 <a name="context.ecv2.h7"></a>
544 <span><a name="context.ecv2.class__code__phrase_role__identifier__execution_context__phrase___code_"></a></span><a class="link" href="ecv2.html#context.ecv2.class__code__phrase_role__identifier__execution_context__phrase___code_">Class
545 <code class="computeroutput"><span class="identifier">execution_context</span></code></a>
546 </h4>
547 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">exec_ontop_arg_t</span> <span class="special">{};</span>
548 <span class="keyword">const</span> <span class="identifier">exec_ontop_arg_t</span> <span class="identifier">exec_ontop_arg</span><span class="special">{};</span>
549
550 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
551 <span class="keyword">class</span> <span class="identifier">execution_context</span> <span class="special">{</span>
552 <span class="keyword">public</span><span class="special">:</span>
553 <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">Params</span> <span class="special">&gt;</span>
554 <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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">);</span>
555
556 <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">Params</span> <span class="special">&gt;</span>
557 <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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">);</span>
558
559 <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">Params</span> <span class="special">&gt;</span>
560 <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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">);</span>
561
562 <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">Params</span> <span class="special">&gt;</span>
563 <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">segemented_stack</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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
564
565 <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">Params</span> <span class="special">&gt;</span>
566 <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">segmented</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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">)=</span> <span class="keyword">delete</span><span class="special">;</span>
567
568 <span class="special">~</span><span class="identifier">execution_context</span><span class="special">();</span>
569
570 <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>
571 <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>
572
573 <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> <span class="keyword">delete</span><span class="special">;</span>
574 <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> <span class="keyword">delete</span><span class="special">;</span>
575
576 <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>
577 <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>
578
579 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">...</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">Args</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
580
581 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span> <span class="special">&gt;</span>
582 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">,</span> <span class="identifier">Args</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">...</span> <span class="identifier">args</span><span class="special">);</span>
583
584 <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>
585
586 <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>
587
588 <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>
589
590 <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>
591
592 <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>
593
594 <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>
595
596 <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>
597 <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>
598 <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>
599 <span class="special">};</span>
600 </pre>
601 <p>
602 </p>
603 <h5>
604 <a name="ecv2_constructor_bridgehead"></a>
605 <span><a name="ecv2_constructor"></a></span>
606 <a class="link" href="ecv2.html#ecv2_constructor">Constructor</a>
607 </h5>
608 <p>
609 </p>
610 <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">Params</span> <span class="special">&gt;</span>
611 <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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">);</span>
612
613 <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">Params</span> <span class="special">&gt;</span>
614 <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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">);</span>
615
616 <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">Params</span> <span class="special">&gt;</span>
617 <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">Params</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">params</span><span class="special">);</span>
618 </pre>
619 <div class="variablelist">
620 <p class="title"><b></b></p>
621 <dl>
622 <dt><span class="term">Effects:</span></dt>
623 <dd><p>
624 Creates a new execution context and prepares the context to execute
625 <code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code>
626 is used as default stack allocator (stack size == fixedsize_stack::traits::default_size()).
627 The constructor with argument type <code class="computeroutput"><span class="identifier">preallocated</span></code>,
628 is used to create a user defined data <a class="link" href="ecv2.html#ecv2_prealloc">(for
629 instance additional control structures)</a> on top of the stack.
630 </p></dd>
631 </dl>
632 </div>
633 <p>
634 </p>
635 <h5>
636 <a name="ecv2_destructor%20destructor_bridgehead"></a>
637 <span><a name="ecv2_destructor%20destructor"></a></span>
638 <a class="link" href="ecv2.html#ecv2_destructor%20destructor">Destructor</a>
639 </h5>
640 <p>
641 </p>
642 <pre class="programlisting"><span class="special">~</span><span class="identifier">execution_context</span><span class="special">();</span>
643 </pre>
644 <div class="variablelist">
645 <p class="title"><b></b></p>
646 <dl>
647 <dt><span class="term">Effects:</span></dt>
648 <dd><p>
649 Destructs the associated stack if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is a valid context, e.g. <span class="emphasis"><em>execution_context::operator
650 bool()</em></span> returns <code class="computeroutput"><span class="keyword">true</span></code>.
651 </p></dd>
652 <dt><span class="term">Throws:</span></dt>
653 <dd><p>
654 Nothing.
655 </p></dd>
656 </dl>
657 </div>
658 <p>
659 </p>
660 <h5>
661 <a name="ecv2_move%20constructor_bridgehead"></a>
662 <span><a name="ecv2_move%20constructor"></a></span>
663 <a class="link" href="ecv2.html#ecv2_move%20constructor">Move
664 constructor</a>
665 </h5>
666 <p>
667 </p>
668 <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>
669 </pre>
670 <div class="variablelist">
671 <p class="title"><b></b></p>
672 <dl>
673 <dt><span class="term">Effects:</span></dt>
674 <dd><p>
675 Moves underlying capture record to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
676 </p></dd>
677 <dt><span class="term">Throws:</span></dt>
678 <dd><p>
679 Nothing.
680 </p></dd>
681 </dl>
682 </div>
683 <p>
684 </p>
685 <h5>
686 <a name="ecv2_move%20assignment_bridgehead"></a>
687 <span><a name="ecv2_move%20assignment"></a></span>
688 <a class="link" href="ecv2.html#ecv2_move%20assignment">Move
689 assignment operator</a>
690 </h5>
691 <p>
692 </p>
693 <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>
694 </pre>
695 <div class="variablelist">
696 <p class="title"><b></b></p>
697 <dl>
698 <dt><span class="term">Effects:</span></dt>
699 <dd><p>
700 Moves the state of <code class="computeroutput"><span class="identifier">other</span></code>
701 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
702 using move semantics.
703 </p></dd>
704 <dt><span class="term">Throws:</span></dt>
705 <dd><p>
706 Nothing.
707 </p></dd>
708 </dl>
709 </div>
710 <p>
711 </p>
712 <h5>
713 <a name="ecv2_operator_bool_bridgehead"></a>
714 <span><a name="ecv2_operator_bool"></a></span>
715 <a class="link" href="ecv2.html#ecv2_operator_bool">Member function
716 <code class="computeroutput">operator bool</code>()</a>
717 </h5>
718 <p>
719 </p>
720 <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>
721 </pre>
722 <div class="variablelist">
723 <p class="title"><b></b></p>
724 <dl>
725 <dt><span class="term">Returns:</span></dt>
726 <dd><p>
727 <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.
728 </p></dd>
729 <dt><span class="term">Throws:</span></dt>
730 <dd><p>
731 Nothing.
732 </p></dd>
733 </dl>
734 </div>
735 <p>
736 </p>
737 <h5>
738 <a name="ecv2_operator_not_bridgehead"></a>
739 <span><a name="ecv2_operator_not"></a></span>
740 <a class="link" href="ecv2.html#ecv2_operator_not">Member function
741 <code class="computeroutput">operator!</code>()</a>
742 </h5>
743 <p>
744 </p>
745 <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>
746 </pre>
747 <div class="variablelist">
748 <p class="title"><b></b></p>
749 <dl>
750 <dt><span class="term">Returns:</span></dt>
751 <dd><p>
752 <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.
753 </p></dd>
754 <dt><span class="term">Throws:</span></dt>
755 <dd><p>
756 Nothing.
757 </p></dd>
758 </dl>
759 </div>
760 <p>
761 </p>
762 <h5>
763 <a name="ecv2_operator_call_bridgehead"></a>
764 <span><a name="ecv2_operator_call"></a></span>
765 <a class="link" href="ecv2.html#ecv2_operator_call">Member function
766 <code class="computeroutput">operator()</code>()</a>
767 </h5>
768 <p>
769 </p>
770 <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">execution_context</span><span class="special">&lt;</span> <span class="identifier">Args</span> <span class="special">...</span> <span class="special">&gt;,</span> <span class="identifier">Args</span> <span class="special">...</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">Args</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span> <span class="comment">// member of generic execution_context template</span>
771
772 <span class="identifier">execution_context</span><span class="special">&lt;</span> <span class="keyword">void</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()();</span> <span class="comment">// member of execution_context&lt; void &gt;</span>
773 </pre>
774 <div class="variablelist">
775 <p class="title"><b></b></p>
776 <dl>
777 <dt><span class="term">Effects:</span></dt>
778 <dd><p>
779 Stores internally the current context data (stack pointer, instruction
780 pointer, and CPU registers) of the current active context and restores
781 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
782 context. The arguments, <code class="computeroutput"><span class="special">...</span> <span class="identifier">args</span></code>, are passed to the current context
783 to be returned by the most recent call 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.
784 </p></dd>
785 <dt><span class="term">Returns:</span></dt>
786 <dd><p>
787 The tuple of execution_context and returned arguments passed to the most
788 recent call to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>, if any and a execution_context representing
789 the context that has been suspended.
790 </p></dd>
791 <dt><span class="term">Note:</span></dt>
792 <dd><p>
793 The returned execution_context indicates if the suspended context has
794 terminated (return from context-function) via <code class="computeroutput"><span class="keyword">bool</span>
795 <span class="keyword">operator</span><span class="special">()</span></code>.
796 If the returned execution_context has terminated no data are transferred
797 in the returned tuple.
798 </p></dd>
799 </dl>
800 </div>
801 <p>
802 </p>
803 <h5>
804 <a name="ecv2_operator_call_ontop_bridgehead"></a>
805 <span><a name="ecv2_operator_call_ontop"></a></span>
806 <a class="link" href="ecv2.html#ecv2_operator_call_ontop">Member
807 function <code class="computeroutput">operator()</code>()</a>
808 </h5>
809 <p>
810 </p>
811 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span> <span class="special">&gt;</span>
812 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">execution_context</span><span class="special">&lt;</span> <span class="identifier">Args</span> <span class="special">...</span> <span class="special">&gt;,</span> <span class="identifier">Args</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">...</span> <span class="identifier">args</span><span class="special">);</span> <span class="comment">// member of generic execution_context</span>
813
814 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span> <span class="special">&gt;</span>
815 <span class="identifier">execution_context</span><span class="special">&lt;</span> <span class="keyword">void</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="comment">// member of execution_context&lt; void &gt;</span>
816 </pre>
817 <div class="variablelist">
818 <p class="title"><b></b></p>
819 <dl>
820 <dt><span class="term">Effects:</span></dt>
821 <dd><p>
822 Same as <span class="emphasis"><em>execution_context::operator()</em></span>. Additionally,
823 function <code class="computeroutput"><span class="identifier">fn</span></code> is executed
824 in the context of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
825 (e.g. the stack frame of <code class="computeroutput"><span class="identifier">fn</span></code>
826 is allocated on stack of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>).
827 </p></dd>
828 <dt><span class="term">Returns:</span></dt>
829 <dd><p>
830 The tuple of execution_context and returned arguments passed to the most
831 recent call to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>, if any and a execution_context representing
832 the context that has been suspended .
833 </p></dd>
834 <dt><span class="term">Note:</span></dt>
835 <dd><p>
836 The tuple of execution_context and returned arguments from <code class="computeroutput"><span class="identifier">fn</span></code> are passed as arguments to the context-function
837 of resumed context (if the context is entered the first time) or those
838 arguments are returned from <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> within the resumed context.
839 </p></dd>
840 <dt><span class="term">Note:</span></dt>
841 <dd><p>
842 Function <code class="computeroutput"><span class="identifier">fn</span></code> needs to
843 return a tuple of execution_context and arguments (<a class="link" href="ecv2.html#ecv2_ontop">see
844 description</a>).
845 </p></dd>
846 <dt><span class="term">Note:</span></dt>
847 <dd><p>
848 The context calling this function must not be destroyed before the arguments,
849 that will be returned from <code class="computeroutput"><span class="identifier">fn</span></code>,
850 are preserved at least in the stack frame of the resumed context.
851 </p></dd>
852 <dt><span class="term">Note:</span></dt>
853 <dd><p>
854 The returned execution_context indicates if the suspended context has
855 terminated (return from context-function) via <code class="computeroutput"><span class="keyword">bool</span>
856 <span class="keyword">operator</span><span class="special">()</span></code>.
857 If the returned execution_context has terminated no data are transferred
858 in the returned tuple.
859 </p></dd>
860 </dl>
861 </div>
862 <p>
863 </p>
864 <h5>
865 <a name="ecv2_operator_equal_bridgehead"></a>
866 <span><a name="ecv2_operator_equal"></a></span>
867 <a class="link" href="ecv2.html#ecv2_operator_equal">Member
868 function <code class="computeroutput">operator==</code>()</a>
869 </h5>
870 <p>
871 </p>
872 <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>
873 </pre>
874 <div class="variablelist">
875 <p class="title"><b></b></p>
876 <dl>
877 <dt><span class="term">Returns:</span></dt>
878 <dd><p>
879 <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>
880 represent the same execution context, <code class="computeroutput"><span class="keyword">false</span></code>
881 otherwise.
882 </p></dd>
883 <dt><span class="term">Throws:</span></dt>
884 <dd><p>
885 Nothing.
886 </p></dd>
887 </dl>
888 </div>
889 <p>
890 </p>
891 <h5>
892 <a name="ecv2_operator_notequal_bridgehead"></a>
893 <span><a name="ecv2_operator_notequal"></a></span>
894 <a class="link" href="ecv2.html#ecv2_operator_notequal">Member
895 function <code class="computeroutput">operator!=</code>()</a>
896 </h5>
897 <p>
898 </p>
899 <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>
900 </pre>
901 <div class="variablelist">
902 <p class="title"><b></b></p>
903 <dl>
904 <dt><span class="term">Returns:</span></dt>
905 <dd><p>
906 <code class="computeroutput">! (other == * this)</code>
907 </p></dd>
908 <dt><span class="term">Throws:</span></dt>
909 <dd><p>
910 Nothing.
911 </p></dd>
912 </dl>
913 </div>
914 <p>
915 </p>
916 <h5>
917 <a name="ecv2_operator_less_bridgehead"></a>
918 <span><a name="ecv2_operator_less"></a></span>
919 <a class="link" href="ecv2.html#ecv2_operator_less">Member function
920 <code class="computeroutput">operator&lt;</code>()</a>
921 </h5>
922 <p>
923 </p>
924 <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>
925 </pre>
926 <div class="variablelist">
927 <p class="title"><b></b></p>
928 <dl>
929 <dt><span class="term">Returns:</span></dt>
930 <dd><p>
931 <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
932 total order of <code class="computeroutput"><span class="identifier">execution_context</span></code>
933 values places <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
934 before <code class="computeroutput"><span class="identifier">other</span></code>, false otherwise.
935 </p></dd>
936 <dt><span class="term">Throws:</span></dt>
937 <dd><p>
938 Nothing.
939 </p></dd>
940 </dl>
941 </div>
942 <p>
943 </p>
944 <h5>
945 <a name="ecv2_operator_greater_bridgehead"></a>
946 <span><a name="ecv2_operator_greater"></a></span>
947 <a class="link" href="ecv2.html#ecv2_operator_greater">Member
948 function <code class="computeroutput">operator&gt;</code>()</a>
949 </h5>
950 <p>
951 </p>
952 <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>
953 </pre>
954 <div class="variablelist">
955 <p class="title"><b></b></p>
956 <dl>
957 <dt><span class="term">Returns:</span></dt>
958 <dd><p>
959 <code class="computeroutput"><span class="identifier">other</span> <span class="special">&lt;</span>
960 <span class="special">*</span> <span class="keyword">this</span></code>
961 </p></dd>
962 <dt><span class="term">Throws:</span></dt>
963 <dd><p>
964 Nothing.
965 </p></dd>
966 </dl>
967 </div>
968 <p>
969 </p>
970 <h5>
971 <a name="ecv2_operator_lesseq_bridgehead"></a>
972 <span><a name="ecv2_operator_lesseq"></a></span>
973 <a class="link" href="ecv2.html#ecv2_operator_lesseq">Member
974 function <code class="computeroutput">operator&lt;=</code>()</a>
975 </h5>
976 <p>
977 </p>
978 <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>
979 </pre>
980 <div class="variablelist">
981 <p class="title"><b></b></p>
982 <dl>
983 <dt><span class="term">Returns:</span></dt>
984 <dd><p>
985 <code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special">&lt;</span>
986 <span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code>
987 </p></dd>
988 <dt><span class="term">Throws:</span></dt>
989 <dd><p>
990 Nothing.
991 </p></dd>
992 </dl>
993 </div>
994 <p>
995 </p>
996 <h5>
997 <a name="ecv2_operator_greatereq_bridgehead"></a>
998 <span><a name="ecv2_operator_greatereq"></a></span>
999 <a class="link" href="ecv2.html#ecv2_operator_greatereq">Member
1000 function <code class="computeroutput">operator&gt;=</code>()</a>
1001 </h5>
1002 <p>
1003 </p>
1004 <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>
1005 </pre>
1006 <div class="variablelist">
1007 <p class="title"><b></b></p>
1008 <dl>
1009 <dt><span class="term">Returns:</span></dt>
1010 <dd><p>
1011 <code class="computeroutput"><span class="special">!</span> <span class="special">(*</span>
1012 <span class="keyword">this</span> <span class="special">&lt;</span>
1013 <span class="identifier">other</span><span class="special">)</span></code>
1014 </p></dd>
1015 <dt><span class="term">Throws:</span></dt>
1016 <dd><p>
1017 Nothing.
1018 </p></dd>
1019 </dl>
1020 </div>
1021 <p>
1022 </p>
1023 <h5>
1024 <a name="ecv2__bridgehead"></a>
1025 <span><a name="ecv2_"></a></span>
1026 <a class="link" href="ecv2.html#ecv2_">Non-member function <code class="computeroutput">operator&lt;&lt;()</code></a>
1027 </h5>
1028 <p>
1029 </p>
1030 <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>
1031 <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>
1032 <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>
1033 </pre>
1034 <div class="variablelist">
1035 <p class="title"><b></b></p>
1036 <dl>
1037 <dt><span class="term">Efects:</span></dt>
1038 <dd><p>
1039 Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code>
1040 to stream <code class="computeroutput"><span class="identifier">os</span></code>.
1041 </p></dd>
1042 <dt><span class="term">Returns:</span></dt>
1043 <dd><p>
1044 <code class="computeroutput"><span class="identifier">os</span></code>
1045 </p></dd>
1046 </dl>
1047 </div>
1048 </div>
1049 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1050 <td align="left"></td>
1051 <td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
1052 Distributed under the Boost Software License, Version 1.0. (See accompanying
1053 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>)
1054 </p>
1055 </div></td>
1056 </tr></table>
1057 <hr>
1058 <div class="spirit-nav">
1059 <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="ecv1.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
1060 </div>
1061 </body>
1062 </html>