#include #include #include #include using namespace std; template class Cycle { public: using value_type = typename Container::value_type; Cycle(Container& c) : c{c} { } size_t size() const { return c.size(); } value_type const& at(int index) const { if (index < 0) throw out_of_range{"negative index"}; return c.at(index % size()); } value_type& at(int index) { if (index < 0) throw out_of_range{"negative index"}; return c.at(index % size()); } private: Container& c; }; #define CATCH_CONFIG_MAIN #include "catch.hpp" TEST_CASE("int vector") { vector v {1, 2, 3, 4}; Cycle> c {v}; for (int i{0}; i < v.size(); ++i) { CHECK (c.at(i) == v.at(i)); CHECK (c.at(i + v.size()) == v.at(i)); CHECK (c.at(i + 2 * v.size()) == v.at(i)); } c.at(0) = 5; CHECK(v.at(0) == 5); CHECK_THROWS(v.at(-1)); } TEST_CASE("string deque") { deque d {"programmering", "kul", "C++"}; Cycle> const c {d}; for (int i{0}; i < d.size(); ++i) { CHECK (c.at(i) == d.at(i)); CHECK (c.at(i + d.size()) == d.at(i)); CHECK (c.at(i + 2 * d.size()) == d.at(i)); } }