MCPcopy Create free account
hub / github.com/Profactor/cv-plot / RepeatGenerator

Class RepeatGenerator

CvPlot/ext/catch2/inc/catch.hpp:4144–4192  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4142
4143 template <typename T>
4144 class RepeatGenerator : public IGenerator<T> {
4145 static_assert(!std::is_same<T, bool>::value,
4146 "RepeatGenerator currently does not support bools"
4147 "because of std::vector<bool> specialization");
4148 GeneratorWrapper<T> m_generator;
4149 mutable std::vector<T> m_returned;
4150 size_t m_target_repeats;
4151 size_t m_current_repeat = 0;
4152 size_t m_repeat_index = 0;
4153 public:
4154 RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
4155 m_generator(std::move(generator)),
4156 m_target_repeats(repeats)
4157 {
4158 assert(m_target_repeats > 0 && "Repeat generator must repeat at least once");
4159 }
4160
4161 T const& get() const override {
4162 if (m_current_repeat == 0) {
4163 m_returned.push_back(m_generator.get());
4164 return m_returned.back();
4165 }
4166 return m_returned[m_repeat_index];
4167 }
4168
4169 bool next() override {
4170 // There are 2 basic cases:
4171 // 1) We are still reading the generator
4172 // 2) We are reading our own cache
4173
4174 // In the first case, we need to poke the underlying generator.
4175 // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache
4176 if (m_current_repeat == 0) {
4177 const auto success = m_generator.next();
4178 if (!success) {
4179 ++m_current_repeat;
4180 }
4181 return m_current_repeat < m_target_repeats;
4182 }
4183
4184 // In the second case, we need to move indices forward and check that we haven't run up against the end
4185 ++m_repeat_index;
4186 if (m_repeat_index == m_returned.size()) {
4187 m_repeat_index = 0;
4188 ++m_current_repeat;
4189 }
4190 return m_current_repeat < m_target_repeats;
4191 }
4192 };
4193
4194 template <typename T>
4195 GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) {

Callers

nothing calls this directly

Calls 1

getMethod · 0.45

Tested by

no test coverage detected