diff options
| author | Martin Hořeňovský | 2026-01-12 14:10:25 +0100 |
|---|---|---|
| committer | Martin Hořeňovský | 2026-01-12 14:27:49 +0100 |
| commit | 44c597f0742b491399994afa00070b99d3ef2885 (patch) | |
| tree | dbb0581d1bf101f4423f43b1e1d0ed150ed48ddb /src | |
| parent | 6aedc79870e7b9122b11810abe195f8cc70fbaa5 (diff) | |
| download | catch3-44c597f0742b491399994afa00070b99d3ef2885.tar.gz | |
Add Concat generator for combining multiple generators
Diffstat (limited to 'src')
| -rw-r--r-- | src/catch2/generators/catch_generators_adapters.hpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/catch2/generators/catch_generators_adapters.hpp b/src/catch2/generators/catch_generators_adapters.hpp index e5ddc25e..01f7c622 100644 --- a/src/catch2/generators/catch_generators_adapters.hpp +++ b/src/catch2/generators/catch_generators_adapters.hpp @@ -234,6 +234,49 @@ namespace Generators { ); } + template <typename T> + class ConcatGenerator final : public IGenerator<T> { + std::vector<GeneratorWrapper<T>> m_generators; + size_t m_current_generator = 0; + + void InsertGenerators( GeneratorWrapper<T>&& gen ) { + m_generators.push_back( CATCH_MOVE( gen ) ); + } + + template <typename... Generators> + void InsertGenerators( GeneratorWrapper<T>&& gen, Generators&&... gens ) { + m_generators.push_back( CATCH_MOVE( gen ) ); + InsertGenerators( CATCH_MOVE( gens )... ); + } + + public: + template <typename... Generators> + ConcatGenerator( Generators&&... generators ) { + InsertGenerators( CATCH_MOVE( generators )... ); + } + + T const& get() const override { + return m_generators[m_current_generator].get(); + } + bool next() override { + const bool success = m_generators[m_current_generator].next(); + if ( success ) { return true; } + + // If current generator is used up, we have to move to the next one + ++m_current_generator; + return m_current_generator < m_generators.size(); + } + }; + + template <typename T, typename... Generators> + GeneratorWrapper<T> cat( GeneratorWrapper<T>&& generator, + Generators&&... generators ) { + return GeneratorWrapper<T>( + Catch::Detail::make_unique<ConcatGenerator<T>>( + CATCH_MOVE( generator ), CATCH_MOVE( generators )... ) ); + } + + } // namespace Generators } // namespace Catch |