| 3963 | |
| 3964 | template<typename T> |
| 3965 | class Generators : public IGenerator<T> { |
| 3966 | std::vector<GeneratorWrapper<T>> m_generators; |
| 3967 | size_t m_current = 0; |
| 3968 | |
| 3969 | void populate(GeneratorWrapper<T>&& generator) { |
| 3970 | m_generators.emplace_back(std::move(generator)); |
| 3971 | } |
| 3972 | void populate(T&& val) { |
| 3973 | m_generators.emplace_back(value(std::move(val))); |
| 3974 | } |
| 3975 | template<typename U> |
| 3976 | void populate(U&& val) { |
| 3977 | populate(T(std::move(val))); |
| 3978 | } |
| 3979 | template<typename U, typename... Gs> |
| 3980 | void populate(U&& valueOrGenerator, Gs... moreGenerators) { |
| 3981 | populate(std::forward<U>(valueOrGenerator)); |
| 3982 | populate(std::forward<Gs>(moreGenerators)...); |
| 3983 | } |
| 3984 | |
| 3985 | public: |
| 3986 | template <typename... Gs> |
| 3987 | Generators(Gs... moreGenerators) { |
| 3988 | m_generators.reserve(sizeof...(Gs)); |
| 3989 | populate(std::forward<Gs>(moreGenerators)...); |
| 3990 | } |
| 3991 | |
| 3992 | T const& get() const override { |
| 3993 | return m_generators[m_current].get(); |
| 3994 | } |
| 3995 | |
| 3996 | bool next() override { |
| 3997 | if (m_current >= m_generators.size()) { |
| 3998 | return false; |
| 3999 | } |
| 4000 | const bool current_status = m_generators[m_current].next(); |
| 4001 | if (!current_status) { |
| 4002 | ++m_current; |
| 4003 | } |
| 4004 | return m_current < m_generators.size(); |
| 4005 | } |
| 4006 | }; |
| 4007 | |
| 4008 | template<typename... Ts> |
| 4009 | GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples ) { |