|
195 | 195 | <div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> }</div> |
196 | 196 | <div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Fun, ::std::size_t... I></div> |
197 | 197 | <div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keyword">constexpr</span> <span class="keyword">auto</span> apply_elements(::std::index_sequence<I...>, Fun&& fun) -> <span class="keyword">decltype</span>(<span class="keyword">auto</span>) {</div> |
198 | | -<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> return ::std::forward<Fun>(fun)(this-><span class="keyword">template</span> get<I>()...);</div> |
199 | | -<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> }</div> |
200 | | -<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Fun></div> |
201 | | -<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keyword">constexpr</span> <span class="keyword">auto</span> apply(Fun&& fun) -> <span class="keyword">decltype</span>(<span class="keyword">auto</span>) {</div> |
202 | | -<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <span class="keywordflow">return</span> apply_elements(::std::index_sequence_for<T...>{}, ::std::forward<Fun>(fun));</div> |
203 | | -<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> }</div> |
204 | | -<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span>};</div> |
205 | | -<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="keyword">template</span> <<span class="keyword">typename</span>... T></div> |
206 | | -<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span>product_type(T&&...) -> product_type<::std::decay_t<T>...>;</div> |
207 | | -<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> </div> |
208 | | -<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="keyword">template</span> <<span class="keyword">typename</span> T></div> |
209 | | -<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> is_product_type(<span class="keyword">const</span> T&) -> ::std::false_type {</div> |
210 | | -<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordflow">return</span> {};</div> |
211 | | -<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span>}</div> |
212 | | -<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="keyword">template</span> <<span class="keyword">typename</span>... T></div> |
213 | | -<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> is_product_type(const ::beman::execution::detail::product_type<T...>&) -> ::std::true_type {</div> |
214 | | -<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keywordflow">return</span> {};</div> |
215 | | -<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span>}</div> |
216 | | -<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div> |
217 | | -<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span><span class="keyword">template</span> <::std::size_t Start, <span class="keyword">typename</span> Fun, <span class="keyword">typename</span> Tuple, ::std::size_t... I></div> |
218 | | -<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> sub_apply_helper(Fun&& fun, Tuple&& tuple, ::std::index_sequence<I...>) -> <span class="keyword">decltype</span>(<span class="keyword">auto</span>) {</div> |
219 | | -<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="comment">// NOLINTNEXTLINE(bugprone-use-after-move,hicpp-invalid-access-moved)</span></div> |
220 | | -<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> return ::std::forward<Fun>(fun)(::std::forward<Tuple>(tuple).template get<I + Start>()...);</div> |
221 | | -<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span>}</div> |
222 | | -<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div> |
223 | | -<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span><span class="keyword">template</span> <::std::<span class="keywordtype">size_t</span> Start, <span class="keyword">typename</span> Fun, <span class="keyword">typename</span> Tuple></div> |
224 | | -<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> sub_apply(Fun&& fun, Tuple&& tuple) -> <span class="keyword">decltype</span>(<span class="keyword">auto</span>) {</div> |
225 | | -<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> constexpr ::std::size_t TSize{::std::tuple_size_v<::std::remove_cvref_t<Tuple>>};</div> |
226 | | -<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keyword">static_assert</span>(Start <= TSize);</div> |
227 | | -<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">return</span> sub_apply_helper<Start>(</div> |
228 | | -<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> ::std::forward<Fun>(fun), ::std::forward<Tuple>(tuple), ::std::make_index_sequence<TSize - Start>());</div> |
229 | | -<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span>}</div> |
230 | | -<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> </div> |
231 | | -<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span>} <span class="comment">// namespace beman::execution::detail</span></div> |
232 | | -<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> </div> |
233 | | -<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span><span class="keyword">namespace </span>std {</div> |
234 | | -<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span><span class="keyword">template</span> <<span class="keyword">typename</span> T></div> |
235 | | -<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> requires ::beman::execution::detail::is_product_type_c<T></div> |
236 | | -<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"><a class="line" href="structstd_1_1tuple__size_3_01T_01_4.html"> 134</a></span><span class="keyword">struct </span>tuple_size<T> : ::std::integral_constant<std::size_t, T::size()> {};</div> |
| 198 | +<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="preprocessor">#if 0</span></div> |
| 199 | +<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> return ::std::forward<Fun>(fun)(this-><span class="keyword">template</span> get<I>()...);</div> |
| 200 | +<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="preprocessor">#else</span></div> |
| 201 | +<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="comment">//-dk:TODO provide rvalue, lvalue, const lvalue overloads?</span></div> |
| 202 | +<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> return ::std::forward<Fun>(fun)(std::move(this-><span class="keyword">template</span> get<I>())...);</div> |
| 203 | +<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="preprocessor">#endif</span></div> |
| 204 | +<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> }</div> |
| 205 | +<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Fun></div> |
| 206 | +<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keyword">constexpr</span> <span class="keyword">auto</span> apply(Fun&& fun) -> <span class="keyword">decltype</span>(<span class="keyword">auto</span>) {</div> |
| 207 | +<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">return</span> apply_elements(::std::index_sequence_for<T...>{}, ::std::forward<Fun>(fun));</div> |
| 208 | +<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> }</div> |
| 209 | +<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span>};</div> |
| 210 | +<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="keyword">template</span> <<span class="keyword">typename</span>... T></div> |
| 211 | +<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span>product_type(T&&...) -> product_type<::std::decay_t<T>...>;</div> |
| 212 | +<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> </div> |
| 213 | +<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="keyword">template</span> <<span class="keyword">typename</span> T></div> |
| 214 | +<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> is_product_type(<span class="keyword">const</span> T&) -> ::std::false_type {</div> |
| 215 | +<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">return</span> {};</div> |
| 216 | +<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span>}</div> |
| 217 | +<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span><span class="keyword">template</span> <<span class="keyword">typename</span>... T></div> |
| 218 | +<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> is_product_type(const ::beman::execution::detail::product_type<T...>&) -> ::std::true_type {</div> |
| 219 | +<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="keywordflow">return</span> {};</div> |
| 220 | +<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span>}</div> |
| 221 | +<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div> |
| 222 | +<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span><span class="keyword">template</span> <::std::size_t Start, <span class="keyword">typename</span> Fun, <span class="keyword">typename</span> Tuple, ::std::size_t... I></div> |
| 223 | +<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> sub_apply_helper(Fun&& fun, Tuple&& tuple, ::std::index_sequence<I...>) -> <span class="keyword">decltype</span>(<span class="keyword">auto</span>) {</div> |
| 224 | +<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="comment">// NOLINTNEXTLINE(bugprone-use-after-move,hicpp-invalid-access-moved)</span></div> |
| 225 | +<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> return ::std::forward<Fun>(fun)(::std::forward<Tuple>(tuple).template get<I + Start>()...);</div> |
| 226 | +<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span>}</div> |
| 227 | +<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> </div> |
| 228 | +<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="keyword">template</span> <::std::<span class="keywordtype">size_t</span> Start, <span class="keyword">typename</span> Fun, <span class="keyword">typename</span> Tuple></div> |
| 229 | +<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span><span class="keyword">constexpr</span> <span class="keyword">auto</span> sub_apply(Fun&& fun, Tuple&& tuple) -> <span class="keyword">decltype</span>(<span class="keyword">auto</span>) {</div> |
| 230 | +<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> constexpr ::std::size_t TSize{::std::tuple_size_v<::std::remove_cvref_t<Tuple>>};</div> |
| 231 | +<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keyword">static_assert</span>(Start <= TSize);</div> |
| 232 | +<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keywordflow">return</span> sub_apply_helper<Start>(</div> |
| 233 | +<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> ::std::forward<Fun>(fun), ::std::forward<Tuple>(tuple), ::std::make_index_sequence<TSize - Start>());</div> |
| 234 | +<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span>}</div> |
| 235 | +<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> </div> |
| 236 | +<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span>} <span class="comment">// namespace beman::execution::detail</span></div> |
237 | 237 | <div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> </div> |
238 | | -<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span><span class="keyword">template</span> <::std::<span class="keywordtype">size_t</span> I, <span class="keyword">typename</span> T></div> |
239 | | -<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> requires ::beman::execution::detail::is_product_type_c<T></div> |
240 | | -<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"><a class="line" href="structstd_1_1tuple__element_3_01I_00_01T_01_4.html"> 138</a></span><span class="keyword">struct </span>tuple_element<I, T> {</div> |
241 | | -<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keyword">using </span>type = ::std::decay_t<decltype(::std::declval<T>().template get<I>())>;</div> |
242 | | -<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span>};</div> |
243 | | -<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span>} <span class="comment">// namespace std</span></div> |
244 | | -<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> </div> |
245 | | -<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span><span class="comment">// ----------------------------------------------------------------------------</span></div> |
246 | | -<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> </div> |
247 | | -<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span><span class="preprocessor">#include <beman/execution/detail/suppress_pop.hpp></span></div> |
248 | | -<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> </div> |
249 | | -<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span><span class="preprocessor">#endif</span></div> |
| 238 | +<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span><span class="keyword">namespace </span>std {</div> |
| 239 | +<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span><span class="keyword">template</span> <<span class="keyword">typename</span> T></div> |
| 240 | +<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> requires ::beman::execution::detail::is_product_type_c<T></div> |
| 241 | +<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"><a class="line" href="structstd_1_1tuple__size_3_01T_01_4.html"> 139</a></span><span class="keyword">struct </span>tuple_size<T> : ::std::integral_constant<std::size_t, T::size()> {};</div> |
| 242 | +<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> </div> |
| 243 | +<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span><span class="keyword">template</span> <::std::<span class="keywordtype">size_t</span> I, <span class="keyword">typename</span> T></div> |
| 244 | +<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> requires ::beman::execution::detail::is_product_type_c<T></div> |
| 245 | +<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"><a class="line" href="structstd_1_1tuple__element_3_01I_00_01T_01_4.html"> 143</a></span><span class="keyword">struct </span>tuple_element<I, T> {</div> |
| 246 | +<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keyword">using </span>type = ::std::decay_t<decltype(::std::declval<T>().template get<I>())>;</div> |
| 247 | +<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span>};</div> |
| 248 | +<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span>} <span class="comment">// namespace std</span></div> |
| 249 | +<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div> |
| 250 | +<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span><span class="comment">// ----------------------------------------------------------------------------</span></div> |
| 251 | +<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div> |
| 252 | +<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><span class="preprocessor">#include <beman/execution/detail/suppress_pop.hpp></span></div> |
| 253 | +<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div> |
| 254 | +<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span><span class="preprocessor">#endif</span></div> |
250 | 255 | </div><!-- fragment --></div><!-- contents --> |
251 | 256 | </div><!-- doc-content --> |
252 | 257 | <!-- start footer part --> |
|
0 commit comments