|
9 | 9 | #ifndef _LIBCPP___ALGORITHM_GENERATE_H |
10 | 10 | #define _LIBCPP___ALGORITHM_GENERATE_H |
11 | 11 |
|
| 12 | +#include <__algorithm/for_each_segment.h> |
12 | 13 | #include <__config> |
| 14 | +#include <__iterator/segmented_iterator.h> |
| 15 | +#include <__type_traits/enable_if.h> |
13 | 16 |
|
14 | 17 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
15 | 18 | # pragma GCC system_header |
16 | 19 | #endif |
17 | 20 |
|
18 | 21 | _LIBCPP_BEGIN_NAMESPACE_STD |
19 | 22 |
|
20 | | -template <class _ForwardIterator, class _Generator> |
| 23 | +template <class _ForwardIterator, class _Sent, class _Generator> |
21 | 24 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void |
22 | | -generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) { |
| 25 | +__generate(_ForwardIterator __first, _Sent __last, _Generator __gen) { |
23 | 26 | for (; __first != __last; ++__first) |
24 | 27 | *__first = __gen(); |
25 | 28 | } |
26 | 29 |
|
| 30 | +#ifndef _LIBCPP_CXX03_LANG |
| 31 | +template <class _SegmentedIterator, |
| 32 | + class _Generator, |
| 33 | + __enable_if_t<__is_segmented_iterator_v<_SegmentedIterator>, int> = 0> |
| 34 | +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 |
| 35 | +_SegmentedIterator __generate(_SegmentedIterator __first, _SegmentedIterator __last, _Generator& __gen) { |
| 36 | + using __local_iterator_t = typename __segmented_iterator_traits<_SegmentedIterator>::__local_iterator; |
| 37 | + std::__for_each_segment(__first, __last, [&](__local_iterator_t __lfirst, __local_iterator_t __llast) { |
| 38 | + std::__generate(__lfirst, __llast, __gen); |
| 39 | + }); |
| 40 | + return __last; |
| 41 | +} |
| 42 | +#endif // !_LIBCPP_CXX03_LANG |
| 43 | + |
| 44 | +template <class _ForwardIterator, class _Generator> |
| 45 | +inline _LIBCPP_HIDE_FROM_ABI |
| 46 | +_LIBCPP_CONSTEXPR_SINCE_CXX20 void generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) { |
| 47 | + std::__generate(__first, __last, __gen); |
| 48 | +} |
| 49 | + |
27 | 50 | _LIBCPP_END_NAMESPACE_STD |
28 | 51 |
|
29 | 52 | #endif // _LIBCPP___ALGORITHM_GENERATE_H |
0 commit comments