[libcxx-commits] [libcxx] [libc++] P3168R2 Give std::optional Range Support (PR #146491)
A. Jiang via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Jul 1 04:19:35 PDT 2025
================
@@ -578,6 +600,71 @@ struct __is_std_optional : false_type {};
template <class _Tp>
struct __is_std_optional<optional<_Tp>> : true_type {};
+# if _LIBCPP_STD_VER >= 26
+
+template <class _T>
+constexpr bool ranges::enable_view<optional<_T>> = true;
+
+template <class _T>
+constexpr auto format_kind<optional<_T>> = range_format::disabled;
+
+template <typename _Tp>
+class __optional_iterator {
+public:
+ using value_type = _Tp;
+ using difference_type = std::ptrdiff_t;
+ using pointer = _Tp*;
+ using reference = _Tp&;
+ using iterator_category = std::forward_iterator_tag;
+
+private:
+ pointer __ptr_;
+ _LIBCPP_HIDE_FROM_ABI explicit __optional_iterator(pointer __ptr) : __ptr_(__ptr) {}
+ _LIBCPP_HIDE_FROM_ABI friend class optional<std::remove_const_t<_Tp>>;
+ _LIBCPP_HIDE_FROM_ABI friend class optional<const _Tp>;
+
+public:
+ _LIBCPP_HIDE_FROM_ABI __optional_iterator() : __ptr_(nullptr) {}
+
+ _LIBCPP_HIDE_FROM_ABI __optional_iterator(const __optional_iterator&) = default;
+ _LIBCPP_HIDE_FROM_ABI __optional_iterator& operator=(const __optional_iterator&) = default;
+
+ _LIBCPP_HIDE_FROM_ABI reference operator*() const {
+ if (__ptr_ == nullptr)
+ std::__throw_runtime_error("deferencering end iterator");
+ return *__ptr_;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI pointer operator->() const {
+ if (__ptr_ == nullptr)
+ std::__throw_runtime_error("deferencering end iterator");
+ return *__ptr_;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI __optional_iterator& operator++() {
+ __ptr_ = nullptr;
+ return *this;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI __optional_iterator operator++(int) {
+ __optional_iterator __tmp = *this;
+ __ptr_ = nullptr;
+ return __tmp;
+ }
+
+ _LIBCPP_HIDE_FROM_ABI bool operator==(const __optional_iterator& __other) const { return __ptr_ == __other.__ptr_; }
+ _LIBCPP_HIDE_FROM_ABI bool operator!=(const __optional_iterator& __other) const { return __ptr_ != __other.__ptr_; }
----------------
frederick-vs-ja wrote:
We should never write `operator!=` if the corresponding `operator==` is conventional (returning `bool`).
```suggestion
```
Also, `constexpr` is missing for most newly added functions.
https://github.com/llvm/llvm-project/pull/146491
More information about the libcxx-commits
mailing list