# librf 2.9.3 | |||||
# librf 2.9.7 | |||||
### librf - 协程库 | ### librf - 协程库 | ||||
* librf是一个基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的非对称stackless协程库。 | * 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 更新: | 2020-03-26 更新: | ||||
兼容xcode 11.2.1。 | 兼容xcode 11.2.1。 | ||||
更新调度器算法,深入应用Coroutines的特性,以期获得更高调度性能。 | 更新调度器算法,深入应用Coroutines的特性,以期获得更高调度性能。 | ||||
不再支持C++14。 | 不再支持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++协程的资料 | * 注一:doc目录下有作者搜集的一些关于C++协程的资料 |
void RunOneBenchmark(bool bMain) | void RunOneBenchmark(bool bMain) | ||||
{ | { | ||||
resumef::local_scheduler ls; | |||||
resumef::local_scheduler_t ls; | |||||
asio::io_service io_service; | asio::io_service io_service; | ||||
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 3456)); | tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 3456)); |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>  </div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> {</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  <span class="keyword">namespace </span>detail</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  {</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">template</span><<span class="keyword">class </span>_Ety, <span class="keyword">class</span>... _Types></div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">struct </span>_awaker</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  {</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="comment">//如果超时</span></div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="comment">// e 始终为nullptr</span></div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="comment">// 不关心返回值</span></div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="comment">//如果不是超时,</span></div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <span class="comment">// e 指向当前触发的事件,用于实现wait_any</span></div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  <span class="comment">// 返回true表示成功触发了事件,event内部减小一次事件计数,并删除此awaker</span></div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <span class="comment">// 返回false表示此事件已经无效,event内部只删除此awaker</span></div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  <span class="keyword">typedef</span> std::function<bool(_Ety * e, _Types...)> callee_type;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  <span class="keyword">typedef</span> spinlock lock_type;</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="comment">//typedef std::recursive_mutex lock_type;</span></div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  lock_type _lock;</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  callee_type _callee;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  std::atomic<intptr_t> _counter;</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  _awaker(callee_type && callee_, intptr_t init_count_ = 0)</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  : _callee(std::forward<callee_type>(callee_))</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  , _counter(init_count_)</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  {</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  }</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  </div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="comment">//调用一次后,_callee就被置nullptr,下次再调用,必然返回false</span></div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="comment">//第一次调用,返回调用_callee的返回值</span></div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="comment">//超时通过传入nullptr来调用</span></div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="keywordtype">bool</span> awake(_Ety * e, intptr_t count_, <span class="keyword">const</span> _Types&... args)</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  {</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  assert(count_ > 0);</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  scoped_lock<lock_type> lock_(this->_lock);</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  </div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="keywordflow">if</span> ((this->_counter.fetch_sub(count_) - count_) <= 0)</div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  {</div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <span class="keywordflow">if</span> (this->_callee)</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  {</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  callee_type callee_ = std::move(this->_callee);</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keywordflow">return</span> callee_(e, args...);</div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  }</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  }</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  }</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  </div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  _awaker(<span class="keyword">const</span> _awaker &) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  _awaker(_awaker &&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  _awaker & operator = (<span class="keyword">const</span> _awaker &) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  _awaker & operator = (_awaker &&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  };</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  }</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> }</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  </div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="preprocessor"> </span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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;"> </span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">▼</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;"> </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<>的类型,从而变成支持 librf 的协程函数。 </td></tr> | |||||
<tr id="row_1_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">▼</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;"> </span><span id="arr_1_0_" class="arrow" onclick="toggleFolder('1_0_')">▼</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;"> </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;"> </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;"> </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<>的公共实现部分,用于减少awaitable_t<>的重复代码。 </td></tr> | |||||
<tr id="row_1_3_"><td class="entry"><span style="width:32px;display:inline-block;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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<>的state基类,实现了针对于future_t<>的公共方法等。 </td></tr> | |||||
<tr id="row_1_21_"><td class="entry"><span style="width:32px;display:inline-block;"> </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<>的state类。 </td></tr> | |||||
<tr id="row_1_22_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </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<>的state类。 </td></tr> | |||||
<tr id="row_1_23_"><td class="entry"><span style="width:32px;display:inline-block;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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>  </div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  </div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="preprocessor">#if ASIO_VERSION >= 101200</span></div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#include "asio_task_1.12.0.inl"</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="preprocessor">#else</span></div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="preprocessor">#include "asio_task_1.10.0.inl"</span></div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#endif</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  </div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__impl__t.html"> 12</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <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<value_type></a>;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <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<value_type></a>;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  <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>  <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>  </div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <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>  <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>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <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>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>& operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>& operator = (<a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  </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>  <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> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  this-><a class="code" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">_state</a>->set_exception(std::move(e));</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  this-><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>  }</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  </div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Exp></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>  <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> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <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>  }</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  </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>  <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>  {</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">return</span> <a class="code" href="structresumef_1_1future__t.html">future_type</a>{ this-><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>  }</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  </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>  <span class="keyword">mutable</span> <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr<state_type></a> <a class="code" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">_state</a> = state_future_t::_Alloc_state<state_type>(<span class="keyword">true</span>);</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  };</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__t.html"> 77</a></span>  <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><_Ty></div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  {</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">using</span> <span class="keyword">typename</span> awaitable_impl_t<_Ty>::value_type;</div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">using</span> <a class="code" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t<_Ty>::awaitable_impl_t</a>;</div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  </div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keyword">template</span><<span class="keyword">class</span> U></div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3"> 89</a></span>  <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3">set_value</a>(U&& value)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  this->_state->set_value(std::forward<U>(value));</div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  this->_state = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  }</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  };</div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  </div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keyword">struct </span>[[nodiscard]] awaitable_t<_Ty&> : <span class="keyword">public</span> awaitable_impl_t<_Ty&></div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  {</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keyword">using</span> <span class="keyword">typename</span> awaitable_impl_t<_Ty&>::value_type;</div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keyword">using</span> awaitable_impl_t<_Ty&>::awaitable_impl_t;</div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  </div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordtype">void</span> set_value(_Ty& value)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  this->_state->set_value(value);</div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  this->_state = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  }</div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  };</div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  </div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">template</span><></div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keyword">struct </span>[[nodiscard]] awaitable_t<void> : <span class="keyword">public</span> awaitable_impl_t<void></div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  {</div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keyword">using</span> awaitable_impl_t<void>::awaitable_impl_t;</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  </div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <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> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  this->_state->set_value();</div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  this->_state = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  }</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  };</div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span> }</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<>对象,作为可等待函数(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< state_type ></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<>的公共实现部分,用于减少awaitable_t<>的重复代码。</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 &&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<>的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< state_type > _state</div><div class="ttdoc">管理的state_t<>对象。</div><div class="ttdef"><b>Definition:</b> awaitable.h:57</div></div> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="preprocessor">#include "channel_v1.h"</span></div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="preprocessor">#include "channel_v2.h"</span></div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#include "channel_v2.inl"</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  <span class="keyword">namespace </span>detail</div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  {</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">struct </span>channel_impl : <span class="keyword">public</span> std::enable_shared_from_this<channel_impl<_Ty>></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  {</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">typedef</span> _awaker<channel_impl<_Ty>, _Ty*, error_code> channel_read_awaker;</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <span class="keyword">typedef</span> std::shared_ptr<channel_read_awaker> channel_read_awaker_ptr;</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  </div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">typedef</span> _awaker<channel_impl<_Ty>> channel_write_awaker;</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="keyword">typedef</span> std::shared_ptr<channel_write_awaker> channel_write_awaker_ptr;</div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">typedef</span> std::pair<channel_write_awaker_ptr, _Ty> write_tuple_type;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  <span class="comment">//typedef spinlock lock_type;</span></div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <span class="keyword">typedef</span> std::recursive_mutex lock_type;</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  lock_type _lock; <span class="comment">//保证访问本对象是线程安全的</span></div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  <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>  std::deque<_Ty> _values; <span class="comment">//数据队列</span></div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  std::list<channel_read_awaker_ptr> _read_awakes; <span class="comment">//读队列</span></div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  std::list<write_tuple_type> _write_awakes; <span class="comment">//写队列</span></div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  channel_impl(<span class="keywordtype">size_t</span> max_counter_)</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  :_max_counter(max_counter_)</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  {</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  }</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  </div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#if _DEBUG</span></div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="keyword">const</span> std::deque<_Ty>& debug_queue()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordflow">return</span> _values;</div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  }</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  </div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="keyword">template</span><<span class="keyword">class</span> callee_t, <span class="keyword">class</span> = std::enable_if<!std::is_same<std::remove_cv_t<callee_t>, channel_read_awaker_ptr>::value>></div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  decltype(<span class="keyword">auto</span>) read(callee_t&& awaker)</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  {</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="keywordflow">return</span> read_(std::make_shared<channel_read_awaker>(std::forward<callee_t>(awaker)));</div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  }</div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="keyword">template</span><<span class="keyword">class</span> callee_t, <span class="keyword">class</span> _Ty2, <span class="keyword">class</span> = std::enable_if<!std::is_same<std::remove_cv_t<callee_t>, channel_write_awaker_ptr>::value>></div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  decltype(<span class="keyword">auto</span>) write(callee_t&& awaker, _Ty2&& val)</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  {</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="keywordflow">return</span> write_(std::make_shared<channel_write_awaker>(std::forward<callee_t>(awaker)), std::forward<_Ty2>(val));</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  }</div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  </div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="comment">//如果已经触发了awaker,则返回true</span></div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="comment">//设计目标是线程安全的,实际情况待考察</span></div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordtype">bool</span> read_(channel_read_awaker_ptr&& r_awaker)</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  {</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  assert(r_awaker);</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  </div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  scoped_lock<lock_type> lock_(this->_lock);</div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  </div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordtype">bool</span> ret_value;</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keywordflow">if</span> (_values.size() > 0)</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  {</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="comment">//如果数据队列有数据,则可以直接读数据</span></div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">auto</span> val = std::move(_values.front());</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  _values.pop_front();</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  </div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  r_awaker->awake(<span class="keyword">this</span>, 1, &val, error_code::none);</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  ret_value = <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  }</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  {</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="comment">//否则,将“读等待”放入“读队列”</span></div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  _read_awakes.push_back(r_awaker);</div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  ret_value = <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  }</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  </div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="comment">//如果已有写队列,则唤醒一个“写等待”</span></div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  awake_one_writer_();</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  </div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keywordflow">return</span> ret_value;</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  }</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  </div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="comment">//设计目标是线程安全的,实际情况待考察</span></div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty2></div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keywordtype">void</span> write_(channel_write_awaker_ptr&& w_awaker, _Ty2&& val)</div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  {</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  assert(w_awaker);</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  scoped_lock<lock_type> lock_(this->_lock);</div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  </div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="comment">//如果满了,则不添加到数据队列,而是将“写等待”和值,放入“写队列”</span></div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordtype">bool</span> is_full = _values.size() >= _max_counter;</div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="keywordflow">if</span> (is_full)</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  _write_awakes.push_back(std::make_pair(std::forward<channel_write_awaker_ptr>(w_awaker), std::forward<_Ty2>(val)));</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  _values.push_back(std::forward<_Ty2>(val));</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  </div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="comment">//如果已有读队列,则唤醒一个“读等待”</span></div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  awake_one_reader_();</div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  </div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="comment">//触发 没有放入“写队列”的“写等待”</span></div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keywordflow">if</span> (!is_full) w_awaker->awake(<span class="keyword">this</span>, 1);</div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  }</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  </div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="comment">//只能被write_函数调用,内部不再需要加锁</span></div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordtype">void</span> awake_one_reader_()</div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  {</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="comment">//assert(!(_read_awakes.size() >= 0 && _values.size() == 0));</span></div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  </div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <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>  {</div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keyword">auto</span> r_awaker = *iter;</div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  iter = _read_awakes.erase(iter);</div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  </div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordflow">if</span> (r_awaker->awake(<span class="keyword">this</span>, 1, _values.size() ? &_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>  {</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">if</span> (_values.size()) _values.pop_front();</div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  </div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="comment">//唤醒一个“读等待”后,尝试唤醒一个“写等待”,以处理“数据队列”满后的“写等待”</span></div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  awake_one_writer_();</div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">break</span>;</div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  }</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  }</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  </div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="comment">//只能被read_函数调用,内部不再需要加锁</span></div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordtype">void</span> awake_one_writer_()</div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  {</div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <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>  {</div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keyword">auto</span> w_awaker = std::move(*iter);</div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  iter = _write_awakes.erase(iter);</div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  </div> | |||||
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordflow">if</span> (w_awaker.first->awake(<span class="keyword">this</span>, 1))</div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  {</div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="comment">//一个“写等待”唤醒后,将“写等待”绑定的值,放入“数据队列”</span></div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  _values.push_back(std::move(w_awaker.second));</div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">break</span>;</div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  }</div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  }</div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  </div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordtype">size_t</span> capacity() const noexcept</div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  {</div> | |||||
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="keywordflow">return</span> _max_counter;</div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  }</div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  </div> | |||||
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  channel_impl(<span class="keyword">const</span> channel_impl&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  channel_impl(channel_impl&&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  channel_impl& operator = (<span class="keyword">const</span> channel_impl&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  channel_impl& operator = (channel_impl&&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  };</div> | |||||
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  } <span class="comment">//namespace detail</span></div> | |||||
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  </div> | |||||
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="keyword">namespace </span>channel_v1</div> | |||||
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span> {</div> | |||||
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  </div> | |||||
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keyword">struct </span>channel_t</div> | |||||
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  {</div> | |||||
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keyword">typedef</span> detail::channel_impl<_Ty> channel_impl_type;</div> | |||||
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <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>  <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>  </div> | |||||
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keyword">typedef</span> std::shared_ptr<channel_impl_type> channel_impl_ptr;</div> | |||||
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keyword">typedef</span> std::weak_ptr<channel_impl_type> channel_impl_wptr;</div> | |||||
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div> | |||||
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  channel_impl_ptr _chan;</div> | |||||
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  channel_t(<span class="keywordtype">size_t</span> max_counter = 0)</div> | |||||
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  :_chan(std::make_shared<channel_impl_type>(max_counter))</div> | |||||
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div> | |||||
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  </div> | |||||
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  }</div> | |||||
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  </div> | |||||
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty2></div> | |||||
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  future_t<bool> write(_Ty2&& val)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  awaitable_t<bool> awaitable;</div> | |||||
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  </div> | |||||
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keyword">auto</span> awaker = std::make_shared<channel_write_awaker>(</div> | |||||
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  [st = awaitable._state](channel_impl_type* chan) -> <span class="keywordtype">bool</span></div> | |||||
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  {</div> | |||||
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  st->set_value(chan ? true : false);</div> | |||||
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  return true;</div> | |||||
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  });</div> | |||||
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  _chan->write_(std::move(awaker), std::forward<_Ty2>(val));</div> | |||||
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  </div> | |||||
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">return</span> awaitable.get_future();</div> | |||||
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  }</div> | |||||
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  </div> | |||||
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  future_t<_Ty> read()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  awaitable_t<_Ty> awaitable;</div> | |||||
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  </div> | |||||
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keyword">auto</span> awaker = std::make_shared<channel_read_awaker>(</div> | |||||
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  [st = awaitable._state](channel_impl_type*, _Ty* val, error_code fe) -> <span class="keywordtype">bool</span></div> | |||||
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  {</div> | |||||
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  if (val)</div> | |||||
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  st->set_value(std::move(*val));</div> | |||||
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  else</div> | |||||
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  st->throw_exception(channel_exception{ fe });</div> | |||||
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  </div> | |||||
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  });</div> | |||||
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  _chan->read_(std::move(awaker));</div> | |||||
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  </div> | |||||
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">return</span> awaitable.get_future();</div> | |||||
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  }</div> | |||||
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  </div> | |||||
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty2></div> | |||||
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  future_t<bool> operator << (_Ty2&& val)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">return</span> std::move(write(std::forward<_Ty2>(val)));</div> | |||||
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  }</div> | |||||
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  </div> | |||||
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  future_t<_Ty> <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> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">return</span> read();</div> | |||||
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  }</div> | |||||
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  </div> | |||||
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span> <span class="preprocessor">#if _DEBUG</span></div> | |||||
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="comment">//非线程安全,返回的队列也不是线程安全的</span></div> | |||||
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keyword">const</span> <span class="keyword">auto</span>& debug_queue()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">return</span> _chan->debug_queue();</div> | |||||
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  }</div> | |||||
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  </div> | |||||
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordtype">size_t</span> capacity() const noexcept</div> | |||||
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  {</div> | |||||
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">return</span> _chan->capacity();</div> | |||||
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  }</div> | |||||
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  </div> | |||||
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  channel_t(<span class="keyword">const</span> channel_t&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  channel_t(channel_t&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  channel_t& operator = (<span class="keyword">const</span> channel_t&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  channel_t& operator = (channel_t&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  };</div> | |||||
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  </div> | |||||
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  </div> | |||||
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keyword">using</span> semaphore_t = channel_t<bool>;</div> | |||||
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  </div> | |||||
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span> } <span class="comment">//namespace v1</span></div> | |||||
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span> } <span class="comment">//namespace resumef</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="keyword">namespace </span>detail</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> {</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Opty></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">struct </span>channel_impl_v2;</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> } <span class="comment">//namespace detail</span></div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  </div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <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> {</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  </div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty = <span class="keywordtype">bool</span>, <span class="keywordtype">bool</span> _Optional = !std::is_trivial_v<_Ty>, <span class="keywordtype">bool</span> _OptimizationThread = false></div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="structresumef_1_1channel__t.html"> 25</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  static_assert((std::is_copy_constructible_v<_Ty>&& std::is_copy_assignable_v<_Ty>) ||</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  (std::is_move_constructible_v<_Ty> && std::is_move_assignable_v<_Ty>));</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  </div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keyword">struct </span>[[nodiscard]] read_awaiter;</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keyword">struct </span>[[nodiscard]] write_awaiter;</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  </div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <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>  </div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <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>  </div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  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>  </div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  read_awaiter read() <span class="keyword">const</span> noexcept;</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  </div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="keyword">template</span><<span class="keyword">class </span>U</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  COMMA_RESUMEF_ENABLE_IF(std::is_constructible_v<value_type, U&&>)</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  ></div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  RESUMEF_REQUIRES(std::is_constructible_v<_Ty, U&&>)</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  write_awaiter operator << (U&& val) <span class="keyword">const</span> noexcept(std::is_move_constructible_v<U>);</div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  </div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keyword">template</span><<span class="keyword">class </span>U</div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  COMMA_RESUMEF_ENABLE_IF(std::is_constructible_v<value_type, U&&>)</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  ></div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  RESUMEF_REQUIRES(std::is_constructible_v<_Ty, U&&>)</div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  write_awaiter write(U&& val) <span class="keyword">const</span> noexcept(std::is_move_constructible_v<U>);</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  </div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  </div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  </div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <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>  <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>  </div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keyword">using</span> optional_type = std::conditional_t<use_optional, std::optional<value_type>, value_type>;</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keyword">using</span> channel_type = detail::channel_impl_v2<value_type, optional_type>;</div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <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>  </div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <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>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>(<a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>& operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <a class="code" href="structresumef_1_1channel__t.html">channel_t</a>& operator = (<a class="code" href="structresumef_1_1channel__t.html">channel_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  std::shared_ptr<channel_type> _chan;</div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  };</div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  </div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  </div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="comment">//不支持channel_t<void></span></div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keyword">template</span><<span class="keywordtype">bool</span> _Option, <span class="keywordtype">bool</span> _OptimizationThread></div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keyword">struct </span><a class="code" href="structresumef_1_1channel__t.html">channel_t</a><void, _Option, _OptimizationThread></div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  {</div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  };</div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  </div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keyword">using</span> semaphore_t = channel_t<bool, false, true>;</div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  </div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span> } <span class="comment">//namespace channel_v2</span></div> | |||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span> } <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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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< Allocator > 成员列表</div> </div> | |||||
</div><!--header--> | |||||
<div class="contents"> | |||||
<p>成员的完整列表,这些成员属于 <a class="el" href="classasio_1_1rf__task__t.html">asio::rf_task_t< Allocator ></a>,包括所有继承而来的类成员</p> | |||||
</div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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< Allocator > 模板结构体 参考</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&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&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< Allocator > 模板结构体 参考</div> </div> | |||||
</div><!--header--> | |||||
<div class="contents"> | |||||
<p>用于指示asio相关异步函数,返回resumef::future_t<>的类型,从而变成支持 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<typename Allocator = std::allocator<int>><br /> | |||||
struct asio::rf_task_t< Allocator ></h3> | |||||
<p>用于指示asio相关异步函数,返回resumef::future_t<>的类型,从而变成支持 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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> | <a class="qindex" href="#letter_b">b</a> | <a class="qindex" href="#letter_c">c</a> | <a class="qindex" href="#letter_e">e</a> | <a class="qindex" href="#letter_f">f</a> | <a class="qindex" href="#letter_g">g</a> | <a class="qindex" href="#letter_l">l</a> | <a class="qindex" href="#letter_m">m</a> | <a class="qindex" href="#letter_r">r</a> | <a class="qindex" href="#letter_s">s</a> | <a class="qindex" href="#letter_t">t</a> | <a class="qindex" href="#letter_w">w</a> | <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">  a  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1channel__t.html">channel_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1get__root__state__awaitor.html">get_root_state_awaitor</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1spinlock.html">spinlock</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1detail_1_1timer__target.html">timer_target</a> (resumef::detail)   </td> | |||||
</tr> | |||||
<tr><td valign="top"><a class="el" href="structresumef_1_1counted__ptr.html">counted_ptr</a> (resumef)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_l"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  l  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1state__base__t.html">state_base_t</a> (resumef)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_w"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  w  </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)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_e"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  e  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1state__future__t.html">state_future_t</a> (resumef)   </td> | |||||
</tr> | |||||
<tr><td valign="top"><a class="el" href="structresumef_1_1awaitable__impl__t.html">awaitable_impl_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1state__generator__t.html">state_generator_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1when__.html">when_</a> (resumef)   </td> | |||||
</tr> | |||||
<tr><td valign="top"><a class="el" href="structresumef_1_1awaitable__t.html">awaitable_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1event__t.html">event_t</a> (resumef)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_m"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  m  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1state__t.html">state_t</a> (resumef)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_y"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  y  </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">  b  </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">  f  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1switch__scheduler__awaitor.html">switch_scheduler_awaitor</a> (resumef)   </td> | |||||
</tr> | |||||
<tr><td valign="top"><a class="el" href="structresumef_1_1mutex__exception.html">mutex_exception</a> (resumef)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_t"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  t  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1yield__awaitor.html">yield_awaitor</a> (resumef)   </td> | |||||
</tr> | |||||
<tr><td valign="top"><a class="el" href="classresumef_1_1batch__lock__t.html">batch_lock_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1future__t.html">future_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1mutex__t.html">mutex_t</a> (resumef)   </td> | |||||
<td></td></tr> | |||||
<tr><td valign="top"><a class="el" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a> (resumef)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_g"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  g  </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">  r  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1task__t.html">task_t</a> (resumef)   </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">  c  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1timer__canceled__exception.html">timer_canceled_exception</a> (resumef)   </td> | |||||
<td></td></tr> | |||||
<tr><td valign="top"><a class="el" href="structresumef_1_1generator__t.html">generator_t</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="classasio_1_1rf__task__t.html">rf_task_t</a> (asio)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1timer__handler.html">timer_handler</a> (resumef)   </td> | |||||
<td></td></tr> | |||||
<tr><td valign="top"><a class="el" href="structresumef_1_1channel__exception.html">channel_exception</a> (resumef)   </td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1get__current__scheduler__awaitor.html">get_current_scheduler_awaitor</a> (resumef)   </td> | |||||
<td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  s  </div></td></tr></table> | |||||
</td> | |||||
<td valign="top"><a class="el" href="structresumef_1_1timer__manager.html">timer_manager</a> (resumef)   </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)   </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> | <a class="qindex" href="#letter_b">b</a> | <a class="qindex" href="#letter_c">c</a> | <a class="qindex" href="#letter_e">e</a> | <a class="qindex" href="#letter_f">f</a> | <a class="qindex" href="#letter_g">g</a> | <a class="qindex" href="#letter_l">l</a> | <a class="qindex" href="#letter_m">m</a> | <a class="qindex" href="#letter_r">r</a> | <a class="qindex" href="#letter_s">s</a> | <a class="qindex" href="#letter_t">t</a> | <a class="qindex" href="#letter_w">w</a> | <a class="qindex" href="#letter_y">y</a></div> | |||||
</div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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< _Ty, _Cont, _Assemble > 成员列表</div> </div> | |||||
</div><!--header--> | |||||
<div class="contents"> | |||||
<p>成员的完整列表,这些成员属于 <a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &locks_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &locks_, _Assemble &la_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &locks_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &locks_, _Assemble &la_)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &)=delete</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &&_Right)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &)=delete</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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 &&_Right)</td><td class="entry"><a class="el" href="classresumef_1_1batch__lock__t.html">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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< _Ty, _Cont, _Assemble ></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< _Ty, _Cont, _Assemble ></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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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< _Ty, _Cont, _Assemble > 模板类 参考</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&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&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> | | |||||
<a href="classresumef_1_1batch__lock__t-members.html">所有成员列表</a> </div> | |||||
<div class="headertitle"> | |||||
<div class="title">resumef::batch_lock_t< _Ty, _Cont, _Assemble > 模板类 参考</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> | |||||
 </td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#a3779f0030948ad54e4f97c8e73afa44d">batch_lock_t</a> (_Cont &locks_)</td></tr> | |||||
<tr class="memdesc:a3779f0030948ad54e4f97c8e73afa44d"><td class="mdescLeft"> </td><td class="mdescRight">通过锁容器构造,并立刻应用加锁算法。 <br /></td></tr> | |||||
<tr class="separator:a3779f0030948ad54e4f97c8e73afa44d"><td class="memSeparator" colspan="2"> </td></tr> | |||||
<tr class="memitem:af46b0d1ba6494e2955660271b190a99a"><td class="memItemLeft" align="right" valign="top"><a id="af46b0d1ba6494e2955660271b190a99a"></a> | |||||
 </td><td class="memItemRight" valign="bottom"><a class="el" href="classresumef_1_1batch__lock__t.html#af46b0d1ba6494e2955660271b190a99a">batch_lock_t</a> (_Cont &locks_, _Assemble &la_)</td></tr> | |||||
<tr class="memdesc:af46b0d1ba6494e2955660271b190a99a"><td class="mdescLeft"> </td><td class="mdescRight">通过锁容器和锁集合构造,并立刻应用加锁算法。 <br /></td></tr> | |||||
<tr class="separator:af46b0d1ba6494e2955660271b190a99a"><td class="memSeparator" colspan="2"> </td></tr> | |||||
<tr class="memitem:a2293d0f5d68f335ed8dd0bb6e89321a6"><td class="memItemLeft" align="right" valign="top"><a id="a2293d0f5d68f335ed8dd0bb6e89321a6"></a> | |||||
 </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 &locks_)</td></tr> | |||||
<tr class="memdesc:a2293d0f5d68f335ed8dd0bb6e89321a6"><td class="mdescLeft"> </td><td class="mdescRight">通过锁容器构造,容器里的锁已经全部获得。 <br /></td></tr> | |||||
<tr class="separator:a2293d0f5d68f335ed8dd0bb6e89321a6"><td class="memSeparator" colspan="2"> </td></tr> | |||||
<tr class="memitem:abf8d154d25e3b66eb308750052fb660e"><td class="memItemLeft" align="right" valign="top"><a id="abf8d154d25e3b66eb308750052fb660e"></a> | |||||
 </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 &locks_, _Assemble &la_)</td></tr> | |||||
<tr class="memdesc:abf8d154d25e3b66eb308750052fb660e"><td class="mdescLeft"> </td><td class="mdescRight">通过锁容器和锁集合构造,容器里的锁已经全部获得。 <br /></td></tr> | |||||
<tr class="separator:abf8d154d25e3b66eb308750052fb660e"><td class="memSeparator" colspan="2"> </td></tr> | |||||
<tr class="memitem:a661dad263c32b25b6bcc92c0d7b73830"><td class="memItemLeft" align="right" valign="top"><a id="a661dad263c32b25b6bcc92c0d7b73830"></a> | |||||
 </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"> </td><td class="mdescRight">析构函数里,释放容器里的锁。 <br /></td></tr> | |||||
<tr class="separator:a661dad263c32b25b6bcc92c0d7b73830"><td class="memSeparator" colspan="2"> </td></tr> | |||||
<tr class="memitem:abc72b35a9eef1bd6c39955d63cc8ce9c"><td class="memItemLeft" align="right" valign="top"><a id="abc72b35a9eef1bd6c39955d63cc8ce9c"></a> | |||||
void </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"> </td><td class="mdescRight">手工释放容器里的锁,析构函数里将不再有释放操作。 <br /></td></tr> | |||||
<tr class="separator:abc72b35a9eef1bd6c39955d63cc8ce9c"><td class="memSeparator" colspan="2"> </td></tr> | |||||
<tr class="memitem:a3da9e6b8f868fffed636704c551fea47"><td class="memItemLeft" align="right" valign="top"><a id="a3da9e6b8f868fffed636704c551fea47"></a> | |||||
 </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> &)=delete</td></tr> | |||||
<tr class="memdesc:a3da9e6b8f868fffed636704c551fea47"><td class="mdescLeft"> </td><td class="mdescRight">不支持拷贝构造。 <br /></td></tr> | |||||
<tr class="separator:a3da9e6b8f868fffed636704c551fea47"><td class="memSeparator" colspan="2"> </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> & </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> &)=delete</td></tr> | |||||
<tr class="memdesc:aabbfeb513ac907b9c8caf6fda9a356d4"><td class="mdescLeft"> </td><td class="mdescRight">不支持拷贝赋值。 <br /></td></tr> | |||||
<tr class="separator:aabbfeb513ac907b9c8caf6fda9a356d4"><td class="memSeparator" colspan="2"> </td></tr> | |||||
<tr class="memitem:a820544949fcf42d08759f5f29686cc9c"><td class="memItemLeft" align="right" valign="top"><a id="a820544949fcf42d08759f5f29686cc9c"></a> | |||||
 </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> &&_Right)</td></tr> | |||||
<tr class="memdesc:a820544949fcf42d08759f5f29686cc9c"><td class="mdescLeft"> </td><td class="mdescRight">支持移动构造。 <br /></td></tr> | |||||
<tr class="separator:a820544949fcf42d08759f5f29686cc9c"><td class="memSeparator" colspan="2"> </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> & </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> &&_Right)</td></tr> | |||||
<tr class="memdesc:a057618d5a806ffe6fd106f851082f12e"><td class="mdescLeft"> </td><td class="mdescRight">支持移动赋值。 <br /></td></tr> | |||||
<tr class="separator:a057618d5a806ffe6fd106f851082f12e"><td class="memSeparator" colspan="2"> </td></tr> | |||||
</table> | |||||
<a name="details" id="details"></a><h2 class="groupheader">详细描述</h2> | |||||
<div class="textblock"><h3>template<class _Ty, class _Cont = std::vector<_Ty>, class _Assemble = detail::_LockVectorAssembleT<_Ty, _Cont>><br /> | |||||
class resumef::batch_lock_t< _Ty, _Cont, _Assemble ></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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="preprocessor">#ifndef RESUMEF_INLINE_STATE</span></div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="preprocessor">#if defined(__clang__) || defined(_MSC_VER)</span></div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#define RESUMEF_INLINE_STATE 1</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="preprocessor">#else</span></div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="preprocessor">#define RESUMEF_INLINE_STATE 1</span></div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#endif //defined(__clang__) || defined(_MSC_VER)</span></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#endif //RESUMEF_INLINE_STATE</span></div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  </div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#ifndef RESUMEF_DEBUG_COUNTER</span></div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">/* #undef RESUMEF_DEBUG_COUNTER */</span></div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#endif //RESUMEF_DEBUG_COUNTER</span></div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#ifndef RESUMEF_ENABLE_CONCEPT</span></div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#ifdef __cpp_lib_concepts</span></div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#define RESUMEF_ENABLE_CONCEPT 1</span></div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#else</span></div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#define RESUMEF_ENABLE_CONCEPT 1</span></div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#endif //#ifdef __cpp_lib_concepts</span></div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#endif //#ifndef RESUMEF_ENABLE_CONCEPT</span></div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  </div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <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> <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> <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>  </div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment">/* #undef RESUMEF_USE_CUSTOM_SPINLOCK */</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html"> 9</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <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>  </div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#ad466495cf5a6056e326a923558676ccd"> 19</a></span>  <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>& cp) : _p(cp._p)</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  {</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  _lock();</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  }</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#ab752ffdd40c7ab1be06e7662488d8e24"> 27</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  _lock();</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  }</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  </div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a8b6f5332dd4754c22970f7e5406c6233"> 35</a></span>  <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>&& cp) noexcept</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  {</div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  std::swap(_p, cp._p);</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  }</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  </div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a"> 43</a></span>  <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>& <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>& cp)</div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  {</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keywordflow">if</span> (&cp != <span class="keyword">this</span>)</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  {</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <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>  std::swap(_p, t._p);</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  }</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  }</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  </div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#af6a044ce1cdecc3a2650f16f445de2d4"> 56</a></span>  <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>& <a class="code" href="structresumef_1_1counted__ptr.html#af6a044ce1cdecc3a2650f16f445de2d4">operator=</a>(<a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr</a>&& cp) noexcept</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  {</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keywordflow">if</span> (&cp != <span class="keyword">this</span>)</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  std::swap(_p, cp._p);</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  }</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  </div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6"> 66</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  _unlock();</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  }</div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  </div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba"> 74</a></span>  T* <a class="code" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba">operator-></a>() const noexcept</div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  {</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keywordflow">return</span> _p;</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  }</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  </div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#a9f6757dac685431f2ae561a58c502d1f"> 82</a></span>  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>  {</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordflow">return</span> _p;</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  }</div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  </div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899"> 90</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  _unlock();</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  }</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordtype">void</span> _unlock()</div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  {</div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keywordflow">if</span> (_p != <span class="keyword">nullptr</span>)</div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  {</div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keyword">auto</span> t = _p;</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  _p = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  t->unlock();</div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  }</div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  }</div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keywordtype">void</span> _lock(T* p)</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  {</div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">if</span> (p != <span class="keyword">nullptr</span>)</div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  p->lock();</div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  _p = p;</div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  }</div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordtype">void</span> _lock()</div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  {</div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordflow">if</span> (_p != <span class="keyword">nullptr</span>)</div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  _p->lock();</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  }</div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  T* _p = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  };</div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  </div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U></div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> counted_ptr<T>& _Left, <span class="keyword">const</span> counted_ptr<U>& _Right)</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  {</div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">return</span> _Left.get() == _Right.get();</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> counted_ptr<T>& _Left, std::nullptr_t)</div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  {</div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <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>  }</div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (std::nullptr_t, <span class="keyword">const</span> counted_ptr<T>& _Left)</div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  {</div> | |||||
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <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>  }</div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> counted_ptr<T>& _Left, std::nullptr_t)</div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  {</div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <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>  }</div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (std::nullptr_t, <span class="keyword">const</span> counted_ptr<T>& _Left)</div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  {</div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <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>  }</div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span> }</div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  </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 & operator=(counted_ptr &&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 &&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-></a></div><div class="ttdeci">T * operator->() 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 & operator=(const counted_ptr &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 &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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</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>  <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>  {</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <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>  {</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  }</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="keyword">template</span><<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t<traits::is_promise_v<_PromiseT>>></div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keywordtype">bool</span> await_suspend(coroutine_handle<_PromiseT> handler)</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  {</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  _PromiseT& promise = handler.promise();</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <span class="keyword">auto</span>* state = promise.get_state();</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  this->_scheduler = state->get_scheduler();</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  </div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  }</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <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>  {</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <span class="keywordflow">return</span> _scheduler;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  }</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <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> <span class="preprocessor">#ifdef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <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> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  };</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  </div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <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>  {</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">return</span> {};</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  }</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  </div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  </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>  <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>  {</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <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>  {</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  }</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keyword">template</span><<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t<traits::is_promise_v<_PromiseT>>></div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keywordtype">bool</span> await_suspend(coroutine_handle<_PromiseT> handler)</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  {</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  _PromiseT& promise = handler.promise();</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keyword">auto</span>* parent = promise.get_state();</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  this->_state = parent->get_root();</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  </div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  }</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <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>  {</div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keywordflow">return</span> _state;</div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  }</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <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> <span class="preprocessor">#ifdef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <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> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  };</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  </div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <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>  {</div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">return</span> {};</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  }</div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  </div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span> }</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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <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>  </div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> {</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">struct </span>scheduler_t;</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  </div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty = <span class="keywordtype">void</span>></div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <span class="keyword">struct </span>[[nodiscard]] future_t;</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  </div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">using</span> future_vt [[deprecated]] = future_t<>;</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Ty = std::<span class="keywordtype">nullptr</span>_t, <span class="keyword">typename</span> _Alloc = std::allocator<<span class="keywordtype">char</span>>></div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <span class="keyword">struct </span>generator_t;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  </div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty = <span class="keywordtype">void</span>></div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  <span class="keyword">struct </span>promise_t;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  </div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty = <span class="keywordtype">void</span>></div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="keyword">struct </span>awaitable_t;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keyword">struct </span>state_base_t;</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  </div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <span class="keyword">struct </span>switch_scheduler_t;</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  </div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  <span class="keyword">template</span><<span class="keyword">typename</span> _PromiseT = <span class="keywordtype">void</span>></div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keyword">using</span> coroutine_handle = std::experimental::coroutine_handle<_PromiseT>;</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keyword">using</span> suspend_always = std::experimental::suspend_always;</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="keyword">using</span> suspend_never = std::experimental::suspend_never;</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  </div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mutexes></div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="keyword">using</span> scoped_lock = std::scoped_lock<_Mutexes...>;</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  </div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  constexpr <span class="keywordtype">size_t</span> _Version = LIB_RESUMEF_VERSION;</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  </div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  scheduler_t* this_scheduler();</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  </div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> }</div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  </div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  </div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keyword">extern</span> std::mutex g_resumef_cout_mutex;</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="keyword">extern</span> std::atomic<intptr_t> g_resumef_state_count;</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="keyword">extern</span> std::atomic<intptr_t> g_resumef_task_count;</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">extern</span> std::atomic<intptr_t> g_resumef_evtctx_count;</div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="keyword">extern</span> std::atomic<intptr_t> g_resumef_state_id;</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  </div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span> {</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">template</span><<span class="keyword">class</span> T></div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keyword">struct </span>remove_cvref</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  {</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keyword">typedef</span> std::remove_cv_t<std::remove_reference_t<T>> type;</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  };</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="keyword">template</span><<span class="keyword">class</span> T></div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keyword">using</span> remove_cvref_t = <span class="keyword">typename</span> remove_cvref<T>::type;</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  </div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  </div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  constexpr <span class="keywordtype">size_t</span> _Align_size()</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  {</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <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>  <span class="keywordflow">return</span> std::is_empty_v<_Ty> ? 0 :</div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  (<span class="keyword">sizeof</span>(_Ty) + _ALIGN_REQ - 1) & ~(_ALIGN_REQ - 1);</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  }</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> }</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  </div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="preprocessor">#include "exception.inl"</span></div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  </div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
/* | |||||
@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('▼'); | |||||
$(this).show(); | |||||
} else if (l==level+1) { | |||||
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed'); | |||||
a.html('►'); | |||||
$(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('►'); | |||||
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('▼'); | |||||
// 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('►'); | |||||
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 */ |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="preprocessor">#include "event_v1.h"</span></div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="preprocessor">#include "event_v2.h"</span></div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#include "event_v2.inl"</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  <span class="keyword">namespace </span>detail</div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  {</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  <span class="keyword">struct </span>event_impl;</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">typedef</span> _awaker<event_impl> event_awaker;</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">typedef</span> std::shared_ptr<event_awaker> event_awaker_ptr;</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  </div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <span class="keyword">struct </span>event_impl : <span class="keyword">public</span> std::enable_shared_from_this<event_impl></div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  {</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="comment">//typedef spinlock lock_type;</span></div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">typedef</span> std::recursive_mutex lock_type;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  </div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  std::list<event_awaker_ptr> _awakes;</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  intptr_t _counter;</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  lock_type _lock;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  event_impl(intptr_t initial_counter_);</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  </div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <span class="keywordtype">void</span> signal();</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keywordtype">void</span> reset();</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  </div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <span class="comment">//如果已经触发了awaker,则返回true</span></div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keywordtype">bool</span> wait_(<span class="keyword">const</span> event_awaker_ptr& awaker);</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  </div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  <span class="keyword">template</span><<span class="keyword">class</span> callee_t, <span class="keyword">class</span> dummy_t = std::enable_if<!std::is_same<std::remove_cv_t<callee_t>, event_awaker_ptr>::value>></div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  decltype(<span class="keyword">auto</span>) wait(callee_t&& awaker, dummy_t* dummy_ = <span class="keywordtype">nullptr</span>)</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  {</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  (void)dummy_;</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <span class="keywordflow">return</span> wait_(std::make_shared<event_awaker>(std::forward<callee_t>(awaker)));</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  }</div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  </div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  event_impl(<span class="keyword">const</span> event_impl&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  event_impl(event_impl&&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  event_impl& operator = (<span class="keyword">const</span> event_impl&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  event_impl& operator = (event_impl&&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  };</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  }</div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  </div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="keyword">namespace </span>event_v1</div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> {</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  </div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="comment">//提供一种在协程和非协程之间同步的手段。</span></div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="comment">//典型用法是在非协程的线程,或者异步代码里,调用signal()方法触发信号,</span></div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="comment">//协程代码里,调用co_await wait()等系列方法等待同步。</span></div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keyword">struct </span>event_t</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  {</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keyword">typedef</span> std::shared_ptr<detail::event_impl> event_impl_ptr;</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keyword">typedef</span> std::weak_ptr<detail::event_impl> event_impl_wptr;</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  event_impl_ptr _event;</div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keyword">struct </span>wait_all_ctx;</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  event_t(intptr_t initial_counter_ = 0);</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordtype">void</span> signal()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  _event->signal();</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  }</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keywordtype">void</span> reset()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  _event->reset();</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  }</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  </div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  </div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  </div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  future_t<bool></div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  wait() <span class="keyword">const</span>;</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period></div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  future_t<bool></div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  wait_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keywordflow">return</span> wait_for_(std::chrono::duration_cast<clock_type::duration>(dt));</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  }</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration></div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  future_t<bool></div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  wait_until(<span class="keyword">const</span> std::chrono::time_point<_Clock, _Duration>& tp)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordflow">return</span> wait_until_(std::chrono::time_point_cast<clock_type::duration>(tp));</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  </div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  </div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  </div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  </div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  </div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keyword">static</span> future_t<intptr_t></div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  wait_any(_Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  {</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <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>  }</div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Cont></div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keyword">static</span> future_t<intptr_t></div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  wait_any(<span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  {</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <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>  }</div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  </div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keyword">static</span> future_t<intptr_t></div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  wait_any_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, _Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  {</div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordflow">return</span> wait_any_for_(std::chrono::duration_cast<clock_type::duration>(dt), make_event_vector(begin_, end_));</div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  }</div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Cont></div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">static</span> future_t<intptr_t></div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  wait_any_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, <span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  {</div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">return</span> wait_any_for_(std::chrono::duration_cast<clock_type::duration>(dt), make_event_vector(std::begin(cnt_), std::end(cnt_)));</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  }</div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  </div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keyword">static</span> future_t<intptr_t></div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  wait_any_until(<span class="keyword">const</span> std::chrono::time_point<_Clock, _Duration>& tp, _Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  {</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordflow">return</span> wait_any_until_(std::chrono::time_point_cast<clock_type::duration>(tp), make_event_vector(begin_, end_));</div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  }</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Cont></div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keyword">static</span> future_t<intptr_t></div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  wait_any_until(<span class="keyword">const</span> std::chrono::time_point<_Clock, _Duration>& tp, <span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  {</div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">return</span> wait_any_until_(std::chrono::time_point_cast<clock_type::duration>(tp), make_event_vector(std::begin(cnt_), std::end(cnt_)));</div> | |||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  }</div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  </div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  </div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  </div> | |||||
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  </div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  </div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keyword">static</span> future_t<bool></div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  wait_all(_Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  {</div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <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>  }</div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Cont></div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keyword">static</span> future_t<bool></div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  wait_all(<span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  {</div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <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>  }</div> | |||||
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  </div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keyword">static</span> future_t<bool></div> | |||||
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  wait_all_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, _Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  {</div> | |||||
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordflow">return</span> wait_all_for_(std::chrono::duration_cast<clock_type::duration>(dt), make_event_vector(begin_, end_));</div> | |||||
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  }</div> | |||||
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period, <span class="keyword">class</span> _Cont></div> | |||||
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keyword">static</span> future_t<bool></div> | |||||
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  wait_all_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, <span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  {</div> | |||||
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordflow">return</span> wait_all_for_(std::chrono::duration_cast<clock_type::duration>(dt), make_event_vector(std::begin(cnt_), std::end(cnt_)));</div> | |||||
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  }</div> | |||||
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  </div> | |||||
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="keyword">static</span> future_t<bool></div> | |||||
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  wait_all_until(<span class="keyword">const</span> std::chrono::time_point<_Clock, _Duration>& tp, _Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  {</div> | |||||
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">return</span> wait_all_until_(std::chrono::time_point_cast<clock_type::duration>(tp), make_event_vector(begin_, end_));</div> | |||||
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  }</div> | |||||
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration, <span class="keyword">class</span> _Cont></div> | |||||
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keyword">static</span> future_t<bool></div> | |||||
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  wait_all_until(<span class="keyword">const</span> std::chrono::time_point<_Clock, _Duration>& tp, <span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  {</div> | |||||
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">return</span> wait_all_until_(std::chrono::time_point_cast<clock_type::duration>(tp), make_event_vector(std::begin(cnt_), std::end(cnt_)));</div> | |||||
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  }</div> | |||||
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  </div> | |||||
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  </div> | |||||
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  </div> | |||||
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  event_t(<span class="keyword">const</span> event_t&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  event_t(event_t&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  event_t& operator = (<span class="keyword">const</span> event_t&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  event_t& operator = (event_t&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  </div> | |||||
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keyword">static</span> std::vector<event_impl_ptr> make_event_vector(_Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  {</div> | |||||
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  std::vector<event_impl_ptr> evts;</div> | |||||
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  evts.reserve(std::distance(begin_, end_));</div> | |||||
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <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>  evts.push_back((*i)._event);</div> | |||||
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  </div> | |||||
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordflow">return</span> evts;</div> | |||||
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  }</div> | |||||
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  </div> | |||||
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keyword">inline</span> future_t<bool> wait_for_(<span class="keyword">const</span> clock_type::duration& dt)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">return</span> wait_until_(clock_type::now() + dt);</div> | |||||
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  }</div> | |||||
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  future_t<bool> wait_until_(<span class="keyword">const</span> clock_type::time_point& tp) <span class="keyword">const</span>;</div> | |||||
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  </div> | |||||
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  </div> | |||||
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keyword">static</span> future_t<intptr_t> wait_any_(std::vector<event_impl_ptr>&& evts);</div> | |||||
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keyword">inline</span> <span class="keyword">static</span> future_t<intptr_t> wait_any_for_(<span class="keyword">const</span> clock_type::duration& dt, std::vector<event_impl_ptr>&& evts)</div> | |||||
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  {</div> | |||||
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">return</span> wait_any_until_(clock_type::now() + dt, std::forward<std::vector<event_impl_ptr>>(evts));</div> | |||||
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  }</div> | |||||
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keyword">static</span> future_t<intptr_t> wait_any_until_(<span class="keyword">const</span> clock_type::time_point& tp, std::vector<event_impl_ptr>&& evts);</div> | |||||
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  </div> | |||||
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  </div> | |||||
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keyword">static</span> future_t<bool> wait_all_(std::vector<event_impl_ptr>&& evts);</div> | |||||
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keyword">inline</span> <span class="keyword">static</span> future_t<bool> wait_all_for_(<span class="keyword">const</span> clock_type::duration& dt, std::vector<event_impl_ptr>&& evts)</div> | |||||
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  {</div> | |||||
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keywordflow">return</span> wait_all_until_(clock_type::now() + dt, std::forward<std::vector<event_impl_ptr>>(evts));</div> | |||||
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  }</div> | |||||
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keyword">static</span> future_t<bool> wait_all_until_(<span class="keyword">const</span> clock_type::time_point& tp, std::vector<event_impl_ptr>&& evts);</div> | |||||
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  };</div> | |||||
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  </div> | |||||
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> }</div> | |||||
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> }</div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  <span class="keyword">namespace </span>detail</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  {</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">struct </span>event_v2_impl;</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  }</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  </div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <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>  {</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"><a class="line" href="structresumef_1_1event__t.html"> 19</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  <span class="keyword">using</span> event_impl_ptr = std::shared_ptr<detail::event_v2_impl>;</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="keyword">using</span> clock_type = std::chrono::system_clock;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <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>  </div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <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>  </div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  ~<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>  </div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <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>  </div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <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>  </div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <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>  </div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">struct </span>[[nodiscard]] awaiter;</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  </div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  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>  </div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  awaiter wait() <span class="keyword">const</span> noexcept;</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  </div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Btype></div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keyword">struct </span>timeout_awaitor_impl;</div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  </div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keyword">struct </span>[[nodiscard]] timeout_awaiter;</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  </div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period></div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  timeout_awaiter wait_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt) <span class="keyword">const</span> noexcept;</div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  </div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Clock, <span class="keyword">class</span> _Duration></div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  timeout_awaiter wait_until(<span class="keyword">const</span> std::chrono::time_point<_Clock, _Duration>& tp) <span class="keyword">const</span> noexcept;</div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  </div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  </div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keyword">struct </span>[[nodiscard]] any_awaiter;</div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  </div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keyword">template</span><<span class="keyword">class </span>_Iter</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  ></div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  RESUMEF_REQUIRES(_IteratorOfT<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <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>  ->any_awaiter<_Iter>;</div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  </div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keyword">template</span><<span class="keyword">class </span>_Cont</div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  ></div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  RESUMEF_REQUIRES(_ContainerOfT<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keyword">static</span> <span class="keyword">auto</span> wait_any(<span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  ->any_awaiter<decltype(std::begin(cnt_))>;</div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  </div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keyword">struct </span>[[nodiscard]] timeout_any_awaiter;</div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  </div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keyword">template</span><<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> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  ></div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  RESUMEF_REQUIRES(_IteratorOfT<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keyword">static</span> <span class="keyword">auto</span> wait_any_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, _Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  ->timeout_any_awaiter<_Iter>;</div> | |||||
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  </div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="keyword">template</span><<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> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  ></div> | |||||
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  RESUMEF_REQUIRES(_ContainerOfT<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keyword">static</span> <span class="keyword">auto</span> wait_any_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, <span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  ->timeout_any_awaiter<decltype(std::begin(cnt_))>;</div> | |||||
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  </div> | |||||
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  </div> | |||||
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  </div> | |||||
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keyword">struct </span>[[nodiscard]] all_awaiter;</div> | |||||
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  </div> | |||||
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keyword">template</span><<span class="keyword">class </span>_Iter</div> | |||||
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  ></div> | |||||
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  RESUMEF_REQUIRES(_IteratorOfT<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <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>  ->all_awaiter<_Iter>;</div> | |||||
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  </div> | |||||
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="keyword">template</span><<span class="keyword">class </span>_Cont</div> | |||||
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  ></div> | |||||
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  RESUMEF_REQUIRES(_ContainerOfT<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keyword">static</span> <span class="keyword">auto</span> wait_all(<span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  ->all_awaiter<decltype(std::begin(cnt_))>;</div> | |||||
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  </div> | |||||
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  </div> | |||||
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Iter></div> | |||||
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keyword">struct </span>[[nodiscard]] timeout_all_awaiter;</div> | |||||
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  </div> | |||||
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keyword">template</span><<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> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_iterator_of_v<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  ></div> | |||||
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  RESUMEF_REQUIRES(_IteratorOfT<_Iter, event_t>)</div> | |||||
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keyword">static</span> <span class="keyword">auto</span> wait_all_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, _Iter begin_, _Iter end_)</div> | |||||
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  ->timeout_all_awaiter<_Iter>;</div> | |||||
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  </div> | |||||
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keyword">template</span><<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> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_container_of_v<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  ></div> | |||||
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  RESUMEF_REQUIRES(_ContainerOfT<_Cont, event_t>)</div> | |||||
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keyword">static</span> <span class="keyword">auto</span> wait_all_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, <span class="keyword">const</span> _Cont& cnt_)</div> | |||||
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  ->timeout_all_awaiter<decltype(std::begin(cnt_))>;</div> | |||||
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  </div> | |||||
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <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>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <a class="code" href="structresumef_1_1event__t.html">event_t</a>(<a class="code" href="structresumef_1_1event__t.html">event_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <a class="code" href="structresumef_1_1event__t.html">event_t</a>& operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1event__t.html">event_t</a>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <a class="code" href="structresumef_1_1event__t.html">event_t</a>& operator = (<a class="code" href="structresumef_1_1event__t.html">event_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  event_impl_ptr _event;</div> | |||||
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  };</div> | |||||
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  }</div> | |||||
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span> }</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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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;"> </span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">▼</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')"> </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;"> </span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">▼</span><span id="img_0_0_" class="iconfopen" onclick="toggleFolder('0_0_')"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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;"> </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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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< _Ty ></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< _Ty, _Cont, _Assemble ></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< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>channel_t() | |||||
: <a class="el" href="structresumef_1_1channel__t.html#ac94d5fa13a6c1f5cc5d3ee3e50fa4232">resumef::channel_t< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>counted_ptr() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#ad3969379af7311183c1c11d13f6da9f3">resumef::counted_ptr< T ></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< T ></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< _Ty ></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< _Ty, _Optional, _OptimizationThread ></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->() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba">resumef::counted_ptr< T ></a> | |||||
</li> | |||||
<li>operator<<() | |||||
: <a class="el" href="structresumef_1_1channel__t.html#a8554b84ad37f013471f2c5d2da745887">resumef::channel_t< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>operator=() | |||||
: <a class="el" href="classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></a> | |||||
, <a class="el" href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a">resumef::counted_ptr< T ></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< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>reset() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899">resumef::counted_ptr< T ></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< _Ty ></a> | |||||
</li> | |||||
<li>set_value() | |||||
: <a class="el" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3">resumef::awaitable_t< _Ty ></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< _Ty ></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< _Ty, _Cont, _Assemble ></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< _Ty, _Optional, _OptimizationThread ></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< _Ty, _Cont, _Assemble ></a> | |||||
</li> | |||||
<li>~counted_ptr() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6">resumef::counted_ptr< T ></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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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"> | |||||
  | |||||
<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< _Ty, _Cont, _Assemble ></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< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>channel_t() | |||||
: <a class="el" href="structresumef_1_1channel__t.html#ac94d5fa13a6c1f5cc5d3ee3e50fa4232">resumef::channel_t< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>counted_ptr() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#ab752ffdd40c7ab1be06e7662488d8e24">resumef::counted_ptr< T ></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< T ></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< _Ty ></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< _Ty, _Optional, _OptimizationThread ></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->() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba">resumef::counted_ptr< T ></a> | |||||
</li> | |||||
<li>operator<<() | |||||
: <a class="el" href="structresumef_1_1channel__t.html#a8554b84ad37f013471f2c5d2da745887">resumef::channel_t< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>operator=() | |||||
: <a class="el" href="classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e">resumef::batch_lock_t< _Ty, _Cont, _Assemble ></a> | |||||
, <a class="el" href="structresumef_1_1counted__ptr.html#a8a5bff0a86d41b1ab50f817be770573a">resumef::counted_ptr< T ></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< _Ty, _Optional, _OptimizationThread ></a> | |||||
</li> | |||||
<li>reset() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#aa33f9e7d3ee850bed6dbefd40252a899">resumef::counted_ptr< T ></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< _Ty ></a> | |||||
</li> | |||||
<li>set_value() | |||||
: <a class="el" href="structresumef_1_1awaitable__t.html#af66d4b4a3ba5339873b2dd8353ae6db3">resumef::awaitable_t< _Ty ></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< _Ty ></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< _Ty, _Cont, _Assemble ></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< _Ty, _Optional, _OptimizationThread ></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< _Ty, _Cont, _Assemble ></a> | |||||
</li> | |||||
<li>~counted_ptr() | |||||
: <a class="el" href="structresumef_1_1counted__ptr.html#a825f25bf4975e015f859e8ba29bd85b6">resumef::counted_ptr< T ></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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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"> | |||||
 <ul> | |||||
<li>_state | |||||
: <a class="el" href="structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915">resumef::awaitable_impl_t< _Ty ></a> | |||||
</li> | |||||
</ul> | |||||
</div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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>  </div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>  </div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> {</div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  </div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"><a class="line" href="structresumef_1_1future__t.html"> 14</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  <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<value_type></a>;</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <span class="keyword">using</span> promise_type = promise_t<value_type>;</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  <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<value_type></a>;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <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>  </div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr<state_type></a> _state;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <a class="code" href="structresumef_1_1future__t.html">future_t</a>(<a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr<state_type></a> _st) noexcept</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  :_state(std::move(_st)) {}</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <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>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <a class="code" href="structresumef_1_1future__t.html">future_t</a>(<a class="code" href="structresumef_1_1future__t.html">future_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  </div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  <a class="code" href="structresumef_1_1future__t.html">future_t</a>& operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1future__t.html">future_t</a>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <a class="code" href="structresumef_1_1future__t.html">future_t</a>& operator = (<a class="code" href="structresumef_1_1future__t.html">future_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  </div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="keywordtype">bool</span> await_ready() noexcept</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  {</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordflow">return</span> _state->future_await_ready();</div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  }</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  </div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="keyword">template</span><<span class="keyword">class</span> _PromiseT, <span class="keyword">typename</span> = std::enable_if_t<traits::is_promise_v<_PromiseT>>></div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="keywordtype">void</span> await_suspend(coroutine_handle<_PromiseT> handler)</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  {</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  _state->future_await_suspend(handler);</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  }</div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  </div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  value_type await_resume()</div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  {</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keywordflow">return</span> _state->future_await_resume();</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  }</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  };</div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> }</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  </div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keyword">namespace </span>std {</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keyword">namespace </span>experimental {</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  </div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="comment">/*If the coroutine is defined as task<float> foo(std::string x, bool flag);, </span></div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"> then its Promise type is std::coroutine_traits<task<float>, std::string, bool>::promise_type.</span></div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"> If the coroutine is a non-static member function, such as task<void> my_class::method1(int x) const;, </span></div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="comment"> its Promise type is std::coroutine_traits<task<void>, const my_class&, int>::promise_type.</span></div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment"> */</span></div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span>... Args></div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keyword">struct </span>coroutine_traits<resumef::future_t<_Ty>, Args...></div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  {</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keyword">typedef</span> resumef::promise_t<_Ty> promise_type;</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  };</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  }</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span> } <span class="comment">// namespace std::experimental</span></div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <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< state_type ></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<>的state类。</div><div class="ttdef"><b>Definition:</b> state.h:217</div></div> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="comment">/*</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">* Modify from <experimental/generator_t.h></span></div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <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> <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> <span class="comment">*/</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  </div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#pragma pack(push,_CRT_PACKING)</span></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#pragma push_macro("new")</span></div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#undef new</span></div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  </div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> {</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> promise_type></div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">struct </span>generator_iterator;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  </div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  </div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  <span class="keyword">template</span><<span class="keyword">typename</span> promise_type></div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <span class="keyword">struct </span>generator_iterator<void, promise_type></div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  {</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <span class="keyword">typedef</span> ptrdiff_t difference_type;</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  </div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  coroutine_handle<promise_type> _Coro;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  </div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  generator_iterator(std::nullptr_t) : _Coro(nullptr)</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  {</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  }</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  </div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  generator_iterator(coroutine_handle<promise_type> _CoroArg) : _Coro(_CoroArg)</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  {</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  }</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  </div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  generator_iterator& operator++()</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  {</div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="keywordflow">if</span> (_Coro.done())</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  _Coro = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  _Coro.resume();</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  }</div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  </div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <span class="keywordtype">void</span> operator++(<span class="keywordtype">int</span>)</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  {</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <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>  <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>  ++* <span class="keyword">this</span>;</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  }</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  </div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordtype">bool</span> operator==(generator_iterator <span class="keyword">const</span>& right_)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="keywordflow">return</span> _Coro == right_._Coro;</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  }</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  </div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keywordtype">bool</span> operator!=(generator_iterator <span class="keyword">const</span>& right_)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == right_);</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  }</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  };</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  </div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> promise_type></div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keyword">struct </span>generator_iterator<std::nullptr_t, promise_type> : <span class="keyword">public</span> generator_iterator<void, promise_type></div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  {</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  generator_iterator(std::nullptr_t) : generator_iterator<void, promise_type>(nullptr)</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  {</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  }</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  generator_iterator(coroutine_handle<promise_type> _CoroArg) : generator_iterator<void, promise_type>(_CoroArg)</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  {</div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  }</div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  };</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  </div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> promise_type></div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keyword">struct </span>generator_iterator : <span class="keyword">public</span> generator_iterator<void, promise_type></div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  {</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keyword">using</span> reference = _Ty <span class="keyword">const</span>&;</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <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>  </div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  generator_iterator(std::nullptr_t) : generator_iterator<void, promise_type>(nullptr)</div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  {</div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  }</div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  generator_iterator(coroutine_handle<promise_type> _CoroArg) : generator_iterator<void, promise_type>(_CoroArg)</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  {</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  }</div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  </div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  reference operator*()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="keywordflow">return</span> *this->_Coro.promise()._CurrentValue;</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  }</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  </div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  pointer operator->()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordflow">return</span> this->_Coro.promise()._CurrentValue;</div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  }</div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  };</div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  </div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> _Alloc></div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="structresumef_1_1generator__t.html"> 103</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <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>  </div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keyword">struct </span>promise_type</div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  {</div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <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>  <span class="keyword">using</span> future_type = <a class="code" href="structresumef_1_1generator__t.html">generator_t<value_type></a>;</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  </div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  _Ty <span class="keyword">const</span>* _CurrentValue;</div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  </div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  promise_type()</div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  {</div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  get_state()->set_initial_suspend(coroutine_handle<promise_type>::from_promise(*<span class="keyword">this</span>));</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  promise_type(promise_type&& _Right) noexcept = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  promise_type& operator = (promise_type&& _Right) noexcept = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  promise_type(<span class="keyword">const</span> promise_type&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  promise_type& operator = (<span class="keyword">const</span> promise_type&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  </div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <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>  {</div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <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>  }</div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  </div> | |||||
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  suspend_always initial_suspend() noexcept</div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  {</div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keywordflow">return</span> {};</div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  }</div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  </div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  suspend_always final_suspend() noexcept</div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  {</div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">return</span> {};</div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  }</div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  </div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  suspend_always yield_value(_Ty <span class="keyword">const</span>& _Value) noexcept</div> | |||||
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  {</div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  _CurrentValue = std::addressof(_Value);</div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="keywordflow">return</span> {};</div> | |||||
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  }</div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  </div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="comment">//template<class = std::enable_if_t<!std::is_same_v<_Ty, void>, _Ty>></span></div> | |||||
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keywordtype">void</span> return_value(_Ty <span class="keyword">const</span>& _Value) noexcept</div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  {</div> | |||||
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  _CurrentValue = std::addressof(_Value);</div> | |||||
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  }</div> | |||||
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="comment">//template<class = std::enable_if_t<std::is_same_v<_Ty, void>, _Ty>></span></div> | |||||
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordtype">void</span> return_value() noexcept</div> | |||||
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  {</div> | |||||
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  _CurrentValue = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  }</div> | |||||
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  </div> | |||||
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordtype">void</span> set_exception(std::exception_ptr e)</div> | |||||
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  {</div> | |||||
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  (void)e;</div> | |||||
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  std::terminate();</div> | |||||
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div> | |||||
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <span class="preprocessor">#ifdef __clang__</span></div> | |||||
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordtype">void</span> unhandled_exception()</div> | |||||
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  {</div> | |||||
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  std::terminate();</div> | |||||
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  }</div> | |||||
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  </div> | |||||
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Uty></div> | |||||
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  _Uty&& await_transform(_Uty&& _Whatever) noexcept</div> | |||||
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  {</div> | |||||
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  static_assert(std::is_same_v<_Uty, void>,</div> | |||||
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="stringliteral">"co_await is not supported in coroutines of type std::experiemental::generator_t"</span>);</div> | |||||
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">return</span> std::forward<_Uty>(_Whatever);</div> | |||||
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  }</div> | |||||
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  </div> | |||||
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <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>  {</div> | |||||
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <span class="preprocessor">#if RESUMEF_INLINE_STATE</span></div> | |||||
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keywordtype">size_t</span> _State_size = _Align_size<state_type>();</div> | |||||
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <span class="preprocessor">#if defined(__clang__)</span></div> | |||||
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keyword">auto</span> h = coroutine_handle<promise_type>::from_promise(*<span class="keyword">this</span>);</div> | |||||
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordtype">char</span>* ptr = <span class="keyword">reinterpret_cast<</span><span class="keywordtype">char</span>*<span class="keyword">></span>(h.address()) - _State_size;</div> | |||||
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>*<span class="keyword">></span>(ptr);</div> | |||||
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> <span class="preprocessor">#elif defined(_MSC_VER)</span></div> | |||||
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">char</span>* ptr = <span class="keyword">reinterpret_cast<</span><span class="keywordtype">char</span>*<span class="keyword">></span>(<span class="keyword">this</span>) - _State_size;</div> | |||||
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>*<span class="keyword">></span>(ptr);</div> | |||||
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span> <span class="preprocessor">#else</span></div> | |||||
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> <span class="preprocessor">#error "Unknown compiler"</span></div> | |||||
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="preprocessor">#else</span></div> | |||||
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">return</span> _state.get();</div> | |||||
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  }</div> | |||||
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  </div> | |||||
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keyword">using</span> _Alloc_char = <span class="keyword">typename</span> std::allocator_traits<_Alloc>::template rebind_alloc<char>;</div> | |||||
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  static_assert(std::is_same_v<<span class="keywordtype">char</span>*, <span class="keyword">typename</span> std::allocator_traits<_Alloc_char>::pointer>,</div> | |||||
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="stringliteral">"generator_t does not support allocators with fancy pointer types"</span>);</div> | |||||
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  static_assert(std::allocator_traits<_Alloc_char>::is_always_equal::value,</div> | |||||
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="stringliteral">"generator_t only supports stateless allocators"</span>);</div> | |||||
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  </div> | |||||
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <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>  {</div> | |||||
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  _Alloc_char _Al;</div> | |||||
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <span class="preprocessor">#if RESUMEF_INLINE_STATE</span></div> | |||||
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordtype">size_t</span> _State_size = _Align_size<state_type>();</div> | |||||
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  assert(_Size >= <span class="keyword">sizeof</span>(uint32_t) && _Size < (std::numeric_limits<uint32_t>::max)() - <span class="keyword">sizeof</span>(_State_size));</div> | |||||
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  </div> | |||||
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keywordtype">char</span>* ptr = _Al.allocate(_Size + _State_size);</div> | |||||
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordtype">char</span>* _Rptr = ptr + _State_size;</div> | |||||
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> <span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div> | |||||
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  std::cout << <span class="stringliteral">" generator_promise::new, alloc size="</span> << (_Size + _State_size) << std::endl;</div> | |||||
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  std::cout << <span class="stringliteral">" generator_promise::new, alloc ptr="</span> << (<span class="keywordtype">void</span>*)ptr << std::endl;</div> | |||||
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  std::cout << <span class="stringliteral">" generator_promise::new, return ptr="</span> << (<span class="keywordtype">void</span>*)_Rptr << std::endl;</div> | |||||
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  </div> | |||||
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="comment">//在初始地址上构造state</span></div> | |||||
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  {</div> | |||||
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <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>  st->lock();</div> | |||||
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  }</div> | |||||
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  </div> | |||||
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">return</span> _Rptr;</div> | |||||
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> <span class="preprocessor">#else</span></div> | |||||
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordtype">char</span>* ptr = _Al.allocate(_Size);</div> | |||||
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> <span class="preprocessor">#if RESUMEF_DEBUG_COUNTER</span></div> | |||||
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  std::cout << <span class="stringliteral">" generator_promise::new, alloc size="</span> << _Size << std::endl;</div> | |||||
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  std::cout << <span class="stringliteral">" generator_promise::new, alloc ptr="</span> << (<span class="keywordtype">void</span>*)ptr << std::endl;</div> | |||||
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  std::cout << <span class="stringliteral">" generator_promise::new, return ptr="</span> << (<span class="keywordtype">void</span>*)ptr << std::endl;</div> | |||||
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  </div> | |||||
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keywordflow">return</span> ptr;</div> | |||||
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  }</div> | |||||
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  </div> | |||||
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <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>  {</div> | |||||
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <span class="preprocessor">#if RESUMEF_INLINE_STATE</span></div> | |||||
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordtype">size_t</span> _State_size = _Align_size<state_type>();</div> | |||||
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  assert(_Size >= <span class="keyword">sizeof</span>(uint32_t) && _Size < (std::numeric_limits<uint32_t>::max)() - <span class="keyword">sizeof</span>(_State_size));</div> | |||||
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  </div> | |||||
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  *<span class="keyword">reinterpret_cast<</span>uint32_t*<span class="keyword">></span>(_Ptr) = <span class="keyword">static_cast<</span>uint32_t<span class="keyword">></span>(_Size + _State_size);</div> | |||||
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  </div> | |||||
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>* st = <span class="keyword">reinterpret_cast<</span><a class="code" href="structresumef_1_1state__generator__t.html">state_type</a>*<span class="keyword">></span>(<span class="keyword">static_cast<</span><span class="keywordtype">char</span>*<span class="keyword">></span>(_Ptr) - _State_size);</div> | |||||
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  st->unlock();</div> | |||||
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span> <span class="preprocessor">#else</span></div> | |||||
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  _Alloc_char _Al;</div> | |||||
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">return</span> _Al.deallocate(<span class="keyword">reinterpret_cast<</span><span class="keywordtype">char</span> *<span class="keyword">></span>(_Ptr), _Size);</div> | |||||
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div> | |||||
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span> <span class="preprocessor">#if !RESUMEF_INLINE_STATE</span></div> | |||||
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <a class="code" href="structresumef_1_1counted__ptr.html">counted_ptr<state_type></a> _state = state_generator_t::_Alloc_state();</div> | |||||
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  };</div> | |||||
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  </div> | |||||
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keyword">using</span> iterator = generator_iterator<_Ty, promise_type>;</div> | |||||
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  </div> | |||||
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  iterator begin()</div> | |||||
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  {</div> | |||||
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">if</span> (_Coro)</div> | |||||
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  {</div> | |||||
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  _Coro.resume();</div> | |||||
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">if</span> (_Coro.done())</div> | |||||
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">return</span>{ <span class="keyword">nullptr</span> };</div> | |||||
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  }</div> | |||||
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">return</span> { _Coro };</div> | |||||
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  }</div> | |||||
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  </div> | |||||
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  iterator end()</div> | |||||
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div> | |||||
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">return</span>{ <span class="keyword">nullptr</span> };</div> | |||||
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  }</div> | |||||
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  </div> | |||||
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keyword">explicit</span> <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>(promise_type& _Prom)</div> | |||||
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  : _Coro(coroutine_handle<promise_type>::from_promise(_Prom))</div> | |||||
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  {</div> | |||||
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  }</div> | |||||
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  </div> | |||||
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <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>  </div> | |||||
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <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>&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>& operator=(<a class="code" href="structresumef_1_1generator__t.html">generator_t</a> <span class="keyword">const</span>&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  </div> | |||||
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>(<a class="code" href="structresumef_1_1generator__t.html">generator_t</a>&& right_) noexcept</div> | |||||
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  : _Coro(right_._Coro)</div> | |||||
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  {</div> | |||||
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  right_._Coro = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  }</div> | |||||
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  </div> | |||||
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <a class="code" href="structresumef_1_1generator__t.html">generator_t</a>& operator=(<a class="code" href="structresumef_1_1generator__t.html">generator_t</a>&& right_) noexcept</div> | |||||
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  {</div> | |||||
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <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>  _Coro = right_._Coro;</div> | |||||
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  right_._Coro = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  }</div> | |||||
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> | |||||
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  }</div> | |||||
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  </div> | |||||
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  ~<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>  {</div> | |||||
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">if</span> (_Coro) {</div> | |||||
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  _Coro.destroy();</div> | |||||
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  }</div> | |||||
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div> | |||||
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  </div> | |||||
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <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>  {</div> | |||||
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keyword">auto</span> t = _Coro;</div> | |||||
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  _Coro = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">return</span> t.promise().get_state();</div> | |||||
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  }</div> | |||||
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  </div> | |||||
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  coroutine_handle<promise_type> _Coro = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  };</div> | |||||
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  </div> | |||||
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span> } <span class="comment">// namespace resumef</span></div> | |||||
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  </div> | |||||
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span> <span class="preprocessor">#pragma pop_macro("new")</span></div> | |||||
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <span class="preprocessor">#pragma pack(pop)</span></div> | |||||
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  </div> | |||||
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  </div> | |||||
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span> <span class="keyword">namespace </span>std {</div> | |||||
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keyword">namespace </span>experimental {</div> | |||||
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  </div> | |||||
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Ty, <span class="keyword">typename</span> _Alloc, <span class="keyword">typename</span>... Args></div> | |||||
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keyword">struct </span>coroutine_traits<resumef::generator_t<_Ty, _Alloc>, Args...></div> | |||||
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  {</div> | |||||
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structresumef_1_1generator__t.html">resumef::generator_t<_Ty, _Alloc>::promise_type</a> promise_type;</div> | |||||
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  };</div> | |||||
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  }</div> | |||||
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span> } <span class="comment">// namespace std::experimental</span></div> | |||||
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  </div> | |||||
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span> <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< state_type ></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<>的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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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;"> </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;"> </span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">▼</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< _Ty ></a></td><td class="desc">Awaitable_t<>的公共实现部分,用于减少awaitable_t<>的重复代码。 </td></tr> | |||||
<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1awaitable__t.html" target="_self">resumef::awaitable_t< _Ty ></a></td><td class="desc">用于包装‘异步函数’为‘可等待函数(awaitable function)’。 </td></tr> | |||||
<tr id="row_2_"><td class="entry"><span style="width:16px;display:inline-block;"> </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< _Ty, _Cont, _Assemble ></a></td><td class="desc">无死锁的批量枷锁。 </td></tr> | |||||
<tr id="row_3_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </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< _Mtxs ></a></td><td class="desc">在析构的时候自动解锁mutex_t的辅助类。 </td></tr> | |||||
<tr id="row_4_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1channel__t.html" target="_self">resumef::channel_t< _Ty, _Optional, _OptimizationThread ></a></td><td class="desc">可传递数据的模板信号量。 </td></tr> | |||||
<tr id="row_5_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr< T ></a></td><td class="desc">专用与state的智能计数指针,通过管理state内嵌的引用计数来管理state的生存期。 </td></tr> | |||||
<tr id="row_6_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr< detail::state_event_all_t ></a></td><td class="desc"></td></tr> | |||||
<tr id="row_7_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr< detail::state_event_t ></a></td><td class="desc"></td></tr> | |||||
<tr id="row_8_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr< detail::state_mutex_t ></a></td><td class="desc"></td></tr> | |||||
<tr id="row_9_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr< resumef::state_t ></a></td><td class="desc"></td></tr> | |||||
<tr id="row_10_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1counted__ptr.html" target="_self">resumef::counted_ptr< state_type ></a></td><td class="desc"></td></tr> | |||||
<tr id="row_11_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </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;"> </span><span id="arr_12_" class="arrow" onclick="toggleFolder('12_')">▼</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;"> </span><span id="arr_12_0_" class="arrow" onclick="toggleFolder('12_0_')">▼</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;"> </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;"> </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;"> </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;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1future__t.html" target="_self">resumef::future_t< _Ty ></a></td><td class="desc">用于resumef协程的返回值。 </td></tr> | |||||
<tr id="row_14_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1future__t.html" target="_self">resumef::future_t< T ></a></td><td class="desc"></td></tr> | |||||
<tr id="row_15_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1generator__t.html" target="_self">resumef::generator_t< _Ty, _Alloc ></a></td><td class="desc">专用于co_yield函数。 </td></tr> | |||||
<tr id="row_16_"><td class="entry"><span style="width:16px;display:inline-block;"> </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;"> </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;"> </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;"> </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;"> </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< Allocator ></a></td><td class="desc">用于指示asio相关异步函数,返回resumef::future_t<>的类型,从而变成支持 librf 的协程函数。 </td></tr> | |||||
<tr id="row_21_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </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;"> </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;"> </span><span id="arr_23_" class="arrow" onclick="toggleFolder('23_')">▼</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;"> </span><span id="arr_23_0_" class="arrow" onclick="toggleFolder('23_0_')">▼</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<>的state基类,实现了针对于future_t<>的公共方法等。 </td></tr> | |||||
<tr id="row_23_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1state__t.html" target="_self">resumef::state_t< _Ty ></a></td><td class="desc">专用于future_t<>的state类。 </td></tr> | |||||
<tr id="row_23_1_"><td class="entry"><span style="width:32px;display:inline-block;"> </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<>的state类。 </td></tr> | |||||
<tr id="row_24_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </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;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structresumef_1_1task__t.html" target="_self">resumef::task_t< _Ty, class ></a></td><td class="desc">协程任务类。 </td></tr> | |||||
<tr id="row_26_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </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;"> </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;"> </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;"> </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;"> </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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  <span class="keyword">template</span><<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></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  <span class="keyword">struct </span>intrusive_link_queue</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  {</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">using</span> node_type = _Node;</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">using</span> node_ptr_type = _Nodeptr;</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">using</span> size_type = _Sty;</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  intrusive_link_queue();</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  </div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  intrusive_link_queue(<span class="keyword">const</span> intrusive_link_queue&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  intrusive_link_queue(intrusive_link_queue&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  intrusive_link_queue& operator =(<span class="keyword">const</span> intrusive_link_queue&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  intrusive_link_queue& operator =(intrusive_link_queue&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  </div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  <span class="keyword">auto</span> size() const noexcept->size_type;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <span class="keywordtype">bool</span> empty() const noexcept;</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  <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>  auto try_pop() noexcept->node_ptr_type;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  private:</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  node_ptr_type _head;</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  node_ptr_type _tail;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  </div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <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>  std::atomic<size_type> m_count;</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  };</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  </div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  intrusive_link_queue<_Node, _Nodeptr, _Sty>::intrusive_link_queue()</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  : _head(nullptr)</div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  , _tail(nullptr)</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  , m_count(0)</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  #endif</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  {</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  }</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  </div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="keyword">auto</span> intrusive_link_queue<_Node, _Nodeptr, _Sty>::size() const noexcept->size_type</div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  {</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <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>  <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> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  size_type count = 0;</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keywordflow">for</span> (node_type* node = _head; node != <span class="keyword">nullptr</span>; node = node->next)</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  ++count;</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">return</span> count;</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <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>  }</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  </div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keywordtype">bool</span> intrusive_link_queue<_Node, _Nodeptr, _Sty>::empty() const noexcept</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  {</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keywordflow">return</span> _head == <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  }</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  </div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keywordtype">void</span> intrusive_link_queue<_Node, _Nodeptr, _Sty>::push_back(node_ptr_type node) noexcept</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  {</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  assert(node != <span class="keyword">nullptr</span>);</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  </div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  node->_next = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">if</span> (_head == <span class="keyword">nullptr</span>)</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  {</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  _head = _tail = node;</div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  }</div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  {</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  _tail->_next = node;</div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  _tail = node;</div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  }</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  </div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <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>  m_count.fetch_add(1, std::memory_order_acq_rel);</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  }</div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  </div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Node, <span class="keyword">class</span> _Nodeptr, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keyword">auto</span> intrusive_link_queue<_Node, _Nodeptr, _Sty>::try_pop() noexcept->node_ptr_type</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  {</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">if</span> (_head == <span class="keyword">nullptr</span>)</div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  </div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  node_ptr_type node = _head;</div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  _head = node->_next;</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  node->_next = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  </div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">if</span> (_tail == node)</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  {</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  assert(node->_next == <span class="keyword">nullptr</span>);</div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  _tail = <span class="keyword">nullptr</span>;</div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  }</div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  </div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <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>  m_count.fetch_sub(1, std::memory_order_acq_rel);</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  </div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">return</span> node;</div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  }</div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> }</div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
/* | |||||
@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 */ |
/* | |||||
@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"}]}]} |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="preprocessor">#include "mutex_v1.h"</span></div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="preprocessor">#include "mutex_v2.h"</span></div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#include "mutex_v2.inl"</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  <span class="keyword">namespace </span>detail</div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  {</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  <span class="keyword">struct </span>mutex_impl;</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  typedef ::resumef::detail::_awaker<mutex_impl> mutex_awaker;</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">typedef</span> std::shared_ptr<mutex_awaker> mutex_awaker_ptr;</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  </div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <span class="keyword">struct </span>mutex_impl : <span class="keyword">public</span> std::enable_shared_from_this<mutex_impl></div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  {</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="comment">//typedef spinlock lock_type;</span></div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">typedef</span> std::recursive_mutex lock_type;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  </div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  std::list<mutex_awaker_ptr> _awakes;</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  mutex_awaker_ptr _owner;</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  lock_type _lock;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  mutex_impl();</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  </div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <span class="comment">//如果已经触发了awaker,则返回true</span></div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keywordtype">bool</span> lock_(<span class="keyword">const</span> mutex_awaker_ptr& awaker);</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <span class="keywordtype">bool</span> try_lock_(<span class="keyword">const</span> mutex_awaker_ptr& awaker);</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <span class="keywordtype">void</span> unlock();</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  </div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="keyword">template</span><<span class="keyword">class</span> callee_t, <span class="keyword">class</span> dummy_t = std::enable_if<!std::is_same<std::remove_cv_t<callee_t>, mutex_awaker_ptr>::value>></div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  decltype(<span class="keyword">auto</span>) lock(callee_t&& awaker, dummy_t* dummy_ = <span class="keywordtype">nullptr</span>)</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  {</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  (void)dummy_;</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="keywordflow">return</span> lock_(std::make_shared<mutex_awaker>(std::forward<callee_t>(awaker)));</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  }</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  </div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  mutex_impl(<span class="keyword">const</span> mutex_impl&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  mutex_impl(mutex_impl&&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  mutex_impl& operator = (<span class="keyword">const</span> mutex_impl&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  mutex_impl& operator = (mutex_impl&&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  };</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  }</div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  </div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="keyword">namespace </span>mutex_v1</div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> {</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keyword">struct </span>mutex_t</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  {</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keyword">typedef</span> std::shared_ptr<detail::mutex_impl> lock_impl_ptr;</div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keyword">typedef</span> std::weak_ptr<detail::mutex_impl> lock_impl_wptr;</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  lock_impl_ptr _locker;</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  mutex_t();</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  </div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="keywordtype">void</span> unlock()<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  _locker->unlock();</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  }</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  </div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  future_t<bool> lock() <span class="keyword">const</span>;</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <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>  </div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="comment">/*</span></div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment"> template<class _Rep, class _Period></span></div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="comment"> awaitable_t<bool></span></div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="comment"> try_lock_for(const std::chrono::duration<_Rep, _Period> & dt) const</span></div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="comment"> {</span></div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="comment"> return try_lock_for_(std::chrono::duration_cast<clock_type::duration>(dt));</span></div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="comment"> }</span></div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment"> template<class _Clock, class _Duration></span></div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="comment"> awaitable_t<bool></span></div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="comment"> try_lock_until(const std::chrono::time_point<_Clock, _Duration> & tp) const</span></div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="comment"> {</span></div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="comment"> return try_lock_until_(std::chrono::time_point_cast<clock_type::duration>(tp));</span></div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment"> }</span></div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment"> */</span></div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  </div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  </div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  mutex_t(<span class="keyword">const</span> mutex_t&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  mutex_t(mutex_t&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  mutex_t& operator = (<span class="keyword">const</span> mutex_t&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  mutex_t& operator = (mutex_t&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keyword">inline</span> future_t<bool> try_lock_for_(<span class="keyword">const</span> clock_type::duration& dt)<span class="keyword"> const</span></div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <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>  }</div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  future_t<bool> try_lock_until_(<span class="keyword">const</span> clock_type::time_point& tp) <span class="keyword">const</span>;</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  };</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span> }</div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> }</div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  <span class="keyword">namespace </span>detail</div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  {</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="keyword">struct </span>mutex_v2_impl;</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  }</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  </div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  <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>  {</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </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>  <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>  </div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  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>  </div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs></div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="structresumef_1_1batch__unlock__t.html"> 28</a></span>  <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>  </div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="structresumef_1_1mutex__t.html"> 34</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <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>  </div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="keyword">struct </span>lock_awaiter;</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <span class="keyword">struct </span>[[nodiscard]] awaiter;</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <span class="keyword">struct </span>[[nodiscard]] manual_awaiter;</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  </div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  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>  </div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  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>  </div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  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>  </div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  </div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keyword">struct </span>[[nodiscard]] try_awaiter;</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  </div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  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>  </div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keyword">struct </span>[[nodiscard]] unlock_awaiter;</div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  </div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  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>  </div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  </div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keyword">struct </span>[[nodiscard]] timeout_awaiter;</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  </div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keyword">template</span> <<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period></div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  timeout_awaiter<span class="comment">/*bool*/</span> try_lock_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt) <span class="keyword">const</span> noexcept;</div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  </div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keyword">template</span> <<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period></div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  timeout_awaiter<span class="comment">/*bool*/</span> try_lock_until(<span class="keyword">const</span> std::chrono::time_point<_Rep, _Period>& tp) <span class="keyword">const</span> noexcept;</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  </div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  </div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <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>  </div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <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>  </div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">template</span> <<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period></div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordtype">bool</span> try_lock_for(<span class="keyword">const</span> std::chrono::duration<_Rep, _Period>& dt, <span class="keywordtype">void</span>* unique_address);</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  </div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keyword">template</span> <<span class="keyword">class</span> _Rep, <span class="keyword">class</span> _Period></div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keywordtype">bool</span> try_lock_until(<span class="keyword">const</span> std::chrono::time_point<_Rep, _Period>& tp, <span class="keywordtype">void</span>* unique_address);</div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  </div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <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>  </div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  </div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs</div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  , <span class="keyword">typename</span> = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>>...>></div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  ></div> | |||||
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keyword">static</span> <a class="code" href="structresumef_1_1future__t.html">future_t</a><<a class="code" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a><_Mtxs...>> lock(_Mtxs&... mtxs);</div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  </div> | |||||
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs</div> | |||||
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  , <span class="keyword">typename</span> = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>>...>></div> | |||||
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  ></div> | |||||
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keyword">static</span> <a class="code" href="structresumef_1_1future__t.html">future_t<></a> lock(<a class="code" href="structresumef_1_1adopt__manual__unlock__t.html">adopt_manual_unlock_t</a> manual_unlock_tag, _Mtxs&... mtxs);</div> | |||||
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  </div> | |||||
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs</div> | |||||
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  , <span class="keyword">typename</span> = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>>...>></div> | |||||
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  ></div> | |||||
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keyword">static</span> <a class="code" href="structresumef_1_1future__t.html">future_t<></a> unlock(_Mtxs&... mtxs);</div> | |||||
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  </div> | |||||
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  </div> | |||||
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs</div> | |||||
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  , <span class="keyword">typename</span> = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>>...>></div> | |||||
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  ></div> | |||||
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keyword">static</span> <a class="code" href="structresumef_1_1batch__unlock__t.html">batch_unlock_t</a><_Mtxs...> lock(<span class="keywordtype">void</span>* unique_address, _Mtxs&... mtxs);</div> | |||||
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  </div> | |||||
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs</div> | |||||
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  , <span class="keyword">typename</span> = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>>...>></div> | |||||
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  ></div> | |||||
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <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&... mtxs);</div> | |||||
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  </div> | |||||
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs</div> | |||||
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  , <span class="keyword">typename</span> = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>>...>></div> | |||||
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  ></div> | |||||
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keyword">static</span> <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>* unique_address, _Mtxs&... mtxs);</div> | |||||
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  </div> | |||||
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <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>  </div> | |||||
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <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>  ~<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>  </div> | |||||
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <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>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>(<a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>& operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>& operator = (<a class="code" href="structresumef_1_1mutex__t.html">mutex_t</a>&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  </div> | |||||
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keyword">typedef</span> std::shared_ptr<detail::mutex_v2_impl> mutex_impl_ptr;</div> | |||||
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div> | |||||
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keyword">struct </span>_MutexAwaitAssembleT;</div> | |||||
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  </div> | |||||
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keyword">template</span><<span class="keyword">class</span>... _Mtxs> <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>  </div> | |||||
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  mutex_impl_ptr _mutex;</div> | |||||
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  };</div> | |||||
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</div> | |||||
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span> }</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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="preprocessor">#pragma push_macro("new")</span></div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="preprocessor">#undef new</span></div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  </div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> {</div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">struct </span>suspend_on_initial;</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">struct </span>suspend_on_final;</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  </div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="keyword">template</span> <<span class="keyword">typename</span> _Ty></div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">struct </span>promise_impl_t</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  {</div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <span class="keyword">using</span> state_type = state_t<value_type>;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  <span class="keyword">using</span> promise_type = promise_t<value_type>;</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <span class="keyword">using</span> future_type = future_t<value_type>;</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  promise_impl_t() noexcept {}</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  promise_impl_t(promise_impl_t&& _Right) noexcept = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  promise_impl_t& operator = (promise_impl_t&& _Right) noexcept = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  promise_impl_t(<span class="keyword">const</span> promise_impl_t&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  promise_impl_t& operator = (<span class="keyword">const</span> promise_impl_t&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  </div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <span class="keyword">auto</span> get_state() noexcept->state_type*;</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  </div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  suspend_on_initial initial_suspend() noexcept;</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  suspend_on_final final_suspend() noexcept;</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  template <typename _Uty></div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  _Uty&& await_transform(_Uty&& _Whatever) noexcept;</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="keywordtype">void</span> set_exception(std::exception_ptr e);</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#ifdef __clang__</span></div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <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> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  future_type get_return_object() noexcept;</div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="keywordtype">void</span> cancellation_requested() noexcept;</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  </div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  using _Alloc_char = std::allocator<<span class="keywordtype">char</span>>;</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <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>  <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> <span class="preprocessor">#if !RESUMEF_INLINE_STATE</span></div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  counted_ptr<state_type> _state = state_future_t::_Alloc_state<state_type>(<span class="keyword">false</span>);</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  };</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  </div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keyword">struct </span>promise_t final : <span class="keyword">public</span> promise_impl_t<_Ty></div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  {</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keyword">using</span> <span class="keyword">typename</span> promise_impl_t<_Ty>::value_type;</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keyword">using</span> promise_impl_t<_Ty>::get_return_object;</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  </div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="keyword">template</span><<span class="keyword">class</span> U></div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="keywordtype">void</span> return_value(U&& val); <span class="comment">//co_return val</span></div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keyword">template</span><<span class="keyword">class</span> U></div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  suspend_always yield_value(U&& val);</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  };</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">struct </span>promise_t<_Ty&> final : <span class="keyword">public</span> promise_impl_t<_Ty&></div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  {</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keyword">using</span> <span class="keyword">typename</span> promise_impl_t<_Ty&>::value_type;</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keyword">using</span> promise_impl_t<_Ty&>::get_return_object;</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  </div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="keywordtype">void</span> return_value(_Ty& val); <span class="comment">//co_return val</span></div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  suspend_always yield_value(_Ty& val);</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  };</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  </div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keyword">template</span><></div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keyword">struct </span>promise_t<void> final : <span class="keyword">public</span> promise_impl_t<void></div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  {</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keyword">using</span> promise_impl_t<void>::get_return_object;</div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  </div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <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>  suspend_always yield_value();</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  };</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> }</div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  </div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="preprocessor">#pragma pop_macro("new")</span></div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  </div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">struct </span>task_base_t</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  {</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  task_base_t() = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="keyword">virtual</span> ~task_base_t();</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  </div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="keyword">protected</span>:</div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keyword">friend</span> scheduler_t;</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  counted_ptr<state_base_t> _state;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  };</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#endif</span></div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <span class="comment">//----------------------------------------------------------------------------------------------</span></div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  </div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> = std::<span class="keywordtype">void</span>_t<>></div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="structresumef_1_1task__t.html"> 34</a></span>  <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>  </div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="keyword">struct </span><a class="code" href="structresumef_1_1task__t.html">task_t</a><_Ty, std::void_t<traits::is_future<std::remove_reference_t<_Ty>>>> : <span class="keyword">public</span> task_base_t</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  {</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <span class="keyword">using</span> future_type = std::remove_reference_t<_Ty>;</div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <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>  <span class="keyword">using</span> state_type = <a class="code" href="structresumef_1_1state__t.html">state_t<value_type></a>;</div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  </div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <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>  <a class="code" href="structresumef_1_1task__t.html">task_t</a>(future_type& f)</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  {</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  initialize(f);</div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  }</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keyword">protected</span>:</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordtype">void</span> initialize(future_type& f)</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  {</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  _state = f._state.get();</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  }</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  };</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  </div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty></div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keyword">struct </span>task_t<generator_t<_Ty>> : <span class="keyword">public</span> task_base_t</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  {</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keyword">using</span> future_type = generator_t<value_type>;</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">using</span> state_type = state_generator_t;</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  </div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  task_t() = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  task_t(future_type& f)</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  {</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  initialize(f);</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  }</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <span class="keyword">protected</span>:</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordtype">void</span> initialize(future_type& f)</div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  {</div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  _state = f.detach_state();</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  }</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  };</div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  </div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="comment">//----------------------------------------------------------------------------------------------</span></div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  </div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="comment">//ctx_task_t接受的是一个'函数对象'</span></div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <span class="comment">//这个'函数对象'被调用后,返回generator<_Ty>/future_t<_Ty>类型</span></div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="comment">//然后'函数对象'作为异步执行的上下文状态保存起来</span></div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ctx></div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keyword">struct </span>ctx_task_t : <span class="keyword">public</span> task_t<remove_cvref_t<decltype(std::declval<_Ctx>()())>></div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keyword">using</span> context_type = _Ctx;</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  </div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  context_type _context;</div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  </div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  ctx_task_t(context_type ctx)</div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  : _context(std::move(ctx))</div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  {</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  decltype(<span class="keyword">auto</span>) f = _context();</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  this->initialize(f);</div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  }</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  };</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span> }</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<>的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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  <span class="comment">//使用自旋锁完成的线程安全的环形队列。</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  <span class="comment">//支持多个线程同时push和pop。</span></div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  <span class="comment">//_Option : 如果队列保存的数据不支持拷贝只支持移动,则需要设置为true;或者数据希望pop后销毁,都需要设置为true。</span></div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="comment">//_Sty : 内存保持数量和索引的整数类型。用于外部控制队列的结构体大小。</span></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">template</span><<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></div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">struct </span>ring_queue</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  {</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">using</span> size_type = _Sty;</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <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>  <span class="keyword">using</span> optional_type = std::conditional_t<use_option, std::optional<value_type>, value_type>;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  ring_queue(<span class="keywordtype">size_t</span> sz);</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  ring_queue(<span class="keyword">const</span> ring_queue&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  ring_queue(ring_queue&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  ring_queue& operator =(<span class="keyword">const</span> ring_queue&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  ring_queue& operator =(ring_queue&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  </div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <span class="keyword">auto</span> size() const noexcept->size_type;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  auto capacity() const noexcept->size_type;</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keywordtype">bool</span> empty() const noexcept;</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="keywordtype">bool</span> full() const noexcept;</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  template<class U></div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keywordtype">bool</span> try_push(U&& value) noexcept(std::is_nothrow_move_assignable_v<U>);</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  template<class U></div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="keywordtype">bool</span> try_pop(U& value) noexcept(std::is_nothrow_move_assignable_v<value_type>);</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  private:</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  using container_type = std::unique_ptr<optional_type[]>;</div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  container_type m_bufferPtr;</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  size_type m_bufferSize;</div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  </div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  size_type m_writeIndex;</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  size_type m_readIndex;</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <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>  std::atomic<size_type> m_count;</div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  </div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <span class="keyword">auto</span> nextIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type;</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  };</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  </div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  ring_queue<_Ty, _Option, _Sty>::ring_queue(<span class="keywordtype">size_t</span> sz)</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  : m_bufferPtr(new optional_type[sz + 1])</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  , m_bufferSize(static_cast<size_type>(sz + 1))</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  , m_writeIndex(0)</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  , m_readIndex(0)</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  , m_count(0)</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  #endif</div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  {</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  assert(sz < (std::numeric_limits<size_type>::max)());</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  }</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="keyword">auto</span> ring_queue<_Ty, _Option, _Sty>::nextIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  {</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>size_type<span class="keyword">></span>((a_count + 1) % m_bufferSize);</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  }</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  </div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keyword">auto</span> ring_queue<_Ty, _Option, _Sty>::size() const noexcept->size_type</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  {</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <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>  <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> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keywordflow">if</span> (m_writeIndex >= m_readIndex)</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">return</span> (m_writeIndex - m_readIndex);</div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="keywordflow">return</span> (m_bufferSize + m_writeIndex - m_readIndex);</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <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>  }</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  </div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">auto</span> ring_queue<_Ty, _Option, _Sty>::capacity() const noexcept->size_type</div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  {</div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keywordflow">return</span> m_bufferSize - 1;</div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  }</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  </div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordtype">bool</span> ring_queue<_Ty, _Option, _Sty>::empty() const noexcept</div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  {</div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <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>  <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> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">return</span> m_writeIndex == m_readIndex;</div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> <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>  }</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  </div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordtype">bool</span> ring_queue<_Ty, _Option, _Sty>::full() const noexcept</div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  {</div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <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>  <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> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keywordflow">return</span> nextIndex(m_writeIndex) == m_readIndex;</div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <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>  }</div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  </div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keyword">template</span><<span class="keyword">class</span> U></div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordtype">bool</span> ring_queue<_Ty, _Option, _Sty>::try_push(U&& value) noexcept(std::is_nothrow_move_assignable_v<U>)</div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  {</div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keyword">auto</span> nextWriteIndex = nextIndex(m_writeIndex);</div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordflow">if</span> (nextWriteIndex == m_readIndex)</div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  </div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  assert(m_writeIndex < m_bufferSize);</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  </div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  m_bufferPtr[m_writeIndex] = std::move(value);</div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  m_writeIndex = nextWriteIndex;</div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  </div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <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>  m_count.fetch_add(1, std::memory_order_acq_rel);</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  </div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keyword">template</span><<span class="keyword">class</span> U></div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordtype">bool</span> ring_queue<_Ty, _Option, _Sty>::try_pop(U& value) noexcept(std::is_nothrow_move_assignable_v<value_type>)</div> | |||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  {</div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">if</span> (m_readIndex == m_writeIndex)</div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  </div> | |||||
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  optional_type& ov = m_bufferPtr[m_readIndex];</div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">if</span> constexpr (use_option)</div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  {</div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  value = std::move(ov).value();</div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  ov = std::nullopt;</div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  }</div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  {</div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  value = std::move(ov);</div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  }</div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  </div> | |||||
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  m_readIndex = nextIndex(m_readIndex);</div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  </div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <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>  m_count.fetch_sub(1, std::memory_order_acq_rel);</div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  }</div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> }</div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  <span class="comment">//目前无法解决三个索引数值回绕导致的问题</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  <span class="comment">//如果为了避免索引回绕的问题,索引采用uint64_t类型,</span></div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  <span class="comment">//则在与spinlock<T, false, uint32_t>版本的对比中速度反而慢了</span></div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="comment">//pop时无法使用move语义来获取数据。因为算法要求先获取值,且获取后有可能失败,从而重新获取其它值。</span></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty = u<span class="keywordtype">int</span>32_t></div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">struct </span>ring_queue_lockfree</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  {</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">using</span> size_type = _Sty;</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  ring_queue_lockfree(<span class="keywordtype">size_t</span> sz);</div> | |||||
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  </div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  ring_queue_lockfree(<span class="keyword">const</span> ring_queue_lockfree&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  ring_queue_lockfree(ring_queue_lockfree&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  ring_queue_lockfree& operator =(<span class="keyword">const</span> ring_queue_lockfree&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  ring_queue_lockfree& operator =(ring_queue_lockfree&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  </div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="keyword">auto</span> size() const noexcept->size_type;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  auto capacity() const noexcept->size_type;</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keywordtype">bool</span> empty() const noexcept;</div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <span class="keywordtype">bool</span> full() const noexcept;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  template<class U></div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keywordtype">bool</span> try_push(U&& value) noexcept(std::is_nothrow_move_constructible_v<U>);</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="keywordtype">bool</span> try_pop(value_type& value) noexcept(std::is_nothrow_move_constructible_v<value_type>);</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  private:</div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  std::unique_ptr<value_type[]> m_bufferPtr;</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  size_type m_bufferSize;</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  </div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  std::atomic<size_type> 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>  std::atomic<size_type> 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>  std::atomic<size_type> m_maximumReadIndex; <span class="comment">//It points to the place where the latest "commited" data has been inserted. </span></div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="comment">//If it's not the same as writeIndex it means there are writes pending to be "commited" to the queue, </span></div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <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>  <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>  <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>  <span class="comment">//save the data into the queue.</span></div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <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>  std::atomic<size_type> m_count;</div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  </div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keyword">auto</span> countToIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type;</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="keyword">auto</span> nextIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type;</div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  };</div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  </div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  ring_queue_lockfree<_Ty, _Sty>::ring_queue_lockfree(<span class="keywordtype">size_t</span> sz)</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  : m_bufferPtr(new value_type[sz + 1])</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  , m_bufferSize(static_cast<size_type>(sz + 1))</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  , m_writeIndex(0)</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  , m_readIndex(0)</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  , m_maximumReadIndex(0)</div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  , m_count(0)</div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  #endif</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  {</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  assert(sz < (std::numeric_limits<size_type>::max)());</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  }</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  </div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keyword">auto</span> ring_queue_lockfree<_Ty, _Sty>::countToIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type</div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  {</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="comment">//return (a_count % m_bufferSize);</span></div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">return</span> a_count;</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  }</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  </div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keyword">auto</span> ring_queue_lockfree<_Ty, _Sty>::nextIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  {</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="comment">//return static_cast<size_type>((a_count + 1));</span></div> | |||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>size_type<span class="keyword">></span>((a_count + 1) % m_bufferSize);</div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  }</div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  </div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <span class="keyword">auto</span> ring_queue_lockfree<_Ty, _Sty>::size() const noexcept->size_type</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  {</div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <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>  <span class="keywordflow">return</span> m_count.load();</div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <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>  currentWriteIndex = countToIndex(currentWriteIndex);</div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  </div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <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>  currentReadIndex = countToIndex(currentReadIndex);</div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  </div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="keywordflow">if</span> (currentWriteIndex >= currentReadIndex)</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keywordflow">return</span> (currentWriteIndex - currentReadIndex);</div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">return</span> (m_bufferSize + currentWriteIndex - currentReadIndex);</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <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>  }</div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  </div> | |||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keyword">auto</span> ring_queue_lockfree<_Ty, _Sty>::capacity() const noexcept->size_type</div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  {</div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">return</span> m_bufferSize - 1;</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  }</div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  </div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordtype">bool</span> ring_queue_lockfree<_Ty, _Sty>::empty() const noexcept</div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  {</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <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>  <span class="keywordflow">return</span> m_count.load() == 0;</div> | |||||
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <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>  <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>  <span class="keywordflow">return</span> countToIndex(currentWriteIndex) == countToIndex(currentReadIndex);</div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <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>  }</div> | |||||
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  </div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keywordtype">bool</span> ring_queue_lockfree<_Ty, _Sty>::full() const noexcept</div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  {</div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <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>  <span class="keywordflow">return</span> (m_count.load() == (m_bufferSize - 1));</div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <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>  <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>  <span class="keywordflow">return</span> countToIndex(nextIndex(currentWriteIndex)) == countToIndex(currentReadIndex);</div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span> <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>  }</div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  </div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keyword">template</span><<span class="keyword">class</span> U></div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordtype">bool</span> ring_queue_lockfree<_Ty, _Sty>::try_push(U&& value) noexcept(std::is_nothrow_move_constructible_v<U>)</div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  {</div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <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>  </div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">do</span></div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  {</div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <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>  {</div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="comment">// the queue is full</span></div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  }</div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  </div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <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>  <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>  <span class="comment">//</span></div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="comment">// using compare_exchange_strong because it isn't allowed to fail spuriously</span></div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <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>  <span class="comment">// will yield better performance on some platforms, but here we'd have to</span></div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="comment">// load m_writeIndex all over again</span></div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  } <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>  </div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <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>  m_bufferPtr[countToIndex(currentWriteIndex)] = std::move(value);</div> | |||||
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  </div> | |||||
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="comment">// update the maximum read index after saving the piece of data. It can't</span></div> | |||||
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <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>  <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>  <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>  <span class="comment">//</span></div> | |||||
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <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>  <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>  <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>  <span class="comment">// better performance on some platforms.</span></div> | |||||
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keyword">auto</span> savedWriteIndex = currentWriteIndex;</div> | |||||
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <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>  {</div> | |||||
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  currentWriteIndex = savedWriteIndex;</div> | |||||
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <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>  <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>  <span class="comment">// than 1 producer thread</span></div> | |||||
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <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>  std::this_thread::yield();</div> | |||||
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  }</div> | |||||
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  </div> | |||||
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <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> <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>  m_count.fetch_add(1);</div> | |||||
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  }</div> | |||||
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  </div> | |||||
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordtype">bool</span> ring_queue_lockfree<_Ty, _Sty>::try_pop(value_type& value) noexcept(std::is_nothrow_move_constructible_v<value_type>)</div> | |||||
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  {</div> | |||||
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <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>  </div> | |||||
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">for</span> (;;)</div> | |||||
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  {</div> | |||||
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keyword">auto</span> idx = countToIndex(currentReadIndex);</div> | |||||
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  </div> | |||||
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <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>  <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>  <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>  {</div> | |||||
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="comment">// the queue is empty or</span></div> | |||||
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <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>  <span class="comment">// waiting to commit the data into it</span></div> | |||||
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  }</div> | |||||
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  </div> | |||||
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="comment">// retrieve the data from the queue</span></div> | |||||
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  value = m_bufferPtr[idx]; <span class="comment">//但是,这里的方法不适合。如果只支持移动怎么办?</span></div> | |||||
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  </div> | |||||
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <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>  <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>  <span class="comment">// increased it</span></div> | |||||
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <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>  {</div> | |||||
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <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>  <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> <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>  m_count.fetch_sub(1);</div> | |||||
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  }</div> | |||||
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  </div> | |||||
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <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>  <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>  <span class="comment">// before we could perform the CAS operation </span></div> | |||||
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  } <span class="comment">// keep looping to try again!</span></div> | |||||
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  }</div> | |||||
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span> }</div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>  <span class="comment">//使用自旋锁完成的线程安全的环形队列。</span></div> | |||||
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>  <span class="comment">//支持多个线程同时push和pop。</span></div> | |||||
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  <span class="comment">//_Option : 如果队列保存的数据不支持拷贝只支持移动,则需要设置为true;或者数据希望pop后销毁,都需要设置为true。</span></div> | |||||
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>  <span class="comment">//_Sty : 内存保持数量和索引的整数类型。用于外部控制队列的结构体大小。</span></div> | |||||
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>  <span class="keyword">template</span><<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></div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>  <span class="keyword">struct </span>ring_queue_spinlock</div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  {</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="keyword">using</span> value_type = _Ty;</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="keyword">using</span> size_type = _Sty;</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <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>  <span class="keyword">using</span> optional_type = std::conditional_t<use_option, std::optional<value_type>, value_type>;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  ring_queue_spinlock(<span class="keywordtype">size_t</span> sz);</div> | |||||
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  </div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  ring_queue_spinlock(<span class="keyword">const</span> ring_queue_spinlock&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  ring_queue_spinlock(ring_queue_spinlock&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  ring_queue_spinlock& operator =(<span class="keyword">const</span> ring_queue_spinlock&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  ring_queue_spinlock& operator =(ring_queue_spinlock&&) = <span class="keywordflow">default</span>;</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  </div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <span class="keyword">auto</span> size() const noexcept->size_type;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  auto capacity() const noexcept->size_type;</div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keywordtype">bool</span> empty() const noexcept;</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="keywordtype">bool</span> full() const noexcept;</div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  template<class U></div> | |||||
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keywordtype">bool</span> try_push(U&& value) noexcept(std::is_nothrow_move_assignable_v<U>);</div> | |||||
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keywordtype">bool</span> try_pop(value_type& value) noexcept(std::is_nothrow_move_assignable_v<value_type>);</div> | |||||
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  private:</div> | |||||
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  using container_type = std::conditional_t<std::is_same_v<value_type, <span class="keywordtype">bool</span>>, std::unique_ptr<optional_type[]>, std::vector<optional_type>>;</div> | |||||
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  container_type m_bufferPtr;</div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  size_type m_bufferSize;</div> | |||||
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  </div> | |||||
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  size_type m_writeIndex;</div> | |||||
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  size_type m_readIndex;</div> | |||||
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  mutable resumef::spinlock m_lock;</div> | |||||
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <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>  std::atomic<size_type> m_count;</div> | |||||
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  </div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <span class="keyword">auto</span> nextIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type;</div> | |||||
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  };</div> | |||||
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  </div> | |||||
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  ring_queue_spinlock<_Ty, _Option, _Sty>::ring_queue_spinlock(<span class="keywordtype">size_t</span> sz)</div> | |||||
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  : m_bufferSize(static_cast<size_type>(sz + 1))</div> | |||||
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  , m_writeIndex(0)</div> | |||||
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  , m_readIndex(0)</div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  , m_count(0)</div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  #endif</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  {</div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keywordflow">if</span> constexpr (std::is_same_v<value_type, bool>)</div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  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>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  m_bufferPtr.resize(sz + 1);</div> | |||||
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  </div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  assert(sz < (std::numeric_limits<size_type>::max)());</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  }</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  </div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="keyword">auto</span> ring_queue_spinlock<_Ty, _Option, _Sty>::nextIndex(size_type a_count) <span class="keyword">const</span> noexcept->size_type</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  {</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>size_type<span class="keyword">></span>((a_count + 1) % m_bufferSize);</div> | |||||
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  }</div> | |||||
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  </div> | |||||
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keyword">auto</span> ring_queue_spinlock<_Ty, _Option, _Sty>::size() const noexcept->size_type</div> | |||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  {</div> | |||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <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>  <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> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  std::scoped_lock __guard(this->m_lock);</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  </div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <span class="keywordflow">if</span> (m_writeIndex >= m_readIndex)</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keywordflow">return</span> (m_writeIndex - m_readIndex);</div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">return</span> (m_bufferSize + m_writeIndex - m_readIndex);</div> | |||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <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>  }</div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  </div> | |||||
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keyword">auto</span> ring_queue_spinlock<_Ty, _Option, _Sty>::capacity() const noexcept->size_type</div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  {</div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordflow">return</span> m_bufferSize - 1;</div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  }</div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  </div> | |||||
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordtype">bool</span> ring_queue_spinlock<_Ty, _Option, _Sty>::empty() const noexcept</div> | |||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  {</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <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>  <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> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  std::scoped_lock __guard(this->m_lock);</div> | |||||
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  </div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">return</span> m_writeIndex == m_readIndex;</div> | |||||
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <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>  }</div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  </div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keywordtype">bool</span> ring_queue_spinlock<_Ty, _Option, _Sty>::full() const noexcept</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  {</div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <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>  <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> <span class="preprocessor"> #else</span></div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  std::scoped_lock __guard(this->m_lock);</div> | |||||
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  </div> | |||||
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keywordflow">return</span> nextIndex(m_writeIndex) == m_readIndex;</div> | |||||
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <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>  }</div> | |||||
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  </div> | |||||
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keyword">template</span><<span class="keyword">class</span> U></div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordtype">bool</span> ring_queue_spinlock<_Ty, _Option, _Sty>::try_push(U&& value) noexcept(std::is_nothrow_move_assignable_v<U>)</div> | |||||
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  {</div> | |||||
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  std::scoped_lock __guard(this->m_lock);</div> | |||||
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  </div> | |||||
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keyword">auto</span> nextWriteIndex = nextIndex(m_writeIndex);</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">if</span> (nextWriteIndex == m_readIndex)</div> | |||||
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  </div> | |||||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  assert(m_writeIndex < m_bufferSize);</div> | |||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  </div> | |||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  m_bufferPtr[m_writeIndex] = std::move(value);</div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  m_writeIndex = nextWriteIndex;</div> | |||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  </div> | |||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <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>  m_count.fetch_add(1, std::memory_order_acq_rel);</div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  }</div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  </div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keyword">template</span><<span class="keyword">class</span> _Ty, <span class="keywordtype">bool</span> _Option, <span class="keyword">class</span> _Sty></div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordtype">bool</span> ring_queue_spinlock<_Ty, _Option, _Sty>::try_pop(value_type& value) noexcept(std::is_nothrow_move_assignable_v<value_type>)</div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  {</div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  std::scoped_lock __guard(this->m_lock);</div> | |||||
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  </div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordflow">if</span> (m_readIndex == m_writeIndex)</div> | |||||
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> | |||||
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  </div> | |||||
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  optional_type& ov = m_bufferPtr[m_readIndex];</div> | |||||
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">if</span> constexpr (use_option)</div> | |||||
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  {</div> | |||||
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  value = std::move(ov.value());</div> | |||||
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  ov = std::nullopt;</div> | |||||
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  }</div> | |||||
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  {</div> | |||||
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  value = std::move(ov);</div> | |||||
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  }</div> | |||||
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  </div> | |||||
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  m_readIndex = nextIndex(m_readIndex);</div> | |||||
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  </div> | |||||
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span> <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>  m_count.fetch_sub(1, std::memory_order_acq_rel);</div> | |||||
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span> <span class="preprocessor"> #endif</span></div> | |||||
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> | |||||
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  }</div> | |||||
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span> }</div> | |||||
</div><!-- fragment --></div><!-- contents --> | |||||
<!-- start footer part --> | |||||
<hr class="footer"/><address class="footer"><small> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> <span class="preprocessor">#pragma once</span></div> | |||||
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div> | |||||
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="keyword">namespace </span>resumef</div> | |||||
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> {</div> | |||||
<div class="line"><a name="l00010"></a><span class="lineno"><a class="line" href="structresumef_1_1scheduler__t.html"> 10</a></span>  <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<scheduler_t></div> | |||||
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>  {</div> | |||||
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <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<state_base_t></a>;</div> | |||||
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  <span class="keyword">using</span> state_vector = std::vector<state_sptr>;</div> | |||||
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <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>  <span class="keyword">using</span> task_dictionary_type = std::unordered_map<state_base_t*, std::unique_ptr<task_base_t>>;</div> | |||||
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  </div> | |||||
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <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>  state_vector _runing_states;</div> | |||||
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  state_vector _cached_states;</div> | |||||
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  </div> | |||||
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <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>  task_dictionary_type _ready_task;</div> | |||||
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  </div> | |||||
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  timer_mgr_ptr _timer;</div> | |||||
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  </div> | |||||
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keywordtype">void</span> new_task(task_base_t* task);</div> | |||||
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="comment">//void cancel_all_task_();</span></div> | |||||
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <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>  </div> | |||||
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <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>  </div> | |||||
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="comment">//void break_all();</span></div> | |||||
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  </div> | |||||
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keyword">template</span><<span class="keyword">class </span>_Ty</div> | |||||
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  COMMA_RESUMEF_ENABLE_IF(traits::is_callable_v<_Ty> || traits::is_future_v<_Ty> || traits::is_generator_v<_Ty>)</div> | |||||
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  ></div> | |||||
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  RESUMEF_REQUIRES(traits::is_callable_v<_Ty> || traits::is_future_v<_Ty> || traits::is_generator_v<_Ty>)</div> | |||||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <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>  <span class="keywordtype">void</span> <a class="code" href="structresumef_1_1scheduler__t.html#a449d34ba6a8e28284f2b02089cb7dcec">operator + </a>(_Ty&& coro)</div> | |||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  {</div> | |||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keywordflow">if</span> constexpr (traits::is_callable_v<_Ty>)</div> | |||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  new_task(<span class="keyword">new</span> ctx_task_t<_Ty>(coro));</div> | |||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keywordflow">else</span></div> | |||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  new_task(<span class="keyword">new</span> <a class="code" href="structresumef_1_1task__t.html">task_t<_Ty></a>(coro));</div> | |||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  }</div> | |||||
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  </div> | |||||
<div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structresumef_1_1scheduler__t.html#a9d22640803eb9397cb844e532f4c8585"> 75</a></span>  <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> <span class="keyword"> </span>{</div> | |||||
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  scoped_lock<spinlock, spinlock> __guard(_lock_ready, _lock_running);</div> | |||||
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <span class="keywordflow">return</span> _ready_task.empty() && _runing_states.empty() && _timer->empty();</div> | |||||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  }</div> | |||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  </div> | |||||
<div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="structresumef_1_1scheduler__t.html#a1d369882e156db4efc1a1693acfc0e22"> 84</a></span>  <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>  {</div> | |||||
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordflow">return</span> _timer.get();</div> | |||||
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  }</div> | |||||
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  </div> | |||||
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <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>  <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>  std::unique_ptr<task_base_t> 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>  <span class="keywordtype">void</span> add_switch(std::unique_ptr<task_base_t> task);</div> | |||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  </div> | |||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <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>  <span class="keyword">protected</span>:</div> | |||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <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>  <span class="keyword">public</span>:</div> | |||||
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  ~<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>  </div> | |||||
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>(<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&& right_) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>& operator = (<a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&& right_) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <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>&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>& operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1scheduler__t.html">scheduler_t</a>&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  </div> | |||||
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <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> <span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div> | |||||
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  };</div> | |||||
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  </div> | |||||
<div class="line"><a name="l00117"></a><span class="lineno"><a class="line" href="structresumef_1_1local__scheduler__t.html"> 117</a></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="l00118"></a><span class="lineno"> 118</span>  {</div> | |||||
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <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>  </div> | |||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <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> & sch);</div> | |||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  </div> | |||||
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <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>  </div> | |||||
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <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>&& right_) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>& operator = (<a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&& right_) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <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>&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>& operator = (<span class="keyword">const</span> <a class="code" href="structresumef_1_1local__scheduler__t.html">local_scheduler_t</a>&) = <span class="keyword">delete</span>;</div> | |||||
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keyword">private</span>:</div> | |||||
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <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>  };</div> | |||||
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span> }</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 &&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> | |||||
制作者  <a href="http://www.doxygen.org/index.html"> | |||||
<img class="footer" src="doxygen.png" alt="doxygen"/> | |||||
</a> 1.8.17 | |||||
</small></address> | |||||
</body> | |||||
</html> |
<!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&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&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> |
var searchData= | |||||
[ | |||||
['_5fstate_0',['_state',['../structresumef_1_1awaitable__impl__t.html#af7b6df5bbe7392334d7914db0d878915',1,'resumef::awaitable_impl_t']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
var searchData= | |||||
[ | |||||
['batch_5flock_5ft_4',['batch_lock_t',['../classresumef_1_1batch__lock__t.html',1,'resumef::batch_lock_t< _Ty, _Cont, _Assemble >'],['../classresumef_1_1batch__lock__t.html#a3779f0030948ad54e4f97c8e73afa44d',1,'resumef::batch_lock_t::batch_lock_t(_Cont &locks_)'],['../classresumef_1_1batch__lock__t.html#af46b0d1ba6494e2955660271b190a99a',1,'resumef::batch_lock_t::batch_lock_t(_Cont &locks_, _Assemble &la_)'],['../classresumef_1_1batch__lock__t.html#a2293d0f5d68f335ed8dd0bb6e89321a6',1,'resumef::batch_lock_t::batch_lock_t(std::adopt_lock_t, _Cont &locks_)'],['../classresumef_1_1batch__lock__t.html#abf8d154d25e3b66eb308750052fb660e',1,'resumef::batch_lock_t::batch_lock_t(std::adopt_lock_t, _Cont &locks_, _Assemble &la_)'],['../classresumef_1_1batch__lock__t.html#a3da9e6b8f868fffed636704c551fea47',1,'resumef::batch_lock_t::batch_lock_t(const batch_lock_t &)=delete'],['../classresumef_1_1batch__lock__t.html#a820544949fcf42d08759f5f29686cc9c',1,'resumef::batch_lock_t::batch_lock_t(batch_lock_t &&_Right)']]], | |||||
['batch_5funlock_5ft_5',['batch_unlock_t',['../structresumef_1_1batch__unlock__t.html',1,'resumef']]] | |||||
]; |
<!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&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&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> |
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< _Ty, _Optional, _OptimizationThread >'],['../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< T >'],['../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 &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 &&cp) noexcept']]], | |||||
['counted_5fptr_3c_20detail_3a_3astate_5fevent_5fall_5ft_20_3e_10',['counted_ptr< detail::state_event_all_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20detail_3a_3astate_5fevent_5ft_20_3e_11',['counted_ptr< detail::state_event_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20detail_3a_3astate_5fmutex_5ft_20_3e_12',['counted_ptr< detail::state_mutex_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20resumef_3a_3astate_5ft_20_3e_13',['counted_ptr< resumef::state_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20state_5ftype_20_3e_14',['counted_ptr< state_type >',['../structresumef_1_1counted__ptr.html',1,'resumef']]] | |||||
]; |
<!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&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&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> |
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)']]] | |||||
]; |
<!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&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&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> |
var searchData= | |||||
[ | |||||
['future_5ft_17',['future_t',['../structresumef_1_1future__t.html',1,'resumef']]], | |||||
['future_5ft_3c_20t_20_3e_18',['future_t< T >',['../structresumef_1_1future__t.html',1,'resumef']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
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 &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 &... mtxs)'],['../structresumef_1_1mutex__t.html#ae7f95d070a020cfeaf99684a06c5fd47',1,'resumef::mutex_t::lock(adopt_manual_unlock_t manual_unlock_tag, _Mtxs &... mtxs)'],['../structresumef_1_1mutex__t.html#ad7ba090cf3188eaa738d4e37a4c6ab7a',1,'resumef::mutex_t::lock(void *unique_address, _Mtxs &... mtxs)'],['../structresumef_1_1mutex__t.html#abfbfd653a04d3c3b3d88a5bdcaba4664',1,'resumef::mutex_t::lock(adopt_manual_unlock_t manual_unlock_tag, void *unique_address, _Mtxs &... mtxs)'],['../structresumef_1_1spinlock.html#ae313002e0db9c20b32d386e4eb91c372',1,'resumef::spinlock::lock()']]] | |||||
]; |
<!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&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&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> |
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()']]] | |||||
]; |
<!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&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&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> |
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->',['../structresumef_1_1counted__ptr.html#aa22f547da8b8e79b476ee83e4a790dba',1,'resumef::counted_ptr']]], | |||||
['operator_3c_3c_33',['operator<<',['../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 &cp)'],['../structresumef_1_1counted__ptr.html#af6a044ce1cdecc3a2650f16f445de2d4',1,'resumef::counted_ptr::operator=(counted_ptr &&cp) noexcept'],['../classresumef_1_1batch__lock__t.html#aabbfeb513ac907b9c8caf6fda9a356d4',1,'resumef::batch_lock_t::operator=(const batch_lock_t &)=delete'],['../classresumef_1_1batch__lock__t.html#a057618d5a806ffe6fd106f851082f12e',1,'resumef::batch_lock_t::operator=(batch_lock_t &&_Right)']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
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< _Rep, _Period > &dt) const noexcept'],['../structresumef_1_1mutex__t.html#a15c6518dafb6c2cf52a0b0dbdd90ae7b',1,'resumef::mutex_t::try_lock_for(const std::chrono::duration< _Rep, _Period > &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< _Rep, _Period > &tp) const noexcept'],['../structresumef_1_1mutex__t.html#aec072ad5fd0d6b688a3866ee9f1dc791',1,'resumef::mutex_t::try_lock_until(const std::chrono::time_point< _Rep, _Period > &tp, void *unique_address)']]] | |||||
]; |
<!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&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&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> |
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 &... mtxs)'],['../structresumef_1_1mutex__t.html#a28defd5d64173ef3114a419f945adb3d',1,'resumef::mutex_t::unlock(void *unique_address, _Mtxs &... mtxs)'],['../structresumef_1_1spinlock.html#af6d49dc277c0719e282a9387ed3c35e9',1,'resumef::spinlock::unlock()'],['../classresumef_1_1batch__lock__t.html#abc72b35a9eef1bd6c39955d63cc8ce9c',1,'resumef::batch_lock_t::unlock()']]] | |||||
]; |
<!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&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&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> |
var searchData= | |||||
[ | |||||
['via_62',['via',['../structresumef_1_1switch__scheduler__awaitor.html#ad895f4414bfb91fde51ac735420246a9',1,'resumef::switch_scheduler_awaitor::via(scheduler_t &sch) noexcept'],['../structresumef_1_1switch__scheduler__awaitor.html#a59f9ab7279d4aee22b69b93c86b209e7',1,'resumef::switch_scheduler_awaitor::via(scheduler_t *sch) noexcept']]] | |||||
]; |
<!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&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&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> |
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 &sch, _Awaitable &&... args) -> detail::when_future_t< std::tuple< detail::awaitor_result_t< _Awaitable >... > >'],['../structresumef_1_1when__.html#a29810e8fe2efbfb395669971758182fe',1,'resumef::when_::when_all(scheduler_t &sch, _Iter begin, _Iter end) -> detail::when_future_t< std::vector< detail::awaitor_result_t< decltype(*std::declval< _Iter >())> > >'],['../structresumef_1_1when__.html#a66d4fc83bbdbe36232615ff7d0459049',1,'resumef::when_::when_all(scheduler_t &sch, _Cont &cont)'],['../structresumef_1_1when__.html#a1d453b444cfaa704cf7a1da01eed49b9',1,'resumef::when_::when_all(_Awaitable &&... args) -> future_t< std::tuple< detail::awaitor_result_t< _Awaitable >... >>'],['../structresumef_1_1when__.html#a9b8ec7229b5c7dd7c2ae58d3365799dc',1,'resumef::when_::when_all(_Iter begin, _Iter end) -> future_t< std::vector< detail::awaitor_result_t< decltype(*begin)>>>'],['../structresumef_1_1when__.html#aa2a8218ff1eb6cb48fb981310a284b84',1,'resumef::when_::when_all(_Cont &&cont) -> future_t< std::vector< detail::awaitor_result_t< decltype(*std::begin(cont))>>>']]], | |||||
['when_5fany_68',['when_any',['../structresumef_1_1when__.html#af4fe05b26abdab4ff00505ce56674ef9',1,'resumef::when_::when_any(scheduler_t &sch, _Awaitable &&... args) -> detail::when_future_t< when_any_pair >'],['../structresumef_1_1when__.html#a5eb64c53feea7f37b643f9b9c3faf685',1,'resumef::when_::when_any(scheduler_t &sch, _Iter begin, _Iter end) -> detail::when_future_t< when_any_pair >'],['../structresumef_1_1when__.html#a753478e5b7b3df202efc98c0274484e8',1,'resumef::when_::when_any(scheduler_t &sch, _Cont &cont) -> detail::when_future_t< when_any_pair >'],['../structresumef_1_1when__.html#a4ec23495051e2b682f27ce0b3d527305',1,'resumef::when_::when_any(_Awaitable &&... args) -> future_t< when_any_pair >'],['../structresumef_1_1when__.html#a8595c1bc0659b67724654b6661537058',1,'resumef::when_::when_any(_Iter begin, _Iter end) -> future_t< when_any_pair >'],['../structresumef_1_1when__.html#a0b9b2f88f5c8cd76dd8d1c70926cc029',1,'resumef::when_::when_any(_Cont &&cont) -> future_t< when_any_pair >']]], | |||||
['write_69',['write',['../structresumef_1_1channel__t.html#a603d7e9a7e0d621292b5a3c340aaadc9',1,'resumef::channel_t']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
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']]] | |||||
]; |
<!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&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&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> |
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< detail::state_event_all_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20detail_3a_3astate_5fevent_5ft_20_3e_85',['counted_ptr< detail::state_event_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20detail_3a_3astate_5fmutex_5ft_20_3e_86',['counted_ptr< detail::state_mutex_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20resumef_3a_3astate_5ft_20_3e_87',['counted_ptr< resumef::state_t >',['../structresumef_1_1counted__ptr.html',1,'resumef']]], | |||||
['counted_5fptr_3c_20state_5ftype_20_3e_88',['counted_ptr< state_type >',['../structresumef_1_1counted__ptr.html',1,'resumef']]] | |||||
]; |