Parcourir la source

完善文档。

上传Doxygen生成的文档。
tags/v2.9.7
tearshark il y a 4 ans
Parent
révision
cd74eea532
100 fichiers modifiés avec 9364 ajouts et 19 suppressions
  1. 27
    18
      README.md
  2. 1
    1
      benchmark/benchmark_asio_echo.cpp
  3. 144
    0
      doxygen/html/__awaker_8h_source.html
  4. 114
    0
      doxygen/html/annotated.html
  5. 88
    0
      doxygen/html/asio__task_8h_source.html
  6. 173
    0
      doxygen/html/awaitable_8h_source.html
  7. BIN
      doxygen/html/bc_s.png
  8. BIN
      doxygen/html/bdwn.png
  9. 85
    0
      doxygen/html/channel_8h_source.html
  10. 323
    0
      doxygen/html/channel__v1_8h_source.html
  11. 166
    0
      doxygen/html/channel__v2_8h_source.html
  12. 82
    0
      doxygen/html/classasio_1_1rf__task__t-members.html
  13. 94
    0
      doxygen/html/classasio_1_1rf__task__t.html
  14. 152
    0
      doxygen/html/classes.html
  15. 93
    0
      doxygen/html/classresumef_1_1batch__lock__t-members.html
  16. 146
    0
      doxygen/html/classresumef_1_1batch__lock__t.html
  17. BIN
      doxygen/html/closed.png
  18. 107
    0
      doxygen/html/config_8h_source.html
  19. 202
    0
      doxygen/html/counted__ptr_8h_source.html
  20. 156
    0
      doxygen/html/current__scheduler_8h_source.html
  21. 155
    0
      doxygen/html/def_8h_source.html
  22. 84
    0
      doxygen/html/dir_3c80010775d22af2067790ecc9cdcf9d.html
  23. 80
    0
      doxygen/html/dir_54ae0e78d997f6903cdf0996223d047f.html
  24. BIN
      doxygen/html/doc.png
  25. 1771
    0
      doxygen/html/doxygen.css
  26. BIN
      doxygen/html/doxygen.png
  27. 120
    0
      doxygen/html/dynsections.js
  28. 85
    0
      doxygen/html/event_8h_source.html
  29. 295
    0
      doxygen/html/event__v1_8h_source.html
  30. 242
    0
      doxygen/html/event__v2_8h_source.html
  31. 115
    0
      doxygen/html/files.html
  32. BIN
      doxygen/html/folderclosed.png
  33. BIN
      doxygen/html/folderopen.png
  34. 282
    0
      doxygen/html/functions.html
  35. 275
    0
      doxygen/html/functions_func.html
  36. 77
    0
      doxygen/html/functions_vars.html
  37. 144
    0
      doxygen/html/future_8h_source.html
  38. 418
    0
      doxygen/html/generator_8h_source.html
  39. 119
    0
      doxygen/html/hierarchy.html
  40. 76
    0
      doxygen/html/index.html
  41. 184
    0
      doxygen/html/intrusive__link__queue_8h_source.html
  42. 35
    0
      doxygen/html/jquery.js
  43. 50
    0
      doxygen/html/menu.js
  44. 65
    0
      doxygen/html/menudata.js
  45. 85
    0
      doxygen/html/mutex_8h_source.html
  46. 172
    0
      doxygen/html/mutex__v1_8h_source.html
  47. 217
    0
      doxygen/html/mutex__v2_8h_source.html
  48. BIN
      doxygen/html/nav_f.png
  49. BIN
      doxygen/html/nav_g.png
  50. BIN
      doxygen/html/nav_h.png
  51. BIN
      doxygen/html/open.png
  52. 161
    0
      doxygen/html/promise_8h_source.html
  53. 164
    0
      doxygen/html/rf__task_8h_source.html
  54. 229
    0
      doxygen/html/ring__queue_8h_source.html
  55. 299
    0
      doxygen/html/ring__queue__lockfree_8h_source.html
  56. 242
    0
      doxygen/html/ring__queue__spinlock_8h_source.html
  57. 188
    0
      doxygen/html/scheduler_8h_source.html
  58. 30
    0
      doxygen/html/search/all_0.html
  59. 4
    0
      doxygen/html/search/all_0.js
  60. 30
    0
      doxygen/html/search/all_1.html
  61. 6
    0
      doxygen/html/search/all_1.js
  62. 30
    0
      doxygen/html/search/all_10.html
  63. 5
    0
      doxygen/html/search/all_10.js
  64. 30
    0
      doxygen/html/search/all_11.html
  65. 7
    0
      doxygen/html/search/all_11.js
  66. 30
    0
      doxygen/html/search/all_2.html
  67. 5
    0
      doxygen/html/search/all_2.js
  68. 30
    0
      doxygen/html/search/all_3.html
  69. 12
    0
      doxygen/html/search/all_3.js
  70. 30
    0
      doxygen/html/search/all_4.html
  71. 5
    0
      doxygen/html/search/all_4.js
  72. 30
    0
      doxygen/html/search/all_5.html
  73. 5
    0
      doxygen/html/search/all_5.js
  74. 30
    0
      doxygen/html/search/all_6.html
  75. 10
    0
      doxygen/html/search/all_6.js
  76. 30
    0
      doxygen/html/search/all_7.html
  77. 5
    0
      doxygen/html/search/all_7.js
  78. 30
    0
      doxygen/html/search/all_8.html
  79. 5
    0
      doxygen/html/search/all_8.js
  80. 30
    0
      doxygen/html/search/all_9.html
  81. 8
    0
      doxygen/html/search/all_9.js
  82. 30
    0
      doxygen/html/search/all_a.html
  83. 8
    0
      doxygen/html/search/all_a.js
  84. 30
    0
      doxygen/html/search/all_b.html
  85. 14
    0
      doxygen/html/search/all_b.js
  86. 30
    0
      doxygen/html/search/all_c.html
  87. 13
    0
      doxygen/html/search/all_c.js
  88. 30
    0
      doxygen/html/search/all_d.html
  89. 4
    0
      doxygen/html/search/all_d.js
  90. 30
    0
      doxygen/html/search/all_e.html
  91. 4
    0
      doxygen/html/search/all_e.js
  92. 30
    0
      doxygen/html/search/all_f.html
  93. 10
    0
      doxygen/html/search/all_f.js
  94. 30
    0
      doxygen/html/search/classes_0.html
  95. 6
    0
      doxygen/html/search/classes_0.js
  96. 30
    0
      doxygen/html/search/classes_1.html
  97. 5
    0
      doxygen/html/search/classes_1.js
  98. 30
    0
      doxygen/html/search/classes_2.html
  99. 11
    0
      doxygen/html/search/classes_2.js
  100. 0
    0
      doxygen/html/search/classes_3.html

+ 27
- 18
README.md Voir le fichier

@@ -1,8 +1,34 @@
# librf 2.9.3
# librf 2.9.7

### librf - 协程库
* librf是一个基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的非对称stackless协程库。

支持以下平台和编译器:

Windows: 使用VS2017/VS2019/clang 9编译
Android: 使用NDK 20.1 自带的clang编译

librf有以下特点:

* 1.基于C++20提案'Stackless Resumable Functions'编写的非对称stackless协程库,可以以同步的方式编写简单的代码,同时获得异步的性能
* 2.理论上支持海量协程, 创建 **10,000,000** 个协程只需使用 **2.2G** 物理内存(使用clang编译)
* 3.拥有极小的协程调度,在I7 8100 3.6GHz的CPU上,**1000** 个协程的平均切换开销是 **27** 纳秒(使用clang编译)
* 4.提供协程锁(mutex), 定时器, channel, event等特性, 帮助用户更加容易地编写程序
* 5.可以很好的跟asio, libuv等库结合,能跟现有的callback范式的异步/延迟代码很好的结合
* 6.目前已处于较为完善状态,已经小规模在生产项目中使用。不出意外,2.8以上版本就是C++20 Coroutines对应的版本

如果你发现了任何bug、有好的建议、或使用上有不明之处,可以提交到issue,也可以直接联系作者:

email: tearshark@163.net
QQ交流群: 296561497



2020-03-31 更新:

使用Doxygen自动生成文档,并完善文档内容。
支持cmake。(目前仅VS2019测试通过)。

2020-03-26 更新:

兼容xcode 11.2.1。
@@ -21,24 +47,7 @@
更新调度器算法,深入应用Coroutines的特性,以期获得更高调度性能。
不再支持C++14。

支持以下平台和编译器:

Windows: 使用VS2017/VS2019/clang 9编译
Android: 使用NDK 20.1 自带的clang编译

librf有以下特点:

* 1.基于C++20提案'Stackless Resumable Functions'编写的非对称stackless协程库,可以以同步的方式编写简单的代码,同时获得异步的性能
* 2.理论上支持海量协程, 创建 **10,000,000** 个协程只需使用 **2.2G** 物理内存(使用clang编译)
* 3.拥有极小的协程调度,在I7 8100 3.6GHz的CPU上,**1000** 个协程的平均切换开销是 **27** 纳秒(使用clang编译)
* 4.提供协程锁(mutex), 定时器, channel, event等特性, 帮助用户更加容易地编写程序
* 5.可以很好的跟asio, libuv等库结合,能跟现有的callback范式的异步/延迟代码很好的结合
* 6.目前已处于较为完善状态,已经小规模在生产项目中使用。不出意外,2.8以上版本就是C++20 Coroutines对应的版本

如果你发现了任何bug、有好的建议、或使用上有不明之处,可以提交到issue,也可以直接联系作者:

email: tearshark@163.net
QQ交流群: 296561497


* 注一:doc目录下有作者搜集的一些关于C++协程的资料

+ 1
- 1
benchmark/benchmark_asio_echo.cpp Voir le fichier

@@ -120,7 +120,7 @@ void StartPrintEchoCount()
void RunOneBenchmark(bool bMain)
{
resumef::local_scheduler ls;
resumef::local_scheduler_t ls;
asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 3456));

+ 144
- 0
doxygen/html/__awaker_8h_source.html Voir le fichier

@@ -0,0 +1,144 @@
<!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/_awaker.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">_awaker.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="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; </div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="keyword">namespace </span>resumef</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;{</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; {</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Ety, <span class="keyword">class</span>... _Types&gt;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">struct </span>_awaker</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; {</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="comment">//如果超时</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="comment">// e 始终为nullptr</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="comment">// 不关心返回值</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="comment">//如果不是超时,</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="comment">// e 指向当前触发的事件,用于实现wait_any</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="comment">// 返回true表示成功触发了事件,event内部减小一次事件计数,并删除此awaker</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="comment">// 返回false表示此事件已经无效,event内部只删除此awaker</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keyword">typedef</span> std::function&lt;bool(_Ety * e, _Types...)&gt; callee_type;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keyword">typedef</span> spinlock lock_type;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <span class="comment">//typedef std::recursive_mutex lock_type;</span></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; lock_type _lock;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; callee_type _callee;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; std::atomic&lt;intptr_t&gt; _counter;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; _awaker(callee_type &amp;&amp; callee_, intptr_t init_count_ = 0)</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; : _callee(std::forward&lt;callee_type&gt;(callee_))</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; , _counter(init_count_)</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; {</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; </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="comment">//调用一次后,_callee就被置nullptr,下次再调用,必然返回false</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="comment">//第一次调用,返回调用_callee的返回值</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="comment">//超时通过传入nullptr来调用</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordtype">bool</span> awake(_Ety * e, intptr_t count_, <span class="keyword">const</span> _Types&amp;... args)</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; {</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; assert(count_ &gt; 0);</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; scoped_lock&lt;lock_type&gt; lock_(this-&gt;_lock);</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keywordflow">if</span> ((this-&gt;_counter.fetch_sub(count_) - count_) &lt;= 0)</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; {</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">if</span> (this-&gt;_callee)</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; {</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; callee_type callee_ = std::move(this-&gt;_callee);</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">return</span> callee_(e, args...);</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; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; }</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; }</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; _awaker(<span class="keyword">const</span> _awaker &amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; _awaker(_awaker &amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; _awaker &amp; operator = (<span class="keyword">const</span> _awaker &amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; _awaker &amp; operator = (_awaker &amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; };</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;}</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="preprocessor"> </span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 114
- 0
doxygen/html/annotated.html Voir le fichier

@@ -0,0 +1,114 @@
<!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: 类列表</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>
</div><!-- top -->
<!-- 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 class="header">
<div class="headertitle">
<div class="title">类列表</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">这里列出了所有类、结构、联合以及接口定义等,并附带简要说明:</div><div class="directory">
<div class="levels">[详情级别 <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>asio</b></td><td class="desc"></td></tr>
<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classasio_1_1rf__task__t.html" target="_self">rf_task_t</a></td><td class="desc">用于指示asio相关异步函数,返回resumef::future_t&lt;&gt;的类型,从而变成支持 librf 的协程函数。 </td></tr>
<tr id="row_1_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>resumef</b></td><td class="desc"></td></tr>
<tr id="row_1_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_1_0_" class="arrow" onclick="toggleFolder('1_0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>detail</b></td><td class="desc"></td></tr>
<tr id="row_1_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1detail_1_1timer__target.html" target="_self">timer_target</a></td><td class="desc">定时器对象。 </td></tr>
<tr id="row_1_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1adopt__manual__unlock__t.html" target="_self">adopt_manual_unlock_t</a></td><td class="desc">提示手工解锁,故相关的lock()函数不再返回batch_unlock_t。 </td></tr>
<tr id="row_1_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1awaitable__impl__t.html" target="_self">awaitable_impl_t</a></td><td class="desc">Awaitable_t&lt;&gt;的公共实现部分,用于减少awaitable_t&lt;&gt;的重复代码。 </td></tr>
<tr id="row_1_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1awaitable__t.html" target="_self">awaitable_t</a></td><td class="desc">用于包装‘异步函数’为‘可等待函数(awaitable function)’。 </td></tr>
<tr id="row_1_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classresumef_1_1batch__lock__t.html" target="_self">batch_lock_t</a></td><td class="desc">无死锁的批量枷锁。 </td></tr>
<tr id="row_1_5_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1batch__unlock__t.html" target="_self">batch_unlock_t</a></td><td class="desc">在析构的时候自动解锁mutex_t的辅助类。 </td></tr>
<tr id="row_1_6_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1channel__exception.html" target="_self">channel_exception</a></td><td class="desc">错误使用channel_t时产生的异常(v2版本已经不再抛此异常了)。 </td></tr>
<tr id="row_1_7_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1channel__t.html" target="_self">channel_t</a></td><td class="desc">可传递数据的模板信号量。 </td></tr>
<tr id="row_1_8_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">counted_ptr</a></td><td class="desc">专用与state的智能计数指针,通过管理state内嵌的引用计数来管理state的生存期。 </td></tr>
<tr id="row_1_9_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1event__t.html" target="_self">event_t</a></td><td class="desc">用于协程的事件。 </td></tr>
<tr id="row_1_10_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1future__t.html" target="_self">future_t</a></td><td class="desc">用于resumef协程的返回值。 </td></tr>
<tr id="row_1_11_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1generator__t.html" target="_self">generator_t</a></td><td class="desc">专用于co_yield函数。 </td></tr>
<tr id="row_1_12_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1get__current__scheduler__awaitor.html" target="_self">get_current_scheduler_awaitor</a></td><td class="desc">获得本协程绑定的调度器的可等待对象。 </td></tr>
<tr id="row_1_13_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1get__root__state__awaitor.html" target="_self">get_root_state_awaitor</a></td><td class="desc">获得本协程绑定的跟state指针的可等待对象。 </td></tr>
<tr id="row_1_14_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1local__scheduler__t.html" target="_self">local_scheduler_t</a></td><td class="desc">创建一个线程相关的调度器。 </td></tr>
<tr id="row_1_15_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1mutex__exception.html" target="_self">mutex_exception</a></td><td class="desc">错误使用mutex_t时产生的异常。 </td></tr>
<tr id="row_1_16_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1mutex__t.html" target="_self">mutex_t</a></td><td class="desc">支持递归的锁。 </td></tr>
<tr id="row_1_17_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1scheduler__t.html" target="_self">scheduler_t</a></td><td class="desc">协程调度器。 </td></tr>
<tr id="row_1_18_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1spinlock.html" target="_self">spinlock</a></td><td class="desc">一个自旋锁实现。 </td></tr>
<tr id="row_1_19_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__base__t.html" target="_self">state_base_t</a></td><td class="desc">State基类,state用于在协程的promise和future之间共享数据。 </td></tr>
<tr id="row_1_20_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__future__t.html" target="_self">state_future_t</a></td><td class="desc">专用于future_t&lt;&gt;的state基类,实现了针对于future_t&lt;&gt;的公共方法等。 </td></tr>
<tr id="row_1_21_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__generator__t.html" target="_self">state_generator_t</a></td><td class="desc">专用于generator_t&lt;&gt;的state类。 </td></tr>
<tr id="row_1_22_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__t.html" target="_self">state_t</a></td><td class="desc">专用于future_t&lt;&gt;的state类。 </td></tr>
<tr id="row_1_23_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1switch__scheduler__awaitor.html" target="_self">switch_scheduler_awaitor</a></td><td class="desc">切换协程的可等待对象。 </td></tr>
<tr id="row_1_24_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1task__t.html" target="_self">task_t</a></td><td class="desc">协程任务类。 </td></tr>
<tr id="row_1_25_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1timer__canceled__exception.html" target="_self">timer_canceled_exception</a></td><td class="desc">定时器提前取消导致的异常。 </td></tr>
<tr id="row_1_26_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1timer__handler.html" target="_self">timer_handler</a></td><td class="desc">定时器句柄。 </td></tr>
<tr id="row_1_27_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1timer__manager.html" target="_self">timer_manager</a></td><td class="desc">定时器管理器。 </td></tr>
<tr id="row_1_28_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1when__.html" target="_self">when_</a></td><td class="desc">目前不知道怎么在doxygen里面能搜集到全局函数的文档。故用一个结构体来欺骗doxygen。 </td></tr>
<tr id="row_1_29_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1yield__awaitor.html" target="_self">yield_awaitor</a></td><td class="desc">将本协程让渡出一次调用的可等待对象。 </td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- 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>

+ 88
- 0
doxygen/html/asio__task_8h_source.html Voir le fichier

@@ -0,0 +1,88 @@
<!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/asio_task.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">asio_task.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor">#pragma once</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160; </div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#if ASIO_VERSION &gt;= 101200</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &quot;asio_task_1.12.0.inl&quot;</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &quot;asio_task_1.10.0.inl&quot;</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#endif</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 173
- 0
doxygen/html/awaitable_8h_source.html Voir le fichier

@@ -0,0 +1,173 @@
<!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/awaitable.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">awaitable.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="l00005"></a><span class="lineno"> 5</span>&#160; </div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00012"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__impl__t.html"> 12</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; {</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1state__t.html">state_type</a> = <a class="code" href="structresumef_1_1state__t.html">state_t&lt;value_type&gt;</a>;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1future__t.html">future_type</a> = <a class="code" href="structresumef_1_1future__t.html">future_t&lt;value_type&gt;</a>;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="keyword">using</span> lock_type = <span class="keyword">typename</span> <a class="code" href="structresumef_1_1spinlock.html">state_type::lock_type</a>;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keyword">using</span> _Alloc_char = <span class="keyword">typename</span> state_type::_Alloc_char;</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; <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>() {}</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>(<a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</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; <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&amp; operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&amp; operator = (<a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__impl__t.html#a22f1adeb8ecfd2c078f620dbc7c368a1"> 31</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html#a22f1adeb8ecfd2c078f620dbc7c368a1">set_exception</a>(std::exception_ptr e)<span class="keyword"> const</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; this-&gt;<a class="code" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">_state</a>-&gt;set_exception(std::move(e));</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; this-&gt;<a class="code" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">_state</a> = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; }</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; </div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Exp&gt;</div>
<div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__impl__t.html#a2f7b2ef525186c9b7512dceb2453bebe"> 41</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html#a2f7b2ef525186c9b7512dceb2453bebe">throw_exception</a>(_Exp e)<span class="keyword"> const</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <a class="code" href="structresumef_1_1awaitable__impl__t.html#a22f1adeb8ecfd2c078f620dbc7c368a1">set_exception</a>(std::make_exception_ptr(std::move(e)));</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; </div>
<div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__impl__t.html#a647bd5f5a5572bbbe8a17000ea5dc06d"> 49</a></span>&#160; <a class="code" href="structresumef_1_1future__t.html">future_type</a> <a class="code" href="structresumef_1_1awaitable__impl__t.html#a647bd5f5a5572bbbe8a17000ea5dc06d">get_future</a>() noexcept</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; {</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structresumef_1_1future__t.html">future_type</a>{ this-&gt;<a class="code" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">_state</a> };</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; }</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915"> 57</a></span>&#160; <span class="keyword">mutable</span> <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr&lt;state_type&gt;</a> <a class="code" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">_state</a> = state_future_t::_Alloc_state&lt;state_type&gt;(<span class="keyword">true</span>);</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; </div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__t.html"> 77</a></span>&#160; <span class="keyword">struct </span>[[nodiscard]] <a class="code" href="structresumef_1_1awaitable__t.html">awaitable_t</a> : <span class="keyword">public</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&lt;_Ty&gt;</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="keyword">using</span> <span class="keyword">typename</span> awaitable_impl_t&lt;_Ty&gt;::value_type;</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t&lt;_Ty&gt;::awaitable_impl_t</a>;</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> U&gt;</div>
<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3"> 89</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3">set_value</a>(U&amp;&amp; value)<span class="keyword"> const</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; this-&gt;_state-&gt;set_value(std::forward&lt;U&gt;(value));</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; this-&gt;_state = <span class="keyword">nullptr</span>;</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="l00095"></a><span class="lineno"> 95</span>&#160; </div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keyword">struct </span>[[nodiscard]] awaitable_t&lt;_Ty&amp;&gt; : <span class="keyword">public</span> awaitable_impl_t&lt;_Ty&amp;&gt;</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">using</span> <span class="keyword">typename</span> awaitable_impl_t&lt;_Ty&amp;&gt;::value_type;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">using</span> awaitable_impl_t&lt;_Ty&amp;&gt;::awaitable_impl_t;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordtype">void</span> set_value(_Ty&amp; value)<span class="keyword"> const</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; this-&gt;_state-&gt;set_value(value);</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; this-&gt;_state = <span class="keyword">nullptr</span>;</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; };</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">template</span>&lt;&gt;</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keyword">struct </span>[[nodiscard]] awaitable_t&lt;void&gt; : <span class="keyword">public</span> awaitable_impl_t&lt;void&gt;</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="keyword">using</span> awaitable_impl_t&lt;void&gt;::awaitable_impl_t;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordtype">void</span> set_value()<span class="keyword"> const</span></div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; this-&gt;_state-&gt;set_value();</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; this-&gt;_state = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; }</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; };</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1awaitable__impl__t_html_a647bd5f5a5572bbbe8a17000ea5dc06d"><div class="ttname"><a href="structresumef_1_1awaitable__impl__t.html#a647bd5f5a5572bbbe8a17000ea5dc06d">resumef::awaitable_impl_t::get_future</a></div><div class="ttdeci">future_type get_future() noexcept</div><div class="ttdoc">获得与之关联的future_t&lt;&gt;对象,作为可等待函数(awaitable function)的返回值。</div><div class="ttdef"><b>Definition:</b> awaitable.h:49</div></div>
<div class="ttc" id="astructresumef_1_1future__t_html"><div class="ttname"><a href="structresumef_1_1future__t.html">resumef::future_t</a></div><div class="ttdoc">用于resumef协程的返回值。</div><div class="ttdef"><b>Definition:</b> future.h:14</div></div>
<div class="ttc" id="astructresumef_1_1awaitable__t_html"><div class="ttname"><a href="structresumef_1_1awaitable__t.html">resumef::awaitable_t</a></div><div class="ttdoc">用于包装‘异步函数’为‘可等待函数(awaitable function)’。</div><div class="ttdef"><b>Definition:</b> awaitable.h:77</div></div>
<div class="ttc" id="astructresumef_1_1awaitable__impl__t_html_a2f7b2ef525186c9b7512dceb2453bebe"><div class="ttname"><a href="structresumef_1_1awaitable__impl__t.html#a2f7b2ef525186c9b7512dceb2453bebe">resumef::awaitable_impl_t::throw_exception</a></div><div class="ttdeci">void throw_exception(_Exp e) const</div><div class="ttdoc">在协程内部,重新抛出之前设置的异常。</div><div class="ttdef"><b>Definition:</b> awaitable.h:41</div></div>
<div class="ttc" id="astructresumef_1_1awaitable__impl__t_html_a22f1adeb8ecfd2c078f620dbc7c368a1"><div class="ttname"><a href="structresumef_1_1awaitable__impl__t.html#a22f1adeb8ecfd2c078f620dbc7c368a1">resumef::awaitable_impl_t::set_exception</a></div><div class="ttdeci">void set_exception(std::exception_ptr e) const</div><div class="ttdoc">发生了异常后,设置异常。</div><div class="ttdef"><b>Definition:</b> awaitable.h:31</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html"><div class="ttname"><a href="structresumef_1_1counted__ptr.html">resumef::counted_ptr&lt; state_type &gt;</a></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_1awaitable__impl__t_html"><div class="ttname"><a href="structresumef_1_1awaitable__impl__t.html">resumef::awaitable_impl_t</a></div><div class="ttdoc">awaitable_t&lt;&gt;的公共实现部分,用于减少awaitable_t&lt;&gt;的重复代码。</div><div class="ttdef"><b>Definition:</b> awaitable.h:12</div></div>
<div class="ttc" id="astructresumef_1_1awaitable__t_html_af66d4b4a3ba5339873b2dd8353ae6db3"><div class="ttname"><a href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3">resumef::awaitable_t::set_value</a></div><div class="ttdeci">void set_value(U &amp;&amp;value) const</div><div class="ttdoc">设置可等待函数的返回值。</div><div class="ttdef"><b>Definition:</b> awaitable.h:89</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_1awaitable__impl__t_html_af7b6df5bbe7392334d7914db0d878915"><div class="ttname"><a href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">resumef::awaitable_impl_t::_state</a></div><div class="ttdeci">counted_ptr&lt; state_type &gt; _state</div><div class="ttdoc">管理的state_t&lt;&gt;对象。</div><div class="ttdef"><b>Definition:</b> awaitable.h:57</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>

BIN
doxygen/html/bc_s.png Voir le fichier


BIN
doxygen/html/bdwn.png Voir le fichier


+ 85
- 0
doxygen/html/channel_8h_source.html Voir le fichier

@@ -0,0 +1,85 @@
<!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/channel.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">channel.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="preprocessor">#include &quot;channel_v1.h&quot;</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#include &quot;channel_v2.h&quot;</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &quot;channel_v2.inl&quot;</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 323
- 0
doxygen/html/channel__v1_8h_source.html Voir le fichier

@@ -0,0 +1,323 @@
<!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/channel_v1.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">channel_v1.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="l00005"></a><span class="lineno"> 5</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; {</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">struct </span>channel_impl : <span class="keyword">public</span> std::enable_shared_from_this&lt;channel_impl&lt;_Ty&gt;&gt;</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">typedef</span> _awaker&lt;channel_impl&lt;_Ty&gt;, _Ty*, error_code&gt; channel_read_awaker;</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;channel_read_awaker&gt; channel_read_awaker_ptr;</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; </div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">typedef</span> _awaker&lt;channel_impl&lt;_Ty&gt;&gt; channel_write_awaker;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;channel_write_awaker&gt; channel_write_awaker_ptr;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">typedef</span> std::pair&lt;channel_write_awaker_ptr, _Ty&gt; write_tuple_type;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="comment">//typedef spinlock lock_type;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keyword">typedef</span> std::recursive_mutex lock_type;</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; lock_type _lock; <span class="comment">//保证访问本对象是线程安全的</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> _max_counter; <span class="comment">//数据队列的容量上限</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; std::deque&lt;_Ty&gt; _values; <span class="comment">//数据队列</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; std::list&lt;channel_read_awaker_ptr&gt; _read_awakes; <span class="comment">//读队列</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; std::list&lt;write_tuple_type&gt; _write_awakes; <span class="comment">//写队列</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; channel_impl(<span class="keywordtype">size_t</span> max_counter_)</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; :_max_counter(max_counter_)</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; }</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#if _DEBUG</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keyword">const</span> std::deque&lt;_Ty&gt;&amp; debug_queue()<span class="keyword"> const</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordflow">return</span> _values;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; }</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> callee_t, <span class="keyword">class</span> = std::enable_if&lt;!std::is_same&lt;std::remove_cv_t&lt;callee_t&gt;, channel_read_awaker_ptr&gt;::value&gt;&gt;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; decltype(<span class="keyword">auto</span>) read(callee_t&amp;&amp; awaker)</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="keywordflow">return</span> read_(std::make_shared&lt;channel_read_awaker&gt;(std::forward&lt;callee_t&gt;(awaker)));</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> callee_t, <span class="keyword">class</span> _Ty2, <span class="keyword">class</span> = std::enable_if&lt;!std::is_same&lt;std::remove_cv_t&lt;callee_t&gt;, channel_write_awaker_ptr&gt;::value&gt;&gt;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; decltype(<span class="keyword">auto</span>) write(callee_t&amp;&amp; awaker, _Ty2&amp;&amp; val)</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; {</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">return</span> write_(std::make_shared&lt;channel_write_awaker&gt;(std::forward&lt;callee_t&gt;(awaker)), std::forward&lt;_Ty2&gt;(val));</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; }</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; <span class="comment">//如果已经触发了awaker,则返回true</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="comment">//设计目标是线程安全的,实际情况待考察</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordtype">bool</span> read_(channel_read_awaker_ptr&amp;&amp; r_awaker)</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; {</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; assert(r_awaker);</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; scoped_lock&lt;lock_type&gt; lock_(this-&gt;_lock);</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordtype">bool</span> ret_value;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">if</span> (_values.size() &gt; 0)</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; {</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">//如果数据队列有数据,则可以直接读数据</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keyword">auto</span> val = std::move(_values.front());</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; _values.pop_front();</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; r_awaker-&gt;awake(<span class="keyword">this</span>, 1, &amp;val, error_code::none);</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; ret_value = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; }</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; {</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">//否则,将“读等待”放入“读队列”</span></div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; _read_awakes.push_back(r_awaker);</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; ret_value = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; }</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; </div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">//如果已有写队列,则唤醒一个“写等待”</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; awake_one_writer_();</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keywordflow">return</span> ret_value;</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; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">//设计目标是线程安全的,实际情况待考察</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty2&gt;</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordtype">void</span> write_(channel_write_awaker_ptr&amp;&amp; w_awaker, _Ty2&amp;&amp; val)</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; {</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; assert(w_awaker);</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; scoped_lock&lt;lock_type&gt; lock_(this-&gt;_lock);</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="comment">//如果满了,则不添加到数据队列,而是将“写等待”和值,放入“写队列”</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keywordtype">bool</span> is_full = _values.size() &gt;= _max_counter;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">if</span> (is_full)</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; _write_awakes.push_back(std::make_pair(std::forward&lt;channel_write_awaker_ptr&gt;(w_awaker), std::forward&lt;_Ty2&gt;(val)));</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; _values.push_back(std::forward&lt;_Ty2&gt;(val));</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; <span class="comment">//如果已有读队列,则唤醒一个“读等待”</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; awake_one_reader_();</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; </div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">//触发 没有放入“写队列”的“写等待”</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">if</span> (!is_full) w_awaker-&gt;awake(<span class="keyword">this</span>, 1);</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; </div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="comment">//只能被write_函数调用,内部不再需要加锁</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordtype">void</span> awake_one_reader_()</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="comment">//assert(!(_read_awakes.size() &gt;= 0 &amp;&amp; _values.size() == 0));</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; </div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = _read_awakes.begin(); iter != _read_awakes.end(); )</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; {</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">auto</span> r_awaker = *iter;</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; iter = _read_awakes.erase(iter);</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; <span class="keywordflow">if</span> (r_awaker-&gt;awake(<span class="keyword">this</span>, 1, _values.size() ? &amp;_values.front() : <span class="keyword">nullptr</span>, error_code::read_before_write))</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; {</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">if</span> (_values.size()) _values.pop_front();</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="comment">//唤醒一个“读等待”后,尝试唤醒一个“写等待”,以处理“数据队列”满后的“写等待”</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; awake_one_writer_();</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; }</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; }</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; </div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="comment">//只能被read_函数调用,内部不再需要加锁</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordtype">void</span> awake_one_writer_()</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = _write_awakes.begin(); iter != _write_awakes.end(); )</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; {</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">auto</span> w_awaker = std::move(*iter);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; iter = _write_awakes.erase(iter);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keywordflow">if</span> (w_awaker.first-&gt;awake(<span class="keyword">this</span>, 1))</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; {</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="comment">//一个“写等待”唤醒后,将“写等待”绑定的值,放入“数据队列”</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; _values.push_back(std::move(w_awaker.second));</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; }</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; }</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordtype">size_t</span> capacity() const noexcept</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; {</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">return</span> _max_counter;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; }</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; channel_impl(<span class="keyword">const</span> channel_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; channel_impl(channel_impl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; channel_impl&amp; operator = (<span class="keyword">const</span> channel_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; channel_impl&amp; operator = (channel_impl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; };</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; } <span class="comment">//namespace detail</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; </div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="keyword">namespace </span>channel_v1</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;{</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">struct </span>channel_t</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; {</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keyword">typedef</span> detail::channel_impl&lt;_Ty&gt; channel_impl_type;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> channel_impl_type::channel_read_awaker channel_read_awaker;</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> channel_impl_type::channel_write_awaker channel_write_awaker;</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">typedef</span> std::shared_ptr&lt;channel_impl_type&gt; channel_impl_ptr;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">typedef</span> std::weak_ptr&lt;channel_impl_type&gt; channel_impl_wptr;</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; channel_impl_ptr _chan;</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; channel_t(<span class="keywordtype">size_t</span> max_counter = 0)</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; :_chan(std::make_shared&lt;channel_impl_type&gt;(max_counter))</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; }</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="keyword">template</span>&lt;<span class="keyword">class</span> _Ty2&gt;</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; future_t&lt;bool&gt; write(_Ty2&amp;&amp; val)<span class="keyword"> const</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; awaitable_t&lt;bool&gt; awaitable;</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">auto</span> awaker = std::make_shared&lt;channel_write_awaker&gt;(</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; [st = awaitable._state](channel_impl_type* chan) -&gt; <span class="keywordtype">bool</span></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; st-&gt;set_value(chan ? true : false);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; return true;</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; });</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; _chan-&gt;write_(std::move(awaker), std::forward&lt;_Ty2&gt;(val));</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="keywordflow">return</span> awaitable.get_future();</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; }</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; </div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; future_t&lt;_Ty&gt; read()<span class="keyword"> const</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; awaitable_t&lt;_Ty&gt; awaitable;</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="keyword">auto</span> awaker = std::make_shared&lt;channel_read_awaker&gt;(</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; [st = awaitable._state](channel_impl_type*, _Ty* val, error_code fe) -&gt; <span class="keywordtype">bool</span></div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; {</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; if (val)</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; st-&gt;set_value(std::move(*val));</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; else</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; st-&gt;throw_exception(channel_exception{ fe });</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; });</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; _chan-&gt;read_(std::move(awaker));</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; </div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordflow">return</span> awaitable.get_future();</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; }</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="keyword">template</span>&lt;<span class="keyword">class</span> _Ty2&gt;</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; future_t&lt;bool&gt; operator &lt;&lt; (_Ty2&amp;&amp; val)<span class="keyword"> const</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordflow">return</span> std::move(write(std::forward&lt;_Ty2&gt;(val)));</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; </div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; future_t&lt;_Ty&gt; <span class="keyword">operator</span> co_await ()<span class="keyword"> const</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">return</span> read();</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; </div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;<span class="preprocessor">#if _DEBUG</span></div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="comment">//非线程安全,返回的队列也不是线程安全的</span></div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; debug_queue()<span class="keyword"> const</span></div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">return</span> _chan-&gt;debug_queue();</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;<span class="preprocessor">#endif</span></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="keywordtype">size_t</span> capacity() const noexcept</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">return</span> _chan-&gt;capacity();</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; }</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; channel_t(<span class="keyword">const</span> channel_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; channel_t(channel_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; channel_t&amp; operator = (<span class="keyword">const</span> channel_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; channel_t&amp; operator = (channel_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; };</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; <span class="keyword">using</span> semaphore_t = channel_t&lt;bool&gt;;</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; </div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;} <span class="comment">//namespace v1</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;} <span class="comment">//namespace resumef</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 166
- 0
doxygen/html/channel__v2_8h_source.html Voir le fichier

@@ -0,0 +1,166 @@
<!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/channel_v2.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">channel_v2.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="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;{</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Opty&gt;</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">struct </span>channel_impl_v2;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;} <span class="comment">//namespace detail</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; </div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="keyword">inline</span> <span class="keyword">namespace </span>channel_v2</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;{</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; </div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty = <span class="keywordtype">bool</span>, <span class="keywordtype">bool</span> _Optional = !std::is_trivial_v&lt;_Ty&gt;, <span class="keywordtype">bool</span> _OptimizationThread = false&gt;</div>
<div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="structresumef_1_1channel__t.html"> 25</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1channel__t.html">channel_t</a></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; {</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; static_assert((std::is_copy_constructible_v&lt;_Ty&gt;&amp;&amp; std::is_copy_assignable_v&lt;_Ty&gt;) ||</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; (std::is_move_constructible_v&lt;_Ty&gt; &amp;&amp; std::is_move_assignable_v&lt;_Ty&gt;));</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keyword">struct </span>[[nodiscard]] read_awaiter;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <span class="keyword">struct </span>[[nodiscard]] write_awaiter;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; </div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>(<span class="keywordtype">size_t</span> cache_size = 1);</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; </div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keywordtype">size_t</span> capacity() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; read_awaiter <span class="keyword">operator</span> co_await() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; </div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; read_awaiter read() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; </div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>U</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; COMMA_RESUMEF_ENABLE_IF(std::is_constructible_v&lt;value_type, U&amp;&amp;&gt;)</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; &gt;</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; RESUMEF_REQUIRES(std::is_constructible_v&lt;_Ty, U&amp;&amp;&gt;)</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; write_awaiter operator &lt;&lt; (U&amp;&amp; val) <span class="keyword">const</span> noexcept(std::is_move_constructible_v&lt;U&gt;);</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>U</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; COMMA_RESUMEF_ENABLE_IF(std::is_constructible_v&lt;value_type, U&amp;&amp;&gt;)</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; &gt;</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; RESUMEF_REQUIRES(std::is_constructible_v&lt;_Ty, U&amp;&amp;&gt;)</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; write_awaiter write(U&amp;&amp; val) <span class="keyword">const</span> noexcept(std::is_move_constructible_v&lt;U&gt;);</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">bool</span> use_optional = _Optional;</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">bool</span> optimization_for_multithreading = _OptimizationThread;</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; </div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keyword">using</span> optional_type = std::conditional_t&lt;use_optional, std::optional&lt;value_type&gt;, value_type&gt;;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">using</span> channel_type = detail::channel_impl_v2&lt;value_type, optional_type&gt;;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">using</span> lock_type = <span class="keyword">typename</span> channel_type::lock_type;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>(<a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&amp; operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&amp; operator = (<a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; std::shared_ptr&lt;channel_type&gt; _chan;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; };</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="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="comment">//不支持channel_t&lt;void&gt;</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> _Option, <span class="keywordtype">bool</span> _OptimizationThread&gt;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&lt;void, _Option, _OptimizationThread&gt;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; };</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; </div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">using</span> semaphore_t = channel_t&lt;bool, false, true&gt;;</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; </div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;} <span class="comment">//namespace channel_v2</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;} <span class="comment">//namespace resumef</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1channel__t_html"><div class="ttname"><a href="structresumef_1_1channel__t.html">resumef::channel_t</a></div><div class="ttdoc">可传递数据的模板信号量。</div><div class="ttdef"><b>Definition:</b> channel_v2.h:25</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>

+ 82
- 0
doxygen/html/classasio_1_1rf__task__t-members.html Voir le fichier

@@ -0,0 +1,82 @@
<!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: 成员列表</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"><b>asio</b></li><li class="navelem"><a class="el" href="classasio_1_1rf__task__t.html">rf_task_t</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">asio::rf_task_t&lt; Allocator &gt; 成员列表</div> </div>
</div><!--header-->
<div class="contents">

<p>成员的完整列表,这些成员属于 <a class="el" href="classasio_1_1rf__task__t.html">asio::rf_task_t&lt; Allocator &gt;</a>,包括所有继承而来的类成员</p>
</div><!-- contents -->
<!-- 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>

+ 94
- 0
doxygen/html/classasio_1_1rf__task__t.html Voir le fichier

@@ -0,0 +1,94 @@
<!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: asio::rf_task_t&lt; Allocator &gt; 模板结构体 参考</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"><b>asio</b></li><li class="navelem"><a class="el" href="classasio_1_1rf__task__t.html">rf_task_t</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="classasio_1_1rf__task__t-members.html">所有成员列表</a> </div>
<div class="headertitle">
<div class="title">asio::rf_task_t&lt; Allocator &gt; 模板结构体 参考</div> </div>
</div><!--header-->
<div class="contents">

<p>用于指示asio相关异步函数,返回resumef::future_t&lt;&gt;的类型,从而变成支持 librf 的协程函数。
<a href="classasio_1_1rf__task__t.html#details">更多...</a></p>
<a name="details" id="details"></a><h2 class="groupheader">详细描述</h2>
<div class="textblock"><h3>template&lt;typename Allocator = std::allocator&lt;int&gt;&gt;<br />
struct asio::rf_task_t&lt; Allocator &gt;</h3>

<p>用于指示asio相关异步函数,返回resumef::future_t&lt;&gt;的类型,从而变成支持 librf 的协程函数。 </p>
</div><hr/>该结构体的文档由以下文件生成:<ul>
<li>librf/src/asio_task_1.10.0.inl</li>
<li>librf/src/asio_task_1.12.0.inl</li>
</ul>
</div><!-- contents -->
<!-- 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>

+ 152
- 0
doxygen/html/classes.html Voir le fichier

@@ -0,0 +1,152 @@
<!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: 类索引</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>
</div><!-- top -->
<!-- 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 class="header">
<div class="headertitle">
<div class="title">类索引</div> </div>
</div><!--header-->
<div class="contents">
<div class="qindex"><a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_c">c</a>&#160;|&#160;<a class="qindex" href="#letter_e">e</a>&#160;|&#160;<a class="qindex" href="#letter_f">f</a>&#160;|&#160;<a class="qindex" href="#letter_g">g</a>&#160;|&#160;<a class="qindex" href="#letter_l">l</a>&#160;|&#160;<a class="qindex" href="#letter_m">m</a>&#160;|&#160;<a class="qindex" href="#letter_r">r</a>&#160;|&#160;<a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a>&#160;|&#160;<a class="qindex" href="#letter_w">w</a>&#160;|&#160;<a class="qindex" href="#letter_y">y</a></div>
<table class="classindex">
<tr><td rowspan="2" valign="bottom"><a name="letter_a"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;a&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1channel__t.html">channel_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1get__root__state__awaitor.html">get_root_state_awaitor</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1spinlock.html">spinlock</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1detail_1_1timer__target.html">timer_target</a> (resumef::detail)&#160;&#160;&#160;</td>
</tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1counted__ptr.html">counted_ptr</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_l"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;l&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1state__base__t.html">state_base_t</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_w"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;w&#160;&#160;</div></td></tr></table>
</td>
</tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1adopt__manual__unlock__t.html">adopt_manual_unlock_t</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_e"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;e&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1state__future__t.html">state_future_t</a> (resumef)&#160;&#160;&#160;</td>
</tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1state__generator__t.html">state_generator_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1when__.html">when_</a> (resumef)&#160;&#160;&#160;</td>
</tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1awaitable__t.html">awaitable_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1event__t.html">event_t</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_m"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;m&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1state__t.html">state_t</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_y"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;y&#160;&#160;</div></td></tr></table>
</td>
</tr>
<tr><td rowspan="2" valign="bottom"><a name="letter_b"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;b&#160;&#160;</div></td></tr></table>
</td>
<td rowspan="2" valign="bottom"><a name="letter_f"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;f&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1switch__scheduler__awaitor.html">switch_scheduler_awaitor</a> (resumef)&#160;&#160;&#160;</td>
</tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1mutex__exception.html">mutex_exception</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_t"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;t&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1yield__awaitor.html">yield_awaitor</a> (resumef)&#160;&#160;&#160;</td>
</tr>
<tr><td valign="top"><a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1future__t.html">future_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1mutex__t.html">mutex_t</a> (resumef)&#160;&#160;&#160;</td>
<td></td></tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_g"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;g&#160;&#160;</div></td></tr></table>
</td>
<td rowspan="2" valign="bottom"><a name="letter_r"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;r&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1task__t.html">task_t</a> (resumef)&#160;&#160;&#160;</td>
<td></td></tr>
<tr><td rowspan="2" valign="bottom"><a name="letter_c"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;c&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1timer__canceled__exception.html">timer_canceled_exception</a> (resumef)&#160;&#160;&#160;</td>
<td></td></tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1generator__t.html">generator_t</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="classasio_1_1rf__task__t.html">rf_task_t</a> (asio)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1timer__handler.html">timer_handler</a> (resumef)&#160;&#160;&#160;</td>
<td></td></tr>
<tr><td valign="top"><a class="el" href="structresumef_1_1channel__exception.html">channel_exception</a> (resumef)&#160;&#160;&#160;</td>
<td valign="top"><a class="el" href="structresumef_1_1get__current__scheduler__awaitor.html">get_current_scheduler_awaitor</a> (resumef)&#160;&#160;&#160;</td>
<td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;s&#160;&#160;</div></td></tr></table>
</td>
<td valign="top"><a class="el" href="structresumef_1_1timer__manager.html">timer_manager</a> (resumef)&#160;&#160;&#160;</td>
<td></td></tr>
<tr><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td valign="top"><a class="el" href="structresumef_1_1scheduler__t.html">scheduler_t</a> (resumef)&#160;&#160;&#160;</td>
<td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td></tr>
</table>
<div class="qindex"><a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_c">c</a>&#160;|&#160;<a class="qindex" href="#letter_e">e</a>&#160;|&#160;<a class="qindex" href="#letter_f">f</a>&#160;|&#160;<a class="qindex" href="#letter_g">g</a>&#160;|&#160;<a class="qindex" href="#letter_l">l</a>&#160;|&#160;<a class="qindex" href="#letter_m">m</a>&#160;|&#160;<a class="qindex" href="#letter_r">r</a>&#160;|&#160;<a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a>&#160;|&#160;<a class="qindex" href="#letter_w">w</a>&#160;|&#160;<a class="qindex" href="#letter_y">y</a></div>
</div><!-- contents -->
<!-- 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>

+ 93
- 0
doxygen/html/classresumef_1_1batch__lock__t-members.html Voir le fichier

@@ -0,0 +1,93 @@
<!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: 成员列表</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"><b>resumef</b></li><li class="navelem"><a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt; 成员列表</div> </div>
</div><!--header-->
<div class="contents">

<p>成员的完整列表,这些成员属于 <a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>,包括所有继承而来的类成员</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#a3779f0030948ad54e4f97c8e73afa44d">batch_lock_t</a>(_Cont &amp;locks_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">explicit</span></td></tr>
<tr><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#af46b0d1ba6494e2955660271b190a99a">batch_lock_t</a>(_Cont &amp;locks_, _Assemble &amp;la_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">explicit</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#a2293d0f5d68f335ed8dd0bb6e89321a6">batch_lock_t</a>(std::adopt_lock_t, _Cont &amp;locks_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">explicit</span></td></tr>
<tr><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#abf8d154d25e3b66eb308750052fb660e">batch_lock_t</a>(std::adopt_lock_t, _Cont &amp;locks_, _Assemble &amp;la_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">explicit</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#a3da9e6b8f868fffed636704c551fea47">batch_lock_t</a>(const batch_lock_t &amp;)=delete</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#a820544949fcf42d08759f5f29686cc9c">batch_lock_t</a>(batch_lock_t &amp;&amp;_Right)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#aabbfeb513ac907b9c8caf6fda9a356d4">operator=</a>(const batch_lock_t &amp;)=delete</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e">operator=</a>(batch_lock_t &amp;&amp;_Right)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#abc72b35a9eef1bd6c39955d63cc8ce9c">unlock</a>()</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html#a661dad263c32b25b6bcc92c0d7b73830">~batch_lock_t</a>() noexcept</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
</table></div><!-- contents -->
<!-- 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>

+ 146
- 0
doxygen/html/classresumef_1_1batch__lock__t.html Voir le fichier

@@ -0,0 +1,146 @@
<!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: resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt; 模板类 参考</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"><b>resumef</b></li><li class="navelem"><a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-methods">Public 成员函数</a> &#124;
<a href="classresumef_1_1batch__lock__t-members.html">所有成员列表</a> </div>
<div class="headertitle">
<div class="title">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt; 模板类 参考</div> </div>
</div><!--header-->
<div class="contents">

<p>无死锁的批量枷锁。
<a href="classresumef_1_1batch__lock__t.html#details">更多...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public 成员函数</h2></td></tr>
<tr class="memitem:a3779f0030948ad54e4f97c8e73afa44d"><td class="memItemLeft" align="right" valign="top"><a id="a3779f0030948ad54e4f97c8e73afa44d"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#a3779f0030948ad54e4f97c8e73afa44d">batch_lock_t</a> (_Cont &amp;locks_)</td></tr>
<tr class="memdesc:a3779f0030948ad54e4f97c8e73afa44d"><td class="mdescLeft">&#160;</td><td class="mdescRight">通过锁容器构造,并立刻应用加锁算法。 <br /></td></tr>
<tr class="separator:a3779f0030948ad54e4f97c8e73afa44d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af46b0d1ba6494e2955660271b190a99a"><td class="memItemLeft" align="right" valign="top"><a id="af46b0d1ba6494e2955660271b190a99a"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#af46b0d1ba6494e2955660271b190a99a">batch_lock_t</a> (_Cont &amp;locks_, _Assemble &amp;la_)</td></tr>
<tr class="memdesc:af46b0d1ba6494e2955660271b190a99a"><td class="mdescLeft">&#160;</td><td class="mdescRight">通过锁容器和锁集合构造,并立刻应用加锁算法。 <br /></td></tr>
<tr class="separator:af46b0d1ba6494e2955660271b190a99a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2293d0f5d68f335ed8dd0bb6e89321a6"><td class="memItemLeft" align="right" valign="top"><a id="a2293d0f5d68f335ed8dd0bb6e89321a6"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#a2293d0f5d68f335ed8dd0bb6e89321a6">batch_lock_t</a> (std::adopt_lock_t, _Cont &amp;locks_)</td></tr>
<tr class="memdesc:a2293d0f5d68f335ed8dd0bb6e89321a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">通过锁容器构造,容器里的锁已经全部获得。 <br /></td></tr>
<tr class="separator:a2293d0f5d68f335ed8dd0bb6e89321a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abf8d154d25e3b66eb308750052fb660e"><td class="memItemLeft" align="right" valign="top"><a id="abf8d154d25e3b66eb308750052fb660e"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#abf8d154d25e3b66eb308750052fb660e">batch_lock_t</a> (std::adopt_lock_t, _Cont &amp;locks_, _Assemble &amp;la_)</td></tr>
<tr class="memdesc:abf8d154d25e3b66eb308750052fb660e"><td class="mdescLeft">&#160;</td><td class="mdescRight">通过锁容器和锁集合构造,容器里的锁已经全部获得。 <br /></td></tr>
<tr class="separator:abf8d154d25e3b66eb308750052fb660e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a661dad263c32b25b6bcc92c0d7b73830"><td class="memItemLeft" align="right" valign="top"><a id="a661dad263c32b25b6bcc92c0d7b73830"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#a661dad263c32b25b6bcc92c0d7b73830">~batch_lock_t</a> () noexcept</td></tr>
<tr class="memdesc:a661dad263c32b25b6bcc92c0d7b73830"><td class="mdescLeft">&#160;</td><td class="mdescRight">析构函数里,释放容器里的锁。 <br /></td></tr>
<tr class="separator:a661dad263c32b25b6bcc92c0d7b73830"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abc72b35a9eef1bd6c39955d63cc8ce9c"><td class="memItemLeft" align="right" valign="top"><a id="abc72b35a9eef1bd6c39955d63cc8ce9c"></a>
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#abc72b35a9eef1bd6c39955d63cc8ce9c">unlock</a> ()</td></tr>
<tr class="memdesc:abc72b35a9eef1bd6c39955d63cc8ce9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">手工释放容器里的锁,析构函数里将不再有释放操作。 <br /></td></tr>
<tr class="separator:abc72b35a9eef1bd6c39955d63cc8ce9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3da9e6b8f868fffed636704c551fea47"><td class="memItemLeft" align="right" valign="top"><a id="a3da9e6b8f868fffed636704c551fea47"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#a3da9e6b8f868fffed636704c551fea47">batch_lock_t</a> (const <a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> &amp;)=delete</td></tr>
<tr class="memdesc:a3da9e6b8f868fffed636704c551fea47"><td class="mdescLeft">&#160;</td><td class="mdescRight">不支持拷贝构造。 <br /></td></tr>
<tr class="separator:a3da9e6b8f868fffed636704c551fea47"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aabbfeb513ac907b9c8caf6fda9a356d4"><td class="memItemLeft" align="right" valign="top"><a id="aabbfeb513ac907b9c8caf6fda9a356d4"></a>
<a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#aabbfeb513ac907b9c8caf6fda9a356d4">operator=</a> (const <a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> &amp;)=delete</td></tr>
<tr class="memdesc:aabbfeb513ac907b9c8caf6fda9a356d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">不支持拷贝赋值。 <br /></td></tr>
<tr class="separator:aabbfeb513ac907b9c8caf6fda9a356d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a820544949fcf42d08759f5f29686cc9c"><td class="memItemLeft" align="right" valign="top"><a id="a820544949fcf42d08759f5f29686cc9c"></a>
&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#a820544949fcf42d08759f5f29686cc9c">batch_lock_t</a> (<a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> &amp;&amp;_Right)</td></tr>
<tr class="memdesc:a820544949fcf42d08759f5f29686cc9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">支持移动构造。 <br /></td></tr>
<tr class="separator:a820544949fcf42d08759f5f29686cc9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a057618d5a806ffe6fd106f851082f12e"><td class="memItemLeft" align="right" valign="top"><a id="a057618d5a806ffe6fd106f851082f12e"></a>
<a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e">operator=</a> (<a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> &amp;&amp;_Right)</td></tr>
<tr class="memdesc:a057618d5a806ffe6fd106f851082f12e"><td class="mdescLeft">&#160;</td><td class="mdescRight">支持移动赋值。 <br /></td></tr>
<tr class="separator:a057618d5a806ffe6fd106f851082f12e"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">详细描述</h2>
<div class="textblock"><h3>template&lt;class _Ty, class _Cont = std::vector&lt;_Ty&gt;, class _Assemble = detail::_LockVectorAssembleT&lt;_Ty, _Cont&gt;&gt;<br />
class resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</h3>

<p>无死锁的批量枷锁。 </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">_Ty</td><td>锁的类型。例如std::mutex,resumef::spinlock,resumef::mutex_t(线程用法)均可。 </td></tr>
<tr><td class="paramname">_Cont</td><td>容纳一批锁的容器。 </td></tr>
<tr><td class="paramname">_Assemble</td><td>与_Cont配套的锁集合,特化了如何操作_Ty。 </td></tr>
</table>
</dd>
</dl>
</div><hr/>该类的文档由以下文件生成:<ul>
<li>librf/src/<a class="el" href="spinlock_8h_source.html">spinlock.h</a></li>
</ul>
</div><!-- contents -->
<!-- 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>

BIN
doxygen/html/closed.png Voir le fichier


+ 107
- 0
doxygen/html/config_8h_source.html Voir le fichier

@@ -0,0 +1,107 @@
<!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/config.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">config.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="preprocessor">#ifndef RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#if defined(__clang__) || defined(_MSC_VER)</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#define RESUMEF_INLINE_STATE 1</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#define RESUMEF_INLINE_STATE 1</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#endif //defined(__clang__) || defined(_MSC_VER)</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#endif //RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; </div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#ifndef RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment">/* #undef RESUMEF_DEBUG_COUNTER */</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#endif //RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#ifndef RESUMEF_ENABLE_CONCEPT</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#ifdef __cpp_lib_concepts</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#define RESUMEF_ENABLE_CONCEPT 1</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#define RESUMEF_ENABLE_CONCEPT 1</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#endif //#ifdef __cpp_lib_concepts</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#endif //#ifndef RESUMEF_ENABLE_CONCEPT</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#ifndef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">/* #undef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE */</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#endif //_WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment">/* #undef RESUMEF_USE_CUSTOM_SPINLOCK */</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 202
- 0
doxygen/html/counted__ptr_8h_source.html Voir le fichier

@@ -0,0 +1,202 @@
<!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/counted_ptr.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">counted_ptr.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"> 8</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a name="l00009"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html"> 9</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; {</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html#ad3969379af7311183c1c11d13f6da9f3">counted_ptr</a>() noexcept = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; </div>
<div class="line"><a name="l00019"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#ad466495cf5a6056e326a923558676ccd"> 19</a></span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html#ad466495cf5a6056e326a923558676ccd">counted_ptr</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>&amp; cp) : _p(cp._p)</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; {</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; _lock();</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; }</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#ab752ffdd40c7ab1be06e7662488d8e24"> 27</a></span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html#ab752ffdd40c7ab1be06e7662488d8e24">counted_ptr</a>(T* p) : _p(p)</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; _lock();</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; }</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a8b6f5332dd4754c22970f7e5406c6233"> 35</a></span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html#a8b6f5332dd4754c22970f7e5406c6233">counted_ptr</a>(<a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>&amp;&amp; cp) noexcept</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; {</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; std::swap(_p, cp._p);</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; }</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; </div>
<div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a"> 43</a></span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>&amp; <a class="code" href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a">operator=</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>&amp; cp)</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; <span class="keywordflow">if</span> (&amp;cp != <span class="keyword">this</span>)</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; {</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a> t = cp;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; std::swap(_p, t._p);</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; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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; </div>
<div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#af6a044ce1cdecc3a2650f16f445de2d4"> 56</a></span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>&amp; <a class="code" href="structresumef_1_1counted__ptr.html#af6a044ce1cdecc3a2650f16f445de2d4">operator=</a>(<a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>&amp;&amp; cp) noexcept</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; {</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">if</span> (&amp;cp != <span class="keyword">this</span>)</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; std::swap(_p, cp._p);</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; }</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6"> 66</a></span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6">~counted_ptr</a>()</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; {</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; _unlock();</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; }</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; </div>
<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba"> 74</a></span>&#160; T* <a class="code" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba">operator-&gt;</a>() const noexcept</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; {</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keywordflow">return</span> _p;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; }</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; </div>
<div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a9f6757dac685431f2ae561a58c502d1f"> 82</a></span>&#160; T* <a class="code" href="structresumef_1_1counted__ptr.html#a9f6757dac685431f2ae561a58c502d1f">get</a>() const noexcept</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; {</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="keywordflow">return</span> _p;</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; </div>
<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899"> 90</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899">reset</a>()</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; {</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; _unlock();</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; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keywordtype">void</span> _unlock()</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; {</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">if</span> (_p != <span class="keyword">nullptr</span>)</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; {</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keyword">auto</span> t = _p;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; _p = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; t-&gt;unlock();</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; }</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; }</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordtype">void</span> _lock(T* p)</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="keywordflow">if</span> (p != <span class="keyword">nullptr</span>)</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; p-&gt;lock();</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; _p = p;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordtype">void</span> _lock()</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; <span class="keywordflow">if</span> (_p != <span class="keyword">nullptr</span>)</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; _p-&gt;lock();</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; }</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; T* _p = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; };</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> U&gt;</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; _Left, <span class="keyword">const</span> counted_ptr&lt;U&gt;&amp; _Right)</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; {</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">return</span> _Left.get() == _Right.get();</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; _Left, std::nullptr_t)</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">return</span> _Left.get() == <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; }</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (std::nullptr_t, <span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; _Left)</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keywordflow">return</span> _Left.get() == <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; }</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; _Left, std::nullptr_t)</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="keywordflow">return</span> _Left.get() != <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; }</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (std::nullptr_t, <span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; _Left)</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="keywordflow">return</span> _Left.get() != <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; }</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;}</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1counted__ptr_html_ab752ffdd40c7ab1be06e7662488d8e24"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#ab752ffdd40c7ab1be06e7662488d8e24">resumef::counted_ptr::counted_ptr</a></div><div class="ttdeci">counted_ptr(T *p)</div><div class="ttdoc">通过裸指针构造一个计数指针。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:27</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_af6a044ce1cdecc3a2650f16f445de2d4"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#af6a044ce1cdecc3a2650f16f445de2d4">resumef::counted_ptr::operator=</a></div><div class="ttdeci">counted_ptr &amp; operator=(counted_ptr &amp;&amp;cp) noexcept</div><div class="ttdoc">移动赋值函数。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:56</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_ad3969379af7311183c1c11d13f6da9f3"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#ad3969379af7311183c1c11d13f6da9f3">resumef::counted_ptr::counted_ptr</a></div><div class="ttdeci">counted_ptr() noexcept=default</div><div class="ttdoc">构造一个无内容的计数指针。</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_a8b6f5332dd4754c22970f7e5406c6233"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#a8b6f5332dd4754c22970f7e5406c6233">resumef::counted_ptr::counted_ptr</a></div><div class="ttdeci">counted_ptr(counted_ptr &amp;&amp;cp) noexcept</div><div class="ttdoc">移动构造函数。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:35</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_a9f6757dac685431f2ae561a58c502d1f"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#a9f6757dac685431f2ae561a58c502d1f">resumef::counted_ptr::get</a></div><div class="ttdeci">T * get() const noexcept</div><div class="ttdoc">获得管理的state指针。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:82</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html"><div class="ttname"><a href="structresumef_1_1counted__ptr.html">resumef::counted_ptr</a></div><div class="ttdoc">专用与state的智能计数指针,通过管理state内嵌的引用计数来管理state的生存期。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:9</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_aa33f9e7d3ee850bed6dbefd40252a899"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899">resumef::counted_ptr::reset</a></div><div class="ttdeci">void reset()</div><div class="ttdoc">重置为空指针。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:90</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_aa22f547da8b8e79b476ee83e4a790dba"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba">resumef::counted_ptr::operator-&gt;</a></div><div class="ttdeci">T * operator-&gt;() const noexcept</div><div class="ttdoc">重载指针操作符。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:74</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_a8a5bff0a86d41b1ab50f817be770573a"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a">resumef::counted_ptr::operator=</a></div><div class="ttdeci">counted_ptr &amp; operator=(const counted_ptr &amp;cp)</div><div class="ttdoc">拷贝赋值函数。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:43</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_a825f25bf4975e015f859e8ba29bd85b6"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6">resumef::counted_ptr::~counted_ptr</a></div><div class="ttdeci">~counted_ptr()</div><div class="ttdoc">析构函数中自动做一个计数减一操作。计数减为0,则删除state对象。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:66</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html_ad466495cf5a6056e326a923558676ccd"><div class="ttname"><a href="structresumef_1_1counted__ptr.html#ad466495cf5a6056e326a923558676ccd">resumef::counted_ptr::counted_ptr</a></div><div class="ttdeci">counted_ptr(const counted_ptr &amp;cp)</div><div class="ttdoc">拷贝构造函数。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:19</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>

+ 156
- 0
doxygen/html/current__scheduler_8h_source.html Voir le fichier

@@ -0,0 +1,156 @@
<!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/current_scheduler.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">current_scheduler.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_1get__current__scheduler__awaitor.html"> 8</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1get__current__scheduler__awaitor.html">get_current_scheduler_awaitor</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="keywordtype">bool</span> await_ready() <span class="keyword">const</span> noexcept</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; {</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; }</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</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="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keywordtype">bool</span> await_suspend(coroutine_handle&lt;_PromiseT&gt; handler)</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; {</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; _PromiseT&amp; promise = handler.promise();</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keyword">auto</span>* state = promise.get_state();</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; this-&gt;_scheduler = state-&gt;get_scheduler();</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; }</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* await_resume() <span class="keyword">const</span> noexcept</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="keywordflow">return</span> _scheduler;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; }</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* _scheduler;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#ifdef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">static</span> <a class="code" href="structresumef_1_1get__current__scheduler__awaitor.html">get_current_scheduler_awaitor</a> <a class="code" href="structresumef_1_1get__current__scheduler__awaitor.html#ae47a1b255bffdfc2c7762f4d9cf9b3bf">get_current_scheduler</a>() noexcept;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></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; </div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keyword">inline</span> <a class="code" href="structresumef_1_1get__current__scheduler__awaitor.html">get_current_scheduler_awaitor</a> get_current_scheduler() noexcept</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; <span class="keywordflow">return</span> {};</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; </div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="structresumef_1_1get__root__state__awaitor.html"> 57</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1get__root__state__awaitor.html">get_root_state_awaitor</a></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="keywordtype">bool</span> await_ready() <span class="keyword">const</span> noexcept</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; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; }</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</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="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordtype">bool</span> await_suspend(coroutine_handle&lt;_PromiseT&gt; handler)</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; _PromiseT&amp; promise = handler.promise();</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keyword">auto</span>* parent = promise.get_state();</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; this-&gt;_state = parent-&gt;get_root();</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* await_resume() <span class="keyword">const</span> noexcept</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; {</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">return</span> _state;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; }</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* _state;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;<span class="preprocessor">#ifdef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keyword">public</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_1get__root__state__awaitor.html">get_root_state_awaitor</a> <a class="code" href="structresumef_1_1get__root__state__awaitor.html#adffac6b1ec6065c68dc345aa6fff5e49">get_root_state</a>() noexcept;</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; };</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keyword">inline</span> <a class="code" href="structresumef_1_1get__root__state__awaitor.html">get_root_state_awaitor</a> get_root_state() noexcept</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; {</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</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;}</div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1get__root__state__awaitor_html"><div class="ttname"><a href="structresumef_1_1get__root__state__awaitor.html">resumef::get_root_state_awaitor</a></div><div class="ttdoc">获得本协程绑定的跟state指针的可等待对象。</div><div class="ttdef"><b>Definition:</b> current_scheduler.h:57</div></div>
<div class="ttc" id="astructresumef_1_1get__current__scheduler__awaitor_html"><div class="ttname"><a href="structresumef_1_1get__current__scheduler__awaitor.html">resumef::get_current_scheduler_awaitor</a></div><div class="ttdoc">获得本协程绑定的调度器的可等待对象。</div><div class="ttdef"><b>Definition:</b> current_scheduler.h:8</div></div>
<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_1get__root__state__awaitor_html_adffac6b1ec6065c68dc345aa6fff5e49"><div class="ttname"><a href="structresumef_1_1get__root__state__awaitor.html#adffac6b1ec6065c68dc345aa6fff5e49">resumef::get_root_state_awaitor::get_root_state</a></div><div class="ttdeci">static get_root_state_awaitor get_root_state() noexcept</div><div class="ttdoc">获得当前协程的跟state指针。</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_1get__current__scheduler__awaitor_html_ae47a1b255bffdfc2c7762f4d9cf9b3bf"><div class="ttname"><a href="structresumef_1_1get__current__scheduler__awaitor.html#ae47a1b255bffdfc2c7762f4d9cf9b3bf">resumef::get_current_scheduler_awaitor::get_current_scheduler</a></div><div class="ttdeci">static get_current_scheduler_awaitor get_current_scheduler() noexcept</div><div class="ttdoc">获得当前协程绑定的调度器。</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>

+ 155
- 0
doxygen/html/def_8h_source.html Voir le fichier

@@ -0,0 +1,155 @@
<!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/def.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">def.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="preprocessor">#define LIB_RESUMEF_VERSION 20906 // 2.9.6</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160; </div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="keyword">namespace </span>resumef</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;{</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">struct </span>scheduler_t;</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">template</span>&lt;<span class="keyword">class</span> _Ty = <span class="keywordtype">void</span>&gt;</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">struct </span>[[nodiscard]] future_t;</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; </div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">using</span> future_vt [[deprecated]] = future_t&lt;&gt;;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty = std::<span class="keywordtype">nullptr</span>_t, <span class="keyword">typename</span> _Alloc = std::allocator&lt;<span class="keywordtype">char</span>&gt;&gt;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">struct </span>generator_t;</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="keyword">template</span>&lt;<span class="keyword">class</span> _Ty = <span class="keywordtype">void</span>&gt;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keyword">struct </span>promise_t;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty = <span class="keywordtype">void</span>&gt;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <span class="keyword">struct </span>awaitable_t;</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; <span class="keyword">struct </span>state_base_t;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keyword">struct </span>switch_scheduler_t;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _PromiseT = <span class="keywordtype">void</span>&gt;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keyword">using</span> coroutine_handle = std::experimental::coroutine_handle&lt;_PromiseT&gt;;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <span class="keyword">using</span> suspend_always = std::experimental::suspend_always;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keyword">using</span> suspend_never = std::experimental::suspend_never;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mutexes&gt;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keyword">using</span> scoped_lock = std::scoped_lock&lt;_Mutexes...&gt;;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; </div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; constexpr <span class="keywordtype">size_t</span> _Version = LIB_RESUMEF_VERSION;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; scheduler_t* this_scheduler();</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;}</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;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; </div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keyword">extern</span> std::mutex g_resumef_cout_mutex;</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="keyword">extern</span> std::atomic&lt;intptr_t&gt; g_resumef_state_count;</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="keyword">extern</span> std::atomic&lt;intptr_t&gt; g_resumef_task_count;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="keyword">extern</span> std::atomic&lt;intptr_t&gt; g_resumef_evtctx_count;</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="keyword">extern</span> std::atomic&lt;intptr_t&gt; g_resumef_state_id;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="preprocessor">#endif</span></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="keyword">namespace </span>resumef</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keyword">struct </span>remove_cvref</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; {</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">typedef</span> std::remove_cv_t&lt;std::remove_reference_t&lt;T&gt;&gt; type;</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keyword">using</span> remove_cvref_t = <span class="keyword">typename</span> remove_cvref&lt;T&gt;::type;</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; constexpr <span class="keywordtype">size_t</span> _Align_size()</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> _ALIGN_REQ = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*) * 2;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">return</span> std::is_empty_v&lt;_Ty&gt; ? 0 :</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; (<span class="keyword">sizeof</span>(_Ty) + _ALIGN_REQ - 1) &amp; ~(_ALIGN_REQ - 1);</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; }</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;}</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="preprocessor">#include &quot;exception.inl&quot;</span></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="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 84
- 0
doxygen/html/dir_3c80010775d22af2067790ecc9cdcf9d.html Voir le fichier

@@ -0,0 +1,84 @@
<!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 目录参考</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> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">librf 目录参考</div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
目录</h2></td></tr>
</table>
</div><!-- contents -->
<!-- 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>

+ 80
- 0
doxygen/html/dir_54ae0e78d997f6903cdf0996223d047f.html Voir le fichier

@@ -0,0 +1,80 @@
<!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 目录参考</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">src 目录参考</div> </div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
<!-- 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>

BIN
doxygen/html/doc.png Voir le fichier


+ 1771
- 0
doxygen/html/doxygen.css
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


BIN
doxygen/html/doxygen.png Voir le fichier


+ 120
- 0
doxygen/html/dynsections.js Voir le fichier

@@ -0,0 +1,120 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.

Copyright (C) 1997-2017 by Dimitri van Heesch

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

@licend The above is the entire license notice
for the JavaScript code in this file
*/
function toggleVisibility(linkObj)
{
var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src');
if (content.is(':visible')===true) {
content.hide();
summary.show();
$(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
content.show();
summary.hide();
$(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
}
return false;
}

function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}

function toggleLevel(level)
{
$('table.directory tr').each(function() {
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
a.html('&#9660;');
$(this).show();
} else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
}
});
updateStripes();
}

function toggleFolder(id)
{
// the clicked row
var currentRow = $('#row_'+id);

// all rows after the clicked row
var rows = currentRow.nextAll("tr");

var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub

// only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() { return this.id.match(re); });

// first row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) {
// replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING
// replace right arrow by down arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
currentRowSpans.filter(".arrow").html('&#9660;');
// replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();
}


function toggleInherit(id)
{
var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
}
}
/* @license-end */

+ 85
- 0
doxygen/html/event_8h_source.html Voir le fichier

@@ -0,0 +1,85 @@
<!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/event.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">event.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="preprocessor">#include &quot;event_v1.h&quot;</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#include &quot;event_v2.h&quot;</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &quot;event_v2.inl&quot;</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 295
- 0
doxygen/html/event__v1_8h_source.html Voir le fichier

@@ -0,0 +1,295 @@
<!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/event_v1.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">event_v1.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="l00005"></a><span class="lineno"> 5</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; {</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="keyword">struct </span>event_impl;</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">typedef</span> _awaker&lt;event_impl&gt; event_awaker;</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;event_awaker&gt; event_awaker_ptr;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; </div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">struct </span>event_impl : <span class="keyword">public</span> std::enable_shared_from_this&lt;event_impl&gt;</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; {</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="comment">//typedef spinlock lock_type;</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">typedef</span> std::recursive_mutex lock_type;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; std::list&lt;event_awaker_ptr&gt; _awakes;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; intptr_t _counter;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; lock_type _lock;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; event_impl(intptr_t initial_counter_);</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="keywordtype">void</span> signal();</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="keywordtype">void</span> reset();</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="comment">//如果已经触发了awaker,则返回true</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordtype">bool</span> wait_(<span class="keyword">const</span> event_awaker_ptr&amp; awaker);</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> callee_t, <span class="keyword">class</span> dummy_t = std::enable_if&lt;!std::is_same&lt;std::remove_cv_t&lt;callee_t&gt;, event_awaker_ptr&gt;::value&gt;&gt;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; decltype(<span class="keyword">auto</span>) wait(callee_t&amp;&amp; awaker, dummy_t* dummy_ = <span class="keywordtype">nullptr</span>)</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; {</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; (void)dummy_;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keywordflow">return</span> wait_(std::make_shared&lt;event_awaker&gt;(std::forward&lt;callee_t&gt;(awaker)));</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; }</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; event_impl(<span class="keyword">const</span> event_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; event_impl(event_impl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; event_impl&amp; operator = (<span class="keyword">const</span> event_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; event_impl&amp; operator = (event_impl&amp;&amp;) = <span class="keyword">delete</span>;</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; }</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;<span class="keyword">namespace </span>event_v1</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; </div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="comment">//提供一种在协程和非协程之间同步的手段。</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="comment">//典型用法是在非协程的线程,或者异步代码里,调用signal()方法触发信号,</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="comment">//协程代码里,调用co_await wait()等系列方法等待同步。</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keyword">struct </span>event_t</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; {</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;detail::event_impl&gt; event_impl_ptr;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keyword">typedef</span> std::weak_ptr&lt;detail::event_impl&gt; event_impl_wptr;</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; event_impl_ptr _event;</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keyword">struct </span>wait_all_ctx;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; event_t(intptr_t initial_counter_ = 0);</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordtype">void</span> signal()<span class="keyword"> const</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; _event-&gt;signal();</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; }</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordtype">void</span> reset()<span class="keyword"> const</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; _event-&gt;reset();</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; </div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; future_t&lt;bool&gt;</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; wait() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period&gt;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; future_t&lt;bool&gt;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; wait_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt)<span class="keyword"> const</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keywordflow">return</span> wait_for_(std::chrono::duration_cast&lt;clock_type::duration&gt;(dt));</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="keyword">template</span>&lt;<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration&gt;</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; future_t&lt;bool&gt;</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; wait_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Clock, _Duration&gt;&amp; tp)<span class="keyword"> const</span></div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">return</span> wait_until_(std::chrono::time_point_cast&lt;clock_type::duration&gt;(tp));</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; </div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </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; </div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; wait_any(_Iter begin_, _Iter end_)</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; <span class="keywordflow">return</span> wait_any_(make_event_vector(begin_, end_));</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; }</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Cont&gt;</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt;</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; wait_any(<span class="keyword">const</span> _Cont&amp; cnt_)</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="keywordflow">return</span> wait_any_(make_event_vector(std::begin(cnt_), std::end(cnt_)));</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; </div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt;</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; wait_any_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, _Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; {</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">return</span> wait_any_for_(std::chrono::duration_cast&lt;clock_type::duration&gt;(dt), make_event_vector(begin_, end_));</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; }</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Cont&gt;</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt;</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; wait_any_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, <span class="keyword">const</span> _Cont&amp; cnt_)</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="keywordflow">return</span> wait_any_for_(std::chrono::duration_cast&lt;clock_type::duration&gt;(dt), make_event_vector(std::begin(cnt_), std::end(cnt_)));</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; }</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt;</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; wait_any_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Clock, _Duration&gt;&amp; tp, _Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; {</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordflow">return</span> wait_any_until_(std::chrono::time_point_cast&lt;clock_type::duration&gt;(tp), make_event_vector(begin_, end_));</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; }</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Cont&gt;</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; wait_any_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Clock, _Duration&gt;&amp; tp, <span class="keyword">const</span> _Cont&amp; cnt_)</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">return</span> wait_any_until_(std::chrono::time_point_cast&lt;clock_type::duration&gt;(tp), make_event_vector(std::begin(cnt_), std::end(cnt_)));</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; }</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; </div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; </div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; </div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keyword">static</span> future_t&lt;bool&gt;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; wait_all(_Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; {</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">return</span> wait_all_(make_event_vector(begin_, end_));</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Cont&gt;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keyword">static</span> future_t&lt;bool&gt;</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; wait_all(<span class="keyword">const</span> _Cont&amp; cnt_)</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; {</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">return</span> wait_all(std::begin(cnt_), std::end(cnt_));</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; }</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; </div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keyword">static</span> future_t&lt;bool&gt;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; wait_all_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, _Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">return</span> wait_all_for_(std::chrono::duration_cast&lt;clock_type::duration&gt;(dt), make_event_vector(begin_, end_));</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Cont&gt;</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keyword">static</span> future_t&lt;bool&gt;</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; wait_all_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, <span class="keyword">const</span> _Cont&amp; cnt_)</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; {</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">return</span> wait_all_for_(std::chrono::duration_cast&lt;clock_type::duration&gt;(dt), make_event_vector(std::begin(cnt_), std::end(cnt_)));</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; }</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; </div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keyword">static</span> future_t&lt;bool&gt;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; wait_all_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Clock, _Duration&gt;&amp; tp, _Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; {</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordflow">return</span> wait_all_until_(std::chrono::time_point_cast&lt;clock_type::duration&gt;(tp), make_event_vector(begin_, end_));</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; }</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Cont&gt;</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="keyword">static</span> future_t&lt;bool&gt;</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; wait_all_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Clock, _Duration&gt;&amp; tp, <span class="keyword">const</span> _Cont&amp; cnt_)</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> wait_all_until_(std::chrono::time_point_cast&lt;clock_type::duration&gt;(tp), make_event_vector(std::begin(cnt_), std::end(cnt_)));</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; </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; event_t(<span class="keyword">const</span> event_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; event_t(event_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; event_t&amp; operator = (<span class="keyword">const</span> event_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; event_t&amp; operator = (event_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keyword">static</span> std::vector&lt;event_impl_ptr&gt; make_event_vector(_Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; {</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; std::vector&lt;event_impl_ptr&gt; evts;</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; evts.reserve(std::distance(begin_, end_));</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = begin_; i != end_; ++i)</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; evts.push_back((*i)._event);</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; </div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">return</span> evts;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; }</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; <span class="keyword">inline</span> future_t&lt;bool&gt; wait_for_(<span class="keyword">const</span> clock_type::duration&amp; dt)<span class="keyword"> const</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">return</span> wait_until_(clock_type::now() + dt);</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; }</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; future_t&lt;bool&gt; wait_until_(<span class="keyword">const</span> clock_type::time_point&amp; tp) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; </div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt; wait_any_(std::vector&lt;event_impl_ptr&gt;&amp;&amp; evts);</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keyword">inline</span> <span class="keyword">static</span> future_t&lt;intptr_t&gt; wait_any_for_(<span class="keyword">const</span> clock_type::duration&amp; dt, std::vector&lt;event_impl_ptr&gt;&amp;&amp; evts)</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; {</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordflow">return</span> wait_any_until_(clock_type::now() + dt, std::forward&lt;std::vector&lt;event_impl_ptr&gt;&gt;(evts));</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; }</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keyword">static</span> future_t&lt;intptr_t&gt; wait_any_until_(<span class="keyword">const</span> clock_type::time_point&amp; tp, std::vector&lt;event_impl_ptr&gt;&amp;&amp; evts);</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; </div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keyword">static</span> future_t&lt;bool&gt; wait_all_(std::vector&lt;event_impl_ptr&gt;&amp;&amp; evts);</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keyword">inline</span> <span class="keyword">static</span> future_t&lt;bool&gt; wait_all_for_(<span class="keyword">const</span> clock_type::duration&amp; dt, std::vector&lt;event_impl_ptr&gt;&amp;&amp; evts)</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> wait_all_until_(clock_type::now() + dt, std::forward&lt;std::vector&lt;event_impl_ptr&gt;&gt;(evts));</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; <span class="keyword">static</span> future_t&lt;bool&gt; wait_all_until_(<span class="keyword">const</span> clock_type::time_point&amp; tp, std::vector&lt;event_impl_ptr&gt;&amp;&amp; evts);</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; };</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; </div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;}</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 242
- 0
doxygen/html/event__v2_8h_source.html Voir le fichier

@@ -0,0 +1,242 @@
<!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/event_v2.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">event_v2.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="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; {</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">struct </span>event_v2_impl;</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; </div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">inline</span> <span class="keyword">namespace </span>event_v2</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; {</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
<div class="line"><a name="l00019"></a><span class="lineno"><a class="line" href="structresumef_1_1event__t.html"> 19</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1event__t.html">event_t</a></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; {</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keyword">using</span> event_impl_ptr = std::shared_ptr&lt;detail::event_v2_impl&gt;;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <span class="keyword">using</span> clock_type = std::chrono::system_clock;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <a class="code" href="structresumef_1_1event__t.html">event_t</a>(<span class="keywordtype">bool</span> initially = <span class="keyword">false</span>);</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <a class="code" href="structresumef_1_1event__t.html">event_t</a>(std::adopt_lock_t);</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; ~<a class="code" href="structresumef_1_1event__t.html">event_t</a>();</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; </div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keywordtype">void</span> signal_all() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordtype">void</span> signal() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordtype">void</span> reset() <span class="keyword">const</span> noexcept;</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; <span class="keyword">struct </span>[[nodiscard]] awaiter;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; awaiter <span class="keyword">operator</span> co_await() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; awaiter wait() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Btype&gt;</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keyword">struct </span>timeout_awaitor_impl;</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; <span class="keyword">struct </span>[[nodiscard]] timeout_awaiter;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period&gt;</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; timeout_awaiter wait_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt) <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; </div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration&gt;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; timeout_awaiter wait_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Clock, _Duration&gt;&amp; tp) <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keyword">struct </span>[[nodiscard]] any_awaiter;</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="keyword">template</span>&lt;<span class="keyword">class </span>_Iter</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; &gt;</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; RESUMEF_REQUIRES(_IteratorOfT&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_any(_Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; -&gt;any_awaiter&lt;_Iter&gt;;</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; </div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Cont</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; &gt;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; RESUMEF_REQUIRES(_ContainerOfT&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_any(<span class="keyword">const</span> _Cont&amp; cnt_)</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; -&gt;any_awaiter&lt;decltype(std::begin(cnt_))&gt;;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; </div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keyword">struct </span>[[nodiscard]] timeout_any_awaiter;</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Rep, <span class="keyword">class </span>_Period, <span class="keyword">class </span>_Iter</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; &gt;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; RESUMEF_REQUIRES(_IteratorOfT&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_any_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, _Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; -&gt;timeout_any_awaiter&lt;_Iter&gt;;</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="keyword">template</span>&lt;<span class="keyword">class </span>_Rep, <span class="keyword">class </span>_Period, <span class="keyword">class </span>_Cont</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; &gt;</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; RESUMEF_REQUIRES(_ContainerOfT&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_any_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, <span class="keyword">const</span> _Cont&amp; cnt_)</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; -&gt;timeout_any_awaiter&lt;decltype(std::begin(cnt_))&gt;;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; </div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; </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">template</span>&lt;<span class="keyword">class</span> _Iter&gt;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">struct </span>[[nodiscard]] all_awaiter;</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; </div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Iter</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; &gt;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; RESUMEF_REQUIRES(_IteratorOfT&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_all(_Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; -&gt;all_awaiter&lt;_Iter&gt;;</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; </div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Cont</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; &gt;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; RESUMEF_REQUIRES(_ContainerOfT&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_all(<span class="keyword">const</span> _Cont&amp; cnt_)</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; -&gt;all_awaiter&lt;decltype(std::begin(cnt_))&gt;;</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; </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> _Iter&gt;</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keyword">struct </span>[[nodiscard]] timeout_all_awaiter;</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; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Rep, <span class="keyword">class </span>_Period, <span class="keyword">class </span>_Iter</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; &gt;</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; RESUMEF_REQUIRES(_IteratorOfT&lt;_Iter, event_t&gt;)</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_all_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, _Iter begin_, _Iter end_)</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; -&gt;timeout_all_awaiter&lt;_Iter&gt;;</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Rep, <span class="keyword">class </span>_Period, <span class="keyword">class </span>_Cont</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; &gt;</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; RESUMEF_REQUIRES(_ContainerOfT&lt;_Cont, event_t&gt;)</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keyword">static</span> <span class="keyword">auto</span> wait_all_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, <span class="keyword">const</span> _Cont&amp; cnt_)</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; -&gt;timeout_all_awaiter&lt;decltype(std::begin(cnt_))&gt;;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; </div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <a class="code" href="structresumef_1_1event__t.html">event_t</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1event__t.html">event_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <a class="code" href="structresumef_1_1event__t.html">event_t</a>(<a class="code" href="structresumef_1_1event__t.html">event_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <a class="code" href="structresumef_1_1event__t.html">event_t</a>&amp; operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1event__t.html">event_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <a class="code" href="structresumef_1_1event__t.html">event_t</a>&amp; operator = (<a class="code" href="structresumef_1_1event__t.html">event_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; event_impl_ptr _event;</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; };</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;}</div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1event__t_html"><div class="ttname"><a href="structresumef_1_1event__t.html">resumef::event_t</a></div><div class="ttdoc">用于协程的事件。</div><div class="ttdef"><b>Definition:</b> event_v2.h:19</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>

+ 115
- 0
doxygen/html/files.html Voir le fichier

@@ -0,0 +1,115 @@
<!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: 文件列表</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>
</div><!-- top -->
<!-- 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 class="header">
<div class="headertitle">
<div class="title">文件列表</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">这里列出了所有文档化的文件,并附带简要说明:</div><div class="directory">
<div class="levels">[详情级别 <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_3c80010775d22af2067790ecc9cdcf9d.html" target="_self">librf</a></td><td class="desc"></td></tr>
<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">&#9660;</span><span id="img_0_0_" class="iconfopen" onclick="toggleFolder('0_0_')">&#160;</span><a class="el" href="dir_54ae0e78d997f6903cdf0996223d047f.html" target="_self">src</a></td><td class="desc"></td></tr>
<tr id="row_0_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="__awaker_8h_source.html"><span class="icondoc"></span></a><b>_awaker.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="asio__task_8h_source.html"><span class="icondoc"></span></a><b>asio_task.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="awaitable_8h_source.html"><span class="icondoc"></span></a><b>awaitable.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="channel_8h_source.html"><span class="icondoc"></span></a><b>channel.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="channel__v1_8h_source.html"><span class="icondoc"></span></a><b>channel_v1.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_5_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="channel__v2_8h_source.html"><span class="icondoc"></span></a><b>channel_v2.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_6_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="config_8h_source.html"><span class="icondoc"></span></a><b>config.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_7_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="counted__ptr_8h_source.html"><span class="icondoc"></span></a><b>counted_ptr.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_8_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="current__scheduler_8h_source.html"><span class="icondoc"></span></a><b>current_scheduler.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_9_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="def_8h_source.html"><span class="icondoc"></span></a><b>def.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_10_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="event_8h_source.html"><span class="icondoc"></span></a><b>event.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_11_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="event__v1_8h_source.html"><span class="icondoc"></span></a><b>event_v1.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_12_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="event__v2_8h_source.html"><span class="icondoc"></span></a><b>event_v2.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_13_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="future_8h_source.html"><span class="icondoc"></span></a><b>future.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_14_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="generator_8h_source.html"><span class="icondoc"></span></a><b>generator.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_15_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="intrusive__link__queue_8h_source.html"><span class="icondoc"></span></a><b>intrusive_link_queue.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_16_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="mutex_8h_source.html"><span class="icondoc"></span></a><b>mutex.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_17_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="mutex__v1_8h_source.html"><span class="icondoc"></span></a><b>mutex_v1.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_18_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="mutex__v2_8h_source.html"><span class="icondoc"></span></a><b>mutex_v2.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_19_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="promise_8h_source.html"><span class="icondoc"></span></a><b>promise.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_20_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="rf__task_8h_source.html"><span class="icondoc"></span></a><b>rf_task.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_21_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ring__queue_8h_source.html"><span class="icondoc"></span></a><b>ring_queue.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_22_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ring__queue__lockfree_8h_source.html"><span class="icondoc"></span></a><b>ring_queue_lockfree.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_23_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ring__queue__spinlock_8h_source.html"><span class="icondoc"></span></a><b>ring_queue_spinlock.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_24_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="scheduler_8h_source.html"><span class="icondoc"></span></a><b>scheduler.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_25_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="sleep_8h_source.html"><span class="icondoc"></span></a><b>sleep.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_26_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="spinlock_8h_source.html"><span class="icondoc"></span></a><b>spinlock.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_27_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="state_8h_source.html"><span class="icondoc"></span></a><b>state.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_28_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="switch__scheduler_8h_source.html"><span class="icondoc"></span></a><b>switch_scheduler.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_29_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="timer_8h_source.html"><span class="icondoc"></span></a><b>timer.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_30_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="when_8h_source.html"><span class="icondoc"></span></a><b>when.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_31_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="when__v2_8h_source.html"><span class="icondoc"></span></a><b>when_v2.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_32_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="yield_8h_source.html"><span class="icondoc"></span></a><b>yield.h</b></td><td class="desc"></td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- 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>

BIN
doxygen/html/folderclosed.png Voir le fichier


BIN
doxygen/html/folderopen.png Voir le fichier


+ 282
- 0
doxygen/html/functions.html Voir le fichier

@@ -0,0 +1,282 @@
<!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: 类成员</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>
</div><!-- top -->
<!-- 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 class="contents">
<div class="textblock">这里列出了所有文档化的类成员,并附带类所属的文件:</div>

<h3><a id="index__5F"></a>- _ -</h3><ul>
<li>_state
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
</ul>


<h3><a id="index_b"></a>- b -</h3><ul>
<li>batch_lock_t()
: <a class="el" href="classresumef_1_1batch__lock__t.html#a3779f0030948ad54e4f97c8e73afa44d">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
</li>
</ul>


<h3><a id="index_c"></a>- c -</h3><ul>
<li>capacity()
: <a class="el" href="structresumef_1_1channel__t.html#a747f2db122ec920e6c253591729138ac">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>channel_t()
: <a class="el" href="structresumef_1_1channel__t.html#ac94d5fa13a6c1f5cc5d3ee3e50fa4232">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>counted_ptr()
: <a class="el" href="structresumef_1_1counted__ptr.html#ad3969379af7311183c1c11d13f6da9f3">resumef::counted_ptr&lt; T &gt;</a>
</li>
</ul>


<h3><a id="index_e"></a>- e -</h3><ul>
<li>empty()
: <a class="el" href="structresumef_1_1scheduler__t.html#a9d22640803eb9397cb844e532f4c8585">resumef::scheduler_t</a>
</li>
<li>event_t()
: <a class="el" href="structresumef_1_1event__t.html#a5ae54675783d984c3defd7b2093c91a1">resumef::event_t</a>
</li>
</ul>


<h3><a id="index_g"></a>- g -</h3><ul>
<li>get()
: <a class="el" href="structresumef_1_1counted__ptr.html#a9f6757dac685431f2ae561a58c502d1f">resumef::counted_ptr&lt; T &gt;</a>
</li>
<li>get_current_scheduler()
: <a class="el" href="structresumef_1_1get__current__scheduler__awaitor.html#ae47a1b255bffdfc2c7762f4d9cf9b3bf">resumef::get_current_scheduler_awaitor</a>
</li>
<li>get_future()
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#a647bd5f5a5572bbbe8a17000ea5dc06d">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
<li>get_root_state()
: <a class="el" href="structresumef_1_1get__root__state__awaitor.html#adffac6b1ec6065c68dc345aa6fff5e49">resumef::get_root_state_awaitor</a>
</li>
</ul>


<h3><a id="index_l"></a>- l -</h3><ul>
<li>local_scheduler_t()
: <a class="el" href="structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112">resumef::local_scheduler_t</a>
</li>
<li>lock()
: <a class="el" href="structresumef_1_1mutex__t.html#a15c654948f47113fc92223a811d60090">resumef::mutex_t</a>
, <a class="el" href="structresumef_1_1spinlock.html#ae313002e0db9c20b32d386e4eb91c372">resumef::spinlock</a>
</li>
</ul>


<h3><a id="index_m"></a>- m -</h3><ul>
<li>mutex_t()
: <a class="el" href="structresumef_1_1mutex__t.html#a597d0ca4a0f0d9963d0578afb5aa1ecf">resumef::mutex_t</a>
</li>
</ul>


<h3><a id="index_o"></a>- o -</h3><ul>
<li>operator co_await()
: <a class="el" href="structresumef_1_1channel__t.html#a9143771fbfda1d5996e89abc0eb2771e">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
, <a class="el" href="structresumef_1_1event__t.html#a9656c785d3c1c1d57560137894aa1be3">resumef::event_t</a>
, <a class="el" href="structresumef_1_1mutex__t.html#a9f086f150094d041b0c4372a8de504de">resumef::mutex_t</a>
</li>
<li>operator+()
: <a class="el" href="structresumef_1_1scheduler__t.html#a449d34ba6a8e28284f2b02089cb7dcec">resumef::scheduler_t</a>
</li>
<li>operator-&gt;()
: <a class="el" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba">resumef::counted_ptr&lt; T &gt;</a>
</li>
<li>operator&lt;&lt;()
: <a class="el" href="structresumef_1_1channel__t.html#a8554b84ad37f013471f2c5d2da745887">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>operator=()
: <a class="el" href="classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
, <a class="el" href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a">resumef::counted_ptr&lt; T &gt;</a>
</li>
</ul>


<h3><a id="index_r"></a>- r -</h3><ul>
<li>read()
: <a class="el" href="structresumef_1_1channel__t.html#a4ad0246bbfc50513d5a97227905f73c5">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>reset()
: <a class="el" href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899">resumef::counted_ptr&lt; T &gt;</a>
, <a class="el" href="structresumef_1_1event__t.html#a8da187ffff9c6aee7e9bad6d97af9f4a">resumef::event_t</a>
</li>
<li>run_one_batch()
: <a class="el" href="structresumef_1_1scheduler__t.html#a8b396c23730b15afd345328b96dbe1cc">resumef::scheduler_t</a>
</li>
<li>run_until_notask()
: <a class="el" href="structresumef_1_1scheduler__t.html#ae4ef2589ef2ce0335107d579b9e244a8">resumef::scheduler_t</a>
</li>
</ul>


<h3><a id="index_s"></a>- s -</h3><ul>
<li>set_exception()
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#a22f1adeb8ecfd2c078f620dbc7c368a1">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
<li>set_value()
: <a class="el" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3">resumef::awaitable_t&lt; _Ty &gt;</a>
</li>
<li>signal()
: <a class="el" href="structresumef_1_1event__t.html#ab9500bb2438c27adb4b34988eaa04ff9">resumef::event_t</a>
</li>
<li>signal_all()
: <a class="el" href="structresumef_1_1event__t.html#aac7bf6f81982126225125354769ad695">resumef::event_t</a>
</li>
<li>spinlock()
: <a class="el" href="structresumef_1_1spinlock.html#a32730a90789147297f9777fe866a224f">resumef::spinlock</a>
</li>
</ul>


<h3><a id="index_t"></a>- t -</h3><ul>
<li>throw_exception()
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#a2f7b2ef525186c9b7512dceb2453bebe">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
<li>timer()
: <a class="el" href="structresumef_1_1scheduler__t.html#a1d369882e156db4efc1a1693acfc0e22">resumef::scheduler_t</a>
</li>
<li>try_lock()
: <a class="el" href="structresumef_1_1mutex__t.html#a2844d5df6562c153bc5b32d1720efb30">resumef::mutex_t</a>
, <a class="el" href="structresumef_1_1spinlock.html#a62a6841e933ee7845a9ba42765a1b5e3">resumef::spinlock</a>
</li>
<li>try_lock_for()
: <a class="el" href="structresumef_1_1mutex__t.html#afca20661d92d6acac34b324cab774310">resumef::mutex_t</a>
</li>
<li>try_lock_until()
: <a class="el" href="structresumef_1_1mutex__t.html#ada9a310ff364fa8b1ee78dc2f799a8a5">resumef::mutex_t</a>
</li>
</ul>


<h3><a id="index_u"></a>- u -</h3><ul>
<li>unlock()
: <a class="el" href="classresumef_1_1batch__lock__t.html#abc72b35a9eef1bd6c39955d63cc8ce9c">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
, <a class="el" href="structresumef_1_1mutex__t.html#a0bc0948ed9eab5e41518ff9c1a6327a3">resumef::mutex_t</a>
, <a class="el" href="structresumef_1_1spinlock.html#af6d49dc277c0719e282a9387ed3c35e9">resumef::spinlock</a>
</li>
</ul>


<h3><a id="index_v"></a>- v -</h3><ul>
<li>via()
: <a class="el" href="structresumef_1_1switch__scheduler__awaitor.html#ad895f4414bfb91fde51ac735420246a9">resumef::switch_scheduler_awaitor</a>
</li>
</ul>


<h3><a id="index_w"></a>- w -</h3><ul>
<li>wait()
: <a class="el" href="structresumef_1_1event__t.html#a1231525d8406b1f69b563e84dc7fead7">resumef::event_t</a>
</li>
<li>wait_for()
: <a class="el" href="structresumef_1_1event__t.html#ac3d2ceb787ca321855731e40646d4112">resumef::event_t</a>
</li>
<li>wait_until()
: <a class="el" href="structresumef_1_1event__t.html#a083cda88807a10c4f68b134ce32c597b">resumef::event_t</a>
</li>
<li>when_all()
: <a class="el" href="structresumef_1_1when__.html#a6ba9218688af965ccf6d4bd9e98b152a">resumef::when_</a>
</li>
<li>when_any()
: <a class="el" href="structresumef_1_1when__.html#af4fe05b26abdab4ff00505ce56674ef9">resumef::when_</a>
</li>
<li>write()
: <a class="el" href="structresumef_1_1channel__t.html#a603d7e9a7e0d621292b5a3c340aaadc9">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
</ul>


<h3><a id="index_y"></a>- y -</h3><ul>
<li>yield()
: <a class="el" href="structresumef_1_1yield__awaitor.html#a25aa400aefa4bb8c2b61a190b0a7cdda">resumef::yield_awaitor</a>
</li>
</ul>


<h3><a id="index__7E"></a>- ~ -</h3><ul>
<li>~batch_lock_t()
: <a class="el" href="classresumef_1_1batch__lock__t.html#a661dad263c32b25b6bcc92c0d7b73830">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
</li>
<li>~counted_ptr()
: <a class="el" href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6">resumef::counted_ptr&lt; T &gt;</a>
</li>
<li>~event_t()
: <a class="el" href="structresumef_1_1event__t.html#af742aa0454758c3def349cacae86c229">resumef::event_t</a>
</li>
<li>~local_scheduler_t()
: <a class="el" href="structresumef_1_1local__scheduler__t.html#af4c4cd1c6626930ccf891368e3f3e6ec">resumef::local_scheduler_t</a>
</li>
</ul>
</div><!-- contents -->
<!-- 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>

+ 275
- 0
doxygen/html/functions_func.html Voir le fichier

@@ -0,0 +1,275 @@
<!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: 类成员 - 函数</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>
</div><!-- top -->
<!-- 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 class="contents">
&#160;

<h3><a id="index_b"></a>- b -</h3><ul>
<li>batch_lock_t()
: <a class="el" href="classresumef_1_1batch__lock__t.html#a3779f0030948ad54e4f97c8e73afa44d">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
</li>
</ul>


<h3><a id="index_c"></a>- c -</h3><ul>
<li>capacity()
: <a class="el" href="structresumef_1_1channel__t.html#a747f2db122ec920e6c253591729138ac">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>channel_t()
: <a class="el" href="structresumef_1_1channel__t.html#ac94d5fa13a6c1f5cc5d3ee3e50fa4232">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>counted_ptr()
: <a class="el" href="structresumef_1_1counted__ptr.html#ab752ffdd40c7ab1be06e7662488d8e24">resumef::counted_ptr&lt; T &gt;</a>
</li>
</ul>


<h3><a id="index_e"></a>- e -</h3><ul>
<li>empty()
: <a class="el" href="structresumef_1_1scheduler__t.html#a9d22640803eb9397cb844e532f4c8585">resumef::scheduler_t</a>
</li>
<li>event_t()
: <a class="el" href="structresumef_1_1event__t.html#ab3a49adfb8c1cfcfa606cca3148f946a">resumef::event_t</a>
</li>
</ul>


<h3><a id="index_g"></a>- g -</h3><ul>
<li>get()
: <a class="el" href="structresumef_1_1counted__ptr.html#a9f6757dac685431f2ae561a58c502d1f">resumef::counted_ptr&lt; T &gt;</a>
</li>
<li>get_current_scheduler()
: <a class="el" href="structresumef_1_1get__current__scheduler__awaitor.html#ae47a1b255bffdfc2c7762f4d9cf9b3bf">resumef::get_current_scheduler_awaitor</a>
</li>
<li>get_future()
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#a647bd5f5a5572bbbe8a17000ea5dc06d">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
<li>get_root_state()
: <a class="el" href="structresumef_1_1get__root__state__awaitor.html#adffac6b1ec6065c68dc345aa6fff5e49">resumef::get_root_state_awaitor</a>
</li>
</ul>


<h3><a id="index_l"></a>- l -</h3><ul>
<li>local_scheduler_t()
: <a class="el" href="structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112">resumef::local_scheduler_t</a>
</li>
<li>lock()
: <a class="el" href="structresumef_1_1mutex__t.html#abfbfd653a04d3c3b3d88a5bdcaba4664">resumef::mutex_t</a>
, <a class="el" href="structresumef_1_1spinlock.html#ae313002e0db9c20b32d386e4eb91c372">resumef::spinlock</a>
</li>
</ul>


<h3><a id="index_m"></a>- m -</h3><ul>
<li>mutex_t()
: <a class="el" href="structresumef_1_1mutex__t.html#a597d0ca4a0f0d9963d0578afb5aa1ecf">resumef::mutex_t</a>
</li>
</ul>


<h3><a id="index_o"></a>- o -</h3><ul>
<li>operator co_await()
: <a class="el" href="structresumef_1_1channel__t.html#a9143771fbfda1d5996e89abc0eb2771e">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
, <a class="el" href="structresumef_1_1event__t.html#a9656c785d3c1c1d57560137894aa1be3">resumef::event_t</a>
, <a class="el" href="structresumef_1_1mutex__t.html#a9f086f150094d041b0c4372a8de504de">resumef::mutex_t</a>
</li>
<li>operator+()
: <a class="el" href="structresumef_1_1scheduler__t.html#a449d34ba6a8e28284f2b02089cb7dcec">resumef::scheduler_t</a>
</li>
<li>operator-&gt;()
: <a class="el" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba">resumef::counted_ptr&lt; T &gt;</a>
</li>
<li>operator&lt;&lt;()
: <a class="el" href="structresumef_1_1channel__t.html#a8554b84ad37f013471f2c5d2da745887">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>operator=()
: <a class="el" href="classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
, <a class="el" href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a">resumef::counted_ptr&lt; T &gt;</a>
</li>
</ul>


<h3><a id="index_r"></a>- r -</h3><ul>
<li>read()
: <a class="el" href="structresumef_1_1channel__t.html#a4ad0246bbfc50513d5a97227905f73c5">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
<li>reset()
: <a class="el" href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899">resumef::counted_ptr&lt; T &gt;</a>
, <a class="el" href="structresumef_1_1event__t.html#a8da187ffff9c6aee7e9bad6d97af9f4a">resumef::event_t</a>
</li>
<li>run_one_batch()
: <a class="el" href="structresumef_1_1scheduler__t.html#a8b396c23730b15afd345328b96dbe1cc">resumef::scheduler_t</a>
</li>
<li>run_until_notask()
: <a class="el" href="structresumef_1_1scheduler__t.html#ae4ef2589ef2ce0335107d579b9e244a8">resumef::scheduler_t</a>
</li>
</ul>


<h3><a id="index_s"></a>- s -</h3><ul>
<li>set_exception()
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#a22f1adeb8ecfd2c078f620dbc7c368a1">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
<li>set_value()
: <a class="el" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3">resumef::awaitable_t&lt; _Ty &gt;</a>
</li>
<li>signal()
: <a class="el" href="structresumef_1_1event__t.html#ab9500bb2438c27adb4b34988eaa04ff9">resumef::event_t</a>
</li>
<li>signal_all()
: <a class="el" href="structresumef_1_1event__t.html#aac7bf6f81982126225125354769ad695">resumef::event_t</a>
</li>
<li>spinlock()
: <a class="el" href="structresumef_1_1spinlock.html#a32730a90789147297f9777fe866a224f">resumef::spinlock</a>
</li>
</ul>


<h3><a id="index_t"></a>- t -</h3><ul>
<li>throw_exception()
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#a2f7b2ef525186c9b7512dceb2453bebe">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
<li>timer()
: <a class="el" href="structresumef_1_1scheduler__t.html#a1d369882e156db4efc1a1693acfc0e22">resumef::scheduler_t</a>
</li>
<li>try_lock()
: <a class="el" href="structresumef_1_1mutex__t.html#a1dd128870c1fdcc7261ef0fa63e12254">resumef::mutex_t</a>
, <a class="el" href="structresumef_1_1spinlock.html#a62a6841e933ee7845a9ba42765a1b5e3">resumef::spinlock</a>
</li>
<li>try_lock_for()
: <a class="el" href="structresumef_1_1mutex__t.html#afca20661d92d6acac34b324cab774310">resumef::mutex_t</a>
</li>
<li>try_lock_until()
: <a class="el" href="structresumef_1_1mutex__t.html#aec072ad5fd0d6b688a3866ee9f1dc791">resumef::mutex_t</a>
</li>
</ul>


<h3><a id="index_u"></a>- u -</h3><ul>
<li>unlock()
: <a class="el" href="classresumef_1_1batch__lock__t.html#abc72b35a9eef1bd6c39955d63cc8ce9c">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
, <a class="el" href="structresumef_1_1mutex__t.html#a0bc0948ed9eab5e41518ff9c1a6327a3">resumef::mutex_t</a>
, <a class="el" href="structresumef_1_1spinlock.html#af6d49dc277c0719e282a9387ed3c35e9">resumef::spinlock</a>
</li>
</ul>


<h3><a id="index_v"></a>- v -</h3><ul>
<li>via()
: <a class="el" href="structresumef_1_1switch__scheduler__awaitor.html#ad895f4414bfb91fde51ac735420246a9">resumef::switch_scheduler_awaitor</a>
</li>
</ul>


<h3><a id="index_w"></a>- w -</h3><ul>
<li>wait()
: <a class="el" href="structresumef_1_1event__t.html#a1231525d8406b1f69b563e84dc7fead7">resumef::event_t</a>
</li>
<li>wait_for()
: <a class="el" href="structresumef_1_1event__t.html#ac3d2ceb787ca321855731e40646d4112">resumef::event_t</a>
</li>
<li>wait_until()
: <a class="el" href="structresumef_1_1event__t.html#a083cda88807a10c4f68b134ce32c597b">resumef::event_t</a>
</li>
<li>when_all()
: <a class="el" href="structresumef_1_1when__.html#a6ba9218688af965ccf6d4bd9e98b152a">resumef::when_</a>
</li>
<li>when_any()
: <a class="el" href="structresumef_1_1when__.html#a5eb64c53feea7f37b643f9b9c3faf685">resumef::when_</a>
</li>
<li>write()
: <a class="el" href="structresumef_1_1channel__t.html#a603d7e9a7e0d621292b5a3c340aaadc9">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a>
</li>
</ul>


<h3><a id="index_y"></a>- y -</h3><ul>
<li>yield()
: <a class="el" href="structresumef_1_1yield__awaitor.html#a25aa400aefa4bb8c2b61a190b0a7cdda">resumef::yield_awaitor</a>
</li>
</ul>


<h3><a id="index__7E"></a>- ~ -</h3><ul>
<li>~batch_lock_t()
: <a class="el" href="classresumef_1_1batch__lock__t.html#a661dad263c32b25b6bcc92c0d7b73830">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a>
</li>
<li>~counted_ptr()
: <a class="el" href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6">resumef::counted_ptr&lt; T &gt;</a>
</li>
<li>~event_t()
: <a class="el" href="structresumef_1_1event__t.html#af742aa0454758c3def349cacae86c229">resumef::event_t</a>
</li>
<li>~local_scheduler_t()
: <a class="el" href="structresumef_1_1local__scheduler__t.html#af4c4cd1c6626930ccf891368e3f3e6ec">resumef::local_scheduler_t</a>
</li>
</ul>
</div><!-- contents -->
<!-- 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>

+ 77
- 0
doxygen/html/functions_vars.html Voir le fichier

@@ -0,0 +1,77 @@
<!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: 类成员 - 变量</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>
</div><!-- top -->
<!-- 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 class="contents">
&#160;<ul>
<li>_state
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">resumef::awaitable_impl_t&lt; _Ty &gt;</a>
</li>
</ul>
</div><!-- contents -->
<!-- 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>

+ 144
- 0
doxygen/html/future_8h_source.html Voir le fichier

@@ -0,0 +1,144 @@
<!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/future.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">future.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="preprocessor">#pragma once</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160; </div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="keyword">namespace </span>resumef</div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;{</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; </div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00014"></a><span class="lineno"><a class="line" href="structresumef_1_1future__t.html"> 14</a></span>&#160; <span class="keyword">struct </span>[[nodiscard]] <a class="code" href="structresumef_1_1future__t.html">future_t</a></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; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1state__t.html">state_type</a> = <a class="code" href="structresumef_1_1state__t.html">state_t&lt;value_type&gt;</a>;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keyword">using</span> promise_type = promise_t&lt;value_type&gt;;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1future__t.html">future_type</a> = <a class="code" href="structresumef_1_1future__t.html">future_t&lt;value_type&gt;</a>;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keyword">using</span> lock_type = <span class="keyword">typename</span> <a class="code" href="structresumef_1_1spinlock.html">state_type::lock_type</a>;</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; <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr&lt;state_type&gt;</a> _state;</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; <a class="code" href="structresumef_1_1future__t.html">future_t</a>(<a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr&lt;state_type&gt;</a> _st) noexcept</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; :_state(std::move(_st)) {}</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <a class="code" href="structresumef_1_1future__t.html">future_t</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1future__t.html">future_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <a class="code" href="structresumef_1_1future__t.html">future_t</a>(<a class="code" href="structresumef_1_1future__t.html">future_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; </div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <a class="code" href="structresumef_1_1future__t.html">future_t</a>&amp; operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1future__t.html">future_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <a class="code" href="structresumef_1_1future__t.html">future_t</a>&amp; operator = (<a class="code" href="structresumef_1_1future__t.html">future_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keywordtype">bool</span> await_ready() noexcept</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; {</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordflow">return</span> _state-&gt;future_await_ready();</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; }</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; </div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</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="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keywordtype">void</span> await_suspend(coroutine_handle&lt;_PromiseT&gt; handler)</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; {</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; _state-&gt;future_await_suspend(handler);</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; }</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; value_type await_resume()</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; <span class="keywordflow">return</span> _state-&gt;future_await_resume();</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; }</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; };</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;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keyword">namespace </span>std {</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keyword">namespace </span>experimental {</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="comment">/*If the coroutine is defined as task&lt;float&gt; foo(std::string x, bool flag);, </span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="comment"> then its Promise type is std::coroutine_traits&lt;task&lt;float&gt;, std::string, bool&gt;::promise_type.</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="comment"> If the coroutine is a non-static member function, such as task&lt;void&gt; my_class::method1(int x) const;, </span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="comment"> its Promise type is std::coroutine_traits&lt;task&lt;void&gt;, const my_class&amp;, int&gt;::promise_type.</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span>... Args&gt;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keyword">struct </span>coroutine_traits&lt;resumef::future_t&lt;_Ty&gt;, Args...&gt;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; {</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keyword">typedef</span> resumef::promise_t&lt;_Ty&gt; promise_type;</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; };</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;} <span class="comment">// namespace std::experimental</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1future__t_html"><div class="ttname"><a href="structresumef_1_1future__t.html">resumef::future_t</a></div><div class="ttdoc">用于resumef协程的返回值。</div><div class="ttdef"><b>Definition:</b> future.h:14</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html"><div class="ttname"><a href="structresumef_1_1counted__ptr.html">resumef::counted_ptr&lt; state_type &gt;</a></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__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>
<!-- 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>

+ 418
- 0
doxygen/html/generator_8h_source.html Voir le fichier

@@ -0,0 +1,418 @@
<!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/generator.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">generator.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="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">* Modify from &lt;experimental/generator_t.h&gt;</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">* Purpose: Library support of coroutines. generator_t class</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">* http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0057r0.pdf</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#pragma once</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; </div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#pragma pack(push,_CRT_PACKING)</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#pragma push_macro(&quot;new&quot;)</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#undef new</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; </div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="keyword">namespace </span>resumef</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;{</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> promise_type&gt;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">struct </span>generator_iterator;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> promise_type&gt;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keyword">struct </span>generator_iterator&lt;void, promise_type&gt;</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; <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="keyword">typedef</span> ptrdiff_t difference_type;</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; coroutine_handle&lt;promise_type&gt; _Coro;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; generator_iterator(std::nullptr_t) : _Coro(nullptr)</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; }</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; generator_iterator(coroutine_handle&lt;promise_type&gt; _CoroArg) : _Coro(_CoroArg)</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; }</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; </div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; generator_iterator&amp; operator++()</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; {</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordflow">if</span> (_Coro.done())</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; _Coro = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; _Coro.resume();</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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; </div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordtype">void</span> operator++(<span class="keywordtype">int</span>)</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; {</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="comment">// This postincrement operator meets the requirements of the Ranges TS</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="comment">// InputIterator concept, but not those of Standard C++ InputIterator.</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; ++* <span class="keyword">this</span>;</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; </div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordtype">bool</span> operator==(generator_iterator <span class="keyword">const</span>&amp; right_)<span class="keyword"> const</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">return</span> _Coro == right_._Coro;</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; }</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; <span class="keywordtype">bool</span> operator!=(generator_iterator <span class="keyword">const</span>&amp; right_)<span class="keyword"> const</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == right_);</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; }</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; </div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> promise_type&gt;</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keyword">struct </span>generator_iterator&lt;std::nullptr_t, promise_type&gt; : <span class="keyword">public</span> generator_iterator&lt;void, promise_type&gt;</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; generator_iterator(std::nullptr_t) : generator_iterator&lt;void, promise_type&gt;(nullptr)</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; {</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; generator_iterator(coroutine_handle&lt;promise_type&gt; _CoroArg) : generator_iterator&lt;void, promise_type&gt;(_CoroArg)</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; {</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; }</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; </div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> promise_type&gt;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keyword">struct </span>generator_iterator : <span class="keyword">public</span> generator_iterator&lt;void, promise_type&gt;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; {</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keyword">using</span> reference = _Ty <span class="keyword">const</span>&amp;;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keyword">using</span> pointer = _Ty <span class="keyword">const</span>*;</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; generator_iterator(std::nullptr_t) : generator_iterator&lt;void, promise_type&gt;(nullptr)</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; {</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; generator_iterator(coroutine_handle&lt;promise_type&gt; _CoroArg) : generator_iterator&lt;void, promise_type&gt;(_CoroArg)</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; </div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; reference operator*()<span class="keyword"> const</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">return</span> *this-&gt;_Coro.promise()._CurrentValue;</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; </div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; pointer operator-&gt;()<span class="keyword"> const</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">return</span> this-&gt;_Coro.promise()._CurrentValue;</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; }</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; };</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; </div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> _Alloc&gt;</div>
<div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="structresumef_1_1generator__t.html"> 103</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1generator__t.html">generator_t</a></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1state__generator__t.html">state_type</a> = <a class="code" href="structresumef_1_1state__generator__t.html">state_generator_t</a>;</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;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">struct </span>promise_type</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; {</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1state__generator__t.html">state_type</a> = <a class="code" href="structresumef_1_1state__generator__t.html">state_generator_t</a>;</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keyword">using</span> future_type = <a class="code" href="structresumef_1_1generator__t.html">generator_t&lt;value_type&gt;</a>;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; _Ty <span class="keyword">const</span>* _CurrentValue;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; </div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; promise_type()</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; get_state()-&gt;set_initial_suspend(coroutine_handle&lt;promise_type&gt;::from_promise(*<span class="keyword">this</span>));</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; promise_type(promise_type&amp;&amp; _Right) noexcept = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; promise_type&amp; operator = (promise_type&amp;&amp; _Right) noexcept = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; promise_type(<span class="keyword">const</span> promise_type&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; promise_type&amp; operator = (<span class="keyword">const</span> promise_type&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; </div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <a class="code" href="structresumef_1_1generator__t.html">generator_t</a> get_return_object()</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; {</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>{ *<span class="keyword">this</span> };</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; }</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; suspend_always initial_suspend() noexcept</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; {</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; }</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; suspend_always final_suspend() noexcept</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; {</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; }</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; suspend_always yield_value(_Ty <span class="keyword">const</span>&amp; _Value) noexcept</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; {</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; _CurrentValue = std::addressof(_Value);</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; }</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="comment">//template&lt;class = std::enable_if_t&lt;!std::is_same_v&lt;_Ty, void&gt;, _Ty&gt;&gt;</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordtype">void</span> return_value(_Ty <span class="keyword">const</span>&amp; _Value) noexcept</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; _CurrentValue = std::addressof(_Value);</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="comment">//template&lt;class = std::enable_if_t&lt;std::is_same_v&lt;_Ty, void&gt;, _Ty&gt;&gt;</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordtype">void</span> return_value() noexcept</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; {</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; _CurrentValue = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; }</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; </div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordtype">void</span> set_exception(std::exception_ptr e)</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; {</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; (void)e;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; std::terminate();</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; }</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="preprocessor">#ifdef __clang__</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordtype">void</span> unhandled_exception()</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; std::terminate();</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; }</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; </div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Uty&gt;</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; _Uty&amp;&amp; await_transform(_Uty&amp;&amp; _Whatever) noexcept</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; {</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; static_assert(std::is_same_v&lt;_Uty, void&gt;,</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="stringliteral">&quot;co_await is not supported in coroutines of type std::experiemental::generator_t&quot;</span>);</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">return</span> std::forward&lt;_Uty&gt;(_Whatever);</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; </div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>* get_state() noexcept</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="preprocessor">#if RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordtype">size_t</span> _State_size = _Align_size&lt;state_type&gt;();</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;<span class="preprocessor">#if defined(__clang__)</span></div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keyword">auto</span> h = coroutine_handle&lt;promise_type&gt;::from_promise(*<span class="keyword">this</span>);</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordtype">char</span>* ptr = <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(h.address()) - _State_size;</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>*<span class="keyword">&gt;</span>(ptr);</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;<span class="preprocessor">#elif defined(_MSC_VER)</span></div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordtype">char</span>* ptr = <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>) - _State_size;</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>*<span class="keyword">&gt;</span>(ptr);</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;<span class="preprocessor">#error &quot;Unknown compiler&quot;</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">return</span> _state.get();</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;<span class="preprocessor">#endif</span></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; </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keyword">using</span> _Alloc_char = <span class="keyword">typename</span> std::allocator_traits&lt;_Alloc&gt;::template rebind_alloc&lt;char&gt;;</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; static_assert(std::is_same_v&lt;<span class="keywordtype">char</span>*, <span class="keyword">typename</span> std::allocator_traits&lt;_Alloc_char&gt;::pointer&gt;,</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="stringliteral">&quot;generator_t does not support allocators with fancy pointer types&quot;</span>);</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; static_assert(std::allocator_traits&lt;_Alloc_char&gt;::is_always_equal::value,</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="stringliteral">&quot;generator_t only supports stateless allocators&quot;</span>);</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; </div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordtype">void</span>* <span class="keyword">operator</span> <span class="keyword">new</span>(<span class="keywordtype">size_t</span> _Size)</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; {</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; _Alloc_char _Al;</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;<span class="preprocessor">#if RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keywordtype">size_t</span> _State_size = _Align_size&lt;state_type&gt;();</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; assert(_Size &gt;= <span class="keyword">sizeof</span>(uint32_t) &amp;&amp; _Size &lt; (std::numeric_limits&lt;uint32_t&gt;::max)() - <span class="keyword">sizeof</span>(_State_size));</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; </div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordtype">char</span>* ptr = _Al.allocate(_Size + _State_size);</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordtype">char</span>* _Rptr = ptr + _State_size;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;<span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot; generator_promise::new, alloc size=&quot;</span> &lt;&lt; (_Size + _State_size) &lt;&lt; std::endl;</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot; generator_promise::new, alloc ptr=&quot;</span> &lt;&lt; (<span class="keywordtype">void</span>*)ptr &lt;&lt; std::endl;</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot; generator_promise::new, return ptr=&quot;</span> &lt;&lt; (<span class="keywordtype">void</span>*)_Rptr &lt;&lt; std::endl;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; </div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="comment">//在初始地址上构造state</span></div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; {</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>* st = state_type::_Construct(ptr);</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; st-&gt;lock();</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; }</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; </div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">return</span> _Rptr;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordtype">char</span>* ptr = _Al.allocate(_Size);</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;<span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot; generator_promise::new, alloc size=&quot;</span> &lt;&lt; _Size &lt;&lt; std::endl;</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot; generator_promise::new, alloc ptr=&quot;</span> &lt;&lt; (<span class="keywordtype">void</span>*)ptr &lt;&lt; std::endl;</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot; generator_promise::new, return ptr=&quot;</span> &lt;&lt; (<span class="keywordtype">void</span>*)ptr &lt;&lt; std::endl;</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">return</span> ptr;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; }</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; </div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordtype">void</span> <span class="keyword">operator</span> <span class="keyword">delete</span>(<span class="keywordtype">void</span>* _Ptr, <span class="keywordtype">size_t</span> _Size)</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;<span class="preprocessor">#if RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keywordtype">size_t</span> _State_size = _Align_size&lt;state_type&gt;();</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; assert(_Size &gt;= <span class="keyword">sizeof</span>(uint32_t) &amp;&amp; _Size &lt; (std::numeric_limits&lt;uint32_t&gt;::max)() - <span class="keyword">sizeof</span>(_State_size));</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; </div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; *<span class="keyword">reinterpret_cast&lt;</span>uint32_t*<span class="keyword">&gt;</span>(_Ptr) = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(_Size + _State_size);</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; <a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>* st = <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>*<span class="keyword">&gt;</span>(<span class="keyword">static_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(_Ptr) - _State_size);</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; st-&gt;unlock();</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; _Alloc_char _Al;</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="keywordflow">return</span> _Al.deallocate(<span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span> *<span class="keyword">&gt;</span>(_Ptr), _Size);</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#if !RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr&lt;state_type&gt;</a> _state = state_generator_t::_Alloc_state();</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;<span class="preprocessor">#endif</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;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; </div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="keyword">using</span> iterator = generator_iterator&lt;_Ty, promise_type&gt;;</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; iterator begin()</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; {</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keywordflow">if</span> (_Coro)</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; _Coro.resume();</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">if</span> (_Coro.done())</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">return</span>{ <span class="keyword">nullptr</span> };</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; }</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">return</span> { _Coro };</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; }</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; iterator end()</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; {</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordflow">return</span>{ <span class="keyword">nullptr</span> };</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; }</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; </div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keyword">explicit</span> <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>(promise_type&amp; _Prom)</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; : _Coro(coroutine_handle&lt;promise_type&gt;::from_promise(_Prom))</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; }</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; </div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>() = <span class="keywordflow">default</span>;</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; <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>(<a class="code" href="structresumef_1_1generator__t.html">generator_t</a> <span class="keyword">const</span>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>&amp; operator=(<a class="code" href="structresumef_1_1generator__t.html">generator_t</a> <span class="keyword">const</span>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; </div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>(<a class="code" href="structresumef_1_1generator__t.html">generator_t</a>&amp;&amp; right_) noexcept</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; : _Coro(right_._Coro)</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; {</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; right_._Coro = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; }</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; </div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>&amp; operator=(<a class="code" href="structresumef_1_1generator__t.html">generator_t</a>&amp;&amp; right_) noexcept</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; {</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">this</span> != std::addressof(right_)) {</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; _Coro = right_._Coro;</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; right_._Coro = <span class="keyword">nullptr</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; <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; }</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; ~<a class="code" href="structresumef_1_1generator__t.html">generator_t</a>()</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; {</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">if</span> (_Coro) {</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; _Coro.destroy();</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; }</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; </div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>* detach_state()</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; {</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keyword">auto</span> t = _Coro;</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; _Coro = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keywordflow">return</span> t.promise().get_state();</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; }</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; </div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; coroutine_handle&lt;promise_type&gt; _Coro = <span class="keyword">nullptr</span>;</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; </div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;} <span class="comment">// namespace resumef</span></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="preprocessor">#pragma pop_macro(&quot;new&quot;)</span></div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160;<span class="preprocessor">#pragma pack(pop)</span></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;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></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">namespace </span>std {</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keyword">namespace </span>experimental {</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="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> _Alloc, <span class="keyword">typename</span>... Args&gt;</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keyword">struct </span>coroutine_traits&lt;resumef::generator_t&lt;_Ty, _Alloc&gt;, Args...&gt;</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; {</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structresumef_1_1generator__t.html">resumef::generator_t&lt;_Ty, _Alloc&gt;::promise_type</a> promise_type;</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; };</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; }</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;} <span class="comment">// namespace std::experimental</span></div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; </div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1counted__ptr_html"><div class="ttname"><a href="structresumef_1_1counted__ptr.html">resumef::counted_ptr&lt; state_type &gt;</a></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>
<div class="ttc" id="astructresumef_1_1generator__t_html"><div class="ttname"><a href="structresumef_1_1generator__t.html">resumef::generator_t</a></div><div class="ttdoc">专用于co_yield函数。</div><div class="ttdef"><b>Definition:</b> generator.h:103</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>

+ 119
- 0
doxygen/html/hierarchy.html Voir le fichier

@@ -0,0 +1,119 @@
<!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: 类继承关系</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>
</div><!-- top -->
<!-- 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 class="header">
<div class="headertitle">
<div class="title">类继承关系</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">此继承关系列表按字典顺序粗略的排序: </div><div class="directory">
<div class="levels">[详情级别 <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1adopt__manual__unlock__t.html" target="_self">resumef::adopt_manual_unlock_t</a></td><td class="desc">提示手工解锁,故相关的lock()函数不再返回batch_unlock_t。 </td></tr>
<tr id="row_1_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1awaitable__impl__t.html" target="_self">resumef::awaitable_impl_t&lt; _Ty &gt;</a></td><td class="desc">Awaitable_t&lt;&gt;的公共实现部分,用于减少awaitable_t&lt;&gt;的重复代码。 </td></tr>
<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1awaitable__t.html" target="_self">resumef::awaitable_t&lt; _Ty &gt;</a></td><td class="desc">用于包装‘异步函数’为‘可等待函数(awaitable function)’。 </td></tr>
<tr id="row_2_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classresumef_1_1batch__lock__t.html" target="_self">resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;</a></td><td class="desc">无死锁的批量枷锁。 </td></tr>
<tr id="row_3_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1batch__unlock__t.html" target="_self">resumef::batch_unlock_t&lt; _Mtxs &gt;</a></td><td class="desc">在析构的时候自动解锁mutex_t的辅助类。 </td></tr>
<tr id="row_4_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1channel__t.html" target="_self">resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;</a></td><td class="desc">可传递数据的模板信号量。 </td></tr>
<tr id="row_5_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr&lt; T &gt;</a></td><td class="desc">专用与state的智能计数指针,通过管理state内嵌的引用计数来管理state的生存期。 </td></tr>
<tr id="row_6_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr&lt; detail::state_event_all_t &gt;</a></td><td class="desc"></td></tr>
<tr id="row_7_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr&lt; detail::state_event_t &gt;</a></td><td class="desc"></td></tr>
<tr id="row_8_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr&lt; detail::state_mutex_t &gt;</a></td><td class="desc"></td></tr>
<tr id="row_9_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr&lt; resumef::state_t &gt;</a></td><td class="desc"></td></tr>
<tr id="row_10_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr&lt; state_type &gt;</a></td><td class="desc"></td></tr>
<tr id="row_11_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1event__t.html" target="_self">resumef::event_t</a></td><td class="desc">用于协程的事件。 </td></tr>
<tr id="row_12_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_12_" class="arrow" onclick="toggleFolder('12_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><b>std::exception</b></td><td class="desc">STL class </td></tr>
<tr id="row_12_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_12_0_" class="arrow" onclick="toggleFolder('12_0_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><b>std::logic_error</b></td><td class="desc">STL class </td></tr>
<tr id="row_12_0_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1channel__exception.html" target="_self">resumef::channel_exception</a></td><td class="desc">错误使用channel_t时产生的异常(v2版本已经不再抛此异常了)。 </td></tr>
<tr id="row_12_0_1_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1mutex__exception.html" target="_self">resumef::mutex_exception</a></td><td class="desc">错误使用mutex_t时产生的异常。 </td></tr>
<tr id="row_12_0_2_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1timer__canceled__exception.html" target="_self">resumef::timer_canceled_exception</a></td><td class="desc">定时器提前取消导致的异常。 </td></tr>
<tr id="row_13_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1future__t.html" target="_self">resumef::future_t&lt; _Ty &gt;</a></td><td class="desc">用于resumef协程的返回值。 </td></tr>
<tr id="row_14_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1future__t.html" target="_self">resumef::future_t&lt; T &gt;</a></td><td class="desc"></td></tr>
<tr id="row_15_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1generator__t.html" target="_self">resumef::generator_t&lt; _Ty, _Alloc &gt;</a></td><td class="desc">专用于co_yield函数。 </td></tr>
<tr id="row_16_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1get__current__scheduler__awaitor.html" target="_self">resumef::get_current_scheduler_awaitor</a></td><td class="desc">获得本协程绑定的调度器的可等待对象。 </td></tr>
<tr id="row_17_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1get__root__state__awaitor.html" target="_self">resumef::get_root_state_awaitor</a></td><td class="desc">获得本协程绑定的跟state指针的可等待对象。 </td></tr>
<tr id="row_18_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1local__scheduler__t.html" target="_self">resumef::local_scheduler_t</a></td><td class="desc">创建一个线程相关的调度器。 </td></tr>
<tr id="row_19_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1mutex__t.html" target="_self">resumef::mutex_t</a></td><td class="desc">支持递归的锁。 </td></tr>
<tr id="row_20_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classasio_1_1rf__task__t.html" target="_self">asio::rf_task_t&lt; Allocator &gt;</a></td><td class="desc">用于指示asio相关异步函数,返回resumef::future_t&lt;&gt;的类型,从而变成支持 librf 的协程函数。 </td></tr>
<tr id="row_21_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1scheduler__t.html" target="_self">resumef::scheduler_t</a></td><td class="desc">协程调度器。 </td></tr>
<tr id="row_22_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1spinlock.html" target="_self">resumef::spinlock</a></td><td class="desc">一个自旋锁实现。 </td></tr>
<tr id="row_23_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_23_" class="arrow" onclick="toggleFolder('23_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__base__t.html" target="_self">resumef::state_base_t</a></td><td class="desc">State基类,state用于在协程的promise和future之间共享数据。 </td></tr>
<tr id="row_23_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_23_0_" class="arrow" onclick="toggleFolder('23_0_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__future__t.html" target="_self">resumef::state_future_t</a></td><td class="desc">专用于future_t&lt;&gt;的state基类,实现了针对于future_t&lt;&gt;的公共方法等。 </td></tr>
<tr id="row_23_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__t.html" target="_self">resumef::state_t&lt; _Ty &gt;</a></td><td class="desc">专用于future_t&lt;&gt;的state类。 </td></tr>
<tr id="row_23_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__generator__t.html" target="_self">resumef::state_generator_t</a></td><td class="desc">专用于generator_t&lt;&gt;的state类。 </td></tr>
<tr id="row_24_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1switch__scheduler__awaitor.html" target="_self">resumef::switch_scheduler_awaitor</a></td><td class="desc">切换协程的可等待对象。 </td></tr>
<tr id="row_25_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1task__t.html" target="_self">resumef::task_t&lt; _Ty, class &gt;</a></td><td class="desc">协程任务类。 </td></tr>
<tr id="row_26_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1timer__handler.html" target="_self">resumef::timer_handler</a></td><td class="desc">定时器句柄。 </td></tr>
<tr id="row_27_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1timer__manager.html" target="_self">resumef::timer_manager</a></td><td class="desc">定时器管理器。 </td></tr>
<tr id="row_28_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1detail_1_1timer__target.html" target="_self">resumef::detail::timer_target</a></td><td class="desc">定时器对象。 </td></tr>
<tr id="row_29_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1when__.html" target="_self">resumef::when_</a></td><td class="desc">目前不知道怎么在doxygen里面能搜集到全局函数的文档。故用一个结构体来欺骗doxygen。 </td></tr>
<tr id="row_30_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1yield__awaitor.html" target="_self">resumef::yield_awaitor</a></td><td class="desc">将本协程让渡出一次调用的可等待对象。 </td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- 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>

+ 76
- 0
doxygen/html/index.html Voir le fichier

@@ -0,0 +1,76 @@
<!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: 首页</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>
</div><!-- top -->
<!-- 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 class="header">
<div class="headertitle">
<div class="title">librf 文档</div> </div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
<!-- 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>

+ 184
- 0
doxygen/html/intrusive__link__queue_8h_source.html Voir le fichier

@@ -0,0 +1,184 @@
<!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/intrusive_link_queue.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">intrusive_link_queue.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="l00005"></a><span class="lineno"> 5</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr = _Node*, <span class="keyword">class</span> _Sty = u<span class="keywordtype">int</span>32_t&gt;</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; <span class="keyword">struct </span>intrusive_link_queue</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; {</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">using</span> node_type = _Node;</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">using</span> node_ptr_type = _Nodeptr;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">using</span> size_type = _Sty;</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; intrusive_link_queue();</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; intrusive_link_queue(<span class="keyword">const</span> intrusive_link_queue&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; intrusive_link_queue(intrusive_link_queue&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; intrusive_link_queue&amp; operator =(<span class="keyword">const</span> intrusive_link_queue&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; intrusive_link_queue&amp; operator =(intrusive_link_queue&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keyword">auto</span> size() const noexcept-&gt;size_type;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keywordtype">bool</span> empty() const noexcept;</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keywordtype">void</span> push_back(node_ptr_type node) noexcept;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; auto try_pop() noexcept-&gt;node_ptr_type;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; private:</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; node_ptr_type _head;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; node_ptr_type _tail;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="preprocessor">#ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; std::atomic&lt;size_type&gt; m_count;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; };</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; intrusive_link_queue&lt;_Node, _Nodeptr, _Sty&gt;::intrusive_link_queue()</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; : _head(nullptr)</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; , _tail(nullptr)</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; , m_count(0)</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; #endif</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; {</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; </div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keyword">auto</span> intrusive_link_queue&lt;_Node, _Nodeptr, _Sty&gt;::size() const noexcept-&gt;size_type</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;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">return</span> m_count.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; size_type count = 0;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">for</span> (node_type* node = _head; node != <span class="keyword">nullptr</span>; node = node-&gt;next)</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; ++count;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">return</span> count;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; }</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keywordtype">bool</span> intrusive_link_queue&lt;_Node, _Nodeptr, _Sty&gt;::empty() const noexcept</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; {</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">return</span> _head == <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; }</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordtype">void</span> intrusive_link_queue&lt;_Node, _Nodeptr, _Sty&gt;::push_back(node_ptr_type node) noexcept</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; {</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; assert(node != <span class="keyword">nullptr</span>);</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; node-&gt;_next = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">if</span> (_head == <span class="keyword">nullptr</span>)</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; {</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; _head = _tail = node;</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; }</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; _tail-&gt;_next = node;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; _tail = node;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; }</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; m_count.fetch_add(1, std::memory_order_acq_rel);</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="preprocessor"> #endif</span></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; </div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keyword">auto</span> intrusive_link_queue&lt;_Node, _Nodeptr, _Sty&gt;::try_pop() noexcept-&gt;node_ptr_type</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; <span class="keywordflow">if</span> (_head == <span class="keyword">nullptr</span>)</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; </div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; node_ptr_type node = _head;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; _head = node-&gt;_next;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; node-&gt;_next = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">if</span> (_tail == node)</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; assert(node-&gt;_next == <span class="keyword">nullptr</span>);</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; _tail = <span class="keyword">nullptr</span>;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; }</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; </div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; m_count.fetch_sub(1, std::memory_order_acq_rel);</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="preprocessor"> #endif</span></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; <span class="keywordflow">return</span> node;</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; }</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 35
- 0
doxygen/html/jquery.js
Fichier diff supprimé car celui-ci est trop grand
Voir le fichier


+ 50
- 0
doxygen/html/menu.js Voir le fichier

@@ -0,0 +1,50 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.

Copyright (C) 1997-2017 by Dimitri van Heesch

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

@licend The above is the entire license notice
for the JavaScript code in this file
*/
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
function makeTree(data,relPath) {
var result='';
if ('children' in data) {
result+='<ul>';
for (var i in data.children) {
result+='<li><a href="'+relPath+data.children[i].url+'">'+
data.children[i].text+'</a>'+
makeTree(data.children[i],relPath)+'</li>';
}
result+='</ul>';
}
return result;
}

$('#main-nav').append(makeTree(menudata,relPath));
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
if (searchEnabled) {
if (serverSide) {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
} else {
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
}
}
$('#main-menu').smartmenus();
}
/* @license-end */

+ 65
- 0
doxygen/html/menudata.js Voir le fichier

@@ -0,0 +1,65 @@
/*
@licstart The following is the entire license notice for the
JavaScript code in this file.

Copyright (C) 1997-2019 by Dimitri van Heesch

This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

@licend The above is the entire license notice
for the JavaScript code in this file
*/
var menudata={children:[
{text:"首页",url:"index.html"},
{text:"类",url:"annotated.html",children:[
{text:"类列表",url:"annotated.html"},
{text:"类索引",url:"classes.html"},
{text:"类继承关系",url:"hierarchy.html"},
{text:"类成员",url:"functions.html",children:[
{text:"全部",url:"functions.html",children:[
{text:"_",url:"functions.html#index__5F"},
{text:"b",url:"functions.html#index_b"},
{text:"c",url:"functions.html#index_c"},
{text:"e",url:"functions.html#index_e"},
{text:"g",url:"functions.html#index_g"},
{text:"l",url:"functions.html#index_l"},
{text:"m",url:"functions.html#index_m"},
{text:"o",url:"functions.html#index_o"},
{text:"r",url:"functions.html#index_r"},
{text:"s",url:"functions.html#index_s"},
{text:"t",url:"functions.html#index_t"},
{text:"u",url:"functions.html#index_u"},
{text:"v",url:"functions.html#index_v"},
{text:"w",url:"functions.html#index_w"},
{text:"y",url:"functions.html#index_y"},
{text:"~",url:"functions.html#index__7E"}]},
{text:"函数",url:"functions_func.html",children:[
{text:"b",url:"functions_func.html#index_b"},
{text:"c",url:"functions_func.html#index_c"},
{text:"e",url:"functions_func.html#index_e"},
{text:"g",url:"functions_func.html#index_g"},
{text:"l",url:"functions_func.html#index_l"},
{text:"m",url:"functions_func.html#index_m"},
{text:"o",url:"functions_func.html#index_o"},
{text:"r",url:"functions_func.html#index_r"},
{text:"s",url:"functions_func.html#index_s"},
{text:"t",url:"functions_func.html#index_t"},
{text:"u",url:"functions_func.html#index_u"},
{text:"v",url:"functions_func.html#index_v"},
{text:"w",url:"functions_func.html#index_w"},
{text:"y",url:"functions_func.html#index_y"},
{text:"~",url:"functions_func.html#index__7E"}]},
{text:"变量",url:"functions_vars.html"}]}]},
{text:"文件",url:"files.html",children:[
{text:"文件列表",url:"files.html"}]}]}

+ 85
- 0
doxygen/html/mutex_8h_source.html Voir le fichier

@@ -0,0 +1,85 @@
<!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/mutex.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">mutex.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="preprocessor">#include &quot;mutex_v1.h&quot;</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#include &quot;mutex_v2.h&quot;</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &quot;mutex_v2.inl&quot;</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 172
- 0
doxygen/html/mutex__v1_8h_source.html Voir le fichier

@@ -0,0 +1,172 @@
<!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/mutex_v1.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">mutex_v1.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="l00005"></a><span class="lineno"> 5</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; {</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="keyword">struct </span>mutex_impl;</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; typedef ::resumef::detail::_awaker&lt;mutex_impl&gt; mutex_awaker;</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;mutex_awaker&gt; mutex_awaker_ptr;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; </div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">struct </span>mutex_impl : <span class="keyword">public</span> std::enable_shared_from_this&lt;mutex_impl&gt;</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; {</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="comment">//typedef spinlock lock_type;</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">typedef</span> std::recursive_mutex lock_type;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; std::list&lt;mutex_awaker_ptr&gt; _awakes;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; mutex_awaker_ptr _owner;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; lock_type _lock;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; mutex_impl();</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="comment">//如果已经触发了awaker,则返回true</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="keywordtype">bool</span> lock_(<span class="keyword">const</span> mutex_awaker_ptr&amp; awaker);</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="keywordtype">bool</span> try_lock_(<span class="keyword">const</span> mutex_awaker_ptr&amp; awaker);</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keywordtype">void</span> unlock();</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> callee_t, <span class="keyword">class</span> dummy_t = std::enable_if&lt;!std::is_same&lt;std::remove_cv_t&lt;callee_t&gt;, mutex_awaker_ptr&gt;::value&gt;&gt;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; decltype(<span class="keyword">auto</span>) lock(callee_t&amp;&amp; awaker, dummy_t* dummy_ = <span class="keywordtype">nullptr</span>)</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; {</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; (void)dummy_;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keywordflow">return</span> lock_(std::make_shared&lt;mutex_awaker&gt;(std::forward&lt;callee_t&gt;(awaker)));</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; }</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; </div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; mutex_impl(<span class="keyword">const</span> mutex_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; mutex_impl(mutex_impl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; mutex_impl&amp; operator = (<span class="keyword">const</span> mutex_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; mutex_impl&amp; operator = (mutex_impl&amp;&amp;) = <span class="keyword">delete</span>;</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; }</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;<span class="keyword">namespace </span>mutex_v1</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; <span class="keyword">struct </span>mutex_t</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; {</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;detail::mutex_impl&gt; lock_impl_ptr;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keyword">typedef</span> std::weak_ptr&lt;detail::mutex_impl&gt; lock_impl_wptr;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; lock_impl_ptr _locker;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; mutex_t();</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordtype">void</span> unlock()<span class="keyword"> const</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; _locker-&gt;unlock();</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; </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; future_t&lt;bool&gt; lock() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordtype">bool</span> try_lock() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="comment">/*</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="comment"> template&lt;class _Rep, class _Period&gt;</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="comment"> awaitable_t&lt;bool&gt;</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="comment"> try_lock_for(const std::chrono::duration&lt;_Rep, _Period&gt; &amp; dt) const</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;<span class="comment"> {</span></div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;<span class="comment"> return try_lock_for_(std::chrono::duration_cast&lt;clock_type::duration&gt;(dt));</span></div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;<span class="comment"> }</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="comment"> template&lt;class _Clock, class _Duration&gt;</span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="comment"> awaitable_t&lt;bool&gt;</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="comment"> try_lock_until(const std::chrono::time_point&lt;_Clock, _Duration&gt; &amp; tp) const</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;<span class="comment"> {</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="comment"> return try_lock_until_(std::chrono::time_point_cast&lt;clock_type::duration&gt;(tp));</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="comment"> }</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="comment"> */</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; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; mutex_t(<span class="keyword">const</span> mutex_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; mutex_t(mutex_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; mutex_t&amp; operator = (<span class="keyword">const</span> mutex_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; mutex_t&amp; operator = (mutex_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keyword">inline</span> future_t&lt;bool&gt; try_lock_for_(<span class="keyword">const</span> clock_type::duration&amp; dt)<span class="keyword"> const</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keywordflow">return</span> try_lock_until_(clock_type::now() + dt);</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; future_t&lt;bool&gt; try_lock_until_(<span class="keyword">const</span> clock_type::time_point&amp; tp) <span class="keyword">const</span>;</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;}</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 217
- 0
doxygen/html/mutex__v2_8h_source.html Voir le fichier

@@ -0,0 +1,217 @@
<!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/mutex_v2.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">mutex_v2.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="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; {</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">struct </span>mutex_v2_impl;</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; </div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">inline</span> <span class="keyword">namespace </span>mutex_v2</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; {</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
<div class="line"><a name="l00017"></a><span class="lineno"><a class="line" href="structresumef_1_1adopt__manual__unlock__t.html"> 17</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1adopt__manual__unlock__t.html">adopt_manual_unlock_t</a>{};</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; </div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; constexpr <a class="code" href="structresumef_1_1adopt__manual__unlock__t.html">adopt_manual_unlock_t</a> adopt_manual_unlock;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mtxs&gt;</div>
<div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="structresumef_1_1batch__unlock__t.html"> 28</a></span>&#160; <span class="keyword">struct </span>[[nodiscard]] <a class="code" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a>;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; </div>
<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="structresumef_1_1mutex__t.html"> 34</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; {</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="keywordtype">bool</span> is_locked() <span class="keyword">const</span>;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">struct </span>lock_awaiter;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keyword">struct </span>[[nodiscard]] awaiter;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keyword">struct </span>[[nodiscard]] manual_awaiter;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; awaiter<span class="comment">/*batch_unlock_t*/</span> lock() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; </div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; awaiter<span class="comment">/*batch_unlock_t*/</span> <span class="keyword">operator</span> co_await() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; manual_awaiter<span class="comment">/*void*/</span> lock(<a class="code" href="structresumef_1_1adopt__manual__unlock__t.html">adopt_manual_unlock_t</a> manual_unlock_tag) <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">struct </span>[[nodiscard]] try_awaiter;</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; </div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; try_awaiter<span class="comment">/*bool*/</span> try_lock() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; </div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keyword">struct </span>[[nodiscard]] unlock_awaiter;</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; unlock_awaiter<span class="comment">/*void*/</span> unlock() <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; </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; <span class="keyword">struct </span>[[nodiscard]] timeout_awaiter;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; </div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period&gt;</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; timeout_awaiter<span class="comment">/*bool*/</span> try_lock_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt) <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period&gt;</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; timeout_awaiter<span class="comment">/*bool*/</span> try_lock_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Rep, _Period&gt;&amp; tp) <span class="keyword">const</span> noexcept;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; </div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordtype">void</span> lock(<span class="keywordtype">void</span>* unique_address) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; </div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordtype">bool</span> try_lock(<span class="keywordtype">void</span>* unique_address) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period&gt;</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordtype">bool</span> try_lock_for(<span class="keyword">const</span> std::chrono::duration&lt;_Rep, _Period&gt;&amp; dt, <span class="keywordtype">void</span>* unique_address);</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; </div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period&gt;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordtype">bool</span> try_lock_until(<span class="keyword">const</span> std::chrono::time_point&lt;_Rep, _Period&gt;&amp; tp, <span class="keywordtype">void</span>* unique_address);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>* unique_address) <span class="keyword">const</span>;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; </div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; </div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mtxs</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; , <span class="keyword">typename</span> = std::enable_if_t&lt;std::conjunction_v&lt;std::is_same&lt;remove_cvref_t&lt;_Mtxs&gt;, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&gt;...&gt;&gt;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; &gt;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keyword">static</span> <a class="code" href="structresumef_1_1future__t.html">future_t</a>&lt;<a class="code" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a>&lt;_Mtxs...&gt;&gt; lock(_Mtxs&amp;... mtxs);</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; </div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mtxs</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; , <span class="keyword">typename</span> = std::enable_if_t&lt;std::conjunction_v&lt;std::is_same&lt;remove_cvref_t&lt;_Mtxs&gt;, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&gt;...&gt;&gt;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; &gt;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keyword">static</span> <a class="code" href="structresumef_1_1future__t.html">future_t&lt;&gt;</a> lock(<a class="code" href="structresumef_1_1adopt__manual__unlock__t.html">adopt_manual_unlock_t</a> manual_unlock_tag, _Mtxs&amp;... mtxs);</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mtxs</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; , <span class="keyword">typename</span> = std::enable_if_t&lt;std::conjunction_v&lt;std::is_same&lt;remove_cvref_t&lt;_Mtxs&gt;, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&gt;...&gt;&gt;</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; &gt;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keyword">static</span> <a class="code" href="structresumef_1_1future__t.html">future_t&lt;&gt;</a> unlock(_Mtxs&amp;... mtxs);</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; </div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</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>... _Mtxs</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; , <span class="keyword">typename</span> = std::enable_if_t&lt;std::conjunction_v&lt;std::is_same&lt;remove_cvref_t&lt;_Mtxs&gt;, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&gt;...&gt;&gt;</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; &gt;</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keyword">static</span> <a class="code" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a>&lt;_Mtxs...&gt; lock(<span class="keywordtype">void</span>* unique_address, _Mtxs&amp;... mtxs);</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; </div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mtxs</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; , <span class="keyword">typename</span> = std::enable_if_t&lt;std::conjunction_v&lt;std::is_same&lt;remove_cvref_t&lt;_Mtxs&gt;, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&gt;...&gt;&gt;</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; &gt;</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> lock(<a class="code" href="structresumef_1_1adopt__manual__unlock__t.html">adopt_manual_unlock_t</a> manual_unlock_tag, <span class="keywordtype">void</span>* unique_address, _Mtxs&amp;... mtxs);</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mtxs</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; , <span class="keyword">typename</span> = std::enable_if_t&lt;std::conjunction_v&lt;std::is_same&lt;remove_cvref_t&lt;_Mtxs&gt;, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&gt;...&gt;&gt;</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; &gt;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>* unique_address, _Mtxs&amp;... mtxs);</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; </div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>();</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; </div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>(std::adopt_lock_t) noexcept;</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; ~<a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>() noexcept;</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; </div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>(<a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&amp; operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&amp; operator = (<a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;detail::mutex_v2_impl&gt; mutex_impl_ptr;</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keyword">struct </span>_MutexAwaitAssembleT;</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span>... _Mtxs&gt; <span class="keyword">friend</span> <span class="keyword">struct </span><a class="code" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a>;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; </div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; mutex_impl_ptr _mutex;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; };</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><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1adopt__manual__unlock__t_html"><div class="ttname"><a href="structresumef_1_1adopt__manual__unlock__t.html">resumef::adopt_manual_unlock_t</a></div><div class="ttdoc">提示手工解锁,故相关的lock()函数不再返回batch_unlock_t。</div><div class="ttdef"><b>Definition:</b> mutex_v2.h:17</div></div>
<div class="ttc" id="astructresumef_1_1future__t_html"><div class="ttname"><a href="structresumef_1_1future__t.html">resumef::future_t</a></div><div class="ttdoc">用于resumef协程的返回值。</div><div class="ttdef"><b>Definition:</b> future.h:14</div></div>
<div class="ttc" id="astructresumef_1_1batch__unlock__t_html"><div class="ttname"><a href="structresumef_1_1batch__unlock__t.html">resumef::batch_unlock_t</a></div><div class="ttdoc">在析构的时候自动解锁mutex_t的辅助类。</div><div class="ttdef"><b>Definition:</b> mutex_v2.h:28</div></div>
<div class="ttc" id="astructresumef_1_1mutex__t_html"><div class="ttname"><a href="structresumef_1_1mutex__t.html">resumef::mutex_t</a></div><div class="ttdoc">支持递归的锁。</div><div class="ttdef"><b>Definition:</b> mutex_v2.h:34</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>

BIN
doxygen/html/nav_f.png Voir le fichier


BIN
doxygen/html/nav_g.png Voir le fichier


BIN
doxygen/html/nav_h.png Voir le fichier


BIN
doxygen/html/open.png Voir le fichier


+ 161
- 0
doxygen/html/promise_8h_source.html Voir le fichier

@@ -0,0 +1,161 @@
<!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/promise.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">promise.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="preprocessor">#pragma push_macro(&quot;new&quot;)</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#undef new</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; </div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="keyword">namespace </span>resumef</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;{</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">struct </span>suspend_on_initial;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">struct </span>suspend_on_final;</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; </div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> _Ty&gt;</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">struct </span>promise_impl_t</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; {</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">using</span> state_type = state_t&lt;value_type&gt;;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="keyword">using</span> promise_type = promise_t&lt;value_type&gt;;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keyword">using</span> future_type = future_t&lt;value_type&gt;;</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; promise_impl_t() noexcept {}</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; promise_impl_t(promise_impl_t&amp;&amp; _Right) noexcept = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; promise_impl_t&amp; operator = (promise_impl_t&amp;&amp; _Right) noexcept = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; promise_impl_t(<span class="keyword">const</span> promise_impl_t&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; promise_impl_t&amp; operator = (<span class="keyword">const</span> promise_impl_t&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; </div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; <span class="keyword">auto</span> get_state() noexcept-&gt;state_type*;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; suspend_on_initial initial_suspend() noexcept;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; suspend_on_final final_suspend() noexcept;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; template &lt;typename _Uty&gt;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; _Uty&amp;&amp; await_transform(_Uty&amp;&amp; _Whatever) noexcept;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keywordtype">void</span> set_exception(std::exception_ptr e);</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#ifdef __clang__</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordtype">void</span> unhandled_exception(); <span class="comment">//If the coroutine ends with an uncaught exception, it performs the following: </span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; future_type get_return_object() noexcept;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordtype">void</span> cancellation_requested() noexcept;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; </div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; using _Alloc_char = std::allocator&lt;<span class="keywordtype">char</span>&gt;;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keywordtype">void</span>* operator new(<span class="keywordtype">size_t</span> _Size);</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordtype">void</span> operator delete(<span class="keywordtype">void</span>* _Ptr, <span class="keywordtype">size_t</span> _Size);</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor">#if !RESUMEF_INLINE_STATE</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; counted_ptr&lt;state_type&gt; _state = state_future_t::_Alloc_state&lt;state_type&gt;(<span class="keyword">false</span>);</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; };</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; </div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keyword">struct </span>promise_t final : <span class="keyword">public</span> promise_impl_t&lt;_Ty&gt;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; {</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keyword">using</span> <span class="keyword">typename</span> promise_impl_t&lt;_Ty&gt;::value_type;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keyword">using</span> promise_impl_t&lt;_Ty&gt;::get_return_object;</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> U&gt;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordtype">void</span> return_value(U&amp;&amp; val); <span class="comment">//co_return val</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> U&gt;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; suspend_always yield_value(U&amp;&amp; val);</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; </div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keyword">struct </span>promise_t&lt;_Ty&amp;&gt; final : <span class="keyword">public</span> promise_impl_t&lt;_Ty&amp;&gt;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; {</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keyword">using</span> <span class="keyword">typename</span> promise_impl_t&lt;_Ty&amp;&gt;::value_type;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">using</span> promise_impl_t&lt;_Ty&amp;&gt;::get_return_object;</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; <span class="keywordtype">void</span> return_value(_Ty&amp; val); <span class="comment">//co_return val</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; suspend_always yield_value(_Ty&amp; val);</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; };</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keyword">template</span>&lt;&gt;</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keyword">struct </span>promise_t&lt;void&gt; final : <span class="keyword">public</span> promise_impl_t&lt;void&gt;</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keyword">using</span> promise_impl_t&lt;void&gt;::get_return_object;</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordtype">void</span> return_void(); <span class="comment">//co_return;</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; suspend_always yield_value();</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; };</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;}</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="preprocessor">#pragma pop_macro(&quot;new&quot;)</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 164
- 0
doxygen/html/rf__task_8h_source.html Voir le fichier

@@ -0,0 +1,164 @@
<!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/rf_task.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">rf_task.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="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; </div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">struct </span>task_base_t</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; {</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; task_base_t() = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="keyword">virtual</span> ~task_base_t();</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; </div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keyword">protected</span>:</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">friend</span> scheduler_t;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; counted_ptr&lt;state_base_t&gt; _state;</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="preprocessor">#endif</span></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="comment">//----------------------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; </div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> = std::<span class="keywordtype">void</span>_t&lt;&gt;&gt;</div>
<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="structresumef_1_1task__t.html"> 34</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1task__t.html">task_t</a>;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1task__t.html">task_t</a>&lt;_Ty, std::void_t&lt;traits::is_future&lt;std::remove_reference_t&lt;_Ty&gt;&gt;&gt;&gt; : <span class="keyword">public</span> task_base_t</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; {</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keyword">using</span> future_type = std::remove_reference_t&lt;_Ty&gt;;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keyword">using</span> value_type = <span class="keyword">typename</span> future_type::value_type;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keyword">using</span> state_type = <a class="code" href="structresumef_1_1state__t.html">state_t&lt;value_type&gt;</a>;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <a class="code" href="structresumef_1_1task__t.html">task_t</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <a class="code" href="structresumef_1_1task__t.html">task_t</a>(future_type&amp; f)</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; {</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; initialize(f);</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; <span class="keyword">protected</span>:</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordtype">void</span> initialize(future_type&amp; f)</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; _state = f._state.get();</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; }</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; };</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">struct </span>task_t&lt;generator_t&lt;_Ty&gt;&gt; : <span class="keyword">public</span> task_base_t</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="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keyword">using</span> future_type = generator_t&lt;value_type&gt;;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keyword">using</span> state_type = state_generator_t;</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; task_t() = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; task_t(future_type&amp; f)</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; initialize(f);</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keyword">protected</span>:</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordtype">void</span> initialize(future_type&amp; f)</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; {</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; _state = f.detach_state();</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; }</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; };</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="comment">//----------------------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">//ctx_task_t接受的是一个&#39;函数对象&#39;</span></div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">//这个&#39;函数对象&#39;被调用后,返回generator&lt;_Ty&gt;/future_t&lt;_Ty&gt;类型</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="comment">//然后&#39;函数对象&#39;作为异步执行的上下文状态保存起来</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ctx&gt;</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keyword">struct </span>ctx_task_t : <span class="keyword">public</span> task_t&lt;remove_cvref_t&lt;decltype(std::declval&lt;_Ctx&gt;()())&gt;&gt;</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; <span class="keyword">using</span> context_type = _Ctx;</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; context_type _context;</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; ctx_task_t(context_type ctx)</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; : _context(std::move(ctx))</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; {</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; decltype(<span class="keyword">auto</span>) f = _context();</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; this-&gt;initialize(f);</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; }</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;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;}</div>
</div><!-- fragment --></div><!-- contents -->
<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_1task__t_html"><div class="ttname"><a href="structresumef_1_1task__t.html">resumef::task_t</a></div><div class="ttdoc">协程任务类。</div><div class="ttdef"><b>Definition:</b> rf_task.h:34</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>

+ 229
- 0
doxygen/html/ring__queue_8h_source.html Voir le fichier

@@ -0,0 +1,229 @@
<!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/ring_queue.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">ring_queue.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="l00005"></a><span class="lineno"> 5</span>&#160; <span class="comment">//使用自旋锁完成的线程安全的环形队列。</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; <span class="comment">//支持多个线程同时push和pop。</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="comment">//_Option : 如果队列保存的数据不支持拷贝只支持移动,则需要设置为true;或者数据希望pop后销毁,都需要设置为true。</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="comment">//_Sty : 内存保持数量和索引的整数类型。用于外部控制队列的结构体大小。</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option = false, <span class="keyword">class</span> _Sty = u<span class="keywordtype">int</span>32_t&gt;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">struct </span>ring_queue</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; {</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">using</span> size_type = _Sty;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">bool</span> use_option = _Option;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">using</span> optional_type = std::conditional_t&lt;use_option, std::optional&lt;value_type&gt;, value_type&gt;;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; ring_queue(<span class="keywordtype">size_t</span> sz);</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; ring_queue(<span class="keyword">const</span> ring_queue&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; ring_queue(ring_queue&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; ring_queue&amp; operator =(<span class="keyword">const</span> ring_queue&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; ring_queue&amp; operator =(ring_queue&amp;&amp;) = <span class="keywordflow">default</span>;</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">auto</span> size() const noexcept-&gt;size_type;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; auto capacity() const noexcept-&gt;size_type;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordtype">bool</span> empty() const noexcept;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="keywordtype">bool</span> full() const noexcept;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; template&lt;class U&gt;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keywordtype">bool</span> try_push(U&amp;&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;U&gt;);</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; template&lt;class U&gt;</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keywordtype">bool</span> try_pop(U&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;value_type&gt;);</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; private:</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; using container_type = std::unique_ptr&lt;optional_type[]&gt;;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; container_type m_bufferPtr;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; size_type m_bufferSize;</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; size_type m_writeIndex;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; size_type m_readIndex;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="preprocessor">#ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; std::atomic&lt;size_type&gt; m_count;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keyword">auto</span> nextIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; };</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; ring_queue&lt;_Ty, _Option, _Sty&gt;::ring_queue(<span class="keywordtype">size_t</span> sz)</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; : m_bufferPtr(new optional_type[sz + 1])</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; , m_bufferSize(static_cast&lt;size_type&gt;(sz + 1))</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; , m_writeIndex(0)</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; , m_readIndex(0)</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; , m_count(0)</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; #endif</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; {</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; assert(sz &lt; (std::numeric_limits&lt;size_type&gt;::max)());</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; </div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keyword">auto</span> ring_queue&lt;_Ty, _Option, _Sty&gt;::nextIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; {</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>size_type<span class="keyword">&gt;</span>((a_count + 1) % m_bufferSize);</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keyword">auto</span> ring_queue&lt;_Ty, _Option, _Sty&gt;::size() const noexcept-&gt;size_type</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; {</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">return</span> m_count.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordflow">if</span> (m_writeIndex &gt;= m_readIndex)</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">return</span> (m_writeIndex - m_readIndex);</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">return</span> (m_bufferSize + m_writeIndex - m_readIndex);</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; }</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="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keyword">auto</span> ring_queue&lt;_Ty, _Option, _Sty&gt;::capacity() const noexcept-&gt;size_type</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; {</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">return</span> m_bufferSize - 1;</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordtype">bool</span> ring_queue&lt;_Ty, _Option, _Sty&gt;::empty() const noexcept</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; {</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">return</span> m_count.load(std::memory_order_acquire) == 0;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">return</span> m_writeIndex == m_readIndex;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></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="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keywordtype">bool</span> ring_queue&lt;_Ty, _Option, _Sty&gt;::full() const noexcept</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; {</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">return</span> (m_count.load(std::memory_order_acquire) == (m_bufferSize - 1));</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordflow">return</span> nextIndex(m_writeIndex) == m_readIndex;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; }</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> U&gt;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordtype">bool</span> ring_queue&lt;_Ty, _Option, _Sty&gt;::try_push(U&amp;&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;U&gt;)</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; {</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">auto</span> nextWriteIndex = nextIndex(m_writeIndex);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">if</span> (nextWriteIndex == m_readIndex)</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; assert(m_writeIndex &lt; m_bufferSize);</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; m_bufferPtr[m_writeIndex] = std::move(value);</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; m_writeIndex = nextWriteIndex;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; m_count.fetch_add(1, std::memory_order_acq_rel);</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; </div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> U&gt;</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordtype">bool</span> ring_queue&lt;_Ty, _Option, _Sty&gt;::try_pop(U&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;value_type&gt;)</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; {</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">if</span> (m_readIndex == m_writeIndex)</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; optional_type&amp; ov = m_bufferPtr[m_readIndex];</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">if</span> constexpr (use_option)</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; {</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; value = std::move(ov).value();</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; ov = std::nullopt;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; }</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; {</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; value = std::move(ov);</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; </div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; m_readIndex = nextIndex(m_readIndex);</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; m_count.fetch_sub(1, std::memory_order_acq_rel);</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 299
- 0
doxygen/html/ring__queue__lockfree_8h_source.html Voir le fichier

@@ -0,0 +1,299 @@
<!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/ring_queue_lockfree.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">ring_queue_lockfree.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="l00005"></a><span class="lineno"> 5</span>&#160; <span class="comment">//目前无法解决三个索引数值回绕导致的问题</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; <span class="comment">//如果为了避免索引回绕的问题,索引采用uint64_t类型,</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="comment">//则在与spinlock&lt;T, false, uint32_t&gt;版本的对比中速度反而慢了</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="comment">//pop时无法使用move语义来获取数据。因为算法要求先获取值,且获取后有可能失败,从而重新获取其它值。</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty = u<span class="keywordtype">int</span>32_t&gt;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">struct </span>ring_queue_lockfree</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; {</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">using</span> size_type = _Sty;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; ring_queue_lockfree(<span class="keywordtype">size_t</span> sz);</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; </div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; ring_queue_lockfree(<span class="keyword">const</span> ring_queue_lockfree&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; ring_queue_lockfree(ring_queue_lockfree&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; ring_queue_lockfree&amp; operator =(<span class="keyword">const</span> ring_queue_lockfree&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; ring_queue_lockfree&amp; operator =(ring_queue_lockfree&amp;&amp;) = <span class="keywordflow">default</span>;</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; <span class="keyword">auto</span> size() const noexcept-&gt;size_type;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; auto capacity() const noexcept-&gt;size_type;</div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <span class="keywordtype">bool</span> empty() const noexcept;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="keywordtype">bool</span> full() const noexcept;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; template&lt;class U&gt;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordtype">bool</span> try_push(U&amp;&amp; value) noexcept(std::is_nothrow_move_constructible_v&lt;U&gt;);</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="keywordtype">bool</span> try_pop(value_type&amp; value) noexcept(std::is_nothrow_move_constructible_v&lt;value_type&gt;);</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; private:</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; std::unique_ptr&lt;value_type[]&gt; m_bufferPtr;</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; size_type m_bufferSize;</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; std::atomic&lt;size_type&gt; m_writeIndex; <span class="comment">//Where a new element will be inserted to.</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; std::atomic&lt;size_type&gt; m_readIndex; <span class="comment">//Where the next element where be extracted from.</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; std::atomic&lt;size_type&gt; m_maximumReadIndex; <span class="comment">//It points to the place where the latest &quot;commited&quot; data has been inserted. </span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="comment">//If it&#39;s not the same as writeIndex it means there are writes pending to be &quot;commited&quot; to the queue, </span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="comment">//that means that the place for the data was reserved (the index in the array) </span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="comment">//but the data is still not in the queue, </span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="comment">//so the thread trying to read will have to wait for those other threads to </span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="comment">//save the data into the queue.</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="preprocessor">#ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; std::atomic&lt;size_type&gt; m_count;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="preprocessor"> #endif</span></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; <span class="keyword">auto</span> countToIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keyword">auto</span> nextIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type;</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; };</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; ring_queue_lockfree&lt;_Ty, _Sty&gt;::ring_queue_lockfree(<span class="keywordtype">size_t</span> sz)</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; : m_bufferPtr(new value_type[sz + 1])</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; , m_bufferSize(static_cast&lt;size_type&gt;(sz + 1))</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; , m_writeIndex(0)</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; , m_readIndex(0)</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; , m_maximumReadIndex(0)</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; , m_count(0)</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; #endif</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; {</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; assert(sz &lt; (std::numeric_limits&lt;size_type&gt;::max)());</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; }</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">auto</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::countToIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type</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; <span class="comment">//return (a_count % m_bufferSize);</span></div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">return</span> a_count;</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; }</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keyword">auto</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::nextIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">//return static_cast&lt;size_type&gt;((a_count + 1));</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>size_type<span class="keyword">&gt;</span>((a_count + 1) % m_bufferSize);</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; }</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keyword">auto</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::size() const noexcept-&gt;size_type</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; {</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keywordflow">return</span> m_count.load();</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keyword">auto</span> currentWriteIndex = m_maximumReadIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; currentWriteIndex = countToIndex(currentWriteIndex);</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="keyword">auto</span> currentReadIndex = m_readIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; currentReadIndex = countToIndex(currentReadIndex);</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">if</span> (currentWriteIndex &gt;= currentReadIndex)</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordflow">return</span> (currentWriteIndex - currentReadIndex);</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">return</span> (m_bufferSize + currentWriteIndex - currentReadIndex);</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; }</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; </div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keyword">auto</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::capacity() const noexcept-&gt;size_type</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; {</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">return</span> m_bufferSize - 1;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordtype">bool</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::empty() const noexcept</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">return</span> m_count.load() == 0;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keyword">auto</span> currentWriteIndex = m_maximumReadIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">auto</span> currentReadIndex = m_readIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">return</span> countToIndex(currentWriteIndex) == countToIndex(currentReadIndex);</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></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; </div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordtype">bool</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::full() const noexcept</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; {</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">return</span> (m_count.load() == (m_bufferSize - 1));</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keyword">auto</span> currentWriteIndex = m_writeIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">auto</span> currentReadIndex = m_readIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">return</span> countToIndex(nextIndex(currentWriteIndex)) == countToIndex(currentReadIndex);</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; }</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; </div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> U&gt;</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">bool</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::try_push(U&amp;&amp; value) noexcept(std::is_nothrow_move_constructible_v&lt;U&gt;)</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; {</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">auto</span> currentWriteIndex = m_writeIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keywordflow">do</span></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; {</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordflow">if</span> (countToIndex(nextIndex(currentWriteIndex)) == countToIndex(m_readIndex.load(std::memory_order_acquire)))</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="comment">// the queue is full</span></div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="comment">// There is more than one producer. Keep looping till this thread is able </span></div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="comment">// to allocate space for current piece of data</span></div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="comment">// using compare_exchange_strong because it isn&#39;t allowed to fail spuriously</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="comment">// When the compare_exchange operation is in a loop the weak version</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// will yield better performance on some platforms, but here we&#39;d have to</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="comment">// load m_writeIndex all over again</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; } <span class="keywordflow">while</span> (!m_writeIndex.compare_exchange_strong(currentWriteIndex, nextIndex(currentWriteIndex), std::memory_order_acq_rel));</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="comment">// Just made sure this index is reserved for this thread.</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; m_bufferPtr[countToIndex(currentWriteIndex)] = std::move(value);</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; </div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="comment">// update the maximum read index after saving the piece of data. It can&#39;t</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="comment">// fail if there is only one thread inserting in the queue. It might fail </span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">// if there is more than 1 producer thread because this operation has to</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="comment">// be done in the same order as the previous CAS</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="comment">// using compare_exchange_weak because they are allowed to fail spuriously</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="comment">// (act as if *this != expected, even if they are equal), but when the</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="comment">// compare_exchange operation is in a loop the weak version will yield</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="comment">// better performance on some platforms.</span></div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keyword">auto</span> savedWriteIndex = currentWriteIndex;</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordflow">while</span> (!m_maximumReadIndex.compare_exchange_weak(currentWriteIndex, nextIndex(currentWriteIndex), std::memory_order_acq_rel))</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; currentWriteIndex = savedWriteIndex;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="comment">// this is a good place to yield the thread in case there are more</span></div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="comment">// software threads than hardware processors and you have more</span></div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="comment">// than 1 producer thread</span></div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="comment">// have a look at sched_yield (POSIX.1b)</span></div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; std::this_thread::yield();</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="comment">// The value was successfully inserted into the queue</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; m_count.fetch_add(1);</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; }</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordtype">bool</span> ring_queue_lockfree&lt;_Ty, _Sty&gt;::try_pop(value_type&amp; value) noexcept(std::is_nothrow_move_constructible_v&lt;value_type&gt;)</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">auto</span> currentReadIndex = m_readIndex.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; </div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">for</span> (;;)</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; {</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keyword">auto</span> idx = countToIndex(currentReadIndex);</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; </div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="comment">// to ensure thread-safety when there is more than 1 producer </span></div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="comment">// thread a second index is defined (m_maximumReadIndex)</span></div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">if</span> (idx == countToIndex(m_maximumReadIndex.load(std::memory_order_acquire)))</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; {</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// the queue is empty or</span></div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">// a producer thread has allocate space in the queue but is </span></div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="comment">// waiting to commit the data into it</span></div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; }</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; </div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="comment">// retrieve the data from the queue</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; value = m_bufferPtr[idx]; <span class="comment">//但是,这里的方法不适合。如果只支持移动怎么办?</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; </div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="comment">// try to perfrom now the CAS operation on the read index. If we succeed</span></div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="comment">// a_data already contains what m_readIndex pointed to before we </span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="comment">// increased it</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keywordflow">if</span> (m_readIndex.compare_exchange_strong(currentReadIndex, nextIndex(currentReadIndex), std::memory_order_acq_rel))</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; {</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="comment">// got here. The value was retrieved from the queue. Note that the</span></div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="comment">// data inside the m_queue array is not deleted nor reseted</span></div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; m_count.fetch_sub(1);</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; }</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; </div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="comment">// it failed retrieving the element off the queue. Someone else must</span></div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="comment">// have read the element stored at countToIndex(currentReadIndex)</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="comment">// before we could perform the CAS operation </span></div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; } <span class="comment">// keep looping to try again!</span></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;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 242
- 0
doxygen/html/ring__queue__spinlock_8h_source.html Voir le fichier

@@ -0,0 +1,242 @@
<!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/ring_queue_spinlock.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">ring_queue_spinlock.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="l00005"></a><span class="lineno"> 5</span>&#160; <span class="comment">//使用自旋锁完成的线程安全的环形队列。</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; <span class="comment">//支持多个线程同时push和pop。</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="comment">//_Option : 如果队列保存的数据不支持拷贝只支持移动,则需要设置为true;或者数据希望pop后销毁,都需要设置为true。</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="comment">//_Sty : 内存保持数量和索引的整数类型。用于外部控制队列的结构体大小。</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option = false, <span class="keyword">class</span> _Sty = u<span class="keywordtype">int</span>32_t&gt;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">struct </span>ring_queue_spinlock</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; {</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="keyword">using</span> value_type = _Ty;</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">using</span> size_type = _Sty;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; </div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">bool</span> use_option = _Option;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">using</span> optional_type = std::conditional_t&lt;use_option, std::optional&lt;value_type&gt;, value_type&gt;;</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; ring_queue_spinlock(<span class="keywordtype">size_t</span> sz);</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; ring_queue_spinlock(<span class="keyword">const</span> ring_queue_spinlock&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; ring_queue_spinlock(ring_queue_spinlock&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; ring_queue_spinlock&amp; operator =(<span class="keyword">const</span> ring_queue_spinlock&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; ring_queue_spinlock&amp; operator =(ring_queue_spinlock&amp;&amp;) = <span class="keywordflow">default</span>;</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">auto</span> size() const noexcept-&gt;size_type;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; auto capacity() const noexcept-&gt;size_type;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordtype">bool</span> empty() const noexcept;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="keywordtype">bool</span> full() const noexcept;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; template&lt;class U&gt;</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <span class="keywordtype">bool</span> try_push(U&amp;&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;U&gt;);</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <span class="keywordtype">bool</span> try_pop(value_type&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;value_type&gt;);</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; private:</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; using container_type = std::conditional_t&lt;std::is_same_v&lt;value_type, <span class="keywordtype">bool</span>&gt;, std::unique_ptr&lt;optional_type[]&gt;, std::vector&lt;optional_type&gt;&gt;;</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; container_type m_bufferPtr;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; size_type m_bufferSize;</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; </div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; size_type m_writeIndex;</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; size_type m_readIndex;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; mutable resumef::spinlock m_lock;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="preprocessor">#ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; std::atomic&lt;size_type&gt; m_count;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; </div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keyword">auto</span> nextIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; };</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; </div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::ring_queue_spinlock(<span class="keywordtype">size_t</span> sz)</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; : m_bufferSize(static_cast&lt;size_type&gt;(sz + 1))</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; , m_writeIndex(0)</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; , m_readIndex(0)</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; , m_count(0)</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; #endif</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; <span class="keywordflow">if</span> constexpr (std::is_same_v&lt;value_type, bool&gt;)</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; m_bufferPtr = container_type{ <span class="keyword">new</span> optional_type[sz + 1] };</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; m_bufferPtr.resize(sz + 1);</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; assert(sz &lt; (std::numeric_limits&lt;size_type&gt;::max)());</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; }</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keyword">auto</span> ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::nextIndex(size_type a_count) <span class="keyword">const</span> noexcept-&gt;size_type</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; {</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>size_type<span class="keyword">&gt;</span>((a_count + 1) % m_bufferSize);</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; }</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keyword">auto</span> ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::size() const noexcept-&gt;size_type</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">return</span> m_count.load(std::memory_order_acquire);</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; std::scoped_lock __guard(this-&gt;m_lock);</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; </div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keywordflow">if</span> (m_writeIndex &gt;= m_readIndex)</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">return</span> (m_writeIndex - m_readIndex);</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keywordflow">return</span> (m_bufferSize + m_writeIndex - m_readIndex);</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</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; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keyword">auto</span> ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::capacity() const noexcept-&gt;size_type</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; {</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keywordflow">return</span> m_bufferSize - 1;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; }</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="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordtype">bool</span> ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::empty() const noexcept</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;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keywordflow">return</span> m_count.load(std::memory_order_acquire) == 0;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; std::scoped_lock __guard(this-&gt;m_lock);</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; </div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">return</span> m_writeIndex == m_readIndex;</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></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; </div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordtype">bool</span> ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::full() const noexcept</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="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">return</span> (m_count.load(std::memory_order_acquire) == (m_bufferSize - 1));</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;<span class="preprocessor"> #else</span></div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; std::scoped_lock __guard(this-&gt;m_lock);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; </div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">return</span> nextIndex(m_writeIndex) == m_readIndex;</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;<span class="preprocessor"> #endif // _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; }</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; </div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> U&gt;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordtype">bool</span> ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::try_push(U&amp;&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;U&gt;)</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; std::scoped_lock __guard(this-&gt;m_lock);</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; </div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">auto</span> nextWriteIndex = nextIndex(m_writeIndex);</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">if</span> (nextWriteIndex == m_readIndex)</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; </div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; assert(m_writeIndex &lt; m_bufferSize);</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; </div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; m_bufferPtr[m_writeIndex] = std::move(value);</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; m_writeIndex = nextWriteIndex;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; </div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; m_count.fetch_add(1, std::memory_order_acq_rel);</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; }</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="keyword">template</span>&lt;<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty&gt;</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordtype">bool</span> ring_queue_spinlock&lt;_Ty, _Option, _Sty&gt;::try_pop(value_type&amp; value) noexcept(std::is_nothrow_move_assignable_v&lt;value_type&gt;)</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; {</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; std::scoped_lock __guard(this-&gt;m_lock);</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="keywordflow">if</span> (m_readIndex == m_writeIndex)</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; </div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; optional_type&amp; ov = m_bufferPtr[m_readIndex];</div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">if</span> constexpr (use_option)</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; value = std::move(ov.value());</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; ov = std::nullopt;</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; }</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; {</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; value = std::move(ov);</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; }</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; m_readIndex = nextIndex(m_readIndex);</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; </div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;<span class="preprocessor"> #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</span></div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; m_count.fetch_sub(1, std::memory_order_acq_rel);</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</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;}</div>
</div><!-- fragment --></div><!-- contents -->
<!-- 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>

+ 188
- 0
doxygen/html/scheduler_8h_source.html Voir le fichier

@@ -0,0 +1,188 @@
<!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/scheduler.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">scheduler.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="l00010"></a><span class="lineno"><a class="line" href="structresumef_1_1scheduler__t.html"> 10</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a> : <span class="keyword">public</span> std::enable_shared_from_this&lt;scheduler_t&gt;</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; {</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1counted__ptr.html">state_sptr</a> = <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr&lt;state_base_t&gt;</a>;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keyword">using</span> state_vector = std::vector&lt;state_sptr&gt;;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">using</span> <a class="code" href="structresumef_1_1spinlock.html">lock_type</a> = <a class="code" href="structresumef_1_1spinlock.html">spinlock</a>;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">using</span> task_dictionary_type = std::unordered_map&lt;state_base_t*, std::unique_ptr&lt;task_base_t&gt;&gt;;</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="keyword">mutable</span> <a class="code" href="structresumef_1_1spinlock.html">spinlock</a> _lock_running;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; state_vector _runing_states;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; state_vector _cached_states;</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; <span class="keyword">mutable</span> <a class="code" href="structresumef_1_1spinlock.html">spinlock</a> _lock_ready;</div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; task_dictionary_type _ready_task;</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; timer_mgr_ptr _timer;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; </div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordtype">void</span> new_task(task_base_t* task);</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <span class="comment">//void cancel_all_task_();</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1scheduler__t.html#a8b396c23730b15afd345328b96dbe1cc">run_one_batch</a>();</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; </div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1scheduler__t.html#ae4ef2589ef2ce0335107d579b9e244a8">run_until_notask</a>();</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; <span class="comment">//void break_all();</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; </div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Ty</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; COMMA_RESUMEF_ENABLE_IF(traits::is_callable_v&lt;_Ty&gt; || traits::is_future_v&lt;_Ty&gt; || traits::is_generator_v&lt;_Ty&gt;)</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; &gt;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; RESUMEF_REQUIRES(traits::is_callable_v&lt;_Ty&gt; || traits::is_future_v&lt;_Ty&gt; || traits::is_generator_v&lt;_Ty&gt;)</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="structresumef_1_1scheduler__t.html#a449d34ba6a8e28284f2b02089cb7dcec"> 60</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1scheduler__t.html#a449d34ba6a8e28284f2b02089cb7dcec">operator + </a>(_Ty&amp;&amp; coro)</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; {</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordflow">if</span> constexpr (traits::is_callable_v&lt;_Ty&gt;)</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; new_task(<span class="keyword">new</span> ctx_task_t&lt;_Ty&gt;(coro));</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; new_task(<span class="keyword">new</span> <a class="code" href="structresumef_1_1task__t.html">task_t&lt;_Ty&gt;</a>(coro));</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; }</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; </div>
<div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structresumef_1_1scheduler__t.html#a9d22640803eb9397cb844e532f4c8585"> 75</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structresumef_1_1scheduler__t.html#a9d22640803eb9397cb844e532f4c8585">empty</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; scoped_lock&lt;spinlock, spinlock&gt; __guard(_lock_ready, _lock_running);</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keywordflow">return</span> _ready_task.empty() &amp;&amp; _runing_states.empty() &amp;&amp; _timer-&gt;empty();</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; }</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; </div>
<div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="structresumef_1_1scheduler__t.html#a1d369882e156db4efc1a1693acfc0e22"> 84</a></span>&#160; <a class="code" href="structresumef_1_1timer__manager.html">timer_manager</a>* <a class="code" href="structresumef_1_1scheduler__t.html#a1d369882e156db4efc1a1693acfc0e22">timer</a>() const noexcept</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="keywordflow">return</span> _timer.get();</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; }</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="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordtype">void</span> add_generator(<a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* sptr);</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordtype">void</span> del_final(<a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* sptr);</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; std::unique_ptr&lt;task_base_t&gt; del_switch(<a class="code" href="structresumef_1_1state__base__t.html">state_base_t</a>* sptr);</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordtype">void</span> add_switch(std::unique_ptr&lt;task_base_t&gt; task);</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keyword">friend</span> <span class="keyword">struct </span><a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keyword">protected</span>:</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>();</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; ~<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>();</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>(<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&amp;&amp; right_) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&amp; operator = (<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&amp;&amp; right_) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&amp; operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&amp;) = <span class="keyword">delete</span>;</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">static</span> <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a> g_scheduler;</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; };</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; </div>
<div class="line"><a name="l00117"></a><span class="lineno"><a class="line" href="structresumef_1_1local__scheduler__t.html"> 117</a></span>&#160; <span class="keyword">struct </span><a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <a class="code" href="structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112">local_scheduler_t</a>();</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; </div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <a class="code" href="structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112">local_scheduler_t</a>(<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a> &amp; sch);</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; </div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <a class="code" href="structresumef_1_1local__scheduler__t.html#af4c4cd1c6626930ccf891368e3f3e6ec">~local_scheduler_t</a>();</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; </div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <a class="code" href="structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112">local_scheduler_t</a>(<a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&amp;&amp; right_) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&amp; operator = (<a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&amp;&amp; right_) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <a class="code" href="structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112">local_scheduler_t</a>(<span class="keyword">const</span> <a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&amp; operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>* _scheduler_ptr;</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;}</div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="astructresumef_1_1timer__manager_html"><div class="ttname"><a href="structresumef_1_1timer__manager.html">resumef::timer_manager</a></div><div class="ttdoc">定时器管理器。</div><div class="ttdef"><b>Definition:</b> timer.h:84</div></div>
<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_1local__scheduler__t_html_af4c4cd1c6626930ccf891368e3f3e6ec"><div class="ttname"><a href="structresumef_1_1local__scheduler__t.html#af4c4cd1c6626930ccf891368e3f3e6ec">resumef::local_scheduler_t::~local_scheduler_t</a></div><div class="ttdeci">~local_scheduler_t()</div><div class="ttdoc">如果当前线程绑定的调度器由local_scheduler_t所创建,则会销毁调度器,并解绑线程。</div></div>
<div class="ttc" id="astructresumef_1_1scheduler__t_html_a9d22640803eb9397cb844e532f4c8585"><div class="ttname"><a href="structresumef_1_1scheduler__t.html#a9d22640803eb9397cb844e532f4c8585">resumef::scheduler_t::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdoc">判断所有协程是否运行完毕。</div><div class="ttdef"><b>Definition:</b> scheduler.h:75</div></div>
<div class="ttc" id="astructresumef_1_1scheduler__t_html_a8b396c23730b15afd345328b96dbe1cc"><div class="ttname"><a href="structresumef_1_1scheduler__t.html#a8b396c23730b15afd345328b96dbe1cc">resumef::scheduler_t::run_one_batch</a></div><div class="ttdeci">void run_one_batch()</div><div class="ttdoc">运行一批准备妥当的协程。</div></div>
<div class="ttc" id="astructresumef_1_1scheduler__t_html_ae4ef2589ef2ce0335107d579b9e244a8"><div class="ttname"><a href="structresumef_1_1scheduler__t.html#ae4ef2589ef2ce0335107d579b9e244a8">resumef::scheduler_t::run_until_notask</a></div><div class="ttdeci">void run_until_notask()</div><div class="ttdoc">循环运行所有的协程,直到所有协程都运行完成。</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_1scheduler__t_html_a1d369882e156db4efc1a1693acfc0e22"><div class="ttname"><a href="structresumef_1_1scheduler__t.html#a1d369882e156db4efc1a1693acfc0e22">resumef::scheduler_t::timer</a></div><div class="ttdeci">timer_manager * timer() const noexcept</div><div class="ttdoc">获得定时管理器。</div><div class="ttdef"><b>Definition:</b> scheduler.h:84</div></div>
<div class="ttc" id="astructresumef_1_1counted__ptr_html"><div class="ttname"><a href="structresumef_1_1counted__ptr.html">resumef::counted_ptr</a></div><div class="ttdoc">专用与state的智能计数指针,通过管理state内嵌的引用计数来管理state的生存期。</div><div class="ttdef"><b>Definition:</b> counted_ptr.h:9</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_1local__scheduler__t_html"><div class="ttname"><a href="structresumef_1_1local__scheduler__t.html">resumef::local_scheduler_t</a></div><div class="ttdoc">创建一个线程相关的调度器。</div><div class="ttdef"><b>Definition:</b> scheduler.h:117</div></div>
<div class="ttc" id="astructresumef_1_1local__scheduler__t_html_a05f60c654c1f7390682cab7cdcddb112"><div class="ttname"><a href="structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112">resumef::local_scheduler_t::local_scheduler_t</a></div><div class="ttdeci">local_scheduler_t()</div><div class="ttdoc">尽可能的创建一个线程相关的调度器。</div></div>
<div class="ttc" id="astructresumef_1_1scheduler__t_html_a449d34ba6a8e28284f2b02089cb7dcec"><div class="ttname"><a href="structresumef_1_1scheduler__t.html#a449d34ba6a8e28284f2b02089cb7dcec">resumef::scheduler_t::operator+</a></div><div class="ttdeci">void operator+(_Ty &amp;&amp;coro)</div><div class="ttdoc">将一个协程加入到调度器里开始运行。</div><div class="ttdef"><b>Definition:</b> scheduler.h:60</div></div>
<div class="ttc" id="astructresumef_1_1task__t_html"><div class="ttname"><a href="structresumef_1_1task__t.html">resumef::task_t</a></div><div class="ttdoc">协程任务类。</div><div class="ttdef"><b>Definition:</b> rf_task.h:34</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>

+ 30
- 0
doxygen/html/search/all_0.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_0.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 4
- 0
doxygen/html/search/all_0.js Voir le fichier

@@ -0,0 +1,4 @@
var searchData=
[
['_5fstate_0',['_state',['../structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915',1,'resumef::awaitable_impl_t']]]
];

+ 30
- 0
doxygen/html/search/all_1.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_1.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 6
- 0
doxygen/html/search/all_1.js Voir le fichier

@@ -0,0 +1,6 @@
var searchData=
[
['adopt_5fmanual_5funlock_5ft_1',['adopt_manual_unlock_t',['../structresumef_1_1adopt__manual__unlock__t.html',1,'resumef']]],
['awaitable_5fimpl_5ft_2',['awaitable_impl_t',['../structresumef_1_1awaitable__impl__t.html',1,'resumef']]],
['awaitable_5ft_3',['awaitable_t',['../structresumef_1_1awaitable__t.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/all_10.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_10.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 5
- 0
doxygen/html/search/all_10.js Voir le fichier

@@ -0,0 +1,5 @@
var searchData=
[
['yield_70',['yield',['../structresumef_1_1yield__awaitor.html#a25aa400aefa4bb8c2b61a190b0a7cdda',1,'resumef::yield_awaitor']]],
['yield_5fawaitor_71',['yield_awaitor',['../structresumef_1_1yield__awaitor.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/all_11.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_11.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 7
- 0
doxygen/html/search/all_11.js Voir le fichier

@@ -0,0 +1,7 @@
var searchData=
[
['_7ebatch_5flock_5ft_72',['~batch_lock_t',['../classresumef_1_1batch__lock__t.html#a661dad263c32b25b6bcc92c0d7b73830',1,'resumef::batch_lock_t']]],
['_7ecounted_5fptr_73',['~counted_ptr',['../structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6',1,'resumef::counted_ptr']]],
['_7eevent_5ft_74',['~event_t',['../structresumef_1_1event__t.html#af742aa0454758c3def349cacae86c229',1,'resumef::event_t']]],
['_7elocal_5fscheduler_5ft_75',['~local_scheduler_t',['../structresumef_1_1local__scheduler__t.html#af4c4cd1c6626930ccf891368e3f3e6ec',1,'resumef::local_scheduler_t']]]
];

+ 30
- 0
doxygen/html/search/all_2.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_2.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 5
- 0
doxygen/html/search/all_2.js Voir le fichier

@@ -0,0 +1,5 @@
var searchData=
[
['batch_5flock_5ft_4',['batch_lock_t',['../classresumef_1_1batch__lock__t.html',1,'resumef::batch_lock_t&lt; _Ty, _Cont, _Assemble &gt;'],['../classresumef_1_1batch__lock__t.html#a3779f0030948ad54e4f97c8e73afa44d',1,'resumef::batch_lock_t::batch_lock_t(_Cont &amp;locks_)'],['../classresumef_1_1batch__lock__t.html#af46b0d1ba6494e2955660271b190a99a',1,'resumef::batch_lock_t::batch_lock_t(_Cont &amp;locks_, _Assemble &amp;la_)'],['../classresumef_1_1batch__lock__t.html#a2293d0f5d68f335ed8dd0bb6e89321a6',1,'resumef::batch_lock_t::batch_lock_t(std::adopt_lock_t, _Cont &amp;locks_)'],['../classresumef_1_1batch__lock__t.html#abf8d154d25e3b66eb308750052fb660e',1,'resumef::batch_lock_t::batch_lock_t(std::adopt_lock_t, _Cont &amp;locks_, _Assemble &amp;la_)'],['../classresumef_1_1batch__lock__t.html#a3da9e6b8f868fffed636704c551fea47',1,'resumef::batch_lock_t::batch_lock_t(const batch_lock_t &amp;)=delete'],['../classresumef_1_1batch__lock__t.html#a820544949fcf42d08759f5f29686cc9c',1,'resumef::batch_lock_t::batch_lock_t(batch_lock_t &amp;&amp;_Right)']]],
['batch_5funlock_5ft_5',['batch_unlock_t',['../structresumef_1_1batch__unlock__t.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/all_3.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_3.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 12
- 0
doxygen/html/search/all_3.js Voir le fichier

@@ -0,0 +1,12 @@
var searchData=
[
['capacity_6',['capacity',['../structresumef_1_1channel__t.html#a747f2db122ec920e6c253591729138ac',1,'resumef::channel_t']]],
['channel_5fexception_7',['channel_exception',['../structresumef_1_1channel__exception.html',1,'resumef']]],
['channel_5ft_8',['channel_t',['../structresumef_1_1channel__t.html',1,'resumef::channel_t&lt; _Ty, _Optional, _OptimizationThread &gt;'],['../structresumef_1_1channel__t.html#ac94d5fa13a6c1f5cc5d3ee3e50fa4232',1,'resumef::channel_t::channel_t()']]],
['counted_5fptr_9',['counted_ptr',['../structresumef_1_1counted__ptr.html',1,'resumef::counted_ptr&lt; T &gt;'],['../structresumef_1_1counted__ptr.html#ad3969379af7311183c1c11d13f6da9f3',1,'resumef::counted_ptr::counted_ptr() noexcept=default'],['../structresumef_1_1counted__ptr.html#ad466495cf5a6056e326a923558676ccd',1,'resumef::counted_ptr::counted_ptr(const counted_ptr &amp;cp)'],['../structresumef_1_1counted__ptr.html#ab752ffdd40c7ab1be06e7662488d8e24',1,'resumef::counted_ptr::counted_ptr(T *p)'],['../structresumef_1_1counted__ptr.html#a8b6f5332dd4754c22970f7e5406c6233',1,'resumef::counted_ptr::counted_ptr(counted_ptr &amp;&amp;cp) noexcept']]],
['counted_5fptr_3c_20detail_3a_3astate_5fevent_5fall_5ft_20_3e_10',['counted_ptr&lt; detail::state_event_all_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20detail_3a_3astate_5fevent_5ft_20_3e_11',['counted_ptr&lt; detail::state_event_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20detail_3a_3astate_5fmutex_5ft_20_3e_12',['counted_ptr&lt; detail::state_mutex_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20resumef_3a_3astate_5ft_20_3e_13',['counted_ptr&lt; resumef::state_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20state_5ftype_20_3e_14',['counted_ptr&lt; state_type &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/all_4.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_4.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 5
- 0
doxygen/html/search/all_4.js Voir le fichier

@@ -0,0 +1,5 @@
var searchData=
[
['empty_15',['empty',['../structresumef_1_1scheduler__t.html#a9d22640803eb9397cb844e532f4c8585',1,'resumef::scheduler_t']]],
['event_5ft_16',['event_t',['../structresumef_1_1event__t.html',1,'resumef::event_t'],['../structresumef_1_1event__t.html#a5ae54675783d984c3defd7b2093c91a1',1,'resumef::event_t::event_t(bool initially=false)'],['../structresumef_1_1event__t.html#ab3a49adfb8c1cfcfa606cca3148f946a',1,'resumef::event_t::event_t(std::adopt_lock_t)']]]
];

+ 30
- 0
doxygen/html/search/all_5.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_5.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 5
- 0
doxygen/html/search/all_5.js Voir le fichier

@@ -0,0 +1,5 @@
var searchData=
[
['future_5ft_17',['future_t',['../structresumef_1_1future__t.html',1,'resumef']]],
['future_5ft_3c_20t_20_3e_18',['future_t&lt; T &gt;',['../structresumef_1_1future__t.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/all_6.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_6.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 10
- 0
doxygen/html/search/all_6.js Voir le fichier

@@ -0,0 +1,10 @@
var searchData=
[
['generator_5ft_19',['generator_t',['../structresumef_1_1generator__t.html',1,'resumef']]],
['get_20',['get',['../structresumef_1_1counted__ptr.html#a9f6757dac685431f2ae561a58c502d1f',1,'resumef::counted_ptr']]],
['get_5fcurrent_5fscheduler_21',['get_current_scheduler',['../structresumef_1_1get__current__scheduler__awaitor.html#ae47a1b255bffdfc2c7762f4d9cf9b3bf',1,'resumef::get_current_scheduler_awaitor']]],
['get_5fcurrent_5fscheduler_5fawaitor_22',['get_current_scheduler_awaitor',['../structresumef_1_1get__current__scheduler__awaitor.html',1,'resumef']]],
['get_5ffuture_23',['get_future',['../structresumef_1_1awaitable__impl__t.html#a647bd5f5a5572bbbe8a17000ea5dc06d',1,'resumef::awaitable_impl_t']]],
['get_5froot_5fstate_24',['get_root_state',['../structresumef_1_1get__root__state__awaitor.html#adffac6b1ec6065c68dc345aa6fff5e49',1,'resumef::get_root_state_awaitor']]],
['get_5froot_5fstate_5fawaitor_25',['get_root_state_awaitor',['../structresumef_1_1get__root__state__awaitor.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/all_7.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_7.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 5
- 0
doxygen/html/search/all_7.js Voir le fichier

@@ -0,0 +1,5 @@
var searchData=
[
['local_5fscheduler_5ft_26',['local_scheduler_t',['../structresumef_1_1local__scheduler__t.html',1,'resumef::local_scheduler_t'],['../structresumef_1_1local__scheduler__t.html#a05f60c654c1f7390682cab7cdcddb112',1,'resumef::local_scheduler_t::local_scheduler_t()'],['../structresumef_1_1local__scheduler__t.html#a0443e2872feef9f1893087826e7fa7e2',1,'resumef::local_scheduler_t::local_scheduler_t(scheduler_t &amp;sch)']]],
['lock_27',['lock',['../structresumef_1_1mutex__t.html#a15c654948f47113fc92223a811d60090',1,'resumef::mutex_t::lock() const noexcept'],['../structresumef_1_1mutex__t.html#aad074e28785741eb1615d3126da6088a',1,'resumef::mutex_t::lock(adopt_manual_unlock_t manual_unlock_tag) const noexcept'],['../structresumef_1_1mutex__t.html#a3442f7c56bed34e086bd5bd41e4a9c5a',1,'resumef::mutex_t::lock(void *unique_address) const'],['../structresumef_1_1mutex__t.html#ae2aecf303188c9a8122e3fde4fb525fd',1,'resumef::mutex_t::lock(_Mtxs &amp;... mtxs)'],['../structresumef_1_1mutex__t.html#ae7f95d070a020cfeaf99684a06c5fd47',1,'resumef::mutex_t::lock(adopt_manual_unlock_t manual_unlock_tag, _Mtxs &amp;... mtxs)'],['../structresumef_1_1mutex__t.html#ad7ba090cf3188eaa738d4e37a4c6ab7a',1,'resumef::mutex_t::lock(void *unique_address, _Mtxs &amp;... mtxs)'],['../structresumef_1_1mutex__t.html#abfbfd653a04d3c3b3d88a5bdcaba4664',1,'resumef::mutex_t::lock(adopt_manual_unlock_t manual_unlock_tag, void *unique_address, _Mtxs &amp;... mtxs)'],['../structresumef_1_1spinlock.html#ae313002e0db9c20b32d386e4eb91c372',1,'resumef::spinlock::lock()']]]
];

+ 30
- 0
doxygen/html/search/all_8.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_8.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 5
- 0
doxygen/html/search/all_8.js Voir le fichier

@@ -0,0 +1,5 @@
var searchData=
[
['mutex_5fexception_28',['mutex_exception',['../structresumef_1_1mutex__exception.html',1,'resumef']]],
['mutex_5ft_29',['mutex_t',['../structresumef_1_1mutex__t.html',1,'resumef::mutex_t'],['../structresumef_1_1mutex__t.html#a597d0ca4a0f0d9963d0578afb5aa1ecf',1,'resumef::mutex_t::mutex_t()']]]
];

+ 30
- 0
doxygen/html/search/all_9.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_9.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 8
- 0
doxygen/html/search/all_9.js Voir le fichier

@@ -0,0 +1,8 @@
var searchData=
[
['operator_20co_5fawait_30',['operator co_await',['../structresumef_1_1channel__t.html#a9143771fbfda1d5996e89abc0eb2771e',1,'resumef::channel_t::operator co_await()'],['../structresumef_1_1event__t.html#a9656c785d3c1c1d57560137894aa1be3',1,'resumef::event_t::operator co_await()'],['../structresumef_1_1mutex__t.html#a9f086f150094d041b0c4372a8de504de',1,'resumef::mutex_t::operator co_await()']]],
['operator_2b_31',['operator+',['../structresumef_1_1scheduler__t.html#a449d34ba6a8e28284f2b02089cb7dcec',1,'resumef::scheduler_t']]],
['operator_2d_3e_32',['operator-&gt;',['../structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba',1,'resumef::counted_ptr']]],
['operator_3c_3c_33',['operator&lt;&lt;',['../structresumef_1_1channel__t.html#a8554b84ad37f013471f2c5d2da745887',1,'resumef::channel_t']]],
['operator_3d_34',['operator=',['../structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a',1,'resumef::counted_ptr::operator=(const counted_ptr &amp;cp)'],['../structresumef_1_1counted__ptr.html#af6a044ce1cdecc3a2650f16f445de2d4',1,'resumef::counted_ptr::operator=(counted_ptr &amp;&amp;cp) noexcept'],['../classresumef_1_1batch__lock__t.html#aabbfeb513ac907b9c8caf6fda9a356d4',1,'resumef::batch_lock_t::operator=(const batch_lock_t &amp;)=delete'],['../classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e',1,'resumef::batch_lock_t::operator=(batch_lock_t &amp;&amp;_Right)']]]
];

+ 30
- 0
doxygen/html/search/all_a.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_a.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 8
- 0
doxygen/html/search/all_a.js Voir le fichier

@@ -0,0 +1,8 @@
var searchData=
[
['read_35',['read',['../structresumef_1_1channel__t.html#a4ad0246bbfc50513d5a97227905f73c5',1,'resumef::channel_t']]],
['reset_36',['reset',['../structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899',1,'resumef::counted_ptr::reset()'],['../structresumef_1_1event__t.html#a8da187ffff9c6aee7e9bad6d97af9f4a',1,'resumef::event_t::reset()']]],
['rf_5ftask_5ft_37',['rf_task_t',['../classasio_1_1rf__task__t.html',1,'asio']]],
['run_5fone_5fbatch_38',['run_one_batch',['../structresumef_1_1scheduler__t.html#a8b396c23730b15afd345328b96dbe1cc',1,'resumef::scheduler_t']]],
['run_5funtil_5fnotask_39',['run_until_notask',['../structresumef_1_1scheduler__t.html#ae4ef2589ef2ce0335107d579b9e244a8',1,'resumef::scheduler_t']]]
];

+ 30
- 0
doxygen/html/search/all_b.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_b.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 14
- 0
doxygen/html/search/all_b.js Voir le fichier

@@ -0,0 +1,14 @@
var searchData=
[
['scheduler_5ft_40',['scheduler_t',['../structresumef_1_1scheduler__t.html',1,'resumef']]],
['set_5fexception_41',['set_exception',['../structresumef_1_1awaitable__impl__t.html#a22f1adeb8ecfd2c078f620dbc7c368a1',1,'resumef::awaitable_impl_t']]],
['set_5fvalue_42',['set_value',['../structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3',1,'resumef::awaitable_t']]],
['signal_43',['signal',['../structresumef_1_1event__t.html#ab9500bb2438c27adb4b34988eaa04ff9',1,'resumef::event_t']]],
['signal_5fall_44',['signal_all',['../structresumef_1_1event__t.html#aac7bf6f81982126225125354769ad695',1,'resumef::event_t']]],
['spinlock_45',['spinlock',['../structresumef_1_1spinlock.html',1,'resumef::spinlock'],['../structresumef_1_1spinlock.html#a32730a90789147297f9777fe866a224f',1,'resumef::spinlock::spinlock()']]],
['state_5fbase_5ft_46',['state_base_t',['../structresumef_1_1state__base__t.html',1,'resumef']]],
['state_5ffuture_5ft_47',['state_future_t',['../structresumef_1_1state__future__t.html',1,'resumef']]],
['state_5fgenerator_5ft_48',['state_generator_t',['../structresumef_1_1state__generator__t.html',1,'resumef']]],
['state_5ft_49',['state_t',['../structresumef_1_1state__t.html',1,'resumef']]],
['switch_5fscheduler_5fawaitor_50',['switch_scheduler_awaitor',['../structresumef_1_1switch__scheduler__awaitor.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/all_c.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_c.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 13
- 0
doxygen/html/search/all_c.js Voir le fichier

@@ -0,0 +1,13 @@
var searchData=
[
['task_5ft_51',['task_t',['../structresumef_1_1task__t.html',1,'resumef']]],
['throw_5fexception_52',['throw_exception',['../structresumef_1_1awaitable__impl__t.html#a2f7b2ef525186c9b7512dceb2453bebe',1,'resumef::awaitable_impl_t']]],
['timer_53',['timer',['../structresumef_1_1scheduler__t.html#a1d369882e156db4efc1a1693acfc0e22',1,'resumef::scheduler_t']]],
['timer_5fcanceled_5fexception_54',['timer_canceled_exception',['../structresumef_1_1timer__canceled__exception.html',1,'resumef']]],
['timer_5fhandler_55',['timer_handler',['../structresumef_1_1timer__handler.html',1,'resumef']]],
['timer_5fmanager_56',['timer_manager',['../structresumef_1_1timer__manager.html',1,'resumef']]],
['timer_5ftarget_57',['timer_target',['../structresumef_1_1detail_1_1timer__target.html',1,'resumef::detail']]],
['try_5flock_58',['try_lock',['../structresumef_1_1mutex__t.html#a2844d5df6562c153bc5b32d1720efb30',1,'resumef::mutex_t::try_lock() const noexcept'],['../structresumef_1_1mutex__t.html#a1dd128870c1fdcc7261ef0fa63e12254',1,'resumef::mutex_t::try_lock(void *unique_address) const'],['../structresumef_1_1spinlock.html#a62a6841e933ee7845a9ba42765a1b5e3',1,'resumef::spinlock::try_lock()']]],
['try_5flock_5ffor_59',['try_lock_for',['../structresumef_1_1mutex__t.html#afca20661d92d6acac34b324cab774310',1,'resumef::mutex_t::try_lock_for(const std::chrono::duration&lt; _Rep, _Period &gt; &amp;dt) const noexcept'],['../structresumef_1_1mutex__t.html#a15c6518dafb6c2cf52a0b0dbdd90ae7b',1,'resumef::mutex_t::try_lock_for(const std::chrono::duration&lt; _Rep, _Period &gt; &amp;dt, void *unique_address)']]],
['try_5flock_5funtil_60',['try_lock_until',['../structresumef_1_1mutex__t.html#ada9a310ff364fa8b1ee78dc2f799a8a5',1,'resumef::mutex_t::try_lock_until(const std::chrono::time_point&lt; _Rep, _Period &gt; &amp;tp) const noexcept'],['../structresumef_1_1mutex__t.html#aec072ad5fd0d6b688a3866ee9f1dc791',1,'resumef::mutex_t::try_lock_until(const std::chrono::time_point&lt; _Rep, _Period &gt; &amp;tp, void *unique_address)']]]
];

+ 30
- 0
doxygen/html/search/all_d.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_d.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 4
- 0
doxygen/html/search/all_d.js Voir le fichier

@@ -0,0 +1,4 @@
var searchData=
[
['unlock_61',['unlock',['../structresumef_1_1mutex__t.html#a430ec9f4b9bb1c5711b6ba7ef3a1ad99',1,'resumef::mutex_t::unlock() const noexcept'],['../structresumef_1_1mutex__t.html#abc858a566d0884726740557f930ec7db',1,'resumef::mutex_t::unlock(void *unique_address) const'],['../structresumef_1_1mutex__t.html#a0bc0948ed9eab5e41518ff9c1a6327a3',1,'resumef::mutex_t::unlock(_Mtxs &amp;... mtxs)'],['../structresumef_1_1mutex__t.html#a28defd5d64173ef3114a419f945adb3d',1,'resumef::mutex_t::unlock(void *unique_address, _Mtxs &amp;... mtxs)'],['../structresumef_1_1spinlock.html#af6d49dc277c0719e282a9387ed3c35e9',1,'resumef::spinlock::unlock()'],['../classresumef_1_1batch__lock__t.html#abc72b35a9eef1bd6c39955d63cc8ce9c',1,'resumef::batch_lock_t::unlock()']]]
];

+ 30
- 0
doxygen/html/search/all_e.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_e.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 4
- 0
doxygen/html/search/all_e.js Voir le fichier

@@ -0,0 +1,4 @@
var searchData=
[
['via_62',['via',['../structresumef_1_1switch__scheduler__awaitor.html#ad895f4414bfb91fde51ac735420246a9',1,'resumef::switch_scheduler_awaitor::via(scheduler_t &amp;sch) noexcept'],['../structresumef_1_1switch__scheduler__awaitor.html#a59f9ab7279d4aee22b69b93c86b209e7',1,'resumef::switch_scheduler_awaitor::via(scheduler_t *sch) noexcept']]]
];

+ 30
- 0
doxygen/html/search/all_f.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="all_f.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 10
- 0
doxygen/html/search/all_f.js Voir le fichier

@@ -0,0 +1,10 @@
var searchData=
[
['wait_63',['wait',['../structresumef_1_1event__t.html#a1231525d8406b1f69b563e84dc7fead7',1,'resumef::event_t']]],
['wait_5ffor_64',['wait_for',['../structresumef_1_1event__t.html#ac3d2ceb787ca321855731e40646d4112',1,'resumef::event_t']]],
['wait_5funtil_65',['wait_until',['../structresumef_1_1event__t.html#a083cda88807a10c4f68b134ce32c597b',1,'resumef::event_t']]],
['when_5f_66',['when_',['../structresumef_1_1when__.html',1,'resumef']]],
['when_5fall_67',['when_all',['../structresumef_1_1when__.html#a6ba9218688af965ccf6d4bd9e98b152a',1,'resumef::when_::when_all(scheduler_t &amp;sch, _Awaitable &amp;&amp;... args) -&gt; detail::when_future_t&lt; std::tuple&lt; detail::awaitor_result_t&lt; _Awaitable &gt;... &gt; &gt;'],['../structresumef_1_1when__.html#a29810e8fe2efbfb395669971758182fe',1,'resumef::when_::when_all(scheduler_t &amp;sch, _Iter begin, _Iter end) -&gt; detail::when_future_t&lt; std::vector&lt; detail::awaitor_result_t&lt; decltype(*std::declval&lt; _Iter &gt;())&gt; &gt; &gt;'],['../structresumef_1_1when__.html#a66d4fc83bbdbe36232615ff7d0459049',1,'resumef::when_::when_all(scheduler_t &amp;sch, _Cont &amp;cont)'],['../structresumef_1_1when__.html#a1d453b444cfaa704cf7a1da01eed49b9',1,'resumef::when_::when_all(_Awaitable &amp;&amp;... args) -&gt; future_t&lt; std::tuple&lt; detail::awaitor_result_t&lt; _Awaitable &gt;... &gt;&gt;'],['../structresumef_1_1when__.html#a9b8ec7229b5c7dd7c2ae58d3365799dc',1,'resumef::when_::when_all(_Iter begin, _Iter end) -&gt; future_t&lt; std::vector&lt; detail::awaitor_result_t&lt; decltype(*begin)&gt;&gt;&gt;'],['../structresumef_1_1when__.html#aa2a8218ff1eb6cb48fb981310a284b84',1,'resumef::when_::when_all(_Cont &amp;&amp;cont) -&gt; future_t&lt; std::vector&lt; detail::awaitor_result_t&lt; decltype(*std::begin(cont))&gt;&gt;&gt;']]],
['when_5fany_68',['when_any',['../structresumef_1_1when__.html#af4fe05b26abdab4ff00505ce56674ef9',1,'resumef::when_::when_any(scheduler_t &amp;sch, _Awaitable &amp;&amp;... args) -&gt; detail::when_future_t&lt; when_any_pair &gt;'],['../structresumef_1_1when__.html#a5eb64c53feea7f37b643f9b9c3faf685',1,'resumef::when_::when_any(scheduler_t &amp;sch, _Iter begin, _Iter end) -&gt; detail::when_future_t&lt; when_any_pair &gt;'],['../structresumef_1_1when__.html#a753478e5b7b3df202efc98c0274484e8',1,'resumef::when_::when_any(scheduler_t &amp;sch, _Cont &amp;cont) -&gt; detail::when_future_t&lt; when_any_pair &gt;'],['../structresumef_1_1when__.html#a4ec23495051e2b682f27ce0b3d527305',1,'resumef::when_::when_any(_Awaitable &amp;&amp;... args) -&gt; future_t&lt; when_any_pair &gt;'],['../structresumef_1_1when__.html#a8595c1bc0659b67724654b6661537058',1,'resumef::when_::when_any(_Iter begin, _Iter end) -&gt; future_t&lt; when_any_pair &gt;'],['../structresumef_1_1when__.html#a0b9b2f88f5c8cd76dd8d1c70926cc029',1,'resumef::when_::when_any(_Cont &amp;&amp;cont) -&gt; future_t&lt; when_any_pair &gt;']]],
['write_69',['write',['../structresumef_1_1channel__t.html#a603d7e9a7e0d621292b5a3c340aaadc9',1,'resumef::channel_t']]]
];

+ 30
- 0
doxygen/html/search/classes_0.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="classes_0.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 6
- 0
doxygen/html/search/classes_0.js Voir le fichier

@@ -0,0 +1,6 @@
var searchData=
[
['adopt_5fmanual_5funlock_5ft_76',['adopt_manual_unlock_t',['../structresumef_1_1adopt__manual__unlock__t.html',1,'resumef']]],
['awaitable_5fimpl_5ft_77',['awaitable_impl_t',['../structresumef_1_1awaitable__impl__t.html',1,'resumef']]],
['awaitable_5ft_78',['awaitable_t',['../structresumef_1_1awaitable__t.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/classes_1.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="classes_1.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 5
- 0
doxygen/html/search/classes_1.js Voir le fichier

@@ -0,0 +1,5 @@
var searchData=
[
['batch_5flock_5ft_79',['batch_lock_t',['../classresumef_1_1batch__lock__t.html',1,'resumef']]],
['batch_5funlock_5ft_80',['batch_unlock_t',['../structresumef_1_1batch__unlock__t.html',1,'resumef']]]
];

+ 30
- 0
doxygen/html/search/classes_2.html Voir le fichier

@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<link rel="stylesheet" type="text/css" href="search.css"/>
<script type="text/javascript" src="classes_2.js"></script>
<script type="text/javascript" src="search.js"></script>
</head>
<body class="SRPage">
<div id="SRIndex">
<div class="SRStatus" id="Loading">载入中...</div>
<div id="SRResults"></div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
createResults();
/* @license-end */
--></script>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
<script type="text/javascript"><!--
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
document.getElementById("Loading").style.display="none";
document.getElementById("NoMatches").style.display="none";
var searchResults = new SearchResults("searchResults");
searchResults.Search();
/* @license-end */
--></script>
</div>
</body>
</html>

+ 11
- 0
doxygen/html/search/classes_2.js Voir le fichier

@@ -0,0 +1,11 @@
var searchData=
[
['channel_5fexception_81',['channel_exception',['../structresumef_1_1channel__exception.html',1,'resumef']]],
['channel_5ft_82',['channel_t',['../structresumef_1_1channel__t.html',1,'resumef']]],
['counted_5fptr_83',['counted_ptr',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20detail_3a_3astate_5fevent_5fall_5ft_20_3e_84',['counted_ptr&lt; detail::state_event_all_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20detail_3a_3astate_5fevent_5ft_20_3e_85',['counted_ptr&lt; detail::state_event_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20detail_3a_3astate_5fmutex_5ft_20_3e_86',['counted_ptr&lt; detail::state_mutex_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20resumef_3a_3astate_5ft_20_3e_87',['counted_ptr&lt; resumef::state_t &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]],
['counted_5fptr_3c_20state_5ftype_20_3e_88',['counted_ptr&lt; state_type &gt;',['../structresumef_1_1counted__ptr.html',1,'resumef']]]
];

+ 0
- 0
doxygen/html/search/classes_3.html Voir le fichier


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff

Chargement…
Annuler
Enregistrer