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