[libcxx-commits] [libcxx] [libcxx] Optimize std::generate for segmented iterators (PR #163006)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Thu Oct 16 23:45:20 PDT 2025


================
@@ -19,26 +19,22 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-namespace __generate {
+template <class _Generator>
+struct __generate_assigner {
+  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __generate_assigner(_Generator& __gen) : __gen_(__gen) {}
 
-template <typename _Generator>
-struct __fn {
-  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __fn(_Generator& __gen) : __gen_(__gen) {}
-
-  template <typename _Tp>
+  template <class _Tp>
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void operator()(_Tp&& __element) const {
     std::forward<_Tp>(__element) = __gen_();
   }
 
   _Generator& __gen_;
 };
 
-} // namespace __generate
-
 template <class _ForwardIterator, class _Generator>
 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void
 generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) {
-  std::for_each(__first, __last, __generate::__fn<_Generator>(__gen));
+  std::for_each(__first, __last, __generate_assigner<_Generator>(__gen));
----------------
philnik777 wrote:

Can we do `[](decltype(*__first) __val) { ... }`?

https://github.com/llvm/llvm-project/pull/163006


More information about the libcxx-commits mailing list