RingBuffer 구현예제.
DevCho1107
·2023. 4. 20. 19:23
#include <cstdio>
#include <iostream>
#include <stdio.h>
#include <Windows.h>
#define MAX_BUFFER_SIZE (1024*10)
class RingBuffer
{
public:
RingBuffer()
{
m_DataBuffer = new char[MAX_BUFFER_SIZE];
memset(m_DataBuffer, 0x00, sizeof(char) * MAX_BUFFER_SIZE);
m_iCurrentSize = 0;
m_iOffsetStart = 0;
m_iOffsetEnd = 0;
}
~RingBuffer()
{
delete[] m_DataBuffer;
}
//전송할 데이터를 버퍼에 쓴다
bool Push(const char* IN pData, size_t nSize)
{
if (nSize > GetWritableSize())
return false;
if (nSize == 0)
return true;
if (nSize + m_iOffsetEnd > MAX_BUFFER_SIZE)
{
size_t itemp = MAX_BUFFER_SIZE - m_iOffsetEnd;
memcpy(&m_DataBuffer[m_iOffsetEnd], pData, itemp);
memcpy(m_DataBuffer, &pData[itemp], nSize - itemp);
m_iOffsetEnd = nSize - itemp; // end갱신
}
else // 그냥넣음
{
memcpy(&m_DataBuffer[m_iOffsetEnd], pData, nSize);
m_iOffsetEnd += nSize;
}
m_iCurrentSize += nSize;
return true;
}
//버퍼에 받은 데이터를 nSize 만큼 가져온다
bool Pop(char* OUT pData, size_t nSize)
{
if (nSize > m_iCurrentSize)
return false;
if (m_iOffsetStart + nSize > MAX_BUFFER_SIZE)
{
size_t itemp = MAX_BUFFER_SIZE - m_iOffsetStart;
memcpy(pData, &m_DataBuffer[m_iOffsetStart], itemp);
memcpy(&pData[itemp], m_DataBuffer, nSize - itemp);
m_iOffsetStart = nSize - itemp;
}
else
{
memcpy(pData, &m_DataBuffer[m_iOffsetStart], nSize);
m_iOffsetStart += nSize;
}
m_iCurrentSize -= nSize;
return true;
}
size_t GetWritableSize()
{
if (m_iOffsetStart <= m_iOffsetEnd)
return MAX_BUFFER_SIZE - m_iOffsetEnd;
else
return m_iOffsetStart - m_iOffsetEnd;
}
private:
char* m_DataBuffer;
size_t m_iCurrentSize;
size_t m_iOffsetStart;
size_t m_iOffsetEnd;
};
RingBuffer 만들어보기. 사용할때는 pop,push thread safe 하게 사용해야한다.
'< Programming > > C++' 카테고리의 다른 글
constexpr ( generalized constant expressions ) (0) | 2023.05.04 |
---|---|
C++ 17 에서 업데이트 된 기능 정리. (0) | 2023.04.25 |
std::Funtion 정리 (0) | 2023.04.06 |
C++ Window IOCP Server (0) | 2023.04.06 |
override & virtual 사용하기 (0) | 2020.02.03 |