26#ifndef LMMS_SHARED_MEMORY_H
27#define LMMS_SHARED_MEMORY_H
30#include <memory_resource>
42class SharedMemoryImpl;
56 auto temp = std::move(other);
64 swap(a.m_key, b.m_key);
65 swap(a.m_impl, b.m_impl);
66 swap(a.m_ptr, b.m_ptr);
69 const std::string&
key() const noexcept {
return m_key; }
75 std::unique_ptr<SharedMemoryImpl>
m_impl;
89 , m_availableBytes{bufferSize}
90 , m_initialBuffer{buffer}
91 , m_initialBufferSize{bufferSize}
114 void reset(
void* newBuffer, std::size_t newBufferSize)
noexcept
122 void*
do_allocate(std::size_t bytes, std::size_t alignment)
override
125 if (!p) {
throw std::bad_alloc{}; }
132 bool do_is_equal(
const std::pmr::memory_resource& other)
const noexcept override
134 return this == &other;
149 static_assert(std::is_trivial_v<T>,
"objects held in shared memory must be trivial");
150 static_assert(
sizeof(T) > 0);
179 const std::string&
key() const noexcept {
return m_data.key(); }
180 T*
get() const noexcept {
return static_cast<T*
>(
m_data.get()); }
182 std::size_t
size() const noexcept {
return get() ? 1 : 0; }
187 explicit operator bool() const noexcept {
return get() !=
nullptr; }
197 static_assert(std::is_trivial_v<T>,
"objects held in shared memory must be trivial");
198 static_assert(
sizeof(T) > 0);
231 const std::string&
key() const noexcept {
return m_data.key(); }
232 T*
get() const noexcept {
return static_cast<T*
>(
m_data.get()); }
234 std::size_t
size() const noexcept {
return m_data.arraySize() /
sizeof(T); }
238 explicit operator bool() const noexcept {
return get() !=
nullptr; }
std::size_t size() const noexcept
Definition SharedMemory.h:234
SharedMemory(const SharedMemory &)=delete
detail::SharedMemoryData m_data
Definition SharedMemory.h:243
T & operator[](std::size_t index) const noexcept
Definition SharedMemory.h:237
SharedMemory & operator=(const SharedMemory &)=delete
void attach(std::string key)
Definition SharedMemory.h:207
SharedMemoryResource * resource() noexcept
Definition SharedMemory.h:240
void create(std::size_t size)
Definition SharedMemory.h:219
const std::string & key() const noexcept
Definition SharedMemory.h:231
void detach() noexcept
Definition SharedMemory.h:225
SharedMemory & operator=(SharedMemory &&)=default
SharedMemoryResource m_resource
Definition SharedMemory.h:244
void create(std::string key, std::size_t size)
Definition SharedMemory.h:213
SharedMemory(SharedMemory &&)=default
std::size_t size_bytes() const noexcept
Definition SharedMemory.h:235
T * get() const noexcept
Definition SharedMemory.h:232
std::size_t size() const noexcept
Definition SharedMemory.h:182
detail::SharedMemoryData m_data
Definition SharedMemory.h:190
T * get() const noexcept
Definition SharedMemory.h:180
SharedMemory(SharedMemory &&)=default
void attach(std::string key)
Definition SharedMemory.h:159
T * operator->() const noexcept
Definition SharedMemory.h:185
void create()
Definition SharedMemory.h:169
void create(std::string key)
Definition SharedMemory.h:164
std::size_t size_bytes() const noexcept
Definition SharedMemory.h:183
void detach() noexcept
Definition SharedMemory.h:174
T & operator*() const noexcept
Definition SharedMemory.h:186
SharedMemory & operator=(SharedMemory &&)=default
const std::string & key() const noexcept
Definition SharedMemory.h:179
SharedMemory(const SharedMemory &)=delete
SharedMemory & operator=(const SharedMemory &)=delete
Similar to std::pmr::monotonic_buffer_resource, but the initial buffer can be replaced.
Definition SharedMemory.h:84
void do_deallocate(void *, std::size_t, std::size_t) override
Definition SharedMemory.h:131
SharedMemoryResource()=default
SharedMemoryResource(void *buffer, std::size_t bufferSize) noexcept
Definition SharedMemory.h:87
void reset(void *newBuffer, std::size_t newBufferSize) noexcept
Replaces the initial buffer.
Definition SharedMemory.h:114
std::size_t m_initialBufferSize
Definition SharedMemory.h:141
bool do_is_equal(const std::pmr::memory_resource &other) const noexcept override
Definition SharedMemory.h:132
SharedMemoryResource(const SharedMemoryResource &)=delete
friend class SharedMemory
Definition SharedMemory.h:110
void reset() noexcept
Returns the buffer back to its initial state.
Definition SharedMemory.h:100
auto operator=(SharedMemoryResource &&) -> SharedMemoryResource &=default
SharedMemoryResource(SharedMemoryResource &&)=default
void * m_buffer
Definition SharedMemory.h:138
auto availableBytes() const noexcept -> std::size_t
Definition SharedMemory.h:107
void * do_allocate(std::size_t bytes, std::size_t alignment) override
Definition SharedMemory.h:122
auto operator=(const SharedMemoryResource &) -> SharedMemoryResource &=delete
std::size_t m_availableBytes
Definition SharedMemory.h:139
void * m_initialBuffer
Definition SharedMemory.h:140
Definition SharedMemory.h:45
friend void swap(SharedMemoryData &a, SharedMemoryData &b) noexcept
Definition SharedMemory.h:61
std::unique_ptr< SharedMemoryImpl > m_impl
Definition SharedMemory.h:75
void * m_ptr
Definition SharedMemory.h:76
std::string m_key
Definition SharedMemory.h:74
std::size_t arraySize() const noexcept
Definition SharedMemory.cpp:309
SharedMemoryData() noexcept
const std::string & key() const noexcept
Definition SharedMemory.h:69
void * get() const noexcept
Definition SharedMemory.h:70
Definition SharedMemory.cpp:48
Definition RemotePluginBase.cpp:34