Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement