Skip to content

Instantly share code, notes, and snippets.

@dtoma
Created February 24, 2017 08:17
Show Gist options
  • Save dtoma/c964b3135e0870490116586b724e1e0e to your computer and use it in GitHub Desktop.
Save dtoma/c964b3135e0870490116586b724e1e0e to your computer and use it in GitHub Desktop.
ringbuffer
#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