Skip to content

Commit 0510945

Browse files
committed
[libcxx] simplify __optional_iterator operations and add to_address utility
1 parent 149ff9e commit 0510945

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

libcxx/include/optional

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -630,57 +630,55 @@ public:
630630
_LIBCPP_HIDE_FROM_ABI constexpr __optional_iterator& operator=(const __optional_iterator&) = default;
631631

632632
_LIBCPP_HIDE_FROM_ABI constexpr reference operator*() const { return *__it_; }
633-
_LIBCPP_HIDE_FROM_ABI constexpr pointer operator->() const { return *__it_.operator->(); }
633+
_LIBCPP_HIDE_FROM_ABI constexpr pointer operator->() const { return __it_.operator->(); }
634634

635635
_LIBCPP_HIDE_FROM_ABI constexpr __optional_iterator& operator++() noexcept {
636-
__it_ = _Base();
636+
++__it_;
637637
return *this;
638638
}
639639
_LIBCPP_HIDE_FROM_ABI constexpr __optional_iterator operator++(int) noexcept {
640640
auto __tmp = *this;
641-
__it_ = _Base();
641+
++__it_;
642642
return __tmp;
643643
}
644644

645645
_LIBCPP_HIDE_FROM_ABI constexpr __optional_iterator& operator--() noexcept {
646-
__it_ = _Base();
646+
--__it_;
647647
return *this;
648648
}
649649
_LIBCPP_HIDE_FROM_ABI constexpr __optional_iterator operator--(int) noexcept {
650650
auto __tmp = *this;
651-
__it_ = _Base();
651+
--__it_;
652652
return __tmp;
653653
}
654654

655655
_LIBCPP_HIDE_FROM_ABI constexpr __optional_iterator& operator+=(difference_type __n) noexcept {
656-
if (__n != 0)
657-
__it_ = _Base();
656+
__it_ += __n;
658657
return *this;
659658
}
660659
_LIBCPP_HIDE_FROM_ABI constexpr __optional_iterator& operator-=(difference_type __n) noexcept {
661-
if (__n != 0)
662-
__it_ = _Base();
660+
__it_ -= __n;
663661
return *this;
664662
}
665663

666664
_LIBCPP_HIDE_FROM_ABI friend constexpr __optional_iterator
667665
operator+(__optional_iterator __i, difference_type __n) noexcept {
668-
return (__n == 0 ? __i : __optional_iterator(_Base()));
666+
return __optional_iterator(__i.__it_ + __n);
669667
}
670668
_LIBCPP_HIDE_FROM_ABI friend constexpr __optional_iterator
671669
operator+(difference_type __n, __optional_iterator __i) noexcept {
672670
return __i + __n;
673671
}
674672
_LIBCPP_HIDE_FROM_ABI friend constexpr __optional_iterator
675673
operator-(__optional_iterator __i, difference_type __n) noexcept {
676-
return (__n == 0 ? __i : __optional_iterator(_Base()));
674+
return __optional_iterator(__i.__it_ - __n);
677675
}
678676
_LIBCPP_HIDE_FROM_ABI friend constexpr difference_type
679677
operator-(__optional_iterator __a, __optional_iterator __b) noexcept {
680-
return (__a.__it_ == __b.__it_ ? 0 : (__a.__it_ ? 1 : -1));
678+
return __a.__it_ - __b.__it_;
681679
}
682680

683-
_LIBCPP_HIDE_FROM_ABI constexpr reference operator[](difference_type __n) const noexcept { return *(*this + __n); }
681+
_LIBCPP_HIDE_FROM_ABI constexpr reference operator[](difference_type __n) const noexcept { return *(__it_ + __n); }
684682

685683
_LIBCPP_HIDE_FROM_ABI constexpr bool operator==(const __optional_iterator& __other) const {
686684
return __it_ == __other.__it_;
@@ -710,6 +708,10 @@ public:
710708
return __optional_iterator<const _Tp>(__wrap_iter<const _Tp*>{__it_.base()});
711709
}
712710
};
711+
template <typename _Tp>
712+
_LIBCPP_HIDE_FROM_ABI constexpr _Tp* to_address(const __optional_iterator<_Tp>& __it) noexcept {
713+
return std::to_address(__it.__it_);
714+
}
713715

714716
# endif // _LIBCPP_STD_VER >= 26
715717

0 commit comments

Comments
 (0)