int main() { { // Test default constructor CircularBuffer buf; std::cout << buf.size() << "\n"; } { // Test constructor taking 1 arg: size of buffer CircularBuffer buf(32); std::cout << buf.size() << "\n"; } { // Test constructor taking std::vector std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; CircularBuffer buf(v); std::cout << buf.size() << "\n"; } { // Test copy constructor std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; CircularBuffer buf(v); CircularBuffer buf2(buf); std::cout << buf.size() << ", " << buf2.size() << "\n"; } { // Test move constructor std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; CircularBuffer buf(v); CircularBuffer buf2(std::move(buf)); std::cout << buf.size() << ", " << buf2.size() << "\n"; } { // Test copy assignment std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; CircularBuffer buf(v); CircularBuffer buf2(3); std::cout << buf.size() << ", " << buf2.size() << " -> "; buf2 = buf; std::cout << buf.size() << ", " << buf2.size() << "\n"; } { // Test move assignment std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; CircularBuffer buf(v); CircularBuffer buf2(3); std::cout << buf.size() << ", " << buf2.size() << " -> "; buf2 = std::move(buf); std::cout << buf.size() << ", " << buf2.size() << "\n"; } { // Test indexing CircularBuffer buf(10); buf[0] = buf[2] = buf[4] = buf[6] = buf[8] = 1; buf[1] = buf[3] = buf[5] = buf[7] = buf[9] = 2; std::cout << buf.at(1) << " " << buf[6] << "\n"; std::cout << buf.at(32) << " " << buf[127] << "\n"; } { // Test indexing const object const CircularBuffer buf({1, 2, 3, 4, 5}); std::cout << buf.at(1) << " " << buf[8] << "\n"; } { // Test size (already used above) CircularBuffer buf(3); if (buf.size() != 3) std::cout << "Incorrect size!\n"; else std::cout << "Correct size!\n"; } { // Test clear CircularBuffer buf(5); std::cout << buf.size() << " -> "; buf.clear(); std::cout << buf.size() << "\n"; } { // Test swap CircularBuffer buf({1, 2, 3, 4, 5}); CircularBuffer buf2({6, 7, 8, 9, 0}); std::cout << buf[0] << " " << buf[4] << " : " << buf2[0] << " " << buf2[4] << " -> "; buf.swap(buf2); std::cout << buf[0] << " " << buf[4] << " : " << buf2[0] << " " << buf2[4] << "\n"; } { // Test insert CircularBuffer buf; buf.insert(0, 1); buf.insert(0, 2); buf.insert(0, 3); std::cout << buf.size() << " " << buf[2] << "\n"; buf.insert(200, 4); std::cout << buf.size() << " " << buf[2] << "\n"; } { // Test move-insert CircularBuffer buf; int x = 3; buf.insert(0, std::move(x)); int y = 2; buf.insert(0, std::move(y)); std::cout << buf[0] << " " << buf[1] << " " << buf[2] << "\n"; } { // Test erase CircularBuffer buf({1, 2, 3, 4}); std::cout << buf[0] << " " << buf.size() << " -> "; buf.erase(0); std::cout << buf[0] << " " << buf.size() << "\n"; } return 0; }