Class RepeatGenerator

Synopsis

#include <include/internal/catch_generators_generic.hpp>

template <typename T>
class RepeatGenerator : public IGenerator<T>

Description

No description yet.

Mentioned in

Inheritance

Ancestors: IGenerator

Methods

RepeatGenerator
get
next

Source

Lines 93-142 in include/internal/catch_generators_generic.hpp.

template <typename T>
class RepeatGenerator : public IGenerator<T> {
    static_assert(!std::is_same<T, bool>::value,
        "RepeatGenerator currently does not support bools"
        "because of std::vector<bool> specialization");
    GeneratorWrapper<T> m_generator;
    mutable std::vector<T> m_returned;
    size_t m_target_repeats;
    size_t m_current_repeat = 0;
    size_t m_repeat_index = 0;
public:
    RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
        m_generator(std::move(generator)),
        m_target_repeats(repeats)
    {
        assert(m_target_repeats > 0 && "Repeat generator must repeat at least once");
    }
    T const& get() const override {
        if (m_current_repeat == 0) {
            m_returned.push_back(m_generator.get());
            return m_returned.back();
        }
        return m_returned[m_repeat_index];
    }
    bool next() override {
        // There are 2 basic cases:
        // 1) We are still reading the generator
        // 2) We are reading our own cache
        // In the first case, we need to poke the underlying generator.
        // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache
        if (m_current_repeat == 0) {
            const auto success = m_generator.next();
            if (!success) {
                ++m_current_repeat;
            }
            return m_current_repeat < m_target_repeats;
        }
        // In the second case, we need to move indices forward and check that we haven't run up against the end
        ++m_repeat_index;
        if (m_repeat_index == m_returned.size()) {
            m_repeat_index = 0;
            ++m_current_repeat;
        }
        return m_current_repeat < m_target_repeats;
    }
};





Add Discussion as Guest

Log in