Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorMartin Hořeňovský2026-01-12 14:10:25 +0100
committerMartin Hořeňovský2026-01-12 14:27:49 +0100
commit44c597f0742b491399994afa00070b99d3ef2885 (patch)
treedbb0581d1bf101f4423f43b1e1d0ed150ed48ddb /src
parent6aedc79870e7b9122b11810abe195f8cc70fbaa5 (diff)
downloadcatch3-44c597f0742b491399994afa00070b99d3ef2885.tar.gz
Add Concat generator for combining multiple generators
Diffstat (limited to 'src')
-rw-r--r--src/catch2/generators/catch_generators_adapters.hpp43
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