Skip to content

Commit

Permalink
Add peek to queue_spsc_atomic (ETLCPP#430)
Browse files Browse the repository at this point in the history
  • Loading branch information
fractalembedded authored Oct 1, 2021
1 parent 0754b33 commit 71c8544
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
18 changes: 18 additions & 0 deletions include/etl/queue_spsc_atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,24 @@ namespace etl
}
#endif

//*************************************************************************
/// Peek the next value in the queue without removing it.
//*************************************************************************
bool peek(reference value)
{
size_type read_index = read.load(etl::memory_order_relaxed);

if (read_index == write.load(etl::memory_order_acquire))
{
// Queue is empty
return false;
}

value = p_buffer[read_index];

return true;
}

//*************************************************************************
/// Pop a value from the queue.
//*************************************************************************
Expand Down
46 changes: 46 additions & 0 deletions test/test_queue_spsc_atomic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,52 @@ namespace
CHECK(!queue.pop());
}

TEST(test_size_push_peek_pop)
{
etl::queue_spsc_atomic<int, 4> queue;

CHECK_EQUAL(0U, queue.size());

queue.push(1);
queue.push(2);
queue.push(3);
queue.push(4);
CHECK_EQUAL(4U, queue.size());

int i;

CHECK(queue.peek(i));
CHECK_EQUAL(1, i);
CHECK_EQUAL(4U, queue.size());

CHECK(queue.peek(i));
CHECK_EQUAL(1, i);
CHECK_EQUAL(4U, queue.size());

CHECK(queue.pop());
CHECK_EQUAL(3U, queue.size());

CHECK(queue.pop());
CHECK_EQUAL(2U, queue.size());

CHECK(queue.pop());
CHECK_EQUAL(1U, queue.size());

CHECK(queue.peek(i));
CHECK_EQUAL(4, i);
CHECK_EQUAL(1U, queue.size());

CHECK(queue.peek(i));
CHECK_EQUAL(4, i);
CHECK_EQUAL(1U, queue.size());

CHECK(queue.pop());
CHECK_EQUAL(0U, queue.size());

CHECK(!queue.peek(i));
CHECK(!queue.peek(i));
}

//*************************************************************************
TEST(test_multiple_emplace)
{
Expand Down

0 comments on commit 71c8544

Please sign in to comment.