Commit d6c9e372 by Jonathan Wakely

libstdc++: Fix and simplify constraints on std::span constructors

This makes the constraints consistent with the pre-Prague working paper.

	* include/std/span (span::__is_compatible_array): Simplify alias
	template by using requires-clause.
	(span::__is_compatible_ref): New alias template for constraining
	constructors.
	(span::__is_compatible_iterator, span::__is_compatible_range): Remove.
	(span(It, size_type), span(It, End)): Use __is_compatible_ref.
	(span(T(&)[N], span(array<T, N>&), span(const array<T, N>&)): Remove
	redundant parentheses.
	(span(R&&)): Add missing constraints.
parent f09f3242
2020-02-18 Jonathan Wakely <jwakely@redhat.com> 2020-02-18 Jonathan Wakely <jwakely@redhat.com>
* include/std/span (span::__is_compatible_array): Simplify alias
template by using requires-clause.
(span::__is_compatible_ref): New alias template for constraining
constructors.
(span::__is_compatible_iterator, span::__is_compatible_range): Remove.
(span(It, size_type), span(It, End)): Use __is_compatible_ref.
(span(T(&)[N], span(array<T, N>&), span(const array<T, N>&)): Remove
redundant parentheses.
(span(R&&)): Add missing constraints.
* include/std/span (span): Reorder members and rename template * include/std/span (span): Reorder members and rename template
parameters to match declarations in the C++2a working paper. parameters to match declarations in the C++2a working paper.
......
...@@ -123,20 +123,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -123,20 +123,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// _GLIBCXX_RESOLVE_LIB_DEFECTS // _GLIBCXX_RESOLVE_LIB_DEFECTS
// 3255. span's array constructor is too strict // 3255. span's array constructor is too strict
template<typename _Tp, size_t _ArrayExtent> template<typename _Tp, size_t _ArrayExtent>
using __is_compatible_array = __and_< requires (_Extent == dynamic_extent || _ArrayExtent == _Extent)
bool_constant<(_Extent == dynamic_extent || _ArrayExtent == _Extent)>, using __is_compatible_array = __is_array_convertible<_Type, _Tp>;
__is_array_convertible<_Type, _Tp>>;
template<typename _Iter, typename _Ref = iter_reference_t<_Iter>> template<typename _Ref>
using __is_compatible_iterator = __and_< using __is_compatible_ref
bool_constant<contiguous_iterator<_Iter>>, = __is_array_convertible<_Type, remove_reference_t<_Ref>>;
is_lvalue_reference<iter_reference_t<_Iter>>,
is_same<iter_value_t<_Iter>, remove_cvref_t<_Ref>>,
__is_array_convertible<_Type, remove_reference_t<_Ref>>>;
template<typename _Range>
using __is_compatible_range
= __is_compatible_iterator<ranges::iterator_t<_Range>>;
public: public:
// member types // member types
...@@ -165,7 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -165,7 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ } { }
template<contiguous_iterator _It> template<contiguous_iterator _It>
requires (__is_compatible_iterator<_It>::value) requires __is_compatible_ref<iter_reference_t<_It>>::value
constexpr constexpr
span(_It __first, size_type __count) span(_It __first, size_type __count)
noexcept noexcept
...@@ -173,7 +165,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -173,7 +165,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ __glibcxx_assert(_Extent == dynamic_extent || __count == _Extent); } { __glibcxx_assert(_Extent == dynamic_extent || __count == _Extent); }
template<contiguous_iterator _It, sized_sentinel_for<_It> _End> template<contiguous_iterator _It, sized_sentinel_for<_It> _End>
requires (__is_compatible_iterator<_It>::value) requires __is_compatible_ref<iter_reference_t<_It>>::value
&& (!is_convertible_v<_End, size_type>) && (!is_convertible_v<_End, size_type>)
constexpr constexpr
span(_It __first, _End __last) span(_It __first, _End __last)
...@@ -186,32 +178,34 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -186,32 +178,34 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
} }
template<typename _Tp, size_t _ArrayExtent> template<typename _Tp, size_t _ArrayExtent>
requires (__is_compatible_array<_Tp, _ArrayExtent>::value) requires __is_compatible_array<_Tp, _ArrayExtent>::value
constexpr constexpr
span(_Tp (&__arr)[_ArrayExtent]) noexcept span(_Tp (&__arr)[_ArrayExtent]) noexcept
: span(static_cast<pointer>(__arr), _ArrayExtent) : span(static_cast<pointer>(__arr), _ArrayExtent)
{ } { }
template<typename _Tp, size_t _ArrayExtent> template<typename _Tp, size_t _ArrayExtent>
requires (__is_compatible_array<_Tp, _ArrayExtent>::value) requires __is_compatible_array<_Tp, _ArrayExtent>::value
constexpr constexpr
span(array<_Tp, _ArrayExtent>& __arr) noexcept span(array<_Tp, _ArrayExtent>& __arr) noexcept
: span(static_cast<pointer>(__arr.data()), _ArrayExtent) : span(static_cast<pointer>(__arr.data()), _ArrayExtent)
{ } { }
template<typename _Tp, size_t _ArrayExtent> template<typename _Tp, size_t _ArrayExtent>
requires (__is_compatible_array<const _Tp, _ArrayExtent>::value) requires __is_compatible_array<const _Tp, _ArrayExtent>::value
constexpr constexpr
span(const array<_Tp, _ArrayExtent>& __arr) noexcept span(const array<_Tp, _ArrayExtent>& __arr) noexcept
: span(static_cast<pointer>(__arr.data()), _ArrayExtent) : span(static_cast<pointer>(__arr.data()), _ArrayExtent)
{ } { }
template<ranges::contiguous_range _Range> template<typename _Range>
requires (_Extent == dynamic_extent) requires (_Extent == dynamic_extent)
&& ranges::contiguous_range<_Range> && ranges::sized_range<_Range>
&& (ranges::safe_range<_Range> || is_const_v<element_type>)
&& (!__detail::__is_std_span<remove_cvref_t<_Range>>::value) && (!__detail::__is_std_span<remove_cvref_t<_Range>>::value)
&& (!__detail::__is_std_array<remove_cvref_t<_Range>>::value) && (!__detail::__is_std_array<remove_cvref_t<_Range>>::value)
&& (!is_array_v<remove_reference_t<_Range>>) && (!is_array_v<remove_cvref_t<_Range>>)
&& (__is_compatible_range<_Range>::value) && __is_compatible_ref<ranges::range_reference_t<_Range>>::value
constexpr constexpr
span(_Range&& __range) span(_Range&& __range)
noexcept(noexcept(ranges::data(__range)) noexcept(noexcept(ranges::data(__range))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment