Created
February 24, 2017 08:17
-
-
Save dtoma/c964b3135e0870490116586b724e1e0e to your computer and use it in GitHub Desktop.
ringbuffer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <array> | |
#include <iostream> | |
#include <iomanip> | |
namespace { | |
template <typename T, std::size_t N> | |
auto print_array(std::array<T, N> a) { | |
std::cout << "array: |"; | |
for (auto const& e : a) { | |
std::cout << std::setw(2) << e << "|"; | |
} | |
std::cout << "\n"; | |
} | |
template <typename T, std::size_t N> | |
auto mask(std::array<T, N>, T val) { | |
return val & (N - 1); | |
} | |
template <typename T, std::size_t N> | |
auto push(std::array<T, N>& buffer, T val, uint32_t& write) { | |
buffer[mask(buffer, write++)] = val; | |
} | |
template <typename T, std::size_t N> | |
auto shift(std::array<T, N>& buffer, T val, uint32_t& read) { | |
return buffer[mask(buffer, read++)]; | |
} | |
auto empty(uint32_t read, uint32_t write) { | |
return read == write; | |
} | |
auto size(uint32_t read, uint32_t write) { | |
return write - read; | |
} | |
template <typename T, std::size_t N> | |
auto full(std::array<T, N>, uint32_t read, uint32_t write) { | |
return size(read, write) == N; | |
} | |
} | |
int main() { | |
std::array<uint32_t, 4> buffer = { 0, 0, 0, 0 }; | |
uint32_t read = 1; | |
uint32_t write = 1; | |
print_array(buffer); | |
for (uint32_t i = 1; i < 11; ++i) { | |
push(buffer, i, write); | |
print_array(buffer); | |
std::cout << "Buffer is " << (full(buffer, read, write) ? "full" : "not full") << "\n"; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment