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