template<sized_range _Range>
using range_size_t = decltype(ranges::size(std::declval<_Range&>()));
+#if __cplusplus > 202302L
+ template<typename _Tp>
+ concept __static_sized_range = sized_range<_Tp> && requires (_Tp& __t)
+ { static_cast<char(*)[size_t(ranges::size(__t) >= 0)]>(nullptr); };
+#endif // C++26
+
template<typename _Derived>
requires is_class_v<_Derived> && same_as<_Derived, remove_cv_t<_Derived>>
class view_interface; // defined in <bits/ranges_util.h>
using mask = basic_mask<sizeof(_Tp), __deduce_abi_t<_Tp, _Np>>;
// [simd.ctor] load constructor constraints
- template <typename _Tp, size_t _Np = -1uz>
- concept __static_sized_range
- = ranges::sized_range<_Tp> && requires(_Tp&& __r) {
- typename integral_constant<size_t, ranges::size(__r)>;
- requires (_Np == -1uz || ranges::size(__r) == _Np);
- };
-
template <typename _Rg>
consteval size_t
__static_range_size(_Rg& __r)
{
- if constexpr (requires { typename integral_constant<size_t, ranges::size(__r)>; })
+ if constexpr (ranges::__static_sized_range<_Rg>)
return ranges::size(__r);
else
return dynamic_extent;
constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
constexpr size_t __static_size = __static_range_size(__r);
- if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ if constexpr (!__allow_out_of_bounds && ranges::__static_sized_range<_Rg>)
static_assert(ranges::size(__r) >= _RV::size(), "given range must have sufficient size");
const auto* __ptr = __f.template _S_adjust_pointer<_RV>(ranges::data(__r));
constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
constexpr auto __static_size = __static_range_size(__r);
- if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ if constexpr (!__allow_out_of_bounds && ranges::__static_sized_range<_Rg>)
static_assert(ranges::size(__r) >= _RV::size(), "given range must have sufficient size");
const auto* __ptr = __f.template _S_adjust_pointer<_RV>(ranges::data(__r));
"'flag_convert' must be used for conversions that are not value-preserving");
constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
- if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ if constexpr (!__allow_out_of_bounds && ranges::__static_sized_range<_Rg>)
static_assert(ranges::size(__r) >= _TV::size(), "given range must have sufficient size");
auto* __ptr = __f.template _S_adjust_pointer<_TV>(ranges::data(__r));
"'flag_convert' must be used for conversions that are not value-preserving");
constexpr bool __allow_out_of_bounds = __f._S_test(__allow_partial_loadstore);
- if constexpr (!__allow_out_of_bounds && __static_sized_range<_Rg>)
+ if constexpr (!__allow_out_of_bounds && ranges::__static_sized_range<_Rg>)
static_assert(ranges::size(__r) >= _TV::size(), "given range must have sufficient size");
auto* __ptr = __f.template _S_adjust_pointer<_TV>(ranges::data(__r));
}
template <ranges::contiguous_range _Rg, typename... _Flags>
- requires __static_sized_range<_Rg, _S_size>
+ requires ranges::__static_sized_range<_Rg>
&& __vectorizable<ranges::range_value_t<_Rg>>
&& __explicitly_convertible_to<ranges::range_value_t<_Rg>, value_type>
[[__gnu__::__always_inline__]]
constexpr
basic_vec(_Rg&& __range, flags<_Flags...> __flags = {})
- : basic_vec(_LoadCtorTag(), __flags.template _S_adjust_pointer<basic_vec>(
- ranges::data(__range)))
+ requires (ranges::size(__range) == _S_size)
+ : basic_vec(_LoadCtorTag(), __flags.template _S_adjust_pointer<basic_vec>(
+ ranges::data(__range)))
{
static_assert(__loadstore_convertible_to<ranges::range_value_t<_Rg>, value_type,
_Flags...>);
{}
template <ranges::contiguous_range _Rg, typename... _Flags>
- requires __static_sized_range<_Rg, _S_size>
+ requires ranges::__static_sized_range<_Rg>
&& __vectorizable<ranges::range_value_t<_Rg>>
&& __explicitly_convertible_to<ranges::range_value_t<_Rg>, value_type>
constexpr
basic_vec(_Rg&& __range, flags<_Flags...> __flags = {})
+ requires (ranges::size(__range) == _S_size)
: basic_vec(_LoadCtorTag(),
__flags.template _S_adjust_pointer<basic_vec>(ranges::data(__range)))
{
// [simd.overview] deduction guide ------------------------------------------
template <ranges::contiguous_range _Rg, typename... _Ts>
- requires __static_sized_range<_Rg>
+ requires ranges::__static_sized_range<_Rg>
basic_vec(_Rg&& __r, _Ts...)
-> basic_vec<ranges::range_value_t<_Rg>,
__deduce_abi_t<ranges::range_value_t<_Rg>,
return meta::extract<const ranges::range_value_t<_Rg>*>(__str);
}
- namespace __detail
- {
- template<typename _Rg>
- concept __statically_sized
- = requires(_Rg&& __r) {
- static_cast<char(*)[static_cast<size_t>(ranges::size(__r))
- >= 0]>(nullptr);
- };
- } // namespace __detail
-
template<ranges::input_range _Rg>
consteval auto
define_static_array(_Rg&& __r)
using _Tp = ranges::range_value_t<_Rg>;
auto __array = meta::reflect_constant_array(__r);
auto __type = meta::type_of(__array);
- if constexpr (__detail::__statically_sized<_Rg>)
+ if constexpr (ranges::__static_sized_range<_Rg>)
{
constexpr size_t __extent = static_cast<size_t>(ranges::size(__r));
if constexpr (__extent)
static_assert(!__streq_to_1("0"));
static_assert(!__streq_to_1("1 "));
- static_assert(__static_sized_range<int[4]>);
- static_assert(__static_sized_range<int[4], 4>);
- static_assert(__static_sized_range<std::array<int, 4>, 4>);
-
static_assert( __value_preserving_convertible_to<int, double>);
static_assert(!__value_preserving_convertible_to<int, float>);
static_assert( __value_preserving_convertible_to<float, double>);