Micro template library A library for building device drivers
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

109 lines
60 KiB

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
  5. <meta http-equiv="X-UA-Compatible" content="IE=9"/>
  6. <meta name="generator" content="Doxygen 1.8.14"/>
  7. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  8. <title>uTL: W:/Work/Software/Libraries/utl/include/utl/meta/typelist.h</title>
  9. <link href="tabs.css" rel="stylesheet" type="text/css"/>
  10. <script type="text/javascript" src="jquery.js"></script>
  11. <script type="text/javascript" src="dynsections.js"></script>
  12. <link href="navtree.css" rel="stylesheet" type="text/css"/>
  13. <script type="text/javascript" src="resize.js"></script>
  14. <script type="text/javascript" src="navtreedata.js"></script>
  15. <script type="text/javascript" src="navtree.js"></script>
  16. <script type="text/javascript">
  17. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  18. $(document).ready(initResizable);
  19. /* @license-end */</script>
  20. <link href="search/search.css" rel="stylesheet" type="text/css"/>
  21. <script type="text/javascript" src="search/searchdata.js"></script>
  22. <script type="text/javascript" src="search/search.js"></script>
  23. <link href="doxygen.css" rel="stylesheet" type="text/css" />
  24. </head>
  25. <body>
  26. <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
  27. <div id="titlearea">
  28. <table cellspacing="0" cellpadding="0">
  29. <tbody>
  30. <tr style="height: 56px;">
  31. <td id="projectalign" style="padding-left: 0.5em;">
  32. <div id="projectname">uTL
  33. </div>
  34. <div id="projectbrief">micro Template library</div>
  35. </td>
  36. </tr>
  37. </tbody>
  38. </table>
  39. </div>
  40. <!-- end header part -->
  41. <!-- Generated by Doxygen 1.8.14 -->
  42. <script type="text/javascript">
  43. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  44. var searchBox = new SearchBox("searchBox", "search",false,'Search');
  45. /* @license-end */
  46. </script>
  47. <script type="text/javascript" src="menudata.js"></script>
  48. <script type="text/javascript" src="menu.js"></script>
  49. <script type="text/javascript">
  50. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  51. $(function() {
  52. initMenu('',true,false,'search.php','Search');
  53. $(document).ready(function() { init_search(); });
  54. });
  55. /* @license-end */</script>
  56. <div id="main-nav"></div>
  57. </div><!-- top -->
  58. <div id="side-nav" class="ui-resizable side-nav-resizable">
  59. <div id="nav-tree">
  60. <div id="nav-tree-contents">
  61. <div id="nav-sync" class="sync"></div>
  62. </div>
  63. </div>
  64. <div id="splitbar" style="-moz-user-select:none;"
  65. class="ui-resizable-handle">
  66. </div>
  67. </div>
  68. <script type="text/javascript">
  69. /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  70. $(document).ready(function(){initNavTree('_w_1_2_work_2_software_2_libraries_2utl_2include_2utl_2meta_2typelist_8h-example.html','');});
  71. /* @license-end */
  72. </script>
  73. <div id="doc-content">
  74. <!-- window showing the filter options -->
  75. <div id="MSearchSelectWindow"
  76. onmouseover="return searchBox.OnSearchSelectShow()"
  77. onmouseout="return searchBox.OnSearchSelectHide()"
  78. onkeydown="return searchBox.OnSearchSelectKey(event)">
  79. </div>
  80. <!-- iframe showing the search results (closed by default) -->
  81. <div id="MSearchResultsWindow">
  82. <iframe src="javascript:void(0)" frameborder="0"
  83. name="MSearchResults" id="MSearchResults">
  84. </iframe>
  85. </div>
  86. <div class="header">
  87. <div class="headertitle">
  88. <div class="title">W:/Work/Software/Libraries/utl/include/utl/meta/typelist.h</div> </div>
  89. </div><!--header-->
  90. <div class="contents">
  91. <p>A class template that just holds a parameter pack.The idea came from MPL's sequence concept [<a class="el" href="W:/Work/Software/Libraries/utl/include/utl/meta/invoke.h.html#link1">link1</a> 1] and from N4115 [<a class="el" href="W:/Work/Software/Libraries/utl/include/utl/meta/invoke.h.html#link2">link2</a> 2]. In addition to N4115's name "packer" we just prefer a name which is object, not a subject. This way the name gives the feeling of a container and smells like Python.</p>
  92. <p>In addition to tuple we lack members, so typelist could serve as an empty base class, and an object of the ultimate type could always be instantiated (even if the parameter typelist contains void or some type that lacks a default constructor).</p>
  93. <div class="fragment"><div class="line"><span class="keyword">using</span> l1 = typelist&lt;int, void*, double, void&gt;;</div><div class="line">l1 a {};</div></div><!-- fragment --><p>boost::hana [<a class="el" href="W:/Work/Software/Libraries/utl/include/utl/meta/typelist.h.html#link3">link3</a> 3] suggests a more powerful scheme were type invariant structures can be used for metaprograming also. This lib does not need (yet) this kind of power (we afraid the responsibility that comes along). So a simple python-like list with some extra vector-like element access functionalities and no iterators is good enough(for now).</p>
  94. <p><a class="anchor" id="link1"></a>[1]: <a href="https://www.boost.org/doc/">https://www.boost.org/doc/</a> <a class="anchor" id="link2"></a>[2]: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4115.html">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4115.html</a> <a class="anchor" id="link3"></a>[3]: <a href="https://github.com/boostorg/hana">https://github.com/boostorg/hana</a></p>
  95. <div class="fragment"><div class="line"></div><div class="line"><span class="preprocessor">#ifndef __utl_meta_typelist_h__</span></div><div class="line"><span class="preprocessor">#define __utl_meta_typelist_h__</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="impl_8h.html">utl/core/impl.h</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="integral_8h.html">utl/meta/integral.h</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="detection_8h.html">utl/meta/detection.h</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="meta_2invoke_8h.html">utl/meta/invoke.h</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="sfinae_8h.html">utl/meta/sfinae.h</a>&gt;</span></div><div class="line"></div><div class="line"><span class="keyword">namespace </span><a class="code" href="namespaceutl.html">utl</a> {</div><div class="line"><span class="keyword">namespace </span>meta {</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Ts&gt;</div><div class="line"> <span class="keyword">struct </span>typelist {</div><div class="line"> <span class="keyword">using</span> <a name="a0"></a><a class="code" href="structutl_1_1meta_1_1typelist.html#a7332ca3d7a7ec5b730e24a4dab743fa6">type</a> = typelist; </div><div class="line"></div><div class="line"> <span class="keyword">static</span> constexpr <span class="keywordtype">size_t</span> <a name="a1"></a><a class="code" href="structutl_1_1meta_1_1typelist.html#af898a273ef1135286de6cef169db9c2d">size</a>() noexcept {</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">sizeof</span>...(Ts);</div><div class="line"> }</div><div class="line"> <span class="keyword">static</span> constexpr <span class="keywordtype">bool</span> <a name="a2"></a><a class="code" href="structutl_1_1meta_1_1typelist.html#ac502a5ad1b830e75693c2e3c7a7b1cb8">empty</a>() noexcept {</div><div class="line"> <span class="keywordflow">return</span> (<span class="keyword">sizeof</span>...(Ts) == 0);</div><div class="line"> }</div><div class="line"> <span class="comment">// ======= times utility =======</span></div><div class="line"> <span class="keyword">private</span>:</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... &gt; <span class="keyword">struct </span>cat_ { };</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... L1, <span class="keyword">typename</span>... L2&gt;</div><div class="line"> <span class="keyword">struct </span>cat_&lt;typelist&lt;L1...&gt;, typelist&lt;L2...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> <a class="code" href="structutl_1_1meta_1_1typelist.html#a7332ca3d7a7ec5b730e24a4dab743fa6">type</a> = typelist&lt;L1..., L2...&gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keywordtype">size_t</span> N, <span class="keyword">typename</span> ...T&gt;</div><div class="line"> <span class="keyword">struct </span>times_ {</div><div class="line"> <span class="comment">//static_assert( N &gt;= 0, &quot;Cannot make typelist of negative length&quot; );</span></div><div class="line"> <span class="keyword">using</span> <a name="a3"></a><a class="code" href="structutl_1_1meta_1_1typelist_1_1times__.html#abcf09cf6ea99301ed77748d71ea093ac">type</a> = <a name="a4"></a><a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> cat_&lt;</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;times_&lt;N/2, T...&gt;&gt;,</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;times_&lt;N - N/2, T...&gt;&gt;</div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ...T&gt;</div><div class="line"> <span class="keyword">struct </span>times_&lt;1, T...&gt; {</div><div class="line"> <span class="keyword">using</span> <a class="code" href="structutl_1_1meta_1_1typelist_1_1times__.html#abcf09cf6ea99301ed77748d71ea093ac">type</a> = typelist&lt;T...&gt;;</div><div class="line"> };</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ...T&gt;</div><div class="line"> <span class="keyword">struct </span>times_&lt;0, T...&gt; {</div><div class="line"> <span class="keyword">using</span> <a class="code" href="structutl_1_1meta_1_1typelist_1_1times__.html#abcf09cf6ea99301ed77748d71ea093ac">type</a> = typelist&lt;&gt;;</div><div class="line"> };</div><div class="line"> <span class="keyword">public</span>:</div><div class="line"> <span class="keyword">template</span>&lt;<span class="keywordtype">size_t</span> N&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a5"></a><a class="code" href="structutl_1_1meta_1_1typelist.html#ac444325211852c503605ec6c820f3eae">times</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> times_&lt;N, Ts...&gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a6"></a><a class="code" href="namespaceutl_1_1meta.html#a0edfc2c15e42531e53c0822264d220ec">size</a> = size_&lt;List::size()&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a7"></a><a class="code" href="namespaceutl_1_1meta.html#a58c1744750d0df133034f60a95f87e19">empty</a> = bool_&lt;List::empty()&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a8"></a><a class="code" href="namespaceutl_1_1meta.html#aa6513d9d2a5db3ba3517efff33adc761">pair</a> = typelist&lt;T1, T2&gt;;</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keywordtype">size_t</span> N, <span class="keyword">typename</span> ...Ts&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a9"></a><a class="code" href="namespaceutl_1_1meta.html#af6ff0017ea5e914543527b7135930f47">repeat_c</a> = <span class="keyword">typename</span> typelist&lt;Ts...&gt;::template times&lt;N&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> N, <span class="keyword">typename</span> ...Ts&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a10"></a><a class="code" href="namespaceutl_1_1meta.html#aa013c45afb59b5c132a72be54ba145fb">repeat</a> = <a class="code" href="namespaceutl_1_1meta.html#af6ff0017ea5e914543527b7135930f47">repeat_c</a>&lt;N::type::value, Ts...&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>apply_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Fn, <span class="keyword">typename</span> Seq&gt;</div><div class="line"> <span class="keyword">struct </span>apply_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Fn, <span class="keyword">typename</span> ...List&gt;</div><div class="line"> <span class="keyword">struct </span>apply_&lt;Fn, typelist&lt;List...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = <a name="a11"></a><a class="code" href="namespaceutl_1_1meta.html#a77630cd8adc01f7193f6cb834313d90f">invoke</a>&lt;Fn, List...&gt;;</div><div class="line"> };</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Fn, <span class="keyword">typename</span> T, T... Is&gt;</div><div class="line"> <span class="keyword">struct </span>apply_&lt;Fn, <a name="a12"></a><a class="code" href="namespaceutl_1_1meta.html#abc3ba8590a6cdd451f64d6c5dcd8ff99">integer_sequence</a>&lt;T, Is...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = invoke&lt;Fn, integral_&lt;T, Is&gt;...&gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Fn, <span class="keyword">typename</span> Seq&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a13"></a><a class="code" href="namespaceutl_1_1meta.html#a3f684549221fac60bc8c7979cb4b98f4">apply</a> = apply_impl::apply_&lt;Fn, Seq&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Fn, <span class="keyword">typename</span> Seq&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a14"></a><a class="code" href="namespaceutl_1_1meta.html#ac2952cd4ed04938edc6de21ffe200e9b">apply_t</a> = eval &lt;apply&lt;Fn, Seq&gt;&gt;;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/*</span></div><div class="line"><span class="comment"> * ========= element access ========</span></div><div class="line"><span class="comment"> */</span></div><div class="line"> <span class="keyword">namespace </span>at_impl {</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span>_add_pointer { <span class="keyword">using</span> <a name="a15"></a><a class="code" href="structutl_1_1meta_1_1at__impl_1_1__add__pointer.html#a372a7a88f139a95fc12a4da82483d269">type</a> = T*; };</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">using</span> <a name="a16"></a><a class="code" href="namespaceutl_1_1meta_1_1at__impl.html#a1759f370bc952ff21077efca9fe0e0b4">add_pointer</a> = eval &lt; _add_pointer &lt;T&gt; &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ...&gt;</div><div class="line"> <span class="keyword">struct </span>at_head_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... voids&gt;</div><div class="line"> <span class="keyword">struct </span>at_head_ &lt;typelist&lt;voids...&gt;&gt; {</div><div class="line"> <span class="comment">// successful selection N voids, one T* and the rest</span></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt; <span class="keyword">static</span> constexpr T select(voids..., T*, ...);</div><div class="line"> <span class="comment">// selection on error</span></div><div class="line"> <span class="keyword">static</span> constexpr nil_ select (...);</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> List, index_t N&gt;</div><div class="line"> <span class="keyword">struct </span>at_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... List, <a name="a17"></a><a class="code" href="namespaceutl.html#a676c0acd539dd04048dcc7b4d698577e">index_t</a> N&gt;</div><div class="line"> <span class="keyword">struct </span>at_&lt;typelist&lt;List...&gt;, N&gt; {</div><div class="line"> <span class="keyword">using</span> head_ = at_head_&lt;typelist&lt;void*&gt;::times&lt;N&gt;&gt;; <span class="comment">//&lt; make at_head_&lt;&gt; with N void*</span></div><div class="line"> <span class="keyword">using</span> type = decltype(</div><div class="line"> head_::select(<span class="keyword">static_cast&lt;</span>add_pointer&lt;List&gt;<span class="keyword">&gt;</span>(<span class="keyword">nullptr</span>)...) <span class="comment">//&lt; pass all as List*...</span></div><div class="line"> );</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, index_t N&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a18"></a><a class="code" href="namespaceutl_1_1meta.html#a6683b804a20d54817d61ce4663527084">at_c</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> at_impl::at_&lt;List, N&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> N&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a19"></a><a class="code" href="namespaceutl_1_1meta.html#a67329ec425c857dcaf4cde9044674c90">at</a> = at_c&lt;List, N::type::value&gt;;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>front_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> L&gt;</div><div class="line"> <span class="keyword">struct </span>front_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail&gt;</div><div class="line"> <span class="keyword">struct </span>front_&lt;typelist&lt;Head, Tail...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = Head;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a20"></a><a class="code" href="namespaceutl_1_1meta.html#ace309fb2eff5c4a5a806b9393abea486">front</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> front_impl::front_&lt;List&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>back_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">struct </span>back_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail&gt;</div><div class="line"> <span class="keyword">struct </span>back_&lt;typelist&lt;Head, Tail...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = <a class="code" href="namespaceutl_1_1meta.html#a6683b804a20d54817d61ce4663527084">at_c</a> &lt;</div><div class="line"> typelist&lt;Head, Tail...&gt;, <span class="keyword">sizeof</span>...(Tail)</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a21"></a><a class="code" href="namespaceutl_1_1meta.html#ad9ee55707fc633d53577b81a59136b7d">back</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> back_impl::back_&lt;List&gt;</div><div class="line"> &gt;;</div><div class="line"> <span class="comment">/*</span></div><div class="line"><span class="comment"> * ========= typelist operations =========</span></div><div class="line"><span class="comment"> */</span></div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>cat_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Lists&gt;</div><div class="line"> <span class="keyword">struct </span>cat_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;&gt;</div><div class="line"> <span class="keyword">struct </span>cat_&lt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;&gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... L1&gt;</div><div class="line"> <span class="keyword">struct </span>cat_&lt;typelist&lt;L1...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;L1...&gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... L1, <span class="keyword">typename</span>... L2&gt;</div><div class="line"> <span class="keyword">struct </span>cat_&lt;typelist&lt;L1...&gt;, typelist&lt;L2...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;L1..., L2...&gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... L1, <span class="keyword">typename</span>... L2, <span class="keyword">typename</span>... Ln&gt;</div><div class="line"> <span class="keyword">struct </span>cat_&lt;typelist&lt;L1...&gt;, typelist&lt;L2...&gt;, Ln...&gt;</div><div class="line"> : cat_ &lt;typelist&lt;L1..., L2...&gt;, Ln...&gt; { };</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Lists&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a22"></a><a class="code" href="namespaceutl_1_1meta.html#a70d0910ace47f4e12e8fa0788679044a">cat</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> cat_impl::cat_&lt;Lists...&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>fold_impl {</div><div class="line"> <span class="comment">// fold&lt;&lt;T1, T2, T3&gt;, V, F&gt; == F&lt;F&lt;F&lt;V, T1&gt;, T2&gt;, T3&gt;</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div><div class="line"> <span class="keyword">struct </span>fold_ { }; <span class="comment">// ill formed</span></div><div class="line"></div><div class="line"> <span class="comment">// recursive call</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail,</div><div class="line"> <span class="keyword">typename</span> V,</div><div class="line"> <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>fold_&lt;typelist&lt;Head, Tail...&gt;, V, Fn&gt; {</div><div class="line"> <span class="comment">// recursive call of fold_ by consuming typelist and invoking Fn</span></div><div class="line"> <span class="keyword">using</span> type = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> fold_&lt;</div><div class="line"> typelist&lt;Tail...&gt;,</div><div class="line"> invoke&lt;Fn, V, Head&gt;,</div><div class="line"> Fn</div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"> <span class="comment">// termination call</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> V0, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>fold_&lt;typelist&lt;&gt;, V0, Fn&gt; {</div><div class="line"> <span class="keyword">using</span> type = V0;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> V, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a23"></a><a class="code" href="namespaceutl_1_1meta.html#a6108f39d28c924146eff4143a61af226">fold</a> = eval&lt;fold_impl::fold_&lt;List, V, Fn&gt;&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> V, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a24"></a><a class="code" href="namespaceutl_1_1meta.html#aeb5cb48e804cd160b39f8c3ed2967c37">accumulate</a> = fold&lt;List, V, Fn&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>rev_fold_impl {</div><div class="line"></div><div class="line"> <span class="comment">// rev_fold&lt;&lt;T1, T2, T3&gt;, V, F&gt; == F&lt;T1, F&lt;T2, F&lt;T3, V&gt;&gt;&gt;</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div><div class="line"> <span class="keyword">struct </span>rev_fold_ { }; <span class="comment">// ill formed</span></div><div class="line"></div><div class="line"> <span class="comment">// recursive call</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail,</div><div class="line"> <span class="keyword">typename</span> V,</div><div class="line"> <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>rev_fold_&lt;typelist&lt;Head, Tail...&gt;, V, Fn&gt; {</div><div class="line"> <span class="comment">// recursive call inside invoke. This way the 2nd argument of Fn</span></div><div class="line"> <span class="comment">// becoming the recursive &quot;thing&quot;, inside Fn&lt;&gt;</span></div><div class="line"> <span class="keyword">using</span> type = <a class="code" href="namespaceutl_1_1meta.html#a77630cd8adc01f7193f6cb834313d90f">invoke</a> &lt;</div><div class="line"> Fn, Head, <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> rev_fold_ &lt;</div><div class="line"> typelist&lt;Tail...&gt;,</div><div class="line"> V,</div><div class="line"> Fn</div><div class="line"> &gt;&gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"> <span class="comment">// pre-termination call</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Tail, <span class="keyword">typename</span> V, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>rev_fold_ &lt;typelist&lt;Tail&gt;, V, Fn&gt; {</div><div class="line"> <span class="keyword">using</span> type = invoke&lt;Fn, Tail, V&gt;;</div><div class="line"> };</div><div class="line"> <span class="comment">// termination call</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> V, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>rev_fold_ &lt;typelist&lt;&gt;, V, Fn&gt; {</div><div class="line"> <span class="keyword">using</span> type = V;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> V, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a25"></a><a class="code" href="namespaceutl_1_1meta.html#ab1a91edef4cf9fd56b73c9a03eaeb3d4">rev_fold</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> rev_fold_impl::rev_fold_&lt;List, V, Fn&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span>... Ts&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a26"></a><a class="code" href="namespaceutl_1_1meta.html#ab0f84ba0807b6fd36fa9e4e5cfc4cd32">push_front</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#a3f684549221fac60bc8c7979cb4b98f4">apply</a> &lt;</div><div class="line"> bind_front&lt;quote&lt;typelist&gt;, Ts...&gt;, List</div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span>... Ts&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a27"></a><a class="code" href="namespaceutl_1_1meta.html#adf545ba110edc6a34ddcaf2280a0c7f4">push_back</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#a3f684549221fac60bc8c7979cb4b98f4">apply</a> &lt;</div><div class="line"> bind_back&lt;quote&lt;typelist&gt;, Ts...&gt;, List</div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>reverse_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> V = typelist&lt;&gt;&gt;</div><div class="line"> <span class="keyword">struct </span>reverse_ {</div><div class="line"> <span class="keyword">using</span> <a name="a28"></a><a class="code" href="structutl_1_1meta_1_1reverse__impl_1_1reverse__.html#ad1618828ac681258d9909839df60dd39">type</a> = fold&lt;List, V, quote&lt;push_front&gt;&gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a29"></a><a class="code" href="namespaceutl_1_1meta.html#a2ae6bfa22f1912b0ba09d24e0ae2ccd9">reverse</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> reverse_impl::reverse_&lt;List&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>pop_front_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">struct </span>pop_front_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail&gt;</div><div class="line"> <span class="keyword">struct </span>pop_front_&lt;typelist &lt;Head, Tail...&gt;&gt; {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;Tail...&gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a30"></a><a class="code" href="namespaceutl_1_1meta.html#aa4a307a81c0640c6c0dd08f8a53f3c32">pop_front</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> pop_front_impl::pop_front_&lt;List&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>pop_back_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">struct </span>pop_back_ {</div><div class="line"> <span class="keyword">using</span> <a name="a31"></a><a class="code" href="structutl_1_1meta_1_1pop__back__impl_1_1pop__back__.html#a8b82ff5dcd6fcda89b36f8e587e64d24">type</a> = <a class="code" href="namespaceutl_1_1meta.html#a2ae6bfa22f1912b0ba09d24e0ae2ccd9">reverse</a>&lt;</div><div class="line"> pop_front&lt;reverse&lt;List&gt;&gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a32"></a><a class="code" href="namespaceutl_1_1meta.html#a86a37f5803c474823963e1f3c6f7a6d6">pop_back</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a> &lt;</div><div class="line"> pop_back_impl::pop_back_&lt;List&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>transform_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span> = <span class="keywordtype">void</span>&gt;</div><div class="line"> <span class="keyword">struct </span>transform_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Ts, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>transform_&lt;typelist&lt;typelist&lt;Ts...&gt;, Fn&gt;,</div><div class="line"> <a name="a33"></a><a class="code" href="group__detection.html#gae7373c997420d16cf37e542eb3cfa3ad">void_t</a>&lt;<a class="code" href="namespaceutl_1_1meta.html#a77630cd8adc01f7193f6cb834313d90f">invoke</a>&lt;Fn, Ts&gt;...&gt; &gt; <span class="comment">/* SFINAE check */</span> {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;</div><div class="line"> invoke_t&lt;Fn, Ts&gt;...</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Ts0, <span class="keyword">typename</span>... Ts1, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>transform_&lt;typelist&lt;typelist&lt;Ts0...&gt;, typelist&lt;Ts1...&gt;, Fn&gt;,</div><div class="line"> <a class="code" href="group__detection.html#gae7373c997420d16cf37e542eb3cfa3ad">void_t</a>&lt;<a class="code" href="namespaceutl_1_1meta.html#a77630cd8adc01f7193f6cb834313d90f">invoke</a>&lt;Fn, Ts0, Ts1&gt;...&gt;&gt; <span class="comment">/* SFINAE check */</span> {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;</div><div class="line"> invoke_t&lt;Fn, Ts0, Ts1&gt;...</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Args&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a34"></a><a class="code" href="namespaceutl_1_1meta.html#ac8bbf187eea3cb5da38d1bdc97b52334">transform</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> transform_impl::transform_&lt;typelist&lt;Args...&gt;&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>transform_lazy_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span> = <span class="keywordtype">void</span>&gt;</div><div class="line"> <span class="keyword">struct </span>transform_lazy_ { };</div><div class="line"></div><div class="line"> <span class="comment">// Match for Unary Fn with one typelist</span></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Ts, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>transform_lazy_&lt;typelist&lt;typelist&lt;Ts...&gt;, Fn&gt;,</div><div class="line"> <a class="code" href="group__detection.html#gae7373c997420d16cf37e542eb3cfa3ad">void_t</a>&lt;<a class="code" href="namespaceutl_1_1meta.html#a77630cd8adc01f7193f6cb834313d90f">invoke</a>&lt;Fn, Ts&gt;...&gt; &gt; <span class="comment">/* SFINAE check */</span> {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;</div><div class="line"> invoke&lt;Fn, Ts&gt;...</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// Match for Binary Fn with two typelists</span></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Ts0, <span class="keyword">typename</span>... Ts1, <span class="keyword">typename</span> Fn&gt;</div><div class="line"> <span class="keyword">struct </span>transform_lazy_&lt;typelist&lt;typelist&lt;Ts0...&gt;, typelist&lt;Ts1...&gt;, Fn&gt;,</div><div class="line"> <a class="code" href="group__detection.html#gae7373c997420d16cf37e542eb3cfa3ad">void_t</a>&lt;<a class="code" href="namespaceutl_1_1meta.html#a77630cd8adc01f7193f6cb834313d90f">invoke</a>&lt;Fn, Ts0, Ts1&gt;...&gt;&gt; <span class="comment">/* SFINAE check */</span> {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;</div><div class="line"> invoke&lt;Fn, Ts0, Ts1&gt;...</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>... Args&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a35"></a><a class="code" href="namespaceutl_1_1meta.html#a55c0405bfb94c1d285d3131390c31451">transform_lazy</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> transform_lazy_impl::transform_lazy_&lt;typelist&lt;Args...&gt;&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>find_if_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, index_t&gt;</div><div class="line"> <span class="keyword">struct </span>find_if_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail, <span class="keyword">typename</span> Fn, <a class="code" href="namespaceutl.html#a676c0acd539dd04048dcc7b4d698577e">index_t</a> N&gt;</div><div class="line"> <span class="keyword">struct </span>find_if_&lt;typelist&lt;Head, Tail...&gt;, Fn, N&gt; {</div><div class="line"> <span class="comment">// Recursive call to find_if_ until Fn returns true_</span></div><div class="line"> <span class="keyword">using</span> type = <a name="a36"></a><a class="code" href="group__type.html#ga39cc4e727a8faa5ea176f543e62c05c0">if_</a> &lt;</div><div class="line"> invoke_t&lt;Fn, Head&gt;,</div><div class="line"> index_&lt;N&gt;, <span class="comment">// done, return current index</span></div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;find_if_&lt; <span class="comment">// not done, re-call find_if_ with the Tail...</span></div><div class="line"> typelist&lt;Tail...&gt;, Fn, N+1&gt;</div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// When empty or when we are one place after the last item return Npos</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Fn, index_t N&gt;</div><div class="line"> <span class="keyword">struct </span>find_if_&lt;typelist&lt;&gt;, Fn, N&gt; {</div><div class="line"> <span class="keyword">using</span> type = <a name="a37"></a><a class="code" href="namespaceutl_1_1meta.html#af0c85cc6480a9e7a8e4fb7d8f936f01b">Npos</a>;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a38"></a><a class="code" href="namespaceutl_1_1meta.html#aacf124929c0cbb3b29d34679bff50a96">find_if</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> find_if_impl::find_if_&lt;List, Pred, 0&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> T&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a39"></a><a class="code" href="namespaceutl_1_1meta.html#af4c9b6350bba98cc0dd73e87cb4ce413">find</a> = find_if&lt;List, same_as&lt;T&gt;&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>seek_if_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, index_t&gt;</div><div class="line"> <span class="keyword">struct </span>seek_if_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail, <span class="keyword">typename</span> Fn, <a class="code" href="namespaceutl.html#a676c0acd539dd04048dcc7b4d698577e">index_t</a> N&gt;</div><div class="line"> <span class="keyword">struct </span>seek_if_&lt;typelist&lt;Head, Tail...&gt;, Fn, N&gt; {</div><div class="line"> <span class="comment">// recursive call to seek_if_ until Fn returns true_</span></div><div class="line"> <span class="keyword">using</span> type = <a class="code" href="group__type.html#ga39cc4e727a8faa5ea176f543e62c05c0">if_</a> &lt;</div><div class="line"> invoke_t&lt;Fn, Head&gt;,</div><div class="line"> typelist&lt;Head, Tail...&gt;, <span class="comment">// done, return the typelist starting from here</span></div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;seek_if_&lt; <span class="comment">// not done, re-call seek_if_ with the Tail...</span></div><div class="line"> typelist&lt;Tail...&gt;, Fn, N+1&gt;</div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// When empty or when we are one place after the last item return empty typelist</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Fn, index_t N&gt;</div><div class="line"> <span class="keyword">struct </span>seek_if_&lt;typelist&lt;&gt;, Fn, N&gt; {</div><div class="line"> <span class="keyword">using</span> type = typelist&lt;&gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a40"></a><a class="code" href="namespaceutl_1_1meta.html#ab8eafd75f3077a36c4e3363b742da64a">seek_if</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> seek_if_impl::seek_if_&lt;List, Pred, 0&gt;</div><div class="line"> &gt;;</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> T&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a41"></a><a class="code" href="namespaceutl_1_1meta.html#aa550d9dc96d34623af4ce71f8a1eaff5">seek</a> = seek_if &lt;List, same_as&lt;T&gt;&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>count_if_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, <span class="keywordtype">size_t</span>&gt;</div><div class="line"> <span class="keyword">struct </span>count_if_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail, <span class="keyword">typename</span> Fn, <span class="keywordtype">size_t</span> N&gt;</div><div class="line"> <span class="keyword">struct </span>count_if_&lt;typelist&lt;Head, Tail...&gt;, Fn, N&gt; {</div><div class="line"> <span class="comment">// Recursive call to count_if_ up to the end of List, counting all invokes of Fn</span></div><div class="line"> <span class="comment">// returning true_</span></div><div class="line"> <span class="keyword">using</span> type = <a class="code" href="group__type.html#ga39cc4e727a8faa5ea176f543e62c05c0">if_</a> &lt;</div><div class="line"> invoke_t&lt;Fn, Head&gt;,</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> count_if_&lt;typelist&lt;Tail...&gt;, Fn, N+1&gt; <span class="comment">// increase and re-call</span></div><div class="line"> &gt;,</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> count_if_&lt;typelist&lt;Tail...&gt;, Fn, N&gt; <span class="comment">// re-call without increasing</span></div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// At the end of the List return the counter</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Fn, <span class="keywordtype">size_t</span> N&gt;</div><div class="line"> <span class="keyword">struct </span>count_if_&lt;typelist&lt;&gt;, Fn, N&gt; {</div><div class="line"> <span class="keyword">using</span> type = size_&lt;N&gt;;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a42"></a><a class="code" href="namespaceutl_1_1meta.html#a981e18b40d69cdd76466de7bfe24e619">count_if</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> count_if_impl::count_if_&lt;List, Pred, 0&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> T&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a43"></a><a class="code" href="namespaceutl_1_1meta.html#ab5508236016638fa8e6b97cd17dfc9c2">count</a> = count_if&lt;List, same_as&lt;T&gt;&gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>filter_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div><div class="line"> <span class="keyword">struct </span>filter_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail, <span class="keyword">typename</span> Fn, <span class="keyword">typename</span> L&gt;</div><div class="line"> <span class="keyword">struct </span>filter_&lt;typelist&lt;Head, Tail...&gt;, Fn, L&gt; {</div><div class="line"> <span class="comment">// Recursive call to filter_ up to the end of the List, creating a new list</span></div><div class="line"> <span class="comment">// of items for which the invoke of Fn returns true_</span></div><div class="line"> <span class="keyword">using</span> type = <a class="code" href="group__type.html#ga39cc4e727a8faa5ea176f543e62c05c0">if_</a> &lt;</div><div class="line"> invoke_t &lt;Fn, Head&gt;,</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;filter_&lt;typelist&lt;Tail...&gt;, Fn, cat&lt;L, typelist&lt;Head&gt;&gt;&gt;&gt;, <span class="comment">// Add the element and re-call</span></div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;filter_&lt;typelist&lt;Tail...&gt;, Fn, L&gt;&gt; <span class="comment">// re-call with the same list</span></div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// At the end return the produced list</span></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Fn, <span class="keyword">typename</span> L&gt;</div><div class="line"> <span class="keyword">struct </span>filter_&lt;typelist&lt;&gt;, Fn, L&gt; {</div><div class="line"> <span class="keyword">using</span> type = L;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a44"></a><a class="code" href="namespaceutl_1_1meta.html#ac72acc616316c322e750d20a46553ba4">filter</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> filter_impl::filter_&lt;List, Pred, typelist&lt;&gt;&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>replace_if_impl {</div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>, <span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div><div class="line"> <span class="keyword">struct </span>replace_if_ { };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Head, <span class="keyword">typename</span>... Tail, <span class="keyword">typename</span> Fn, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Ret&gt;</div><div class="line"> <span class="keyword">struct </span>replace_if_&lt;typelist&lt;Head, Tail...&gt;, Fn, T, Ret&gt; {</div><div class="line"> <span class="comment">// Recursive call to replace_if_ up to the end of the List, creating a new list</span></div><div class="line"> <span class="comment">// of items based on invocation of Fn</span></div><div class="line"> <span class="keyword">using</span> type = <a class="code" href="group__type.html#ga39cc4e727a8faa5ea176f543e62c05c0">if_</a> &lt;</div><div class="line"> invoke_t&lt;Fn, Head&gt;,</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;replace_if_&lt;typelist&lt;Tail...&gt;, Fn, T, cat&lt;Ret, typelist&lt;T&gt;&gt;&gt;&gt;, <span class="comment">// re-call with change to T</span></div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;replace_if_&lt;typelist&lt;Tail...&gt;, Fn, T, cat&lt;Ret, typelist&lt;Head&gt;&gt;&gt;&gt; <span class="comment">// re-call with no change</span></div><div class="line"> &gt;;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// At the end return the produced list</span></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Fn, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Ret&gt;</div><div class="line"> <span class="keyword">struct </span>replace_if_ &lt;typelist&lt;&gt;, Fn, T, Ret&gt; {</div><div class="line"> <span class="keyword">using</span> type = Ret;</div><div class="line"> };</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred, <span class="keyword">typename</span> T&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a45"></a><a class="code" href="namespaceutl_1_1meta.html#a848a47bf281bf3eaf932cc9113477102">replace_if</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a>&lt;</div><div class="line"> replace_if_impl::replace_if_&lt;List, Pred, T, typelist&lt;&gt;&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a46"></a><a class="code" href="namespaceutl_1_1meta.html#ac9d120f858ebfa2b0ef74c6305a9fb6d">replace</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a> &lt;</div><div class="line"> replace_if &lt;List, same_as&lt;T&gt;, U&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a47"></a><a class="code" href="namespaceutl_1_1meta.html#ace96e2f19376375cc71ee0cd80f4bb75">all_of</a> = <a class="code" href="group__type.html#ga39cc4e727a8faa5ea176f543e62c05c0">if_</a> &lt;</div><div class="line"> empty &lt;List&gt;,</div><div class="line"> <a name="a48"></a><a class="code" href="namespaceutl_1_1meta.html#a55511dbaa0adb605ce22dcec11f8d22d">false_</a>,</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#a58c1744750d0df133034f60a95f87e19">empty</a> &lt;</div><div class="line"> filter &lt;List, compose&lt;quote&lt;not_&gt;, Pred&gt;&gt;</div><div class="line"> &gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a49"></a><a class="code" href="namespaceutl_1_1meta.html#a212c26a29491610187f6e8543f06df5f">any_of</a> = <a name="a50"></a><a class="code" href="group__integral.html#ga16df145331d3c62e624385c5949d90c4">not_</a>&lt;</div><div class="line"> empty&lt;filter &lt;List, Pred&gt;&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> &lt;<span class="keyword">typename</span> List, <span class="keyword">typename</span> Pred&gt;</div><div class="line"> <span class="keyword">using</span> <a name="a51"></a><a class="code" href="namespaceutl_1_1meta.html#af324255cfaa0be3f02843961f5becb85">none_of</a> = <a class="code" href="namespaceutl_1_1meta.html#a58c1744750d0df133034f60a95f87e19">empty</a>&lt;</div><div class="line"> filter &lt;List, Pred&gt;</div><div class="line"> &gt;;</div><div class="line"></div><div class="line">}}</div><div class="line"></div><div class="line"></div><div class="line"><span class="preprocessor">#endif </span><span class="comment">/* __utl_meta_typelist_h__ */</span><span class="preprocessor"></span></div></div><!-- fragment --> </div><!-- contents -->
  96. </div><!-- doc-content -->
  97. <!-- start footer part -->
  98. <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  99. <ul>
  100. <li class="footer">Generated by
  101. <a href="http://www.doxygen.org/index.html">
  102. <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
  103. </ul>
  104. </div>
  105. </body>
  106. </html>