no message
parent
eed3fe05bd
commit
6bc8e49137
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"files.associations": {
|
||||
"*.rh": "cpp"
|
||||
}
|
||||
}
|
|
@ -10,17 +10,29 @@ template <typename T> class RingBuffer{
|
|||
public:
|
||||
T At(uint64_t pos);
|
||||
RingBuffer(uint64_t size);
|
||||
int Add(T *data,uint64_t len);
|
||||
int Take(T *data,uint64_t data);
|
||||
uint32_t CanReadCount();
|
||||
uint32_t CanWriteCount();
|
||||
~RingBuffer();
|
||||
|
||||
protected:
|
||||
T *mData;
|
||||
uint64_t mSize;
|
||||
uint64_t mCurrentTail;
|
||||
uint64_t mCurrentHead;
|
||||
};
|
||||
|
||||
/**
|
||||
* author : caiyuzheng
|
||||
* function: 构造函数
|
||||
*/
|
||||
template<typename T>
|
||||
RingBuffer<T>::RingBuffer(uint64_t size) :
|
||||
mData(nullptr),
|
||||
mSize(0) {
|
||||
mSize(0),
|
||||
mCurrentTail(0),
|
||||
mCurrentHead(0) {
|
||||
mSize = size;
|
||||
mData = new T[size];
|
||||
}
|
||||
|
@ -34,4 +46,37 @@ T RingBuffer<T>::At(uint64_t pos){
|
|||
return mData[pos];
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
int RingBuffer<T>::Add(T *data,uint64_t len){
|
||||
/// 0->n |start|head|.....|tail|
|
||||
if(mCurrentTail > mCurrentHead){
|
||||
if(mCurrentTail + len > mSize - 1){
|
||||
uint64_t tmp = mCurrentTail + len - mSize;
|
||||
for(uint32_t i = 0;i < len;i++){
|
||||
if(mCurrentTail < mSize){
|
||||
data[mCurrentTail++] = data[len];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
uint32_t RingBuffer<T>::CanReadCount(){
|
||||
if(mCurrentHead > mCurrentTail){
|
||||
return mSize - (mCurrentHead - mCurrentTail);
|
||||
}else{
|
||||
return mCurrentTail - mCurrentHead;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
uint32_t RingBuffer<T>::CanWriteCount(){
|
||||
if (mCurrentTail > mCurrentHead){
|
||||
return mSize - (mCurrentTail - mCurrentHead);
|
||||
}
|
||||
if(mCurrentHead > mCurrentTail){
|
||||
return mCurrentHead - mCurrentTail;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue