Circular / Cyclic Buffer implementation
Your ringbuffer has a compile time size, so it would be appropriate to make it a template class rather than simply passing it as an argument to the constructor. You never plan to change it anyway?

template&lt;size_t bufSize&gt;
class CircularBuffer


That leads to the next point. You use a std::unique_ptr&lt;int[]&gt; There is something in C++ that is much better than this std::array. With the size of the buffer a compile time template argument of the class you can easily use it

template&lt;size_t bufSize&gt;
class CircularBuffer {
    std::array&lt;int, bufSize&gt; buf;
    std::size_t head;
    std::size_t tail;
    bool full_v;

    ...
};


Note that this increases the size of the class object considerably, as the std::array is directly inlined in the class.

The other members of this class are always the same after construction so you should use static member initialization:

template&lt;size_t bufSize&gt;
class CircularBuffer {
    std::array&lt;int, bufSize&gt; buf;
    std::size_t head{ 0 };
    std::size_t tail{ 0 };
    bool full_v{ false };

    ...
};


Note that this completely removes the need to define a constructor at all. The compiler generated default constructor will do just fine.

Resetting the buffer should not change the data stored in it as it is not read anyway so just leave it alone

void CircularBuffer::reset()
{
    head = 0;
    tail = 0;
    full_v = false;
}


Can tail ever be larger than head? If not why are you checking it.