tmp
This commit is contained in:
parent
a7b9feaedc
commit
0f15c37c2e
10 changed files with 522 additions and 1 deletions
|
|
@ -0,0 +1,54 @@
|
|||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "liniar_ring.hpp"
|
||||
|
||||
class LinearRingBuffer {
|
||||
public:
|
||||
LinearRingBuffer(size_t size, size_t history) {
|
||||
const auto& [mem, aligned_size] = lrbm::create_linear_ring(size);
|
||||
|
||||
mem_ = (uint8_t*) mem;
|
||||
memSize_ = aligned_size;
|
||||
bufferSize_ = size;
|
||||
historySize_ = history;
|
||||
|
||||
write_ptr_ = mem_;
|
||||
read_ptr_ = mem_;
|
||||
}
|
||||
|
||||
~LinearRingBuffer() { lrbm::destroy_linear_ring((void*) mem_, memSize_ * 2); }
|
||||
|
||||
uint8_t* write_data() { return write_ptr_; }
|
||||
uint8_t* read_data() { return read_ptr_; }
|
||||
|
||||
void write_advance(size_t bytes) { write_ptr_ = advancePointer(write_ptr_, bytes); }
|
||||
void read_advance(size_t bytes) { read_ptr_ = advancePointer(read_ptr_, bytes); }
|
||||
|
||||
void read_reset_with_history() {
|
||||
const auto offset = size_t(write_ptr_ - mem_);
|
||||
|
||||
if (historySize_ < offset) {
|
||||
read_ptr_ = write_ptr_ - historySize_;
|
||||
return;
|
||||
}
|
||||
|
||||
read_ptr_ = mem_ + (memSize_ + offset - historySize_);
|
||||
}
|
||||
|
||||
private:
|
||||
inline uint8_t* advancePointer(const uint8_t* ptr, size_t bytes) {
|
||||
return mem_ + (size_t(ptr - mem_) + bytes) % memSize_;
|
||||
}
|
||||
|
||||
size_t bufferSize_ = 0;
|
||||
size_t historySize_ = 0;
|
||||
size_t memSize_ = 0;
|
||||
|
||||
uint8_t* mem_ = nullptr;
|
||||
|
||||
uint8_t* read_ptr_ = 0;
|
||||
uint8_t* write_ptr_ = 0;
|
||||
};
|
||||
9
Containers/public/liniar_ring.hpp
Normal file
9
Containers/public/liniar_ring.hpp
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
#include <cstddef>
|
||||
#include <utility>
|
||||
|
||||
namespace lrbm {
|
||||
std::pair<void*, size_t> create_linear_ring(size_t size);
|
||||
void destroy_linear_ring(void* base, size_t size);
|
||||
void test();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue