Files
2022-10-26 12:25:11 +08:00

67 lines
1.7 KiB
C++

// RingBuffer.h: interface for the RingBuffer class.
//
//////////////////////////////////////////////////////////////////////
#ifndef __RINGBUFFER_H__
#define __RINGBUFFER_H__
#pragma once
//=======================================================================================================================
/// 링버퍼 구현 클래스
/**
@author
Kim Min Wook < taiyo@webzen.co.kr >
@since
2004. 8. 2
@remarks
- 링버퍼에 데이터를 put, get하는 utility library
- Put( BYTE * pData, DWORD dwSize ) : 현재 위치의 버퍼(m_pRear)에 데이터를 dwSize만큼 삽입
- Get( BYTE * pData, DWORD dwSize ) : 현재 위치의 버퍼(m_pRear)에서 데이터를 dwSize만큼 추출
- Peek( BYTE * pData, DWORD dwSize ) : 현재 위치의 버퍼(m_pRear)에서 데이터를 dwSize만큼 추출( m_pRear에 +dwSize하지 않음 )
@todo
- template으로 유연하게 할 필요 있음(^O^)/
*/
//=======================================================================================================================
namespace util
{
class RingBuffer
{
public:
RingBuffer();
virtual ~RingBuffer();
VOID InitBuffer( DWORD dwBufferSize );
VOID ReleaseBuffer();
VOID ResetBuffer();
BOOL Put( BYTE * pData, DWORD dwSize );
BOOL Get( BYTE * pData, DWORD dwSize );
BOOL Peek( BYTE * pData, DWORD dwSize );
inline DWORD GetAvailableSize() { return m_dwAvailableSize; }
inline DWORD GetOccupiedSize() { return m_dwMaxBufferSize - m_dwAvailableSize; }
inline BYTE * GetFrontPtr() { return m_pFront; }
private:
BYTE * m_pBuffer;
BYTE * m_pHead;
BYTE * m_pTail;
BYTE * m_pFront;
BYTE * m_pRear;
DWORD m_dwMaxBufferSize;
DWORD m_dwAvailableSize;
DWORD m_dwExtraBufferSize; // Tail 뒤에 붙는 여분의 버퍼사이즈
};
}
#endif // __RINGBUFFER_H__