aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2022-10-04 10:54:36 -0400
committerPatrick Palka <ppalka@redhat.com>2022-10-04 10:54:36 -0400
commit3b8bcc3f8b821e7359f8504334488ff2b1fc8f30 (patch)
treeb5eed05d124c50e8e23c4842fea0a94d6872e465
parentbeeb6898fe8ad44731bc58cad7220511b8225797 (diff)
downloadgcc-3b8bcc3f8b821e7359f8504334488ff2b1fc8f30.zip
gcc-3b8bcc3f8b821e7359f8504334488ff2b1fc8f30.tar.gz
gcc-3b8bcc3f8b821e7359f8504334488ff2b1fc8f30.tar.bz2
libstdc++: Avoid heavyweight std::visit in ranges::join_with_view
libstdc++-v3/ChangeLog: * include/std/ranges (join_with_view::_Iterator::operator*): Replace use of std::visit with manual visitation. (join_with_view::_Iterator::operator++): Likewise. (join_with_view::_Iterator::operator--): Likewise. (join_with_view::_Iterator::iter_move): Likewise. (join_with_view::_Iterator::iter_swap): Likewise.
-rw-r--r--libstdc++-v3/include/std/ranges47
1 files changed, 36 insertions, 11 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index d0d6ce6..1f82112 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -7165,18 +7165,23 @@ namespace views::__adaptor
_M_inner_it.template emplace<1>(std::get<1>(std::move(__i._M_inner_it)));
}
- constexpr decltype(auto)
+ constexpr common_reference_t<iter_reference_t<_InnerIter>,
+ iter_reference_t<_PatternIter>>
operator*() const
{
- using reference = common_reference_t<iter_reference_t<_InnerIter>,
- iter_reference_t<_PatternIter>>;
- return std::visit([](auto& __it) -> reference { return *__it; }, _M_inner_it);
+ if (_M_inner_it.index() == 0)
+ return *std::get<0>(_M_inner_it);
+ else
+ return *std::get<1>(_M_inner_it);
}
constexpr _Iterator&
operator++()
{
- std::visit([](auto& __it){ ++__it; }, _M_inner_it);
+ if (_M_inner_it.index() == 0)
+ ++std::get<0>(_M_inner_it);
+ else
+ ++std::get<1>(_M_inner_it);
_M_satisfy();
return *this;
}
@@ -7232,7 +7237,10 @@ namespace views::__adaptor
}
}
- std::visit([](auto& __it){ --__it; }, _M_inner_it);
+ if (_M_inner_it.index() == 0)
+ --std::get<0>(_M_inner_it);
+ else
+ --std::get<1>(_M_inner_it);
return *this;
}
@@ -7253,18 +7261,35 @@ namespace views::__adaptor
&& equality_comparable<_OuterIter> && equality_comparable<_InnerIter>
{ return __x._M_outer_it == __y._M_outer_it && __x._M_inner_it ==__y._M_inner_it; }
- friend constexpr decltype(auto)
+ friend constexpr common_reference_t<iter_rvalue_reference_t<_InnerIter>,
+ iter_rvalue_reference_t<_PatternIter>>
iter_move(const _Iterator& __x)
{
- using __rval_ref = common_reference_t<iter_rvalue_reference_t<_InnerIter>,
- iter_rvalue_reference_t<_PatternIter>>;
- return std::visit<__rval_ref>(ranges::iter_move, __x._M_inner_it);
+ if (__x._M_inner_it.index() == 0)
+ return ranges::iter_move(std::get<0>(__x._M_inner_it));
+ else
+ return ranges::iter_move(std::get<1>(__x._M_inner_it));
}
friend constexpr void
iter_swap(const _Iterator& __x, const _Iterator& __y)
requires indirectly_swappable<_InnerIter, _PatternIter>
- { std::visit(ranges::iter_swap, __x._M_inner_it, __y._M_inner_it); }
+ {
+ if (__x._M_inner_it.index() == 0)
+ {
+ if (__y._M_inner_it.index() == 0)
+ ranges::iter_swap(std::get<0>(__x._M_inner_it), std::get<0>(__y._M_inner_it));
+ else
+ ranges::iter_swap(std::get<0>(__x._M_inner_it), std::get<1>(__y._M_inner_it));
+ }
+ else
+ {
+ if (__y._M_inner_it.index() == 0)
+ ranges::iter_swap(std::get<1>(__x._M_inner_it), std::get<0>(__y._M_inner_it));
+ else
+ ranges::iter_swap(std::get<1>(__x._M_inner_it), std::get<1>(__y._M_inner_it));
+ }
+ }
};
template<input_range _Vp, forward_range _Pattern>