Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,9 @@ endif()
# ------------------------------------------------------------------------------

add_subdirectory(hello_world)
# add_subdirectory(linked_list)
add_subdirectory(ring_buffer)





1 change: 0 additions & 1 deletion hello_world/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,3 @@ target_include_directories(HelloWorld
)

add_subdirectory(tests)
add_subdirectory(examples)
9 changes: 0 additions & 9 deletions hello_world/examples/CMakeLists.txt

This file was deleted.

4 changes: 0 additions & 4 deletions hello_world/examples/basic_usage.cpp

This file was deleted.

10 changes: 10 additions & 0 deletions ring_buffer/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
add_library(RingBuffer INTERFACE)

target_sources(RingBuffer
INTERFACE
FILE_SET HEADERS
FILES
ring_buffer.hpp
)

add_subdirectory(tests)
44 changes: 44 additions & 0 deletions ring_buffer/ring_buffer.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#pragma once

#include <vector>

namespace Containers {

template <typename T> class ring_buffer {
size_t size_;
size_t begin_, end_;
std::vector<T> data_;

public:
ring_buffer(size_t sz) : size_{0}, begin_{0}, end_{0} { data_.reserve(sz); }
size_t size() const { return size_; }
size_t capacity() const { return data_.capacity(); }

private:
bool is_full() const { return size_ == capacity(); }
bool is_empty() const {
if (begin_ == end_ && !is_full())
return true;
return false;
}

public:
bool push(const T &elem) {
if (is_full())
return false;
data_[end_++] = elem;
end_ %= capacity();
++size_;
return true;
}
bool pop() {
if (is_empty())
return false;
++begin_;
begin_ %= capacity();
--size_;
return true;
}
};

} // namespace Containers
13 changes: 13 additions & 0 deletions ring_buffer/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
add_executable(ring_buffer_tests
ring_buffer_tests.cpp
)

target_link_libraries(ring_buffer_tests
PRIVATE
RingBuffer
#project_warnings
GTest::gtest_main
)

include(GoogleTest)
gtest_discover_tests(ring_buffer_tests)
40 changes: 40 additions & 0 deletions ring_buffer/tests/ring_buffer_tests.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include "ring_buffer.hpp"
#include <gtest/gtest.h>

TEST(RingBuffer, constructor) {
const size_t sz = 3;
Containers::ring_buffer<int> rb{sz};
EXPECT_EQ(rb.size(), 0);
EXPECT_EQ(rb.capacity(), sz);
}

TEST(RingBuffer, push) {
const size_t sz = 2;
Containers::ring_buffer<int> rb{sz};

EXPECT_TRUE(rb.push(10));
EXPECT_EQ(rb.size(), 1);

EXPECT_TRUE(rb.push(20));
EXPECT_EQ(rb.size(), 2);

EXPECT_FALSE(rb.push(30));
EXPECT_EQ(rb.size(), 2);
}

TEST(RingBuffer, pop) {
const size_t sz = 2;
Containers::ring_buffer<int> rb{sz};

EXPECT_TRUE(rb.push(10));
EXPECT_TRUE(rb.push(20));
EXPECT_EQ(rb.size(), 2);

EXPECT_TRUE(rb.pop());
EXPECT_EQ(rb.size(), 1);

EXPECT_TRUE(rb.pop());
EXPECT_EQ(rb.size(), 0);

EXPECT_FALSE(rb.pop());
}
Loading