Files
Renderive/YSGraphic_Core/base/RingBuffer.hpp
T
2026-06-16 13:33:27 +08:00

113 lines
3.5 KiB
C++

#pragma once
#include <cstdint>
#include <cstring>
#include <QDebug>
namespace YSG {
class RingBuffer {
public:
// 用char*是因为我的内存 是紧密连接的
// struct CustomType; CustomType* it; it[i] 这种形式是不行的
template<typename T = char>
[[nodiscard]] T* list() const {
return (T*)(mData+s*l);
}
int n{}, l{}, m{};
// s,e 差值始终为 n-1
int e{}, eMin{}, eMax{}; // [n-1, m-1]
int s{}, sMin{}, sMax{}; // [0, m-n]
int f = 0;
char* mData{};
bool isLeft = true;
template <typename T = char>
T* operator[](int offset) {
return reinterpret_cast<T*>(mData + offset * l);
}
void resize(int _l, int _n, int _m) {
n = _n;
l = _l;
m = _m;
eMin = n - 1;
eMax = m - 1;
sMin = 0;
sMax = m - n;
if(isLeft) { //向左移 初始在最右端
s = sMax; e = eMax;
} else {
s = sMin; e = eMin;
}
f = 0;
delete []mData;
int size = m * l;
mData = new char[size];
for(int i = 0; i < size; ++i) {
mData[i] = 0;
}
}
void pushData(void* data){
if(f < n) { //共l次,前几次赋值逻辑和后面不一样
if(isLeft) {
// std::cout << "s == " << s << " sMin-1 " << (sMin-1) << std::endl;
//std::cout << "f == " << f << " dst " << l*(sMax+1) << " src " << l*sMax << " size=" << l*f << std::endl;
//std::cout << "f == " << f << " dst " << l* << " src " << l*sMax << " size=" << l*f << std::endl;
//std::cout << "dst:" << (sMax+1) << " src" << sMax;
std::memmove(mData+l*(sMax+1), mData+l*sMax, l*f);
std::memmove(mData+l*sMax, data, l);
} else {
std::memmove(mData+l*(eMin-f), mData+l*(eMin-f+1), l*f);
std::memmove(mData+l*eMin, data, l);
}
f++;
return;
}
if(isLeft) {
s--; e--;
if(s == sMin-1) {
s = sMax; e = eMax;
std::memmove(mData+l*(sMax+1), mData, l*(n - 1));
std::memmove(mData+l*sMax, data, l);
} else {
std::memmove(mData+l*s, data, l);
}
} else {
s++; e++;
if(e == eMax+1) {
s = sMin; e = eMin;
std::memmove(mData, mData+l*(eMin+1), l*(n - 1));
std::memmove(mData+l*eMin, data, l);
} else {
std::memmove(mData+l*e, data, l);
}
}
}
};
class MutiRingBuffer {
public:
int bufferNum{}, n{}, m{};
std::vector<RingBuffer> buffers;
void resize(std::vector<int> _ls, int _n, int _m) {
n = _n;
m = _m;
bufferNum = (int)_ls.size();
buffers.resize(bufferNum);
for(int i = 0; i < bufferNum; ++i) {
buffers[i].resize(_ls[i], _n, _m);
}
}
void pushData(const std::vector<void*>& datas) {
for(int i = 0; i < bufferNum; ++i) {
buffers[i].pushData(datas[i]);
}
}
};
}