xref: /llvm-project/libcxx/include/__algorithm/ranges_generate.h (revision 09e3a360581dc36d0820d3fb6da9bd7cfed87b5d)
173ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===//
273ebcabfSKonstantin Varlamov //
373ebcabfSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473ebcabfSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
573ebcabfSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673ebcabfSKonstantin Varlamov //
773ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===//
873ebcabfSKonstantin Varlamov 
973ebcabfSKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_GENERATE_H
1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_GENERATE_H
1173ebcabfSKonstantin Varlamov 
1273ebcabfSKonstantin Varlamov #include <__concepts/constructible.h>
1373ebcabfSKonstantin Varlamov #include <__concepts/invocable.h>
1473ebcabfSKonstantin Varlamov #include <__config>
1573ebcabfSKonstantin Varlamov #include <__iterator/concepts.h>
1673ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h>
1773ebcabfSKonstantin Varlamov #include <__ranges/access.h>
1873ebcabfSKonstantin Varlamov #include <__ranges/concepts.h>
1973ebcabfSKonstantin Varlamov #include <__ranges/dangling.h>
20*09e3a360SLouis Dionne #include <__type_traits/invoke.h>
2173ebcabfSKonstantin Varlamov #include <__utility/move.h>
2273ebcabfSKonstantin Varlamov 
2373ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2473ebcabfSKonstantin Varlamov #  pragma GCC system_header
2573ebcabfSKonstantin Varlamov #endif
2673ebcabfSKonstantin Varlamov 
277b462251SLouis Dionne _LIBCPP_PUSH_MACROS
287b462251SLouis Dionne #include <__undef_macros>
297b462251SLouis Dionne 
304f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3173ebcabfSKonstantin Varlamov 
3273ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD
3373ebcabfSKonstantin Varlamov 
3473ebcabfSKonstantin Varlamov namespace ranges {
35d10dc5a0SChristopher Di Bella struct __generate {
36ead7302bSKonstantin Varlamov   template <class _OutIter, class _Sent, class _Func>
375aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr static _OutIter __generate_fn_impl(_OutIter __first, _Sent __last, _Func& __gen) {
38ead7302bSKonstantin Varlamov     for (; __first != __last; ++__first) {
39ead7302bSKonstantin Varlamov       *__first = __gen();
40ead7302bSKonstantin Varlamov     }
41ead7302bSKonstantin Varlamov 
42ead7302bSKonstantin Varlamov     return __first;
43ead7302bSKonstantin Varlamov   }
44ead7302bSKonstantin Varlamov 
4573ebcabfSKonstantin Varlamov   template <input_or_output_iterator _OutIter, sentinel_for<_OutIter> _Sent, copy_constructible _Func>
4673ebcabfSKonstantin Varlamov     requires invocable<_Func&> && indirectly_writable<_OutIter, invoke_result_t<_Func&>>
475aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr _OutIter operator()(_OutIter __first, _Sent __last, _Func __gen) const {
48ead7302bSKonstantin Varlamov     return __generate_fn_impl(std::move(__first), std::move(__last), __gen);
4973ebcabfSKonstantin Varlamov   }
5073ebcabfSKonstantin Varlamov 
5173ebcabfSKonstantin Varlamov   template <class _Range, copy_constructible _Func>
5273ebcabfSKonstantin Varlamov     requires invocable<_Func&> && output_range<_Range, invoke_result_t<_Func&>>
535aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_Range> operator()(_Range&& __range, _Func __gen) const {
54ead7302bSKonstantin Varlamov     return __generate_fn_impl(ranges::begin(__range), ranges::end(__range), __gen);
5573ebcabfSKonstantin Varlamov   }
5673ebcabfSKonstantin Varlamov };
5773ebcabfSKonstantin Varlamov 
5873ebcabfSKonstantin Varlamov inline namespace __cpo {
59d10dc5a0SChristopher Di Bella inline constexpr auto generate = __generate{};
6073ebcabfSKonstantin Varlamov } // namespace __cpo
6173ebcabfSKonstantin Varlamov } // namespace ranges
6273ebcabfSKonstantin Varlamov 
6373ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD
6473ebcabfSKonstantin Varlamov 
654f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
6673ebcabfSKonstantin Varlamov 
677b462251SLouis Dionne _LIBCPP_POP_MACROS
687b462251SLouis Dionne 
6973ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_GENERATE_H
70