|
1731 | 1731 | concept @\defexposconceptnc{completion-tag}@ = // \expos
|
1732 | 1732 | @\libconcept{same_as}@<Tag, set_value_t> || @\libconcept{same_as}@<Tag, set_error_t> || @\libconcept{same_as}@<Tag, set_stopped_t>;
|
1733 | 1733 |
|
1734 |
| - struct @\exposidnc{default-impls}@ { // \expos |
1735 |
| - static constexpr auto @\exposidnc{get-attrs}@ = @\seebelownc@; // \expos |
1736 |
| - static constexpr auto @\exposidnc{get-env}@ = @\seebelownc@; // \expos |
1737 |
| - static constexpr auto @\exposidnc{get-state}@ = @\seebelownc@; // \expos |
1738 |
| - static constexpr auto @\exposidnc{start}@ = @\seebelownc@; // \expos |
1739 |
| - static constexpr auto @\exposidnc{complete}@ = @\seebelownc@; // \expos |
1740 |
| - |
1741 |
| - template<class Sndr, class... Env> |
1742 |
| - static consteval void @\exposidnc{check-types}@(); // \expos |
1743 |
| - }; |
1744 |
| - |
1745 |
| - template<class Tag> |
1746 |
| - struct @\exposidnc{impls-for}@ : @\exposidnc{default-impls}@ {}; // \expos |
1747 |
| - |
1748 | 1734 | template<class Sndr, class Rcvr> // \expos
|
1749 | 1735 | using @\exposid{state-type}@ = decay_t<@\exposid{call-result-t}@<
|
1750 | 1736 | decltype(@\exposid{impls-for}@<tag_of_t<Sndr>>::@\exposid{get-state}@), Sndr, Rcvr&>>;
|
|
1772 | 1758 | Rcvr @\exposidnc{rcvr}@; // \expos
|
1773 | 1759 | @\exposidnc{state-type}@<Sndr, Rcvr> @\exposidnc{state}@; // \expos
|
1774 | 1760 | };
|
| 1761 | +} |
| 1762 | +\end{codeblock} |
| 1763 | + |
| 1764 | +\pnum |
| 1765 | +The expression in the \tcode{noexcept} clause of |
| 1766 | +the constructor of \exposid{basic-state} is |
| 1767 | +\begin{codeblock} |
| 1768 | +is_nothrow_move_constructible_v<Rcvr> && |
| 1769 | +@\exposconcept{nothrow-callable}@<decltype(@\exposid{impls-for}@<tag_of_t<Sndr>>::@\exposid{get-state}@), Sndr, Rcvr&> && |
| 1770 | +(@\libconcept{same_as}@<@\exposid{state-type}@<Sndr, Rcvr>, @\exposid{get-state-result}@> || |
| 1771 | + is_nothrow_constructible_v<@\exposid{state-type}@<Sndr, Rcvr>, @\exposid{get-state-result}@>) |
| 1772 | +\end{codeblock} |
| 1773 | +where \exposid{get-state-result} is |
| 1774 | +\begin{codeblock} |
| 1775 | +@\exposid{call-result-t}@<decltype(@\exposid{impls-for}@<tag_of_t<Sndr>>::@\exposid{get-state}@), Sndr, Rcvr&>. |
| 1776 | +\end{codeblock} |
1775 | 1777 |
|
| 1778 | +\pnum |
| 1779 | +\begin{codeblock} |
| 1780 | +namespace std::execution { |
1776 | 1781 | template<class Sndr, class Rcvr, class Index>
|
1777 | 1782 | requires @\exposconcept{valid-specialization}@<@\exposid{env-type}@, Index, Sndr, Rcvr>
|
1778 | 1783 | struct @\exposidnc{basic-receiver}@ { // \expos
|
|
1805 | 1810 |
|
1806 | 1811 | @\exposidnc{basic-state}@<Sndr, Rcvr>* @\exposidnc{op}@; // \expos
|
1807 | 1812 | };
|
| 1813 | +} |
| 1814 | +\end{codeblock} |
1808 | 1815 |
|
| 1816 | +\begin{codeblock} |
| 1817 | +namespace std::execution { |
1809 | 1818 | constexpr auto @\exposidnc{connect-all}@ = @\seebelownc@; // \expos
|
1810 | 1819 |
|
1811 | 1820 | template<class Sndr, class Rcvr>
|
1812 | 1821 | using @\exposidnc{connect-all-result}@ = @\exposidnc{call-result-t}@< // \expos
|
1813 | 1822 | decltype(@\exposid{connect-all}@), @\exposid{basic-state}@<Sndr, Rcvr>*, Sndr, @\exposid{indices-for}@<Sndr>>;
|
1814 |
| - |
1815 |
| - template<class Sndr, class Rcvr> |
1816 |
| - requires @\exposconcept{valid-specialization}@<@\exposid{state-type}@, Sndr, Rcvr> && |
1817 |
| - @\exposconcept{valid-specialization}@<@\exposid{connect-all-result}@, Sndr, Rcvr> |
1818 |
| - struct @\exposidnc{basic-operation}@ : @\exposidnc{basic-state}@<Sndr, Rcvr> { // \expos |
1819 |
| - using operation_state_concept = operation_state_t; |
1820 |
| - using @\exposidnc{tag-t}@ = tag_of_t<Sndr>; // \expos |
1821 |
| - |
1822 |
| - @\exposidnc{connect-all-result}@<Sndr, Rcvr> @\exposidnc{inner-ops}@; // \expos |
1823 |
| - |
1824 |
| - @\exposidnc{basic-operation}@(Sndr&& sndr, Rcvr&& rcvr) noexcept(@\seebelownc@) // \expos |
1825 |
| - : @\exposid{basic-state}@<Sndr, Rcvr>(std::forward<Sndr>(sndr), std::move(rcvr)), |
1826 |
| - @\exposid{inner-ops}@(@\exposid{connect-all}@(this, std::forward<Sndr>(sndr), @\exposid{indices-for}@<Sndr>())) |
1827 |
| - {} |
1828 |
| - |
1829 |
| - void start() & noexcept { |
1830 |
| - auto& [...ops] = @\exposid{inner-ops}@; |
1831 |
| - @\exposid{impls-for}@<tag-t>::@\exposid{start}@(this->@\exposid{state}@, this->@\exposid{rcvr}@, ops...); |
1832 |
| - } |
1833 |
| - }; |
1834 |
| - |
1835 |
| - template<class Tag, class Data, class... Child> |
1836 |
| - struct @\exposidnc{basic-sender}@ : @\exposidnc{product-type}@<Tag, Data, Child...> { // \expos |
1837 |
| - using sender_concept = sender_t; |
1838 |
| - using @\exposidnc{indices-for}@ = index_sequence_for<Child...>; // \expos |
1839 |
| - |
1840 |
| - decltype(auto) get_env() const noexcept { |
1841 |
| - auto& [_, data, ...child] = *this; |
1842 |
| - return @\exposid{impls-for}@<Tag>::@\exposid{get-attrs}@(data, child...); |
1843 |
| - } |
1844 |
| - |
1845 |
| - template<@\exposconcept{decays-to}@<@\exposid{basic-sender}@> Self, @\libconcept{receiver}@ Rcvr> |
1846 |
| - auto connect(this Self&& self, Rcvr rcvr) noexcept(@\seebelow@) |
1847 |
| - -> @\exposid{basic-operation}@<Self, Rcvr> { |
1848 |
| - return {std::forward<Self>(self), std::move(rcvr)}; |
1849 |
| - } |
1850 |
| - |
1851 |
| - template<@\exposconcept{decays-to}@<@\exposid{basic-sender}@> Self, class... Env> |
1852 |
| - static constexpr auto get_completion_signatures(); |
1853 |
| - }; |
1854 | 1823 | }
|
1855 | 1824 | \end{codeblock}
|
1856 | 1825 |
|
1857 |
| -\pnum |
1858 |
| -It is unspecified whether a specialization of \exposid{basic-sender} |
1859 |
| -is an aggregate. |
1860 |
| - |
1861 |
| -\pnum |
1862 |
| -An expression of type \exposid{basic-sender} is usable as |
1863 |
| -the initializer of a structured binding declaration\iref{dcl.struct.bind}. |
1864 |
| - |
1865 |
| -\pnum |
1866 |
| -The expression in the \tcode{noexcept} clause of |
1867 |
| -the constructor of \exposid{basic-state} is |
1868 |
| -\begin{codeblock} |
1869 |
| -is_nothrow_move_constructible_v<Rcvr> && |
1870 |
| -@\exposconcept{nothrow-callable}@<decltype(@\exposid{impls-for}@<tag_of_t<Sndr>>::@\exposid{get-state}@), Sndr, Rcvr&> && |
1871 |
| -(@\libconcept{same_as}@<@\exposid{state-type}@<Sndr, Rcvr>, @\exposid{get-state-result}@> || |
1872 |
| - is_nothrow_constructible_v<@\exposid{state-type}@<Sndr, Rcvr>, @\exposid{get-state-result}@>) |
1873 |
| -\end{codeblock} |
1874 |
| -where \exposid{get-state-result} is |
1875 |
| -\begin{codeblock} |
1876 |
| -@\exposid{call-result-t}@<decltype(@\exposid{impls-for}@<tag_of_t<Sndr>>::@\exposid{get-state}@), Sndr, Rcvr&>. |
1877 |
| -\end{codeblock} |
1878 |
| - |
1879 | 1826 | \pnum
|
1880 | 1827 | The object \exposid{connect-all} is initialized with
|
1881 | 1828 | a callable object equivalent to the following lambda:
|
|
1902 | 1849 | otherwise, \tcode{false}.
|
1903 | 1850 | \end{itemdescr}
|
1904 | 1851 |
|
| 1852 | +\pnum |
| 1853 | +\begin{codeblock} |
| 1854 | +namespace std::execution { |
| 1855 | + template<class Sndr, class Rcvr> |
| 1856 | + requires @\exposconcept{valid-specialization}@<@\exposid{state-type}@, Sndr, Rcvr> && |
| 1857 | + @\exposconcept{valid-specialization}@<@\exposid{connect-all-result}@, Sndr, Rcvr> |
| 1858 | + struct @\exposidnc{basic-operation}@ : @\exposidnc{basic-state}@<Sndr, Rcvr> { // \expos |
| 1859 | + using operation_state_concept = operation_state_t; |
| 1860 | + using @\exposidnc{tag-t}@ = tag_of_t<Sndr>; // \expos |
| 1861 | + |
| 1862 | + @\exposidnc{connect-all-result}@<Sndr, Rcvr> @\exposidnc{inner-ops}@; // \expos |
| 1863 | + |
| 1864 | + @\exposidnc{basic-operation}@(Sndr&& sndr, Rcvr&& rcvr) noexcept(@\seebelownc@) // \expos |
| 1865 | + : @\exposid{basic-state}@<Sndr, Rcvr>(std::forward<Sndr>(sndr), std::move(rcvr)), |
| 1866 | + @\exposid{inner-ops}@(@\exposid{connect-all}@(this, std::forward<Sndr>(sndr), @\exposid{indices-for}@<Sndr>())) |
| 1867 | + {} |
| 1868 | + |
| 1869 | + void start() & noexcept { |
| 1870 | + auto& [...ops] = @\exposid{inner-ops}@; |
| 1871 | + @\exposid{impls-for}@<tag-t>::@\exposid{start}@(this->@\exposid{state}@, this->@\exposid{rcvr}@, ops...); |
| 1872 | + } |
| 1873 | + }; |
| 1874 | +} |
| 1875 | +\end{codeblock} |
| 1876 | + |
1905 | 1877 | \pnum
|
1906 | 1878 | The expression in the \tcode{noexcept} clause of
|
1907 | 1879 | the constructor of \exposid{basic-operation} is:
|
|
1911 | 1883 | \end{codeblock}
|
1912 | 1884 |
|
1913 | 1885 | \pnum
|
1914 |
| -The expression in the \tcode{noexcept} clause of |
1915 |
| -the \tcode{connect} member function of \exposid{basic-sender} is: |
1916 | 1886 | \begin{codeblock}
|
1917 |
| -is_nothrow_constructible_v<@\exposid{basic-operation}@<Self, Rcvr>, Self, Rcvr> |
| 1887 | +namespace std::execution { |
| 1888 | + struct @\exposidnc{default-impls}@ { // \expos |
| 1889 | + static constexpr auto @\exposidnc{get-attrs}@ = @\seebelownc@; // \expos |
| 1890 | + static constexpr auto @\exposidnc{get-env}@ = @\seebelownc@; // \expos |
| 1891 | + static constexpr auto @\exposidnc{get-state}@ = @\seebelownc@; // \expos |
| 1892 | + static constexpr auto @\exposidnc{start}@ = @\seebelownc@; // \expos |
| 1893 | + static constexpr auto @\exposidnc{complete}@ = @\seebelownc@; // \expos |
| 1894 | + |
| 1895 | + template<class Sndr, class... Env> |
| 1896 | + static consteval void @\exposidnc{check-types}@(); // \expos |
| 1897 | + }; |
| 1898 | + |
| 1899 | + template<class Tag> |
| 1900 | + struct @\exposidnc{impls-for}@ : @\exposidnc{default-impls}@ {}; // \expos |
| 1901 | +} |
1918 | 1902 | \end{codeblock}
|
1919 | 1903 |
|
1920 | 1904 | \pnum
|
|
2004 | 1988 | \end{note}
|
2005 | 1989 | \end{itemdescr}
|
2006 | 1990 |
|
| 1991 | +\pnum |
| 1992 | +\begin{codeblock} |
| 1993 | +namespace std::execution { |
| 1994 | + template<class Tag, class Data, class... Child> |
| 1995 | + struct @\exposidnc{basic-sender}@ : @\exposidnc{product-type}@<Tag, Data, Child...> { // \expos |
| 1996 | + using sender_concept = sender_t; |
| 1997 | + using @\exposidnc{indices-for}@ = index_sequence_for<Child...>; // \expos |
| 1998 | + |
| 1999 | + decltype(auto) get_env() const noexcept { |
| 2000 | + auto& [_, data, ...child] = *this; |
| 2001 | + return @\exposid{impls-for}@<Tag>::@\exposid{get-attrs}@(data, child...); |
| 2002 | + } |
| 2003 | + |
| 2004 | + template<@\exposconcept{decays-to}@<@\exposid{basic-sender}@> Self, @\libconcept{receiver}@ Rcvr> |
| 2005 | + auto connect(this Self&& self, Rcvr rcvr) noexcept(@\seebelow@) |
| 2006 | + -> @\exposid{basic-operation}@<Self, Rcvr> { |
| 2007 | + return {std::forward<Self>(self), std::move(rcvr)}; |
| 2008 | + } |
| 2009 | + |
| 2010 | + template<@\exposconcept{decays-to}@<@\exposid{basic-sender}@> Self, class... Env> |
| 2011 | + static constexpr auto get_completion_signatures(); |
| 2012 | + }; |
| 2013 | +} |
| 2014 | +\end{codeblock} |
| 2015 | + |
| 2016 | +\pnum |
| 2017 | +It is unspecified whether a specialization of \exposid{basic-sender} |
| 2018 | +is an aggregate. |
| 2019 | + |
| 2020 | +\pnum |
| 2021 | +An expression of type \exposid{basic-sender} is usable as |
| 2022 | +the initializer of a structured binding declaration\iref{dcl.struct.bind}. |
| 2023 | + |
| 2024 | +\pnum |
| 2025 | +The expression in the \tcode{noexcept} clause of |
| 2026 | +the \tcode{connect} member function of \exposid{basic-sender} is: |
| 2027 | +\begin{codeblock} |
| 2028 | +is_nothrow_constructible_v<@\exposid{basic-operation}@<Self, Rcvr>, Self, Rcvr> |
| 2029 | +\end{codeblock} |
| 2030 | + |
2007 | 2031 | \indexlibrarymember{get_completion_signatures}{\exposid{basic-sender}}%
|
2008 | 2032 | \begin{itemdecl}
|
2009 | 2033 | template<class Tag, class Data, class... Child>
|
|
0 commit comments