| 986 | /// This generator is async-reentrant |
| 987 | template <typename T> |
| 988 | AsyncGenerator<T> MakeVectorGenerator(std::vector<T> vec) { |
| 989 | struct State { |
| 990 | explicit State(std::vector<T> vec_) : vec(std::move(vec_)), vec_idx(0) {} |
| 991 | |
| 992 | std::vector<T> vec; |
| 993 | std::atomic<std::size_t> vec_idx; |
| 994 | }; |
| 995 | |
| 996 | auto state = std::make_shared<State>(std::move(vec)); |
| 997 | return [state]() { |
| 998 | auto idx = state->vec_idx.fetch_add(1); |
| 999 | if (idx >= state->vec.size()) { |
| 1000 | // Eagerly return memory |
| 1001 | state->vec.clear(); |
| 1002 | return AsyncGeneratorEnd<T>(); |
| 1003 | } |
| 1004 | return Future<T>::MakeFinished(state->vec[idx]); |
| 1005 | }; |
| 1006 | } |
| 1007 | |
| 1008 | /// \see MakeMergedGenerator |
| 1009 | template <typename T> |