Files
Client/Server/RylServerProject/BaseLibrary/Stream/Buffer/BufferQueue.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

194 lines
3.8 KiB
C++

#include "stdafx.h"
#include "Buffer.h"
#include "BufferQueue.h"
#include "BufferFactory.h"
CBufferQueue::CBufferQueue()
: m_lpHead(0),
m_lpTail(0),
m_bufferNum(0),
m_queueSize(0),
m_maxQueueSize(0xFFFFFFFF)
{
}
CBufferQueue::~CBufferQueue()
{
clear();
}
bool CBufferQueue::enqueue(CBuffer* lpBuffer, bool bPendHead)
{
if(0 != lpBuffer)
{
size_t bufferUsage = lpBuffer->length();
if(m_queueSize + bufferUsage < m_maxQueueSize)
{
if(0 == m_lpHead)
{
m_lpHead = m_lpTail = lpBuffer;
}
else if(!bPendHead)
{
m_lpTail->next(lpBuffer);
lpBuffer->prev(m_lpTail);
m_lpTail = lpBuffer;
}
else
{
lpBuffer->next(m_lpHead);
m_lpHead->prev(lpBuffer);
m_lpHead = lpBuffer;
}
++m_bufferNum;
m_queueSize += bufferUsage;
return true;
}
}
return false;
}
CBuffer* CBufferQueue::dequeue()
{
CBuffer* lpBuffer = 0;
if(0 != m_lpHead)
{
lpBuffer = m_lpHead;
m_lpHead = m_lpHead->next();
lpBuffer->prev(0);
lpBuffer->next(0);
if(m_lpTail == lpBuffer)
{
m_lpTail = 0;
}
--m_bufferNum;
m_queueSize -= lpBuffer->length();
}
return lpBuffer;
}
void CBufferQueue::clear()
{
CBuffer* lpDelete = 0;
while(0 != m_lpHead)
{
lpDelete = m_lpHead;
m_lpHead = m_lpHead->next();
SAFE_RELEASE_BUFFER(lpDelete);
}
m_lpTail = 0;
m_bufferNum = 0;
m_queueSize = 0;
}
void CBufferQueue::splice(CBufferQueue& Buffer_In, bool bPendHead)
{
// 상대편 BufferQueue의 내용을 내 BufferQueue로 붙인다.
if(0 != Buffer_In.m_lpHead)
{
if(0 == m_lpHead)
{
m_lpHead = Buffer_In.m_lpHead;
m_lpTail = Buffer_In.m_lpTail;
}
else if(!bPendHead)
{
m_lpTail->next(Buffer_In.m_lpHead);
Buffer_In.m_lpHead->prev(m_lpTail);
m_lpTail = Buffer_In.m_lpTail;
}
else
{
Buffer_In.m_lpTail->next(m_lpHead);
m_lpHead->prev(Buffer_In.m_lpTail);
m_lpHead = Buffer_In.m_lpHead;
}
m_bufferNum += Buffer_In.getBufferNum();
m_queueSize += Buffer_In.getQueueSize();
Buffer_In.m_lpHead = 0;
Buffer_In.m_lpTail = 0;
Buffer_In.m_bufferNum = 0;
Buffer_In.m_queueSize = 0;
}
}
void CBufferQueue::splice_n(CBufferQueue& Buffer_In, unsigned long dwSpliceNum, bool bPendHead)
{
// 상대편 BufferQueue의 내용중, 최대 dwSpliceNum개 만큼을 내 BufferQueue로 붙인다.
if (Buffer_In.getBufferNum() <= dwSpliceNum)
{
// 최대개수 미만이면 몽땅 붙인다.
splice(Buffer_In, bPendHead);
}
else if(0 != Buffer_In.m_lpHead)
{
// 최대개수 이상을 가지고 있으므로, 일단 탐색 들어가서 잘라낸다.
unsigned long dwBufferNum = 0; // 버퍼 갯수
unsigned long dwQueueSize = 0; // 데이터 길이(byte)
CBuffer* lpNewBufferHead = Buffer_In.m_lpHead;
for(; dwBufferNum < dwSpliceNum; ++dwBufferNum)
{
dwQueueSize += lpNewBufferHead->length();
lpNewBufferHead = lpNewBufferHead->next();
}
// 앞뒤를 잘라낸다.
CBuffer* lpSplicedHead = Buffer_In.m_lpHead;
CBuffer* lpSplicedTail = lpNewBufferHead;
Buffer_In.m_lpHead = lpSplicedTail->next();
Buffer_In.m_lpHead->prev(0);
lpSplicedTail->next(0);
Buffer_In.m_bufferNum -= dwBufferNum;
Buffer_In.m_queueSize -= dwQueueSize;
if(0 == m_lpHead)
{
m_lpHead = lpSplicedHead;
m_lpTail = lpSplicedTail;
}
else if(!bPendHead)
{
m_lpTail->next(lpSplicedHead);
lpSplicedHead->prev(m_lpTail);
m_lpTail = lpSplicedTail;
}
else
{
lpSplicedTail->next(m_lpHead);
m_lpHead->prev(lpSplicedTail);
m_lpHead = lpSplicedHead;
}
m_bufferNum += dwBufferNum;
m_queueSize += dwQueueSize;
}
}