mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
Fix kcp transmission error
This commit is contained in:
101
src/ringbuffer/ringbuffer.h
Normal file
101
src/ringbuffer/ringbuffer.h
Normal file
@@ -0,0 +1,101 @@
|
||||
#ifndef _RINGBUFFER_H_
|
||||
#define _RINGBUFFER_H_
|
||||
|
||||
#include <string.h>
|
||||
|
||||
class RingBuffer {
|
||||
public:
|
||||
class Data {
|
||||
public:
|
||||
Data() = default;
|
||||
|
||||
Data(const char* data, size_t size) {
|
||||
data_ = new char[size];
|
||||
memcpy(data_, data, size);
|
||||
size_ = size;
|
||||
}
|
||||
|
||||
Data(const Data& obj) {
|
||||
data_ = new char[obj.size_];
|
||||
memcpy(data_, obj.data_, obj.size_);
|
||||
size_ = obj.size_;
|
||||
}
|
||||
|
||||
Data& operator=(const Data& obj) {
|
||||
data_ = new char[obj.size_];
|
||||
memcpy(data_, obj.data_, obj.size_);
|
||||
size_ = obj.size_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
~Data() {
|
||||
if (data_) {
|
||||
delete data_;
|
||||
data_ = nullptr;
|
||||
}
|
||||
size_ = 0;
|
||||
}
|
||||
|
||||
size_t size() const { return size_; }
|
||||
char* data() const { return data_; }
|
||||
|
||||
public:
|
||||
char* data_ = nullptr;
|
||||
size_t size_ = 0;
|
||||
};
|
||||
|
||||
public:
|
||||
RingBuffer(unsigned size = 128) : m_size(size), m_front(0), m_rear(0) {
|
||||
m_data = new Data[size];
|
||||
}
|
||||
|
||||
~RingBuffer() {
|
||||
delete[] m_data;
|
||||
m_data = nullptr;
|
||||
}
|
||||
|
||||
inline bool isEmpty() const { return m_front == m_rear; }
|
||||
|
||||
inline bool isFull() const { return m_front == (m_rear + 1) % m_size; }
|
||||
|
||||
bool push(const Data& value) {
|
||||
if (isFull()) {
|
||||
return false;
|
||||
}
|
||||
m_data[m_rear] = value;
|
||||
m_rear = (m_rear + 1) % m_size;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool push(const Data* value) {
|
||||
if (isFull()) {
|
||||
return false;
|
||||
}
|
||||
m_data[m_rear] = *value;
|
||||
m_rear = (m_rear + 1) % m_size;
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool pop(Data& value) {
|
||||
if (isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
value = m_data[m_front];
|
||||
m_front = (m_front + 1) % m_size;
|
||||
return true;
|
||||
}
|
||||
|
||||
inline unsigned int front() const { return m_front; }
|
||||
|
||||
inline unsigned int rear() const { return m_rear; }
|
||||
|
||||
inline unsigned int size() const { return m_size; }
|
||||
|
||||
private:
|
||||
unsigned int m_size;
|
||||
int m_front;
|
||||
int m_rear;
|
||||
Data* m_data;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user