Skip to content
Draft
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: 2 additions & 0 deletions libcxx/docs/FeatureTestMacroTable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,8 @@ Status
---------------------------------------------------------- -----------------
``__cpp_lib_ranges_concat`` *unimplemented*
---------------------------------------------------------- -----------------
``__cpp_lib_ranges_to_input`` ``202502L``
---------------------------------------------------------- -----------------
``__cpp_lib_ratio`` ``202306L``
---------------------------------------------------------- -----------------
``__cpp_lib_rcu`` *unimplemented*
Expand Down
1 change: 1 addition & 0 deletions libcxx/docs/ReleaseNotes/22.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ Implemented Papers

- P2321R2: ``zip`` (`Github <https://llvm.org/PR105169>`__) (The paper is partially implemented. ``zip_transform_view``
is implemented in this release)
- P3137R3: ``views::to_input`` (`Github <https://llvm.org/PR127873>`__)
- P3168R2: Give ``std::optional`` Range Support (`Github <https://llvm.org/PR105430>`__)

Improvements and New Features
Expand Down
2 changes: 1 addition & 1 deletion libcxx/docs/Status/Cxx2cPapers.csv
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@
"`P2900R14 <https://wg21.link/P2900R14>`__","Contracts for C++","2025-02 (Hagenberg)","","","`#127870 <https://github.com/llvm/llvm-project/issues/127870>`__",""
"`P3475R2 <https://wg21.link/P3475R2>`__","Defang and deprecate ``memory_order::consume``","2025-02 (Hagenberg)","","","`#127871 <https://github.com/llvm/llvm-project/issues/127871>`__",""
"`P2786R13 <https://wg21.link/P2786R13>`__","Trivial Relocatability For C++26","2025-02 (Hagenberg)","","","`#127872 <https://github.com/llvm/llvm-project/issues/127872>`__",""
"`P3137R3 <https://wg21.link/P3137R3>`__","``views::to_input``","2025-02 (Hagenberg)","","","`#127873 <https://github.com/llvm/llvm-project/issues/127873>`__",""
"`P3137R3 <https://wg21.link/P3137R3>`__","``views::to_input``","2025-02 (Hagenberg)","|Complete|","22","`#127873 <https://github.com/llvm/llvm-project/issues/127873>`__",""
"`P0472R3 <https://wg21.link/P0472R3>`__","Put ``std::monostate`` in ``<utility>``","2025-02 (Hagenberg)","|Complete|","21","`#127874 <https://github.com/llvm/llvm-project/issues/127874>`__",""
"`P3349R1 <https://wg21.link/P3349R1>`__","Converting contiguous iterators to pointers","2025-02 (Hagenberg)","","","`#127875 <https://github.com/llvm/llvm-project/issues/127875>`__",""
"`P3372R3 <https://wg21.link/P3372R3>`__","constexpr containers and adaptors","2025-02 (Hagenberg)","|In Progress|","","`#127876 <https://github.com/llvm/llvm-project/issues/127876>`__",""
Expand Down
1 change: 1 addition & 0 deletions libcxx/include/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,7 @@ set(files
__ranges/take_view.h
__ranges/take_while_view.h
__ranges/to.h
__ranges/to_input_view.h
__ranges/transform_view.h
__ranges/view_interface.h
__ranges/views.h
Expand Down
224 changes: 224 additions & 0 deletions libcxx/include/__ranges/to_input_view.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP___RANGES_TO_INPUT_VIEW_H
#define _LIBCPP___RANGES_TO_INPUT_VIEW_H

#include <__concepts/constructible.h>
#include <__concepts/convertible_to.h>
#include <__config>
#include <__iterator/concepts.h>
#include <__iterator/iter_move.h>
#include <__iterator/iter_swap.h>
#include <__iterator/iterator_traits.h>
#include <__ranges/access.h>
#include <__ranges/all.h>
#include <__ranges/concepts.h>
#include <__ranges/enable_borrowed_range.h>
#include <__ranges/range_adaptor.h>
#include <__ranges/size.h>
#include <__ranges/view_interface.h>
#include <__type_traits/maybe_const.h>
#include <__utility/forward.h>
#include <__utility/move.h>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif

_LIBCPP_PUSH_MACROS
#include <__undef_macros>

_LIBCPP_BEGIN_NAMESPACE_STD

#if _LIBCPP_STD_VER >= 26

namespace ranges {

// [range.to.input.view

template <input_range _View>
requires view<_View>
class to_input_view : public view_interface<to_input_view<_View>> {
_View __base_ = _View(); // exposition only

// [range.to.input.iterator], class template to_input_view::iterator
template <bool _Const>
class iterator; // exposition only

public:
_LIBCPP_HIDE_FROM_ABI to_input_view()
requires default_initializable<_View>
= default;
_LIBCPP_HIDE_FROM_ABI constexpr explicit to_input_view(_View __base) : __base_(std::move(__base)) {}

_LIBCPP_HIDE_FROM_ABI constexpr _View base() const&
requires copy_constructible<_View>
{
return __base_;
}
_LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }

_LIBCPP_HIDE_FROM_ABI constexpr auto begin()
requires(!__simple_view<_View>)
{
return iterator<false>{ranges::begin(__base_)};
}
_LIBCPP_HIDE_FROM_ABI constexpr auto begin() const
requires range<const _View>
{
return iterator<true>{ranges::begin(__base_)};
}

_LIBCPP_HIDE_FROM_ABI constexpr auto end()
requires(!__simple_view<_View>)
{
return ranges::end(__base_);
}
_LIBCPP_HIDE_FROM_ABI constexpr auto end() const
requires range<const _View>
{
return ranges::end(__base_);
}
_LIBCPP_HIDE_FROM_ABI constexpr auto size()
requires sized_range<_View>
{
return ranges::size(__base_);
}
_LIBCPP_HIDE_FROM_ABI constexpr auto size() const
requires sized_range<const _View>
{
return ranges::size(__base_);
}

// TODO: Implement when P2846R6 is available.
// constexpr auto reserve_hint()
// requires approximately_sized_range<_View>
// {
// return ranges::reserve_hint(__base_);
// }
// constexpr auto reserve_hint() const
// requires approximately_sized_range<const _View>
// {
// return ranges::reserve_hint(__base_);
// }
};

template <class _Range>
to_input_view(_Range&&) -> to_input_view<views::all_t<_Range>>;

// [range.to.input.iterator]

template <input_range _View>
requires view<_View>
template <bool _Const>
class to_input_view<_View>::iterator {
using _Base _LIBCPP_NODEBUG = __maybe_const<_Const, _View>; // exposition only

iterator_t<_Base> __current_ = iterator_t<_Base>(); // exposition only

_LIBCPP_HIDE_FROM_ABI constexpr explicit iterator(iterator_t<_Base> __current)
: __current_(std::move(__current)) {} // exposition only

friend class to_input_view<_View>;

public:
using difference_type = range_difference_t<_Base>;
using value_type = range_value_t<_Base>;
using iterator_concept = input_iterator_tag;

_LIBCPP_HIDE_FROM_ABI iterator()
requires default_initializable<iterator_t<_Base>>
= default;

_LIBCPP_HIDE_FROM_ABI iterator(iterator&&) = default;
_LIBCPP_HIDE_FROM_ABI iterator& operator=(iterator&&) = default;

_LIBCPP_HIDE_FROM_ABI constexpr iterator(iterator<!_Const> __i)
requires _Const && convertible_to<iterator_t<_View>, iterator_t<_Base>>
: __current_(std::move(__i.__current_)) {}

_LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_Base> base() && { return std::move(__current_); }
_LIBCPP_HIDE_FROM_ABI constexpr const iterator_t<_Base>& base() const& noexcept { return __current_; }

_LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() const { return *__current_; }

_LIBCPP_HIDE_FROM_ABI constexpr iterator& operator++() {
++__current_;
return *this;
}
_LIBCPP_HIDE_FROM_ABI constexpr void operator++(int) { ++*this; }

_LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const iterator& __x, const sentinel_t<_Base>& __y) {
return __x.__current_ == __y;
}

_LIBCPP_HIDE_FROM_ABI friend constexpr difference_type operator-(const sentinel_t<_Base>& __y, const iterator& __x)
requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
{
return __y - __x.__current_;
}
_LIBCPP_HIDE_FROM_ABI friend constexpr difference_type operator-(const iterator& __x, const sentinel_t<_Base>& __y)
requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
{
return __x.__current_ - __y;
}

_LIBCPP_HIDE_FROM_ABI friend constexpr range_rvalue_reference_t<_Base> _LIBCPP_HIDE_FROM_ABI
iter_move(const iterator& __i) noexcept(noexcept(ranges::iter_move(__i.__current_))) {
return ranges::iter_move(__i.__current_);
}

_LIBCPP_HIDE_FROM_ABI friend constexpr void
iter_swap(const iterator& __x,
const iterator& __y) noexcept(noexcept(ranges::iter_swap(__x.__current_, __y.__current_)))
requires indirectly_swappable<iterator_t<_Base>>
{
ranges::iter_swap(__x.__current_, __y.__current_);
}
};

template <class _View>
constexpr bool enable_borrowed_range<to_input_view<_View>> = enable_borrowed_range<_View>;

namespace views {
namespace __to_input_view {

struct __fn : __range_adaptor_closure<__fn> {
template <class _Range>
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
operator()(_Range&& __range) noexcept(noexcept(/**/ to_input_view(std::forward<_Range>(__range))))
-> decltype(/*--*/ to_input_view(std::forward<_Range>(__range))) {
return /*---------*/ to_input_view(std::forward<_Range>(__range));
}

template <class _Range>
requires(!common_range<_Range> && !forward_range<_Range>)
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
operator()(_Range&& __range) noexcept(noexcept(views::all(std::forward<_Range>(__range))))
-> decltype(/*--------------------------*/ views::all(std::forward<_Range>(__range))) {
return /*---------------------------------*/ views::all(std::forward<_Range>(__range));
}
};

} // namespace __to_input_view

inline namespace __cpo {
inline constexpr auto to_input = __to_input_view::__fn{};
} // namespace __cpo
} // namespace views
} // namespace ranges

#endif // _LIBCPP_STD_VER >= 26

_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#endif // _LIBCPP___RANGES_TO_INPUT_VIEW_H
3 changes: 3 additions & 0 deletions libcxx/include/module.modulemap.in
Original file line number Diff line number Diff line change
Expand Up @@ -1929,6 +1929,9 @@ module std [system] {
header "__ranges/to.h"
export std.functional.bind_back
}
module to_input_view {
header "__ranges/to_input_view.h"
}
module transform_view {
header "__ranges/transform_view.h"
export std.functional.bind_back
Expand Down
15 changes: 15 additions & 0 deletions libcxx/include/ranges
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,17 @@ namespace std::ranges {
class chunk_by_view; // C++23

namespace views { inline constexpr unspecified chunk_by = unspecified; } // C++23

// [range.to.input], to input view
template<input_range V>
requires view<V>
class to_input_view; // C++26

template<class V>
constexpr bool enable_borrowed_range<to_input_view<V>> =
enable_borrowed_range<V>; // C++26

namespace views { inline constexpr unspecified to_input = unspecified; } // C++26
}

namespace std {
Expand Down Expand Up @@ -453,6 +464,10 @@ namespace std {
# include <__ranges/zip_view.h>
# endif

# if _LIBCPP_STD_VER >= 26
# include <__ranges/to_input_view.h>
# endif

# include <version>

// standard-mandated includes
Expand Down
2 changes: 2 additions & 0 deletions libcxx/include/version
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ __cpp_lib_ranges_repeat 202207L <ranges>
__cpp_lib_ranges_slide 202202L <ranges>
__cpp_lib_ranges_starts_ends_with 202106L <algorithm>
__cpp_lib_ranges_to_container 202202L <ranges>
__cpp_lib_ranges_to_input 202502L <ranges>
__cpp_lib_ranges_zip 202110L <ranges> <tuple> <utility>
__cpp_lib_ratio 202306L <ratio>
__cpp_lib_raw_memory_algorithms 201606L <memory>
Expand Down Expand Up @@ -590,6 +591,7 @@ __cpp_lib_void_t 201411L <type_traits>
# define __cpp_lib_out_ptr 202311L
// # define __cpp_lib_philox_engine 202406L
// # define __cpp_lib_ranges_concat 202403L
# define __cpp_lib_ranges_to_input 202502L
# define __cpp_lib_ratio 202306L
// # define __cpp_lib_rcu 202306L
# define __cpp_lib_reference_wrapper 202403L
Expand Down
10 changes: 10 additions & 0 deletions libcxx/modules/std/ranges.inc
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,16 @@ export namespace std {
using std::ranges::views::cartesian_product;
}
#endif

#if _LIBCPP_STD_VER >= 26
// [range.to.input], to input view
using std::ranges::to_input_view;

namespace views {
using std::ranges::views::to_input;
}
#endif

} // namespace ranges

namespace views = ranges::views;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@
# error "__cpp_lib_ranges_to_container should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_to_input
# error "__cpp_lib_ranges_to_input should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_zip
# error "__cpp_lib_ranges_zip should not be defined before c++23"
# endif
Expand Down Expand Up @@ -114,6 +118,10 @@
# error "__cpp_lib_ranges_to_container should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_to_input
# error "__cpp_lib_ranges_to_input should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_zip
# error "__cpp_lib_ranges_zip should not be defined before c++23"
# endif
Expand Down Expand Up @@ -164,6 +172,10 @@
# error "__cpp_lib_ranges_to_container should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_to_input
# error "__cpp_lib_ranges_to_input should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_zip
# error "__cpp_lib_ranges_zip should not be defined before c++23"
# endif
Expand Down Expand Up @@ -217,6 +229,10 @@
# error "__cpp_lib_ranges_to_container should not be defined before c++23"
# endif

# ifdef __cpp_lib_ranges_to_input
# error "__cpp_lib_ranges_to_input should not be defined before c++26"
# endif

# ifdef __cpp_lib_ranges_zip
# error "__cpp_lib_ranges_zip should not be defined before c++23"
# endif
Expand Down Expand Up @@ -312,6 +328,10 @@
# error "__cpp_lib_ranges_to_container should have the value 202202L in c++23"
# endif

# ifdef __cpp_lib_ranges_to_input
# error "__cpp_lib_ranges_to_input should not be defined before c++26"
# endif

# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_ranges_zip
# error "__cpp_lib_ranges_zip should be defined in c++23"
Expand Down Expand Up @@ -434,6 +454,13 @@
# error "__cpp_lib_ranges_to_container should have the value 202202L in c++26"
# endif

# ifndef __cpp_lib_ranges_to_input
# error "__cpp_lib_ranges_to_input should be defined in c++26"
# endif
# if __cpp_lib_ranges_to_input != 202502L
# error "__cpp_lib_ranges_to_input should have the value 202502L in c++26"
# endif

# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_ranges_zip
# error "__cpp_lib_ranges_zip should be defined in c++26"
Expand Down
Loading
Loading