|
16232 | 16232 | bool_constant<T() == T::value>::value && |
16233 | 16233 | bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value; |
16234 | 16234 |
|
| 16235 | +template<class From, class To> |
| 16236 | + concept @\defexposconceptnc{explicitly-convertible-to}@ = // \expos |
| 16237 | + requires { |
| 16238 | + static_cast<To>(declval<From>()); |
| 16239 | + }; |
| 16240 | + |
16235 | 16241 | template<class T> using @\exposidnc{deduced-vec-t} = \seebelownc@; // \expos |
16236 | 16242 |
|
16237 | 16243 | template<class V, class T> using @\exposidnc{make-compatible-simd-t} = \seebelownc@; // \expos |
@@ -16576,54 +16582,46 @@ |
16576 | 16582 | flags<Flags...> f = {}); |
16577 | 16583 |
|
16578 | 16584 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
16579 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 16585 | + requires ranges::@\libconcept{sized_range}@<R> |
16580 | 16586 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r, |
16581 | 16587 | flags<Flags...> f = {}); |
16582 | 16588 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
16583 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 16589 | + requires ranges::@\libconcept{sized_range}@<R> |
16584 | 16590 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r, |
16585 | 16591 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
16586 | 16592 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
16587 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16588 | 16593 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, |
16589 | 16594 | iter_difference_t<I> n, flags<Flags...> f = {}); |
16590 | 16595 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
16591 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16592 | 16596 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, |
16593 | 16597 | iter_difference_t<I> n, const typename basic_vec<T, Abi>::mask_type& mask, |
16594 | 16598 | flags<Flags...> f = {}); |
16595 | 16599 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
16596 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16597 | 16600 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last, |
16598 | 16601 | flags<Flags...> f = {}); |
16599 | 16602 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
16600 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16601 | 16603 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last, |
16602 | 16604 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
16603 | 16605 |
|
16604 | 16606 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
16605 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 16607 | + requires ranges::@\libconcept{sized_range}@<R> |
16606 | 16608 | constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r, |
16607 | 16609 | flags<Flags...> f = {}); |
16608 | 16610 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
16609 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 16611 | + requires ranges::@\libconcept{sized_range}@<R> |
16610 | 16612 | constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r, |
16611 | 16613 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
16612 | 16614 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
16613 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16614 | 16615 | constexpr void partial_store( |
16615 | 16616 | const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, flags<Flags...> f = {}); |
16616 | 16617 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
16617 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16618 | 16618 | constexpr void partial_store( |
16619 | 16619 | const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, |
16620 | 16620 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
16621 | 16621 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
16622 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16623 | 16622 | constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last, |
16624 | 16623 | flags<Flags...> f = {}); |
16625 | 16624 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
16626 | | - requires @\libconcept{indirectly_writable}@<I, T> |
16627 | 16625 | constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last, |
16628 | 16626 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
16629 | 16627 |
|
|
17747 | 17745 | \begin{itemdescr} |
17748 | 17746 | \pnum |
17749 | 17747 | \constraints |
17750 | | -\tcode{\exposid{simd-size-v}<U, UAbi> == size()} is \tcode{true}. |
| 17748 | +\begin{itemize} |
| 17749 | + \item |
| 17750 | + \tcode{\exposid{simd-size-v}<U, UAbi> == size()} is \tcode{true}, and |
| 17751 | + \item |
| 17752 | + \tcode{U} satisfies \tcode{exposconcept{explicitly-convertible-to}<T>}. |
| 17753 | +\end{itemize} |
17751 | 17754 |
|
17752 | 17755 | \pnum |
17753 | 17756 | \effects |
@@ -17819,20 +17822,17 @@ |
17819 | 17822 | \begin{itemize} |
17820 | 17823 | \item \tcode{R} models \tcode{ranges::\libconcept{contiguous_range}} and |
17821 | 17824 | \tcode{ranges::\libconcept{sized_range}}, |
17822 | | -\item \tcode{ranges::size(r)} is a constant expression, and |
17823 | | -\item \tcode{ranges::size(r)} is equal to \tcode{size()}. |
| 17825 | +\item \tcode{ranges::size(r)} is a constant expression, |
| 17826 | +\item \tcode{ranges::size(r)} is equal to \tcode{size()}, and |
| 17827 | +\item \tcode{ranges::range_value_t<R>} is a vectorizable type and satisfies |
| 17828 | + \tcode{\exposconcept{explicitly-convertible-to}<T>}. |
17824 | 17829 | \end{itemize} |
17825 | 17830 |
|
17826 | 17831 | \pnum |
17827 | 17832 | \mandates |
17828 | | -\begin{itemize} |
17829 | | - \item |
17830 | | - \tcode{ranges::range_value_t<R>} is a vectorizable type, and |
17831 | | - \item |
17832 | | - if the template parameter pack \tcode{Flags} does not contain |
17833 | | - \tcode{\exposid{convert-flag}}, then the conversion from |
17834 | | - \tcode{ranges::range_value_t<R>} to \tcode{value_type} is value-preserving. |
17835 | | -\end{itemize} |
| 17833 | +If the template parameter pack \tcode{Flags} does not contain |
| 17834 | +\tcode{\exposid{convert-flag}}, then the conversion from |
| 17835 | +\tcode{ranges::range_value_t<R>} to \tcode{value_type} is value-preserving. |
17836 | 17836 |
|
17837 | 17837 | \pnum |
17838 | 17838 | \expects |
|
18575 | 18575 | \mandates |
18576 | 18576 | \begin{itemize} |
18577 | 18577 | \item |
18578 | | - \tcode{ranges::range_value_t<R>} is a vectorizable type, |
| 18578 | + \tcode{ranges::range_value_t<R>} is a vectorizable type and satisfies |
| 18579 | + \tcode{\exposconcept{explicitly-convertible-to}<T>}, |
18579 | 18580 | \item |
18580 | 18581 | \tcode{same_as<remove_cvref_t<V>, V>} is \tcode{true}, |
18581 | 18582 | \item |
@@ -18622,26 +18623,22 @@ |
18622 | 18623 | \indexlibrarymember{unchecked_store}{simd} |
18623 | 18624 | \begin{itemdecl} |
18624 | 18625 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
18625 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 18626 | + requires ranges::@\libconcept{sized_range}@<R> |
18626 | 18627 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r, flags<Flags...> f = {}); |
18627 | 18628 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
18628 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 18629 | + requires ranges::@\libconcept{sized_range}@<R> |
18629 | 18630 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, R&& r, |
18630 | 18631 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
18631 | 18632 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
18632 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18633 | 18633 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, |
18634 | 18634 | flags<Flags...> f = {}); |
18635 | 18635 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
18636 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18637 | 18636 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, |
18638 | 18637 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
18639 | 18638 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
18640 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18641 | 18639 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last, |
18642 | 18640 | flags<Flags...> f = {}); |
18643 | 18641 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
18644 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18645 | 18642 | constexpr void unchecked_store(const basic_vec<T, Abi>& v, I first, S last, |
18646 | 18643 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
18647 | 18644 | \end{itemdecl} |
@@ -18688,26 +18685,22 @@ |
18688 | 18685 | \indexlibrarymember{partial_store}{simd} |
18689 | 18686 | \begin{itemdecl} |
18690 | 18687 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
18691 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 18688 | + requires ranges::@\libconcept{sized_range}@<R> |
18692 | 18689 | constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r, flags<Flags...> f = {}); |
18693 | 18690 | template<class T, class Abi, ranges::@\libconcept{contiguous_range}@ R, class... Flags> |
18694 | | - requires ranges::@\libconcept{sized_range}@<R> && @\libconcept{indirectly_writable}@<ranges::iterator_t<R>, T> |
| 18691 | + requires ranges::@\libconcept{sized_range}@<R> |
18695 | 18692 | constexpr void partial_store(const basic_vec<T, Abi>& v, R&& r, |
18696 | 18693 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
18697 | 18694 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
18698 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18699 | 18695 | constexpr void partial_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, |
18700 | 18696 | flags<Flags...> f = {}); |
18701 | 18697 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, class... Flags> |
18702 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18703 | 18698 | constexpr void partial_store(const basic_vec<T, Abi>& v, I first, iter_difference_t<I> n, |
18704 | 18699 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
18705 | 18700 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
18706 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18707 | 18701 | constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last, |
18708 | 18702 | flags<Flags...> f = {}); |
18709 | 18703 | template<class T, class Abi, @\libconcept{contiguous_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S, class... Flags> |
18710 | | - requires @\libconcept{indirectly_writable}@<I, T> |
18711 | 18704 | constexpr void partial_store(const basic_vec<T, Abi>& v, I first, S last, |
18712 | 18705 | const typename basic_vec<T, Abi>::mask_type& mask, flags<Flags...> f = {}); |
18713 | 18706 | \end{itemdecl} |
|
18728 | 18721 | parameter. |
18729 | 18722 | \end{itemize} |
18730 | 18723 |
|
| 18724 | +\pnum |
| 18725 | +\constraints |
| 18726 | +\begin{itemize} |
| 18727 | + \item |
| 18728 | + \tcode{ranges::iterator_t<R>} satisfies |
| 18729 | + \tcode{\libconcept{indirectly_writable}<ranges::range_value_t<R>>}, and |
| 18730 | + \item |
| 18731 | + \tcode{T} satisfies |
| 18732 | + \tcode{\exposconcept{explicitly-convertible-to}<ranges::range_value_t<R>>}. |
| 18733 | +\end{itemize} |
| 18734 | + |
18731 | 18735 | \pnum |
18732 | 18736 | \mandates |
18733 | 18737 | \begin{itemize} |
|
18763 | 18767 | \effects |
18764 | 18768 | For all $i$ in the range of \range{0}{basic_vec<T, Abi>::size()}, if |
18765 | 18769 | \tcode{mask[$i$] \&\& $i$ < ranges::\brk{}size(r)} is \tcode{true}, evaluates |
18766 | | -\tcode{ranges::data(r)[$i$] = v[$i$]}. |
| 18770 | +\tcode{ranges::data(r)[$i$] = static_cast<ranges::range_value_t<R>>(v[$i$])}. |
18767 | 18771 | \end{itemdescr} |
18768 | 18772 |
|
18769 | 18773 | \rSec3[simd.permute.static]{Static permute} |
|
18995 | 18999 | \tcode{T} be \tcode{typename V::value_type}. |
18996 | 19000 | \end{itemize} |
18997 | 19001 |
|
| 19002 | +\pnum |
| 19003 | +\constraints |
| 19004 | +\tcode{ranges::range_value_t<R>} is a vectorizable type and satisfies |
| 19005 | +\tcode{\exposconcept{explicitly-convertible-to}<T>}. |
| 19006 | + |
18998 | 19007 | \pnum |
18999 | 19008 | \mandates |
19000 | 19009 | \begin{itemize} |
|
19086 | 19095 |
|
19087 | 19096 | \pnum |
19088 | 19097 | \constraints |
19089 | | -\tcode{V::size() == I::size()} is \tcode{true}. |
| 19098 | +\begin{itemize} |
| 19099 | + \item |
| 19100 | + \tcode{V::size() == I::size()} is \tcode{true}, |
| 19101 | + \item |
| 19102 | + \tcode{ranges::iterator_t<R>} satisfies |
| 19103 | + \tcode{\libconcept{indirectly_writable}<ranges::range_value_t<R>>}, and |
| 19104 | + \item |
| 19105 | + \tcode{typename V::value_type} satisfies |
| 19106 | + \tcode{\exposconcept{explicitly-convertible-to}<ranges::range_value_t<R>>}. |
| 19107 | +\end{itemize} |
19090 | 19108 |
|
19091 | 19109 | \pnum |
19092 | 19110 | \mandates |
|
0 commit comments