| 4118 | |
| 4119 | template <typename T> |
| 4120 | class TakeGenerator : public IGenerator<T> { |
| 4121 | GeneratorWrapper<T> m_generator; |
| 4122 | size_t m_returned = 0; |
| 4123 | size_t m_target; |
| 4124 | public: |
| 4125 | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator): |
| 4126 | m_generator(std::move(generator)), |
| 4127 | m_target(target) |
| 4128 | { |
| 4129 | assert(target != 0 && "Empty generators are not allowed"); |
| 4130 | } |
| 4131 | T const& get() const override { |
| 4132 | return m_generator.get(); |
| 4133 | } |
| 4134 | bool next() override { |
| 4135 | ++m_returned; |
| 4136 | if (m_returned >= m_target) { |
| 4137 | return false; |
| 4138 | } |
| 4139 | |
| 4140 | const auto success = m_generator.next(); |
| 4141 | // If the underlying generator does not contain enough values |
| 4142 | // then we cut short as well |
| 4143 | if (!success) { |
| 4144 | m_returned = m_target; |
| 4145 | } |
| 4146 | return success; |
| 4147 | } |
| 4148 | }; |
| 4149 | |
| 4150 | template <typename T> |
| 4151 | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { |