Skip to content

[libc++][ranges] LWG3564: transform_view::iterator<true>::value_type and iterator_category should use const F& #91816

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libcxx/docs/Status/Cxx23Issues.csv
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@
"`LWG3660 <https://wg21.link/LWG3660>`__","``iterator_traits<common_iterator>::pointer`` should conform to §[iterator.traits]","February 2022","|Complete|","14.0","|ranges|"
"`LWG3661 <https://wg21.link/LWG3661>`__","``constinit atomic<shared_ptr<T>> a(nullptr);`` should work","February 2022","","",""
"","","","","",""
"`LWG3564 <https://wg21.link/LWG3564>`__","``transform_view::iterator<true>::value_type`` and ``iterator_category`` should use ``const F&``","July 2022","","","|ranges|"
"`LWG3564 <https://wg21.link/LWG3564>`__","``transform_view::iterator<true>::value_type`` and ``iterator_category`` should use ``const F&``","July 2022","|Complete|","20.0","|ranges|"
"`LWG3617 <https://wg21.link/LWG3617>`__","``function``/``packaged_task`` deduction guides and deducing ``this``","July 2022","","",""
"`LWG3656 <https://wg21.link/LWG3656>`__","Inconsistent bit operations returning a count","July 2022","|Complete|","15.0",""
"`LWG3659 <https://wg21.link/LWG3659>`__","Consider ``ATOMIC_FLAG_INIT`` undeprecation","July 2022","|Complete|","15.0",""
Expand Down
5 changes: 3 additions & 2 deletions libcxx/include/__ranges/transform_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@ template <input_range _View, copy_constructible _Fn>
# endif
requires __transform_view_constraints<_View, _Fn>
template <bool _Const>
class transform_view<_View, _Fn>::__iterator : public __transform_view_iterator_category_base<_View, _Fn> {
class transform_view<_View, _Fn>::__iterator
: public __transform_view_iterator_category_base<_View, __maybe_const<_Const, _Fn>> {

using _Parent = __maybe_const<_Const, transform_view>;
using _Base = __maybe_const<_Const, _View>;
Expand All @@ -190,7 +191,7 @@ class transform_view<_View, _Fn>::__iterator : public __transform_view_iterator_
iterator_t<_Base> __current_ = iterator_t<_Base>();

using iterator_concept = typename __transform_view_iterator_concept<_View>::type;
using value_type = remove_cvref_t<invoke_result_t<_Fn&, range_reference_t<_Base>>>;
using value_type = remove_cvref_t<invoke_result_t<__maybe_const<_Const, _Fn>&, range_reference_t<_Base>>>;
using difference_type = range_difference_t<_Base>;

_LIBCPP_HIDE_FROM_ABI __iterator()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,22 @@ constexpr bool test() {
static_assert(std::same_as<typename TIter::value_type, int>);
static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>);
}
{
// Member typedefs for random access iterator, LWG3564 mutable overload
using TView = std::ranges::transform_view<RandomAccessView, PlusOneMutableOverload>;
using TIter = std::ranges::iterator_t<TView>;
static_assert(std::same_as<typename TIter::iterator_concept, std::random_access_iterator_tag>);
static_assert(std::same_as<typename TIter::iterator_category, std::random_access_iterator_tag>);
static_assert(std::same_as<typename TIter::value_type, int>);
static_assert(std::same_as<typename TIter::difference_type, std::ptrdiff_t>);

using CTIter = std::ranges::iterator_t<const TView>;
static_assert(std::same_as<typename CTIter::iterator_concept, std::random_access_iterator_tag>);
static_assert(std::same_as<typename CTIter::iterator_category,
std::input_iterator_tag>); // Note: this is now input_iterator_tag.
static_assert(std::same_as<typename CTIter::value_type, int>);
static_assert(std::same_as<typename CTIter::difference_type, std::ptrdiff_t>);
}
{
// Member typedefs for bidirectional iterator.
using TView = std::ranges::transform_view<BidirectionalView, Increment>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ struct PlusOne {
constexpr int operator()(int x) const { return x + 1; }
};

struct PlusOneMutableOverload {
constexpr int operator()(int x) const { return x + 1; }
constexpr int& operator()(int& x) { return ++x; }
};

struct Increment {
constexpr int& operator()(int& x) { return ++x; }
};
Expand Down
Loading