1
0
mirror of https://github.com/tearshark/librf.git synced 2024-10-01 15:57:07 +08:00
librf/doxygen/html/state_8h_source.html
tearshark cd74eea532 完善文档。
上传Doxygen生成的文档。
2020-03-31 15:30:45 +08:00

407 lines
52 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>librf: librf/src/state.h 源文件</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">librf
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'搜索');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_3c80010775d22af2067790ecc9cdcf9d.html">librf</a></li><li class="navelem"><a class="el" href="dir_54ae0e78d997f6903cdf0996223d047f.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">state.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#pragma once</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; </div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="keyword">namespace </span>resumef</div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;{</div>
<div class="line"><a name="l00008"></a><span class="lineno"><a class="line" href="structresumef_1_1state__base__t.html"> 8</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; {</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">using</span> _Alloc_char = std::allocator&lt;char&gt;;</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; std::atomic&lt;intptr_t&gt; _count{0};</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keywordtype">void</span> lock()</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; {</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; ++_count;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; }</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keywordtype">void</span> unlock()</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; {</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keywordflow">if</span> (--_count == 0)</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; {</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; destroy_deallocate();</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; }</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; }</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="keyword">protected</span>:</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* _scheduler = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="comment">//可能来自协程里的promise产生的则经过co_await操作后_coro在初始时不会为nullptr。</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="comment">//也可能来自awaitable_t如果</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <span class="comment">// 一、经过co_await操作后_coro在初始时不会为nullptr。</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="comment">// 二、没有co_await操作直接加入到了调度器里则_coro在初始时为nullptr。调度器需要特殊处理此种情况。</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; coroutine_handle&lt;&gt; _coro;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; </div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keyword">virtual</span> ~<a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>();</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy_deallocate();</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> resume() = 0;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> has_handler() <span class="keyword">const</span> noexcept = 0;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keyword">virtual</span> <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* get_parent() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; </div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordtype">void</span> set_scheduler(<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* sch)</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; {</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; _scheduler = sch;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; }</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; coroutine_handle&lt;&gt; get_handler()<span class="keyword"> const</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">return</span> _coro;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; }</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; </div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* get_root() <span class="keyword">const</span> noexcept</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; {</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* root = <span class="keyword">const_cast&lt;</span><a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>);</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* next = root-&gt;get_parent();</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keywordflow">while</span> (next != <span class="keyword">nullptr</span>)</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; {</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; root = next;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; next = next-&gt;get_parent();</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; }</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">return</span> root;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; }</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* get_scheduler()<span class="keyword"> const</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">return</span> get_root()-&gt;_scheduler;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; }</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; };</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="structresumef_1_1state__generator__t.html"> 70</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1state__generator__t.html">state_generator_t</a> : <span class="keyword">public</span> <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; {</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy_deallocate() <span class="keyword">override</span>;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <a class="code" href="structresumef_1_1state__generator__t.html">state_generator_t</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> resume() <span class="keyword">override</span>;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> has_handler() <span class="keyword">const</span> noexcept <span class="keyword">override</span>;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordtype">bool</span> switch_scheduler_await_suspend(<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* sch);</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keywordtype">void</span> set_initial_suspend(coroutine_handle&lt;&gt; handler)</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; {</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; _coro = handler;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; }</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; </div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="preprocessor">#if RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keyword">static</span> <a class="code" href="structresumef_1_1state__generator__t.html">state_generator_t</a>* _Construct(<span class="keywordtype">void</span>* _Ptr)</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; {</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">return</span> <span class="keyword">new</span>(_Ptr) <a class="code" href="structresumef_1_1state__generator__t.html">state_generator_t</a>();</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; }</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keyword">static</span> <a class="code" href="structresumef_1_1state__generator__t.html">state_generator_t</a>* _Alloc_state();</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; };</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="structresumef_1_1state__future__t.html"> 98</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a> : <span class="keyword">public</span> <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; {</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">enum struct</span> initor_type : uint8_t</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; {</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; None,</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; Initial,</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; Final</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; };</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keyword">enum struct</span> result_type : uint8_t</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; {</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; None,</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; Value,</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; Exception,</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; };</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; </div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="comment">//typedef std::recursive_mutex lock_type;</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keyword">typedef</span> <a class="code" href="structresumef_1_1spinlock.html">spinlock</a> <a class="code" href="structresumef_1_1spinlock.html">lock_type</a>;</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keyword">protected</span>:</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keyword">mutable</span> <a class="code" href="structresumef_1_1spinlock.html">lock_type</a> _mtx;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; coroutine_handle&lt;&gt; _initor;</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>* _parent = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; intptr_t _id;</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; uint32_t _alloc_size = 0;</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="comment">//注意_has_value对齐到 4 Byte上后面必须紧跟 _is_future变量。两者能组合成一个uint16_t数据。</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; std::atomic&lt;result_type&gt; _has_value{ result_type::None };</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordtype">bool</span> _is_future;</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; initor_type _is_initor = initor_type::None;</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; static_assert(<span class="keyword">sizeof</span>(std::atomic&lt;result_type&gt;) == 1);</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; static_assert(<span class="keyword">alignof</span>(std::atomic&lt;result_type&gt;) == 1);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; static_assert(<span class="keyword">sizeof</span>(<span class="keywordtype">bool</span>) == 1);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; static_assert(<span class="keyword">alignof</span>(<span class="keywordtype">bool</span>) == 1);</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; static_assert(<span class="keyword">sizeof</span>(std::atomic&lt;initor_type&gt;) == 1);</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; static_assert(<span class="keyword">alignof</span>(std::atomic&lt;initor_type&gt;) == 1);</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keyword">protected</span>:</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keyword">explicit</span> <a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>(<span class="keywordtype">bool</span> awaitor)</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; {</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; _id = ++g_resumef_state_id;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; _is_future = !awaitor;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; }</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy_deallocate() <span class="keyword">override</span>;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> resume() <span class="keyword">override</span>;</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> has_handler() <span class="keyword">const</span> noexcept <span class="keyword">override</span>;</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keyword">virtual</span> <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* get_parent() <span class="keyword">const</span> noexcept <span class="keyword">override</span>;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; </div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_ready() <span class="keyword">const</span> noexcept</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; {</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160;<span class="preprocessor">#pragma warning(disable : 6326) //warning C6326: Potential comparison of a constant with another constant.</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="comment">//msvc认为是constexpr表达式(不写还给警告)然而clang不这么认为。</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="comment">//放弃constexpr反正合格的编译器都会优化掉这个if判断的。</span></div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">if</span> </div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;<span class="preprocessor">#ifndef __clang__</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; constexpr</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; (offsetof(<a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>, _is_future) - offsetof(<a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>, _has_value) == 1)</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">return</span> 0 != <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>std::atomic&lt;uint16_t&gt; &amp;<span class="keyword">&gt;</span>(_has_value).load(std::memory_order_acquire);</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">return</span> _has_value.load(std::memory_order_acquire) != result_type::None || _is_future;</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;<span class="preprocessor">#pragma warning(default : 6326)</span></div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; }</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> has_handler_skip_lock() <span class="keyword">const</span> noexcept</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; {</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">return</span> (<span class="keywordtype">bool</span>)_coro || _is_initor != initor_type::None;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; }</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; </div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keyword">inline</span> uint32_t get_alloc_size() <span class="keyword">const</span> noexcept</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; {</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keywordflow">return</span> _alloc_size;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; }</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; </div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> future_await_ready() noexcept</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; {</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="comment">//scoped_lock&lt;lock_type&gt; __guard(this-&gt;_mtx);</span></div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">return</span> _has_value.load(std::memory_order_acquire) != result_type::None;</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; }</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t&lt;traits::is_promise_v&lt;_PromiseT&gt;&gt;&gt;</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordtype">void</span> future_await_suspend(coroutine_handle&lt;_PromiseT&gt; handler);</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; </div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordtype">bool</span> switch_scheduler_await_suspend(<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* sch);</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; </div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t&lt;traits::is_promise_v&lt;_PromiseT&gt;&gt;&gt;</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordtype">void</span> promise_initial_suspend(coroutine_handle&lt;_PromiseT&gt; handler);</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t&lt;traits::is_promise_v&lt;_PromiseT&gt;&gt;&gt;</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordtype">void</span> promise_final_suspend(coroutine_handle&lt;_PromiseT&gt; handler);</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; </div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;<span class="preprocessor">#if RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keyword">static</span> _Sty* _Construct(<span class="keywordtype">void</span>* _Ptr, <span class="keywordtype">size_t</span> _Size)</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; {</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; _Sty* st = <span class="keyword">new</span>(_Ptr) _Sty(<span class="keyword">false</span>);</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; st-&gt;_alloc_size = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(_Size);</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; </div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordflow">return</span> st;</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; }</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keyword">static</span> <span class="keyword">inline</span> _Sty* _Alloc_state(<span class="keywordtype">bool</span> awaitor)</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; {</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; _Alloc_char _Al;</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordtype">size_t</span> _Size = _Align_size&lt;_Sty&gt;();</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;<span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot;state_future_t::alloc, size=&quot;</span> &lt;&lt; _Size &lt;&lt; std::endl;</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordtype">char</span>* _Ptr = _Al.allocate(_Size);</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; _Sty* st = <span class="keyword">new</span>(_Ptr) _Sty(awaitor);</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; st-&gt;_alloc_size = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(_Size);</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordflow">return</span> st;</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; }</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; };</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; </div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty&gt;</div>
<div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="structresumef_1_1state__t.html"> 217</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1state__t.html">state_t</a> final : <span class="keyword">public</span> <a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a></div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; {</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keyword">friend</span> <a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>;</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; </div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1spinlock.html">state_future_t::lock_type</a>;</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keyword">explicit</span> <a class="code" href="structresumef_1_1state__t.html">state_t</a>(<span class="keywordtype">bool</span> awaitor) :<a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>(awaitor) {}</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; ~<a class="code" href="structresumef_1_1state__t.html">state_t</a>()</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; {</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordflow">switch</span> (_has_value.load(std::memory_order_acquire))</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; {</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">case</span> result_type::Value:</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; _value.~value_type();</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">case</span> result_type::Exception:</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; _exception.~exception_ptr();</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; }</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; }</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; </div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keyword">auto</span> future_await_resume() -&gt; value_type;</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> U, <span class="keyword">typename</span> = std::enable_if_t&lt;traits::is_promise_v&lt;_PromiseT&gt;&gt;&gt;</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordtype">void</span> promise_yield_value(_PromiseT* promise, U&amp;&amp; val);</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; </div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordtype">void</span> set_exception(std::exception_ptr e);</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="keywordtype">void</span> set_value(U&amp;&amp; val);</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; </div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Exp&gt;</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception(_Exp e)</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; {</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; set_exception(std::make_exception_ptr(std::move(e)));</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; }</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keyword">union</span></div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; {</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; std::exception_ptr _exception;</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; value_type _value;</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; };</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; </div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keywordtype">void</span> set_value_internal(U&amp;&amp; val);</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keywordtype">void</span> set_exception_internal(std::exception_ptr e);</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; };</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; </div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty&gt;</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1state__t.html">state_t</a>&lt;_Ty&amp;&gt; final : <span class="keyword">public</span> <a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; {</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keyword">friend</span> <a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>;</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; </div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1spinlock.html">state_future_t::lock_type</a>;</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keyword">using</span> reference_type = _Ty&amp;;</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="keyword">explicit</span> <a class="code" href="structresumef_1_1state__t.html">state_t</a>(<span class="keywordtype">bool</span> awaitor) :<a class="code" href="structresumef_1_1state__future__t.html">state_future_t</a>(awaitor) {}</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; ~state_t()</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; {</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">if</span> (_has_value.load(std::memory_order_acquire) == result_type::Exception)</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; _exception.~exception_ptr();</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; }</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; </div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keyword">auto</span> future_await_resume()-&gt;reference_type;</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t&lt;traits::is_promise_v&lt;_PromiseT&gt;&gt;&gt;</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keywordtype">void</span> promise_yield_value(_PromiseT* promise, reference_type val);</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; </div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordtype">void</span> set_exception(std::exception_ptr e);</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keywordtype">void</span> set_value(reference_type val);</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; </div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Exp&gt;</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception(_Exp e)</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; {</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; set_exception(std::make_exception_ptr(std::move(e)));</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; }</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="keyword">union</span></div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; {</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; std::exception_ptr _exception;</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; value_type* _value;</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; };</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; </div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keywordtype">void</span> set_value_internal(reference_type val);</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordtype">void</span> set_exception_internal(std::exception_ptr e);</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; };</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; </div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keyword">template</span>&lt;&gt;</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="keyword">struct </span>state_t&lt;void&gt; final : <span class="keyword">public</span> state_future_t</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; {</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keyword">friend</span> state_future_t;</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keyword">using</span> state_future_t::lock_type;</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keyword">explicit</span> state_t(<span class="keywordtype">bool</span> awaitor) :state_future_t(awaitor) {}</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordtype">void</span> future_await_resume();</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t&lt;traits::is_promise_v&lt;_PromiseT&gt;&gt;&gt;</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordtype">void</span> promise_yield_value(_PromiseT* promise);</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; </div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordtype">void</span> set_exception(std::exception_ptr e);</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keywordtype">void</span> set_value();</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; </div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Exp&gt;</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_exception(_Exp e)</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; {</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; set_exception(std::make_exception_ptr(std::move(e)));</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; }</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; std::exception_ptr _exception;</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; };</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;}</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1scheduler__t_html"><div class="ttname"><a href="structresumef_1_1scheduler__t.html">resumef::scheduler_t</a></div><div class="ttdoc">协程调度器。</div><div class="ttdef"><b>Definition:</b> scheduler.h:10</div></div>
<div class="ttc" id="astructresumef_1_1state__base__t_html"><div class="ttname"><a href="structresumef_1_1state__base__t.html">resumef::state_base_t</a></div><div class="ttdoc">state基类state用于在协程的promise和future之间共享数据。</div><div class="ttdef"><b>Definition:</b> state.h:8</div></div>
<div class="ttc" id="astructresumef_1_1spinlock_html"><div class="ttname"><a href="structresumef_1_1spinlock.html">resumef::spinlock</a></div><div class="ttdoc">一个自旋锁实现。</div><div class="ttdef"><b>Definition:</b> spinlock.h:14</div></div>
<div class="ttc" id="astructresumef_1_1state__future__t_html"><div class="ttname"><a href="structresumef_1_1state__future__t.html">resumef::state_future_t</a></div><div class="ttdoc">专用于future_t&lt;&gt;的state基类实现了针对于future_t&lt;&gt;的公共方法等。</div><div class="ttdef"><b>Definition:</b> state.h:98</div></div>
<div class="ttc" id="astructresumef_1_1state__t_html"><div class="ttname"><a href="structresumef_1_1state__t.html">resumef::state_t</a></div><div class="ttdoc">专用于future_t&lt;&gt;的state类。</div><div class="ttdef"><b>Definition:</b> state.h:217</div></div>
<div class="ttc" id="astructresumef_1_1state__generator__t_html"><div class="ttname"><a href="structresumef_1_1state__generator__t.html">resumef::state_generator_t</a></div><div class="ttdoc">专用于generator_t&lt;&gt;的state类。</div><div class="ttdef"><b>Definition:</b> state.h:70</div></div>
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
制作者 &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
</body>
</html>