@@ -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