52 constexpr int initial = 1;
54 std::memory_order_acquire, std::memory_order_relaxed);
65 template <
typename... Args>
67 buffer_.emplace(std::forward<Args>(args)...);
81 const int reference_count =
83 if (reference_count == 1) {
95 [[nodiscard]] T*
get() noexcept {
108class SharedObjectMemoryPool;
151 :
buffer_(std::exchange(other.buffer_,
nullptr)),
162 if (
this == &other) {
182 buffer_ = std::exchange(other.buffer_,
nullptr);
219 :
public std::enable_shared_from_this<SharedObjectMemoryPool<T>> {
227 static std::shared_ptr<SharedObjectMemoryPool<T>>
create(
228 std::size_t num_buffers) {
229 return std::make_shared<SharedObjectMemoryPool<T>>(num_buffers);
257 template <
typename... Args>
266 throw std::bad_alloc();
272 buffer.
emplace(std::forward<Args>(args)...);
Class of buffers of shared objects.
T * get() noexcept
Access the object.
void add_reference() noexcept
Increase the reference count.
SharedObjectBuffer() noexcept=default
Constructor.
std::atomic< int > reference_count_
Reference count. (-1 for unused buffer.)
std::optional< T > buffer_
Buffer.
bool try_start_use() noexcept
Try to start to use.
void emplace(Args &&... args)
Construct an object.
void release() noexcept
Decrease the reference count and destruct the object if needed.
Class of memory pools of shared objects.
SharedObjectMemoryPool(std::size_t num_buffers)
Constructor.
std::vector< SharedObjectBuffer< T > > buffers_
Buffers.
std::size_t next_buffer_index_
Index of the next buffer.
static std::shared_ptr< SharedObjectMemoryPool< T > > create(std::size_t num_buffers)
Create a memory pool.
SharedObject< T > create(Args &&... args)
Create a shared object.
~SharedObjectMemoryPool()=default
Destructor.
Class to hold shared objects.
SharedObject(SharedObject &&other) noexcept
Move constructor.
SharedObject & operator=(const SharedObject &other) noexcept
Copy assignment operator.
void reset() noexcept
Remove the buffer.
SharedObject(const SharedObject &other) noexcept
Copy constructor.
SharedObject & operator=(SharedObject &&other) noexcept
Move assignment operator.
~SharedObject() noexcept
Destructor.
SharedObject() noexcept=default
Constructor.
SharedObjectBuffer< T > * buffer_
Buffer of the shared object.
std::shared_ptr< SharedObjectMemoryPool< T > > memory_pool_
Memory pool.
Namespace of internal implementations.