| 3696 | |
| 3697 | template <typename T> |
| 3698 | class TakeGenerator : public IGenerator<T> { |
| 3699 | GeneratorWrapper<T> m_generator; |
| 3700 | size_t m_returned = 0; |
| 3701 | size_t m_target; |
| 3702 | public: |
| 3703 | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator): |
| 3704 | m_generator(std::move(generator)), |
| 3705 | m_target(target) |
| 3706 | { |
| 3707 | assert(target != 0 && "Empty generators are not allowed"); |
| 3708 | } |
| 3709 | T const& get() const override { |
| 3710 | return m_generator.get(); |
| 3711 | } |
| 3712 | bool next() override { |
| 3713 | ++m_returned; |
| 3714 | if (m_returned >= m_target) { |
| 3715 | return false; |
| 3716 | } |
| 3717 | |
| 3718 | const auto success = m_generator.next(); |
| 3719 | // If the underlying generator does not contain enough values |
| 3720 | // then we cut short as well |
| 3721 | if (!success) { |
| 3722 | m_returned = m_target; |
| 3723 | } |
| 3724 | return success; |
| 3725 | } |
| 3726 | }; |
| 3727 | |
| 3728 | template <typename T> |
| 3729 | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { |