| 4015 | |
| 4016 | template <typename T> |
| 4017 | class TakeGenerator : public IGenerator<T> { |
| 4018 | GeneratorWrapper<T> m_generator; |
| 4019 | size_t m_returned = 0; |
| 4020 | size_t m_target; |
| 4021 | public: |
| 4022 | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator): |
| 4023 | m_generator(std::move(generator)), |
| 4024 | m_target(target) |
| 4025 | { |
| 4026 | assert(target != 0 && "Empty generators are not allowed"); |
| 4027 | } |
| 4028 | T const& get() const override { |
| 4029 | return m_generator.get(); |
| 4030 | } |
| 4031 | bool next() override { |
| 4032 | ++m_returned; |
| 4033 | if (m_returned >= m_target) { |
| 4034 | return false; |
| 4035 | } |
| 4036 | |
| 4037 | const auto success = m_generator.next(); |
| 4038 | // If the underlying generator does not contain enough values |
| 4039 | // then we cut short as well |
| 4040 | if (!success) { |
| 4041 | m_returned = m_target; |
| 4042 | } |
| 4043 | return success; |
| 4044 | } |
| 4045 | }; |
| 4046 | |
| 4047 | template <typename T> |
| 4048 | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { |