no message

master
zcy 2020-08-28 00:27:10 +08:00
parent eed3fe05bd
commit 6bc8e49137
2 changed files with 51 additions and 1 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"*.rh": "cpp"
}
}

View File

@ -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