diff --git a/include/bx/inline/ringbuffer.inl b/include/bx/inline/ringbuffer.inl index 844d5b7..9d8ab94 100644 --- a/include/bx/inline/ringbuffer.inl +++ b/include/bx/inline/ringbuffer.inl @@ -38,13 +38,13 @@ namespace bx return size; } - inline uint32_t RingBufferControl::reserve(uint32_t _size) + inline uint32_t RingBufferControl::reserve(uint32_t _size, bool _mustSucceed) { const uint32_t dist = distance(m_write, m_read)-1; const uint32_t maxSize = uint32_sels(dist, m_size-1, dist); const uint32_t sizeNoSign = uint32_and(_size, 0x7fffffff); const uint32_t test = uint32_sub(sizeNoSign, maxSize); - const uint32_t size = uint32_sels(test, _size, maxSize); + const uint32_t size = uint32_sels(test, _size, _mustSucceed ? 0 : maxSize); const uint32_t advance = uint32_add(m_write, size); const uint32_t write = uint32_mod(advance, m_size); m_write = write; diff --git a/tests/ringbuffer_test.cpp b/tests/ringbuffer_test.cpp new file mode 100644 index 0000000..75d9501 --- /dev/null +++ b/tests/ringbuffer_test.cpp @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx#license-bsd-2-clause + */ + +#include "test.h" +#include + +TEST_CASE("RingBufferControl", "") +{ + bx::RingBufferControl control(16); + + REQUIRE(1 == control.reserve(1) ); + REQUIRE(0 == control.reserve(16, true) ); + REQUIRE(14 == control.reserve(16) ); + REQUIRE(15 == control.commit(15) ); + REQUIRE(15 == control.available() ); + REQUIRE(15 == control.consume(15) ); + REQUIRE(0 == control.available() ); +}