MCPcopy Create free account
hub / github.com/InteractiveComputerGraphics/TriangleMeshDistance / RepeatGenerator

Class RepeatGenerator

tests/catch.hpp:3721–3766  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3719
3720 template <typename T>
3721 class RepeatGenerator : public IGenerator<T> {
3722 GeneratorWrapper<T> m_generator;
3723 mutable std::vector<T> m_returned;
3724 size_t m_target_repeats;
3725 size_t m_current_repeat = 0;
3726 size_t m_repeat_index = 0;
3727 public:
3728 RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
3729 m_generator(std::move(generator)),
3730 m_target_repeats(repeats)
3731 {
3732 assert(m_target_repeats > 0 && "Repeat generator must repeat at least once");
3733 }
3734
3735 T const& get() const override {
3736 if (m_current_repeat == 0) {
3737 m_returned.push_back(m_generator.get());
3738 return m_returned.back();
3739 }
3740 return m_returned[m_repeat_index];
3741 }
3742
3743 bool next() override {
3744 // There are 2 basic cases:
3745 // 1) We are still reading the generator
3746 // 2) We are reading our own cache
3747
3748 // In the first case, we need to poke the underlying generator.
3749 // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache
3750 if (m_current_repeat == 0) {
3751 const auto success = m_generator.next();
3752 if (!success) {
3753 ++m_current_repeat;
3754 }
3755 return m_current_repeat < m_target_repeats;
3756 }
3757
3758 // In the second case, we need to move indices forward and check that we haven't run up against the end
3759 ++m_repeat_index;
3760 if (m_repeat_index == m_returned.size()) {
3761 m_repeat_index = 0;
3762 ++m_current_repeat;
3763 }
3764 return m_current_repeat < m_target_repeats;
3765 }
3766 };
3767
3768 template <typename T>
3769 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