| 4067 | |
| 4068 | template <typename T> |
| 4069 | class TakeGenerator : public IGenerator<T> { |
| 4070 | GeneratorWrapper<T> m_generator; |
| 4071 | size_t m_returned = 0; |
| 4072 | size_t m_target; |
| 4073 | public: |
| 4074 | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator): |
| 4075 | m_generator(std::move(generator)), |
| 4076 | m_target(target) |
| 4077 | { |
| 4078 | assert(target != 0 && "Empty generators are not allowed"); |
| 4079 | } |
| 4080 | T const& get() const override { |
| 4081 | return m_generator.get(); |
| 4082 | } |
| 4083 | bool next() override { |
| 4084 | ++m_returned; |
| 4085 | if (m_returned >= m_target) { |
| 4086 | return false; |
| 4087 | } |
| 4088 | |
| 4089 | const auto success = m_generator.next(); |
| 4090 | // If the underlying generator does not contain enough values |
| 4091 | // then we cut short as well |
| 4092 | if (!success) { |
| 4093 | m_returned = m_target; |
| 4094 | } |
| 4095 | return success; |
| 4096 | } |
| 4097 | }; |
| 4098 | |
| 4099 | template <typename T> |
| 4100 | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { |