| 3644 | |
| 3645 | template <typename T> |
| 3646 | class TakeGenerator : public IGenerator<T> { |
| 3647 | GeneratorWrapper<T> m_generator; |
| 3648 | size_t m_returned = 0; |
| 3649 | size_t m_target; |
| 3650 | public: |
| 3651 | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator): |
| 3652 | m_generator(std::move(generator)), |
| 3653 | m_target(target) |
| 3654 | { |
| 3655 | assert(target != 0 && "Empty generators are not allowed"); |
| 3656 | } |
| 3657 | T const& get() const override { |
| 3658 | return m_generator.get(); |
| 3659 | } |
| 3660 | bool next() override { |
| 3661 | ++m_returned; |
| 3662 | if (m_returned >= m_target) { |
| 3663 | return false; |
| 3664 | } |
| 3665 | |
| 3666 | const auto success = m_generator.next(); |
| 3667 | // If the underlying generator does not contain enough values |
| 3668 | // then we cut short as well |
| 3669 | if (!success) { |
| 3670 | m_returned = m_target; |
| 3671 | } |
| 3672 | return success; |
| 3673 | } |
| 3674 | }; |
| 3675 | |
| 3676 | template <typename T> |
| 3677 | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { |