#ifndef PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H #define PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H #include "../Shared_Memory/Shared_Memory.h" namespace Psc { class SM_Base_RingBuffer { public: struct SharedMemoryState { alignas(64) size_t capacity; alignas(64) size_t head; alignas(64) size_t tail; }; void init(const std::string &name, size_t size); SM_Base_RingBuffer(); SM_Base_RingBuffer(const std::string &name, size_t alloc_size); [[nodiscard]] bool empty() const; [[nodiscard]] bool full() const; ~SM_Base_RingBuffer(); Shared_Memory shm; std::string state_str(); protected: SharedMemoryState *state{}; uint8_t *buffer{}; size_t mask{}; Cross_Process_Mutex data_mutex; Cross_Process_Mutex create_mutex; bool create = false; [[nodiscard]] size_t used_space() const; [[nodiscard]] size_t free_space() const; void rollback(size_t n); void write_bytes(const uint8_t *data, size_t len); void read_bytes(uint8_t *data, size_t len); void peek_bytes(uint8_t *data, size_t len) const; }; // 包模式读取数据 class SM_RingBuffer : public SM_Base_RingBuffer { public: static constexpr size_t HEADER_SIZE = sizeof(uint32_t); bool write(const uint8_t *src, size_t len); bool read(uint8_t *out, size_t &out_len); }; // 流模式读取环境缓冲区 class SM_Stream_RingBuffer : public SM_Base_RingBuffer { public: bool write(const uint8_t *src, size_t len); bool read(uint8_t *out, size_t &out_len); size_t write_best_effort(const uint8_t *src, size_t len); size_t read_best_effort(uint8_t *out, size_t max_len); }; } #endif