diff --git a/libcxx/include/span b/libcxx/include/span --- a/libcxx/include/span +++ b/libcxx/include/span @@ -46,9 +46,7 @@ using reference = element_type&; using const_reference = const element_type&; using iterator = implementation-defined; - using const_iterator = implementation-defined; using reverse_iterator = std::reverse_iterator; - using const_reverse_iterator = std::reverse_iterator; static constexpr size_type extent = Extent; // [span.cons], span constructors, copy, assignment, and destructor @@ -97,12 +95,8 @@ // [span.iterators], span iterator support constexpr iterator begin() const noexcept; constexpr iterator end() const noexcept; - constexpr const_iterator cbegin() const noexcept; - constexpr const_iterator cend() const noexcept; constexpr reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() const noexcept; - constexpr const_reverse_iterator crbegin() const noexcept; - constexpr const_reverse_iterator crend() const noexcept; private: pointer data_; // exposition only @@ -201,9 +195,7 @@ using reference = _Tp &; using const_reference = const _Tp &; using iterator = __wrap_iter; - using const_iterator = __wrap_iter; using reverse_iterator = _VSTD::reverse_iterator; - using const_reverse_iterator = _VSTD::reverse_iterator; static constexpr size_type extent = _Extent; @@ -322,12 +314,8 @@ // [span.iter], span iterator support _LIBCPP_INLINE_VISIBILITY constexpr iterator begin() const noexcept { return iterator(data()); } _LIBCPP_INLINE_VISIBILITY constexpr iterator end() const noexcept { return iterator(data() + size()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cbegin() const noexcept { return const_iterator(data()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cend() const noexcept { return const_iterator(data() + size()); } _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator(end()); } _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rend() const noexcept { return reverse_iterator(begin()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); } _LIBCPP_INLINE_VISIBILITY constexpr void swap(span &__other) noexcept { @@ -363,9 +351,7 @@ using reference = _Tp &; using const_reference = const _Tp &; using iterator = __wrap_iter; - using const_iterator = __wrap_iter; using reverse_iterator = _VSTD::reverse_iterator; - using const_reverse_iterator = _VSTD::reverse_iterator; static constexpr size_type extent = dynamic_extent; @@ -492,12 +478,8 @@ // [span.iter], span iterator support _LIBCPP_INLINE_VISIBILITY constexpr iterator begin() const noexcept { return iterator(data()); } _LIBCPP_INLINE_VISIBILITY constexpr iterator end() const noexcept { return iterator(data() + size()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cbegin() const noexcept { return const_iterator(data()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_iterator cend() const noexcept { return const_iterator(data() + size()); } _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator(end()); } _LIBCPP_INLINE_VISIBILITY constexpr reverse_iterator rend() const noexcept { return reverse_iterator(begin()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); } - _LIBCPP_INLINE_VISIBILITY constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); } _LIBCPP_INLINE_VISIBILITY constexpr void swap(span &__other) noexcept { diff --git a/libcxx/test/std/containers/views/span.iterators/begin.pass.cpp b/libcxx/test/std/containers/views/span.iterators/begin.pass.cpp --- a/libcxx/test/std/containers/views/span.iterators/begin.pass.cpp +++ b/libcxx/test/std/containers/views/span.iterators/begin.pass.cpp @@ -22,22 +22,17 @@ constexpr bool testConstexprSpan(Span s) { bool ret = true; - typename Span::iterator b = s. begin(); - typename Span::const_iterator cb = s.cbegin(); + typename Span::iterator b = s.begin(); if (s.empty()) { - ret = ret && ( b == s.end()); - ret = ret && (cb == s.cend()); + ret = ret && (b == s.end()); } else { - ret = ret && ( *b == s[0]); - ret = ret && ( &*b == &s[0]); - ret = ret && ( *cb == s[0]); - ret = ret && (&*cb == &s[0]); + ret = ret && ( *b == s[0]); + ret = ret && (&*b == &s[0]); } - ret = ret && (b == cb); return ret; } @@ -45,22 +40,17 @@ template void testRuntimeSpan(Span s) { - typename Span::iterator b = s. begin(); - typename Span::const_iterator cb = s.cbegin(); + typename Span::iterator b = s.begin(); if (s.empty()) { - assert( b == s.end()); - assert(cb == s.cend()); + assert(b == s.end()); } else { - assert( *b == s[0]); - assert( &*b == &s[0]); - assert( *cb == s[0]); - assert(&*cb == &s[0]); + assert( *b == s[0]); + assert(&*b == &s[0]); } - assert(b == cb); } struct A{}; diff --git a/libcxx/test/std/containers/views/span.iterators/end.pass.cpp b/libcxx/test/std/containers/views/span.iterators/end.pass.cpp --- a/libcxx/test/std/containers/views/span.iterators/end.pass.cpp +++ b/libcxx/test/std/containers/views/span.iterators/end.pass.cpp @@ -22,52 +22,38 @@ constexpr bool testConstexprSpan(Span s) { bool ret = true; - typename Span::iterator e = s. end(); - typename Span::const_iterator ce = s.cend(); + typename Span::iterator e = s.end(); if (s.empty()) { - ret = ret && ( e == s.begin()); - ret = ret && (ce == s.cbegin()); + ret = ret && (e == s.begin()); } else { - typename Span::const_pointer last = &*(s.cbegin() + s.size() - 1); - ret = ret && ( e != s.begin()); - ret = ret && (ce != s.cbegin()); + typename Span::const_pointer last = &*(s.begin() + s.size() - 1); + ret = ret && (e != s.begin()); ret = ret && (&*( e-1) == last); - ret = ret && (&*(ce-1) == last); } - ret = ret && (static_cast( e - s.begin()) == s.size()); - ret = ret && (static_cast(ce - s.cbegin()) == s.size()); - - ret = ret && (e == ce); + ret = ret && (static_cast(e - s.begin()) == s.size()); return ret; } template void testRuntimeSpan(Span s) { - typename Span::iterator e = s. end(); - typename Span::const_iterator ce = s.cend(); + typename Span::iterator e = s.end(); if (s.empty()) { - assert( e == s.begin()); - assert(ce == s.cbegin()); + assert(e == s.begin()); } else { - typename Span::const_pointer last = &*(s.cbegin() + s.size() - 1); - assert( e != s.begin()); - assert(ce != s.cbegin()); - assert( &*( e-1) == last); - assert( &*(ce-1) == last); + typename Span::const_pointer last = &*(s.begin() + s.size() - 1); + assert(e != s.begin()); + assert(&*( e-1) == last); } - assert(static_cast( e - s.begin()) == s.size()); - assert(static_cast(ce - s.cbegin()) == s.size()); - - assert(e == ce); + assert(static_cast(e - s.begin()) == s.size()); } diff --git a/libcxx/test/std/containers/views/span.iterators/rbegin.pass.cpp b/libcxx/test/std/containers/views/span.iterators/rbegin.pass.cpp --- a/libcxx/test/std/containers/views/span.iterators/rbegin.pass.cpp +++ b/libcxx/test/std/containers/views/span.iterators/rbegin.pass.cpp @@ -22,22 +22,17 @@ constexpr bool testConstexprSpan(Span s) { bool ret = true; - typename Span::reverse_iterator b = s. rbegin(); - typename Span::const_reverse_iterator cb = s.crbegin(); + typename Span::reverse_iterator b = s.rbegin(); if (s.empty()) { ret = ret && ( b == s.rend()); - ret = ret && (cb == s.crend()); } else { const typename Span::size_type last = s.size() - 1; - ret = ret && ( *b == s[last]); - ret = ret && ( &*b == &s[last]); - ret = ret && ( *cb == s[last]); - ret = ret && (&*cb == &s[last]); + ret = ret && ( *b == s[last]); + ret = ret && (&*b == &s[last]); } - ret = ret && (b == cb); return ret; } @@ -45,22 +40,17 @@ template void testRuntimeSpan(Span s) { - typename Span::reverse_iterator b = s. rbegin(); - typename Span::const_reverse_iterator cb = s.crbegin(); + typename Span::reverse_iterator b = s.rbegin(); if (s.empty()) { - assert( b == s.rend()); - assert(cb == s.crend()); + assert(b == s.rend()); } else { const typename Span::size_type last = s.size() - 1; - assert( *b == s[last]); - assert( &*b == &s[last]); - assert( *cb == s[last]); - assert(&*cb == &s[last]); + assert( *b == s[last]); + assert(&*b == &s[last]); } - assert(b == cb); } diff --git a/libcxx/test/std/containers/views/span.iterators/rend.pass.cpp b/libcxx/test/std/containers/views/span.iterators/rend.pass.cpp --- a/libcxx/test/std/containers/views/span.iterators/rend.pass.cpp +++ b/libcxx/test/std/containers/views/span.iterators/rend.pass.cpp @@ -22,46 +22,34 @@ constexpr bool testConstexprSpan(Span s) { bool ret = true; - typename Span::reverse_iterator e = s. rend(); - typename Span::const_reverse_iterator ce = s.crend(); + typename Span::reverse_iterator e = s.rend(); if (s.empty()) { - ret = ret && ( e == s.rbegin()); - ret = ret && (ce == s.crbegin()); + ret = ret && (e == s.rbegin()); } else { - ret = ret && ( e != s.rbegin()); - ret = ret && (ce != s.crbegin()); + ret = ret && (e != s.rbegin()); } - ret = ret && (static_cast( e - s.rbegin()) == s.size()); - ret = ret && (static_cast(ce - s.crbegin()) == s.size()); - - ret = ret && (e == ce); + ret = ret && (static_cast(e - s.rbegin()) == s.size()); return ret; } template void testRuntimeSpan(Span s) { - typename Span::reverse_iterator e = s. rend(); - typename Span::const_reverse_iterator ce = s.crend(); + typename Span::reverse_iterator e = s.rend(); if (s.empty()) { - assert( e == s.rbegin()); - assert(ce == s.crbegin()); + assert(e == s.rbegin()); } else { - assert( e != s.rbegin()); - assert(ce != s.crbegin()); + assert(e != s.rbegin()); } - assert(static_cast( e - s.rbegin()) == s.size()); - assert(static_cast(ce - s.crbegin()) == s.size()); - - assert(e == ce); + assert(static_cast(e - s.rbegin()) == s.size()); } diff --git a/libcxx/test/std/containers/views/types.pass.cpp b/libcxx/test/std/containers/views/types.pass.cpp --- a/libcxx/test/std/containers/views/types.pass.cpp +++ b/libcxx/test/std/containers/views/types.pass.cpp @@ -49,20 +49,6 @@ ASSERT_SAME_TYPE(typename ItT::difference_type, typename S::difference_type); } -template -void testConstIterator() -{ - typedef std::iterator_traits ItT; - - ASSERT_SAME_TYPE(typename ItT::iterator_category, std::random_access_iterator_tag); - ASSERT_SAME_TYPE(typename ItT::value_type, typename S::value_type); -// I'd like to say 'const typename S::pointer' here, but that gives me -// a const pointer to a non-const value, which is not what I want. - ASSERT_SAME_TYPE(typename ItT::reference, typename S::element_type const &); - ASSERT_SAME_TYPE(typename ItT::pointer, typename S::element_type const *); - ASSERT_SAME_TYPE(typename ItT::difference_type, typename S::difference_type); -} - template void testSpan() { @@ -79,8 +65,6 @@ testIterator(); testIterator(); - testConstIterator(); - testConstIterator(); } diff --git a/libcxx/www/cxx2a_status.html b/libcxx/www/cxx2a_status.html --- a/libcxx/www/cxx2a_status.html +++ b/libcxx/www/cxx2a_status.html @@ -521,7 +521,7 @@ 3317Incorrect operator<< for floating-point durationsPrague 3318Clarify whether clocks can represent time before their epochPrague 3319Properly reference specification of IANA time zone databasePrague - 3320span::cbegin/cend methods produce different results than std::[ranges::]cbegin/cendPrague + 3320span::cbegin/cend methods produce different results than std::[ranges::]cbegin/cendPragueComplete 3321uninitialized_construct_using_allocator should use construct_atPrague 3323has-tuple-element helper concept needs convertible_toPrague 3324Special-case std::strong/weak/partial_order for pointersPrague