| 3592 | |
| 3593 | template<typename T> |
| 3594 | class Generators : public IGenerator<T> { |
| 3595 | std::vector<GeneratorWrapper<T>> m_generators; |
| 3596 | size_t m_current = 0; |
| 3597 | |
| 3598 | void populate(GeneratorWrapper<T>&& generator) { |
| 3599 | m_generators.emplace_back(std::move(generator)); |
| 3600 | } |
| 3601 | void populate(T&& val) { |
| 3602 | m_generators.emplace_back(value(std::move(val))); |
| 3603 | } |
| 3604 | template<typename U> |
| 3605 | void populate(U&& val) { |
| 3606 | populate(T(std::move(val))); |
| 3607 | } |
| 3608 | template<typename U, typename... Gs> |
| 3609 | void populate(U&& valueOrGenerator, Gs... moreGenerators) { |
| 3610 | populate(std::forward<U>(valueOrGenerator)); |
| 3611 | populate(std::forward<Gs>(moreGenerators)...); |
| 3612 | } |
| 3613 | |
| 3614 | public: |
| 3615 | template <typename... Gs> |
| 3616 | Generators(Gs... moreGenerators) { |
| 3617 | m_generators.reserve(sizeof...(Gs)); |
| 3618 | populate(std::forward<Gs>(moreGenerators)...); |
| 3619 | } |
| 3620 | |
| 3621 | T const& get() const override { |
| 3622 | return m_generators[m_current].get(); |
| 3623 | } |
| 3624 | |
| 3625 | bool next() override { |
| 3626 | if (m_current >= m_generators.size()) { |
| 3627 | return false; |
| 3628 | } |
| 3629 | const bool current_status = m_generators[m_current].next(); |
| 3630 | if (!current_status) { |
| 3631 | ++m_current; |
| 3632 | } |
| 3633 | return m_current < m_generators.size(); |
| 3634 | } |
| 3635 | }; |
| 3636 | |
| 3637 | template<typename... Ts> |
| 3638 | GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples ) { |