diff --git a/src/midi_RingBuffer.h b/src/midi_RingBuffer.h index 3627d5d..348ad9e 100644 --- a/src/midi_RingBuffer.h +++ b/src/midi_RingBuffer.h @@ -48,9 +48,11 @@ public: public: void write(DataType inData); void write(const DataType* inData, int inSize); + void pop(int inNumberOfItems = 1); void clear(); public: + DataType peek(int inOffset = 0) const; DataType read(); void read(DataType* outData, int inSize); diff --git a/src/midi_RingBuffer.hpp b/src/midi_RingBuffer.hpp index e1f48e7..f3c53eb 100644 --- a/src/midi_RingBuffer.hpp +++ b/src/midi_RingBuffer.hpp @@ -93,6 +93,15 @@ void RingBuffer::write(const DataType* inData, int inSize) } } +template +void RingBuffer::pop(int inNumberOfItems) +{ + for (int i = 0; i < inNumberOfItems; ++i) + { + read(); + } +} + template void RingBuffer::clear() { @@ -104,6 +113,13 @@ void RingBuffer::clear() // ----------------------------------------------------------------------------- +template +DataType RingBuffer::peek(int inOffset) const +{ + const int head = (mReadHead + inOffset) & sMask; + return mData[head]; +} + template DataType RingBuffer::read() { diff --git a/test/unit-tests/tests/unit-tests_RingBuffer.cpp b/test/unit-tests/tests/unit-tests_RingBuffer.cpp index d33352d..083deb7 100644 --- a/test/unit-tests/tests/unit-tests_RingBuffer.cpp +++ b/test/unit-tests/tests/unit-tests_RingBuffer.cpp @@ -170,5 +170,34 @@ TEST(RingBuffer, readArrayOverflow) EXPECT_EQ(buffer.getLength(), 0); } +TEST(RingBuffer, peek) +{ + Buffer buffer; + const uint8_t input[4] = { + 1, 2, 3, 4 + }; + + buffer.write(input, 4); + EXPECT_EQ(1, buffer.peek()); + EXPECT_EQ(2, buffer.peek(1)); + EXPECT_EQ(3, buffer.peek(2)); + EXPECT_EQ(4, buffer.peek(3)); + EXPECT_EQ(4, buffer.getLength()) << "Peek should not change buffer length"; +} + +TEST(RingBuffer, pop) +{ + Buffer buffer; + const uint8_t input[4] = { + 1, 2, 3, 4 + }; + + buffer.write(input, 4); + buffer.pop(); + EXPECT_EQ(3, buffer.getLength()); + buffer.pop(2); + EXPECT_EQ(1, buffer.getLength()); +} + END_UNNAMED_NAMESPACE