xref: /llvm-project/libcxx/include/__algorithm/ranges_generate_n.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_N_H
1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_GENERATE_N_H
1173ebcabfSKonstantin Varlamov 
1273ebcabfSKonstantin Varlamov #include <__concepts/constructible.h>
1373ebcabfSKonstantin Varlamov #include <__concepts/invocable.h>
1473ebcabfSKonstantin Varlamov #include <__config>
1573ebcabfSKonstantin Varlamov #include <__functional/identity.h>
1673ebcabfSKonstantin Varlamov #include <__iterator/concepts.h>
1773ebcabfSKonstantin Varlamov #include <__iterator/incrementable_traits.h>
1873ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h>
1973ebcabfSKonstantin Varlamov #include <__ranges/access.h>
2073ebcabfSKonstantin Varlamov #include <__ranges/concepts.h>
21*09e3a360SLouis Dionne #include <__type_traits/invoke.h>
2273ebcabfSKonstantin Varlamov #include <__utility/move.h>
2373ebcabfSKonstantin Varlamov 
2473ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2573ebcabfSKonstantin Varlamov #  pragma GCC system_header
2673ebcabfSKonstantin Varlamov #endif
2773ebcabfSKonstantin Varlamov 
287b462251SLouis Dionne _LIBCPP_PUSH_MACROS
297b462251SLouis Dionne #include <__undef_macros>
307b462251SLouis Dionne 
314f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3273ebcabfSKonstantin Varlamov 
3373ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD
3473ebcabfSKonstantin Varlamov 
3573ebcabfSKonstantin Varlamov namespace ranges {
36d10dc5a0SChristopher Di Bella struct __generate_n {
3773ebcabfSKonstantin Varlamov   template <input_or_output_iterator _OutIter, copy_constructible _Func>
3873ebcabfSKonstantin Varlamov     requires invocable<_Func&> && indirectly_writable<_OutIter, invoke_result_t<_Func&>>
395aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr _OutIter
405aa03b64SLouis Dionne   operator()(_OutIter __first, iter_difference_t<_OutIter> __n, _Func __gen) const {
41ead7302bSKonstantin Varlamov     for (; __n > 0; --__n) {
42ead7302bSKonstantin Varlamov       *__first = __gen();
43ead7302bSKonstantin Varlamov       ++__first;
44ead7302bSKonstantin Varlamov     }
45ead7302bSKonstantin Varlamov 
46ead7302bSKonstantin Varlamov     return __first;
4773ebcabfSKonstantin Varlamov   }
4873ebcabfSKonstantin Varlamov };
4973ebcabfSKonstantin Varlamov 
5073ebcabfSKonstantin Varlamov inline namespace __cpo {
51d10dc5a0SChristopher Di Bella inline constexpr auto generate_n = __generate_n{};
5273ebcabfSKonstantin Varlamov } // namespace __cpo
5373ebcabfSKonstantin Varlamov } // namespace ranges
5473ebcabfSKonstantin Varlamov 
5573ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD
5673ebcabfSKonstantin Varlamov 
574f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
5873ebcabfSKonstantin Varlamov 
597b462251SLouis Dionne _LIBCPP_POP_MACROS
607b462251SLouis Dionne 
6173ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_GENERATE_N_H
62