36{
37 std::cout << "=== Utility Containers Example ===\n\n";
38
39
40 std::cout << "1. CircularBuffer (mutex-protected, capacity=5):\n";
41 {
43
44
45 for (int i = 1; i <= 5; ++i)
46 {
48 }
49 std::cout <<
" Pushed 1-5. Size=" << buffer.
size() <<
", Full=" << buffer.
full() <<
"\n";
50
51
52 buffer.
push(99,
true);
53 std::cout <<
" Pushed 99 with overwrite. Size=" << buffer.
size() <<
"\n";
54
55
56 std::cout << " Popping: ";
57 while (
auto val = buffer.
pop())
58 {
59 std::cout << *val << " ";
60 }
61 std::cout <<
"\n Empty=" << buffer.
empty() <<
"\n";
62 }
63
64
65 std::cout << "\n2. SPSCCircularBuffer (lock-free, capacity=4):\n";
66 {
68
72 std::cout <<
" Pushed 3 strings. Size=" << spsc.
size() <<
"\n";
73
74
75 if (
auto val = spsc.
pop())
76 {
77 std::cout << " Popped: '" << *val << "'\n";
78 }
79 std::cout <<
" Remaining size=" << spsc.
size() <<
"\n";
80 }
81
82
83 std::cout << "\n3. ObjectPool (growth=4):\n";
84 {
86
87
88 pool.reserve(8);
89 std::cout << " Reserved 8 slots. Available=" << pool.available() << "\n";
90
91
92 bool reused = false;
93 auto conn1 = pool.acquire(&reused, 1, "db-primary");
94 std::cout << " Acquired conn1: id=" << conn1->id << ", endpoint=" << conn1->endpoint
95 << ", reused=" << (reused ? "true" : "false") << "\n";
96
97 auto conn2 = pool.acquire(&reused, 2, "db-replica");
98 std::cout << " Acquired conn2: id=" << conn2->id
99 << ", available=" << pool.available() << "\n";
100
101
102 std::cout << " Releasing conn1...\n";
103 conn1.reset();
104 std::cout << " Available after release=" << pool.available() << "\n";
105
106
107 auto conn3 = pool.acquire(&reused, 3, "db-analytics");
108 std::cout << " Acquired conn3: reused=" << (reused ? "true" : "false") << "\n";
109
110
111 conn2.reset();
112 conn3.reset();
113 pool.clear();
114 std::cout << " Pool cleared. Available=" << pool.available() << "\n";
115 }
116
117 std::cout << "\nDone.\n";
118 return 0;
119}
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).