@@ -14,14 +14,13 @@ import containers.array;
14
14
import containers.common_iterator_functions;
15
15
import containers.index_type;
16
16
import containers.offset_type;
17
+ import containers.reference_wrapper;
17
18
import containers.stored_function;
18
19
19
20
import bounded;
20
21
import numeric_traits;
21
22
import std_module;
22
23
23
- // TODO: Implement `generate`, then `generate_n(f, n)` is `take(generate(f), n)`
24
-
25
24
using namespace bounded ::literal;
26
25
27
26
namespace containers {
@@ -33,6 +32,15 @@ concept construct_subtractable = requires(LHS const lhs, RHS const rhs) {
33
32
34
33
struct generate_sentinel {};
35
34
35
+ template <typename Offset>
36
+ constexpr auto get_generator (auto && generator) -> auto && {
37
+ if constexpr (numeric_traits::max_value<Offset> <= 1_bi) {
38
+ return std::move (containers::unwrap (generator));
39
+ } else {
40
+ return containers::unwrap (generator);
41
+ }
42
+ }
43
+
36
44
template <typename Offset, typename Function>
37
45
struct generate_n_iterator {
38
46
using iterator_category = std::input_iterator_tag;
@@ -44,8 +52,8 @@ struct generate_n_iterator {
44
52
{
45
53
}
46
54
47
- constexpr decltype ( auto ) operator*() const {
48
- return std::invoke (m_generator);
55
+ constexpr auto operator *() const -> decltype ( auto ) {
56
+ return std::invoke (::containers::get_generator<Offset>( m_generator) );
49
57
}
50
58
OPERATORS_ARROW_DEFINITIONS
51
59
0 commit comments