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 1. Context">
8 <link rel=
"up" href=
"../index.html" title=
"Chapter 1. Context">
9 <link rel=
"prev" href=
"requirements.html" title=
"Requirements">
10 <link rel=
"next" href=
"ecv1.html" title=
"Class execution_context (version 1)">
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>
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>
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
29 </h2></div></div></div>
30 <div class=
"note"><table border=
"0" summary=
"Note">
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>
35 <tr><td align=
"left" valign=
"top"><p>
36 This class is enabled per default.
40 Class
<span class=
"emphasis"><em>execution_context
</em></span> encapsulates context switching
41 and manages the associated context' stack (allocation/deallocation).
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.
59 <span class=
"emphasis"><em>execution_context
</em></span> is only move-constructible and move-assignable.
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
69 <div class=
"important"><table border=
"0" summary=
"Important">
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>
74 <tr><td align=
"left" valign=
"top"><p>
75 Segmented stacks are not supported by
<span class=
"emphasis"><em>execution_context
</em></span>
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
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.
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.
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.
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>
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"><</span><span class=
"keyword">int
</span><span class=
"special">></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"><</span><span class=
"keyword">int
</span><span class=
"special">></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">--
></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"><</span><span class=
"number">0</span><span class=
"special">>(
</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"><</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"><</span><span class=
"number">0</span><span class=
"special">>(
</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"><<</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">get
</span><span class=
"special"><</span><span class=
"number">1</span><span class=
"special">>(
</span><span class=
"identifier">result
</span><span class=
"special">)
<<</span><span class=
"string">" "</span><span class=
"special">;
</span>
130 <span class=
"special">}
</span>
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>
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>
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
<></em></span> as transferred type,
154 might also appropriate to express this fact.
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.
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
168 With
<code class=
"computeroutput"><span class=
"identifier">execution_context
</span><span class=
"special"><</span><span class=
"keyword">void
</span><span class=
"special">></span></code> no
169 data will be transferred, only the context switch is executed.
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"><</span><span class=
"keyword">void
</span><span class=
"special">></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"><</span><span class=
"keyword">void
</span><span class=
"special">></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>
177 <span class=
"identifier">output
</span><span class=
"special">:
</span>
178 <span class=
"identifier">inside
</span> <span class=
"identifier">ctx1
</span>
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>.
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.
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"><</span><span class=
"keyword">int
</span><span class=
"special">></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"><</span><span class=
"keyword">int
</span><span class=
"special">></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>
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>
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>.
220 If more than one argument has to be transferred, the signature of the context-function
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"><</span><span class=
"keyword">int
</span><span class=
"special">,
</span><span class=
"keyword">int
</span><span class=
"special">></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"><</span><span class=
"keyword">int
</span><span class=
"special">,
</span><span class=
"keyword">int
</span><span class=
"special">></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>
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>
236 For use-cases, that require to transfer data of different type in each direction,
237 <span class=
"emphasis"><em>boost::variant
<></em></span> could be used.
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"><</span><span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">variant
</span><span class=
"special"><</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">>></span> <span class=
"identifier">ctx_
</span><span class=
"special">;
</span>
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"><</span><span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">variant
</span><span class=
"special"><</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">>></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"><</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">></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"><</span><span class=
"keyword">int
</span><span class=
"special">>(
</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"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">string
</span><span class=
"special">>(
</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"><</span><span class=
"number">0</span><span class=
"special">>(
</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"><</span><span class=
"number">1</span><span class=
"special">>(
</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">&)
</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>
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"><</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">></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"><</span><span class=
"number">0</span><span class=
"special">>(
</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"><</span><span class=
"number">1</span><span class=
"special">>(
</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"><</span><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">string
</span><span class=
"special">>(
</span><span class=
"identifier">data
</span><span class=
"special">);
</span>
272 <span class=
"special">}
</span>
273 <span class=
"special">};
</span>
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"><<</span> <span class=
"identifier">x
</span><span class=
"special">(
</span> <span class=
"number">7</span><span class=
"special">)
</span> <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">endl
</span><span class=
"special">;
</span>
278 <span class=
"identifier">output
</span><span class=
"special">:
</span>
279 <span class=
"number">7</span>
282 In the case of unidirectional transfer of data,
<span class=
"emphasis"><em>boost::optional
<></em></span>
283 or a pointer are appropriate.
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
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.
296 <div class=
"important"><table border=
"0" summary=
"Important">
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>
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.
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>
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
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"><</span><span class=
"keyword">int
</span><span class=
"special">></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"><</span><span class=
"keyword">int
</span><span class=
"special">></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"><<</span> <span class=
"string">"f1: entered first time: "</span> <span class=
"special"><<</span> <span class=
"identifier">data
</span> <span class=
"special"><<</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"><<</span> <span class=
"string">"f1: entered second time: "</span> <span class=
"special"><<</span> <span class=
"identifier">data
</span> <span class=
"special"><<</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"><<</span> <span class=
"string">"f1: entered third time: "</span> <span class=
"special"><<</span> <span class=
"identifier">data
</span> <span class=
"special"><<</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>
327 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">tuple
</span><span class=
"special"><</span><span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">context
</span><span class=
"special">::
</span><span class=
"identifier">execution_context
</span><span class=
"special"><</span><span class=
"keyword">int
</span><span class=
"special">>,
</span><span class=
"keyword">int
</span><span class=
"special">></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"><</span><span class=
"keyword">int
</span><span class=
"special">></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"><<</span> <span class=
"string">"f2: entered: "</span> <span class=
"special"><<</span> <span class=
"identifier">data
</span> <span class=
"special"><<</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>
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"><</span> <span class=
"keyword">int
</span> <span class=
"special">></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"><<</span> <span class=
"string">"f1: returned first time: "</span> <span class=
"special"><<</span> <span class=
"identifier">data
</span> <span class=
"special"><<</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"><<</span> <span class=
"string">"f1: returned second time: "</span> <span class=
"special"><<</span> <span class=
"identifier">data
</span> <span class=
"special"><<</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>
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>
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>.
357 Another option is to execute a function on top of the context that throws an
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"><</span> <span class=
"keyword">void
</span> <span class=
"special">></span> <span class=
"identifier">ctx
</span><span class=
"special">;
</span>
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"><</span> <span class=
"keyword">void
</span> <span class=
"special">></span> <span class=
"special">&&</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"><</span> <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">context
</span><span class=
"special">::
</span><span class=
"identifier">execution_context
</span><span class=
"special"><</span> <span class=
"keyword">void
</span> <span class=
"special">></span> <span class=
"special">>(
</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>
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"><</span><span class=
"keyword">void
</span><span class=
"special">></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"><</span><span class=
"keyword">void
</span><span class=
"special">></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"><<</span> <span class=
"string">"f1()"</span> <span class=
"special"><<</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">&</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"><<</span> <span class=
"string">"f1(): interrupted"</span> <span class=
"special"><<</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>
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"><</span><span class=
"keyword">void
</span><span class=
"special">></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"><</span><span class=
"keyword">void
</span><span class=
"special">></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>
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"><</span> <span class=
"keyword">void
</span> <span class=
"special">></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>
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>
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>.
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
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.
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>
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.
424 <div class=
"note"><table border=
"0" summary=
"Note">
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>
429 <tr><td align=
"left" valign=
"top"><p>
430 The user is responsible for destructing the control structure at the top
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"><</span> <span class=
"keyword">char
</span> <span class=
"special">*
</span> <span class=
"special">>(
</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">-
>~
</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>
451 <span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">StackAllocator
</span> <span class=
"special">></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>
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
464 <pre class=
"programlisting"><span class=
"comment">/*
467 * E ---
> T {('+'|'-') T}
468 * T ---
> S {('*'|'/') S}
469 * S ---
> digit | '(' E ')'
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>
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>
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"><</span><span class=
"keyword">char
</span><span class=
"special">></span> <span class=
"identifier">source
</span><span class=
"special">(
</span>
481 <span class=
"special">[
&</span><span class=
"identifier">is
</span><span class=
"special">,
&</span><span class=
"identifier">done
</span><span class=
"special">,
&</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"><</span><span class=
"keyword">char
</span><span class=
"special">></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">[
&</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"><</span><span class=
"number">0</span><span class=
"special">>(
</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>
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"><</span><span class=
"number">0</span><span class=
"special">>(
</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"><</span><span class=
"number">1</span><span class=
"special">>(
</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>
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>
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).
530 The data (character) is transferred between the two
<span class=
"emphasis"><em>execution_context
</em></span>.
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.
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.
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>
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>
550 <span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"special">...
</span> <span class=
"identifier">Args
</span> <span class=
"special">></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"><</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">></span>
554 <span class=
"identifier">execution_context
</span><span class=
"special">(
</span> <span class=
"identifier">Fn
</span> <span class=
"special">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">params
</span><span class=
"special">);
</span>
556 <span class=
"keyword">template
</span><span class=
"special"><</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">></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">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">params
</span><span class=
"special">);
</span>
559 <span class=
"keyword">template
</span><span class=
"special"><</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">></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">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">params
</span><span class=
"special">);
</span>
562 <span class=
"keyword">template
</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">></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">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</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>
565 <span class=
"keyword">template
</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">></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">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">params
</span><span class=
"special">)=
</span> <span class=
"keyword">delete
</span><span class=
"special">;
</span>
568 <span class=
"special">~
</span><span class=
"identifier">execution_context
</span><span class=
"special">();
</span>
570 <span class=
"identifier">execution_context
</span><span class=
"special">(
</span> <span class=
"identifier">execution_context
</span> <span class=
"special">&&</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">&</span> <span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">execution_context
</span> <span class=
"special">&&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
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">&</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">&</span> <span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">execution_context
</span> <span class=
"keyword">const
</span><span class=
"special">&</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>
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>
579 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">tuple
</span><span class=
"special"><</span> <span class=
"identifier">execution_context
</span><span class=
"special">,
</span> <span class=
"identifier">Args
</span> <span class=
"special">...
</span> <span class=
"special">></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>
581 <span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">Fn
</span> <span class=
"special">></span>
582 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">tuple
</span><span class=
"special"><</span> <span class=
"identifier">execution_context
</span><span class=
"special">,
</span> <span class=
"identifier">Args
</span> <span class=
"special">...
</span> <span class=
"special">></span> <span class=
"keyword">operator
</span><span class=
"special">()(
</span> <span class=
"identifier">exec_ontop_arg_t
</span><span class=
"special">,
</span> <span class=
"identifier">Fn
</span> <span class=
"special">&&</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>
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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
588 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
590 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
592 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
594 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
596 <span class=
"keyword">template
</span><span class=
"special"><</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">></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"><</span> <span class=
"identifier">charT
</span><span class=
"special">,
</span> <span class=
"identifier">traitsT
</span> <span class=
"special">></span> <span class=
"special">&</span>
598 <span class=
"keyword">operator
</span><span class=
"special"><<(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">basic_ostream
</span><span class=
"special"><</span> <span class=
"identifier">charT
</span><span class=
"special">,
</span> <span class=
"identifier">traitsT
</span> <span class=
"special">></span> <span class=
"special">&</span> <span class=
"identifier">os
</span><span class=
"special">,
</span> <span class=
"identifier">execution_context
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">other
</span><span class=
"special">);
</span>
599 <span class=
"special">};
</span>
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>
610 <pre class=
"programlisting"><span class=
"keyword">template
</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">></span>
611 <span class=
"identifier">execution_context
</span><span class=
"special">(
</span> <span class=
"identifier">Fn
</span> <span class=
"special">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">params
</span><span class=
"special">);
</span>
613 <span class=
"keyword">template
</span><span class=
"special"><</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">></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">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">params
</span><span class=
"special">);
</span>
616 <span class=
"keyword">template
</span><span class=
"special"><</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">></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">&&</span> <span class=
"identifier">fn
</span><span class=
"special">,
</span> <span class=
"identifier">Params
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">params
</span><span class=
"special">);
</span>
619 <div class=
"variablelist">
620 <p class=
"title"><b></b></p>
622 <dt><span class=
"term">Effects:
</span></dt>
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.
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>
642 <pre class=
"programlisting"><span class=
"special">~
</span><span class=
"identifier">execution_context
</span><span class=
"special">();
</span>
644 <div class=
"variablelist">
645 <p class=
"title"><b></b></p>
647 <dt><span class=
"term">Effects:
</span></dt>
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>.
652 <dt><span class=
"term">Throws:
</span></dt>
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
668 <pre class=
"programlisting"><span class=
"identifier">execution_context
</span><span class=
"special">(
</span> <span class=
"identifier">execution_context
</span> <span class=
"special">&&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
670 <div class=
"variablelist">
671 <p class=
"title"><b></b></p>
673 <dt><span class=
"term">Effects:
</span></dt>
675 Moves underlying capture record to
<code class=
"computeroutput"><span class=
"special">*
</span><span class=
"keyword">this
</span></code>.
677 <dt><span class=
"term">Throws:
</span></dt>
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>
693 <pre class=
"programlisting"><span class=
"identifier">execution_context
</span> <span class=
"special">&</span> <span class=
"keyword">operator
</span><span class=
"special">=(
</span> <span class=
"identifier">execution_context
</span> <span class=
"special">&&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
695 <div class=
"variablelist">
696 <p class=
"title"><b></b></p>
698 <dt><span class=
"term">Effects:
</span></dt>
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.
704 <dt><span class=
"term">Throws:
</span></dt>
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>
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>
722 <div class=
"variablelist">
723 <p class=
"title"><b></b></p>
725 <dt><span class=
"term">Returns:
</span></dt>
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.
729 <dt><span class=
"term">Throws:
</span></dt>
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>
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>
747 <div class=
"variablelist">
748 <p class=
"title"><b></b></p>
750 <dt><span class=
"term">Returns:
</span></dt>
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.
754 <dt><span class=
"term">Throws:
</span></dt>
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>
770 <pre class=
"programlisting"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">tuple
</span><span class=
"special"><</span> <span class=
"identifier">execution_context
</span><span class=
"special"><</span> <span class=
"identifier">Args
</span> <span class=
"special">...
</span> <span class=
"special">>,
</span> <span class=
"identifier">Args
</span> <span class=
"special">...
</span> <span class=
"special">></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>
772 <span class=
"identifier">execution_context
</span><span class=
"special"><</span> <span class=
"keyword">void
</span> <span class=
"special">></span> <span class=
"keyword">operator
</span><span class=
"special">()();
</span> <span class=
"comment">// member of execution_context
< void
></span>
774 <div class=
"variablelist">
775 <p class=
"title"><b></b></p>
777 <dt><span class=
"term">Effects:
</span></dt>
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.
785 <dt><span class=
"term">Returns:
</span></dt>
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.
791 <dt><span class=
"term">Note:
</span></dt>
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.
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>
811 <pre class=
"programlisting"><span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">Fn
</span> <span class=
"special">></span>
812 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">tuple
</span><span class=
"special"><</span> <span class=
"identifier">execution_context
</span><span class=
"special"><</span> <span class=
"identifier">Args
</span> <span class=
"special">...
</span> <span class=
"special">>,
</span> <span class=
"identifier">Args
</span> <span class=
"special">...
</span> <span class=
"special">></span> <span class=
"keyword">operator
</span><span class=
"special">()(
</span> <span class=
"identifier">exec_ontop_arg_t
</span><span class=
"special">,
</span> <span class=
"identifier">Fn
</span> <span class=
"special">&&</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>
814 <span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">Fn
</span> <span class=
"special">></span>
815 <span class=
"identifier">execution_context
</span><span class=
"special"><</span> <span class=
"keyword">void
</span> <span class=
"special">></span> <span class=
"keyword">operator
</span><span class=
"special">()(
</span> <span class=
"identifier">exec_ontop_arg_t
</span><span class=
"special">,
</span> <span class=
"identifier">Fn
</span> <span class=
"special">&&</span> <span class=
"identifier">fn
</span><span class=
"special">);
</span> <span class=
"comment">// member of execution_context
< void
></span>
817 <div class=
"variablelist">
818 <p class=
"title"><b></b></p>
820 <dt><span class=
"term">Effects:
</span></dt>
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>).
828 <dt><span class=
"term">Returns:
</span></dt>
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 .
834 <dt><span class=
"term">Note:
</span></dt>
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.
840 <dt><span class=
"term">Note:
</span></dt>
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
846 <dt><span class=
"term">Note:
</span></dt>
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.
852 <dt><span class=
"term">Note:
</span></dt>
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.
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>
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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
874 <div class=
"variablelist">
875 <p class=
"title"><b></b></p>
877 <dt><span class=
"term">Returns:
</span></dt>
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>
883 <dt><span class=
"term">Throws:
</span></dt>
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>
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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
901 <div class=
"variablelist">
902 <p class=
"title"><b></b></p>
904 <dt><span class=
"term">Returns:
</span></dt>
906 <code class=
"computeroutput">! (other == * this)
</code>
908 <dt><span class=
"term">Throws:
</span></dt>
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
<</code>()
</a>
924 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
926 <div class=
"variablelist">
927 <p class=
"title"><b></b></p>
929 <dt><span class=
"term">Returns:
</span></dt>
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.
936 <dt><span class=
"term">Throws:
</span></dt>
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
></code>()
</a>
952 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
954 <div class=
"variablelist">
955 <p class=
"title"><b></b></p>
957 <dt><span class=
"term">Returns:
</span></dt>
959 <code class=
"computeroutput"><span class=
"identifier">other
</span> <span class=
"special"><</span>
960 <span class=
"special">*
</span> <span class=
"keyword">this
</span></code>
962 <dt><span class=
"term">Throws:
</span></dt>
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
<=
</code>()
</a>
978 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
980 <div class=
"variablelist">
981 <p class=
"title"><b></b></p>
983 <dt><span class=
"term">Returns:
</span></dt>
985 <code class=
"computeroutput"><span class=
"special">!
</span> <span class=
"special">(
</span><span class=
"identifier">other
</span> <span class=
"special"><</span>
986 <span class=
"special">*
</span> <span class=
"keyword">this
</span><span class=
"special">)
</span></code>
988 <dt><span class=
"term">Throws:
</span></dt>
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
>=
</code>()
</a>
1004 <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">&</span> <span class=
"identifier">other
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span> <span class=
"keyword">noexcept
</span><span class=
"special">;
</span>
1006 <div class=
"variablelist">
1007 <p class=
"title"><b></b></p>
1009 <dt><span class=
"term">Returns:
</span></dt>
1011 <code class=
"computeroutput"><span class=
"special">!
</span> <span class=
"special">(*
</span>
1012 <span class=
"keyword">this
</span> <span class=
"special"><</span>
1013 <span class=
"identifier">other
</span><span class=
"special">)
</span></code>
1015 <dt><span class=
"term">Throws:
</span></dt>
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
<<()
</code></a>
1030 <pre class=
"programlisting"><span class=
"keyword">template
</span><span class=
"special"><</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">></span>
1031 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">basic_ostream
</span><span class=
"special"><</span> <span class=
"identifier">charT
</span><span class=
"special">,
</span> <span class=
"identifier">traitsT
</span> <span class=
"special">></span> <span class=
"special">&</span>
1032 <span class=
"keyword">operator
</span><span class=
"special"><<(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">basic_ostream
</span><span class=
"special"><</span> <span class=
"identifier">charT
</span><span class=
"special">,
</span> <span class=
"identifier">traitsT
</span> <span class=
"special">></span> <span class=
"special">&</span> <span class=
"identifier">os
</span><span class=
"special">,
</span> <span class=
"identifier">execution_context
</span> <span class=
"keyword">const
</span><span class=
"special">&</span> <span class=
"identifier">other
</span><span class=
"special">);
</span>
1034 <div class=
"variablelist">
1035 <p class=
"title"><b></b></p>
1037 <dt><span class=
"term">Efects:
</span></dt>
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>.
1042 <dt><span class=
"term">Returns:
</span></dt>
1044 <code class=
"computeroutput"><span class=
"identifier">os
</span></code>
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
© 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>)
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>