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