Demonstrates CircularBuffer and ObjectPool utility containers.
Demonstrates CircularBuffer and ObjectPool utility containers.Shows mutex-protected circular buffer, SPSC lock-free buffer for producer-consumer scenarios, and object pool with automatic recycling.
#include <iostream>
#include <string>
{
};
{
std::cout << "=== Utility Containers Example ===\n\n";
std::cout << "1. CircularBuffer (mutex-protected, capacity=5):\n";
{
for (int i = 1; i <= 5; ++i)
{
}
std::cout <<
" Pushed 1-5. Size=" << buffer.
size() <<
", Full=" << buffer.
full() <<
"\n";
std::cout <<
" Pushed 99 with overwrite. Size=" << buffer.
size() <<
"\n";
std::cout << " Popping: ";
while (
auto val = buffer.
pop())
{
std::cout << *val << " ";
}
std::cout <<
"\n Empty=" << buffer.
empty() <<
"\n";
}
std::cout << "\n2. SPSCCircularBuffer (lock-free, capacity=4):\n";
{
std::cout <<
" Pushed 3 strings. Size=" << spsc.
size() <<
"\n";
if (
auto val = spsc.
pop())
{
std::cout << " Popped: '" << *val << "'\n";
}
std::cout <<
" Remaining size=" << spsc.
size() <<
"\n";
}
std::cout << "\n3. ObjectPool (growth=4):\n";
{
pool.reserve(8);
std::cout << " Reserved 8 slots. Available=" << pool.available() << "\n";
bool reused = false;
auto conn1 = pool.acquire(&reused, 1, "db-primary");
std::cout << " Acquired conn1: id=" << conn1->id << ", endpoint=" << conn1->endpoint
<< ", reused=" << (reused ? "true" : "false") << "\n";
auto conn2 = pool.acquire(&reused, 2, "db-replica");
std::cout << " Acquired conn2: id=" << conn2->id
<< ", available=" << pool.available() << "\n";
std::cout << " Releasing conn1...\n";
conn1.reset();
std::cout << " Available after release=" << pool.available() << "\n";
auto conn3 = pool.acquire(&reused, 3, "db-analytics");
std::cout << " Acquired conn3: reused=" << (reused ? "true" : "false") << "\n";
conn2.reset();
conn3.reset();
pool.clear();
std::cout << " Pool cleared. Available=" << pool.available() << "\n";
}
std::cout << "\nDone.\n";
return 0;
}
Thread-safe fixed-capacity circular buffer (SPSC-friendly).
Thread-safe fixed-size circular buffer.
bool push(const T &value, bool overwrite=false)
Thread-safe object pool that reuses raw storage for expensive objects.
Lock-free circular buffer for single-producer single-consumer (SPSC).
bool push(const T &value)
Push a value (producer thread only).
std::size_t size() const noexcept
std::optional< T > pop()
Pop a value (consumer thread only).
Thread-safe object pool reusing raw storage for expensive objects.