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

summaryrefslogtreecommitdiffhomepage
path: root/src/catch2/generators
diff options
context:
space:
mode:
authorMartin Hořeňovský2026-01-12 22:39:59 +0100
committerMartin Hořeňovský2026-01-12 22:39:59 +0100
commit024aec9729e0146c809da0c005e7733834f652a0 (patch)
tree95bb14e81629ade81107f44f9084798827b29b92 /src/catch2/generators
parent9eca713a1f4555b3095564781d77654958ee3dc1 (diff)
downloadcatch3-024aec9729e0146c809da0c005e7733834f652a0.tar.gz
Add efficient skip forward to Values, Map and Take generators
Diffstat (limited to 'src/catch2/generators')
-rw-r--r--src/catch2/generators/catch_generators.hpp9
-rw-r--r--src/catch2/generators/catch_generators_adapters.hpp31
2 files changed, 40 insertions, 0 deletions
diff --git a/src/catch2/generators/catch_generators.hpp b/src/catch2/generators/catch_generators.hpp
index 0f35a996..e64f9b5f 100644
--- a/src/catch2/generators/catch_generators.hpp
+++ b/src/catch2/generators/catch_generators.hpp
@@ -93,6 +93,15 @@ namespace Detail {
"specialization, use SingleValue Generator instead.");
std::vector<T> m_values;
size_t m_idx = 0;
+
+ void skipToNthElementImpl( std::size_t n ) override {
+ if ( n >= m_values.size() ) {
+ Detail::throw_generator_exception(
+ "Coud not jump to Nth element: not enough elements" );
+ }
+ m_idx = n;
+ }
+
public:
FixedValuesGenerator( std::initializer_list<T> values ) : m_values( values ) {}
diff --git a/src/catch2/generators/catch_generators_adapters.hpp b/src/catch2/generators/catch_generators_adapters.hpp
index 01f7c622..35c103ce 100644
--- a/src/catch2/generators/catch_generators_adapters.hpp
+++ b/src/catch2/generators/catch_generators_adapters.hpp
@@ -22,6 +22,22 @@ namespace Generators {
GeneratorWrapper<T> m_generator;
size_t m_returned = 0;
size_t m_target;
+
+ void skipToNthElementImpl( std::size_t n ) override {
+ if ( n >= m_target ) {
+ Detail::throw_generator_exception(
+ "Coud not jump to Nth element: not enough elements" );
+ }
+
+ for (; m_returned < n; ++m_returned) {
+ const auto success = m_generator.next();
+ if ( !success ) {
+ Detail::throw_generator_exception(
+ "Coud not jump to Nth element: not enough elements" );
+ }
+ }
+ }
+
public:
TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):
m_generator(CATCH_MOVE(generator)),
@@ -158,6 +174,21 @@ namespace Generators {
Func m_function;
// To avoid returning dangling reference, we have to save the values
T m_cache;
+
+ void skipToNthElementImpl( std::size_t n ) override {
+ for ( size_t curr = GeneratorUntypedBase::currentElementIndex();
+ curr < n;
+ ++curr ) {
+ const auto success = m_generator.next();
+ if (!success) {
+ Detail::throw_generator_exception(
+ "Coud not jump to Nth element: not enough elements" );
+ }
+ }
+
+ m_cache = m_function( m_generator.get() );
+ }
+
public:
template <typename F2 = Func>
MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :