Files
2026-05-20 03:08:08 +09:00

131 lines
2.3 KiB
C++

#ifndef STREAM_BUFFER__H_
#define STREAM_BUFFER__H_
#ifdef _WIN32
#pragma once
#endif
class HStreamBuffer : public HObject
{
public:
HStreamBuffer(size_t nSize)
{
m_pBuffer = (char *)malloc(nSize); //...??? 2048 : because of openssl buffer overflow?
m_nBufferSize = nSize;
m_pBufferHead = m_pBuffer;
m_pBufferTail = m_pBuffer;
m_nStoredSize = 0;
m_nRemainSize = m_nBufferSize;
}
~HStreamBuffer()
{
free(m_pBuffer);
}
inline char * Head() { return m_pBufferHead; }
inline char * Tail() { return m_pBufferTail; }
inline size_t Size() { return m_nBufferSize; }
inline size_t StoredSize() { return m_nStoredSize; }
inline size_t RemainSize() { return m_nRemainSize; }
inline bool MoveTail(size_t nSize)
{
if (nSize > m_nRemainSize)
return false;
m_pBufferTail += nSize;
m_nStoredSize += nSize;
m_nRemainSize -= nSize;
return true;
}
inline bool Pop(size_t nSize)
{
if (nSize > m_nStoredSize)
return false;
m_nStoredSize -= nSize;
if (m_nStoredSize == 0)
{
m_pBufferHead = m_pBuffer;
m_pBufferTail = m_pBuffer;
m_nRemainSize = m_nBufferSize;
}
else
{
m_pBufferHead += nSize;
}
return true;
}
inline bool PopAndRewind(size_t nSize)
{
if (nSize > m_nStoredSize)
return false;
m_nStoredSize -= nSize;
memcpy(m_pBufferHead, m_pBufferHead + nSize, m_nStoredSize);
m_pBufferTail = m_pBufferHead + m_nStoredSize;
m_nRemainSize += nSize;
return true;
}
inline bool Store(const char * pData, size_t nSize)
{
if (nSize > m_nRemainSize)
return false;
memcpy(m_pBufferTail, pData, nSize);
m_pBufferTail += nSize;
m_nStoredSize += nSize;
m_nRemainSize -= nSize;
return true;
}
inline void Reset()
{
m_pBufferHead = m_pBuffer;
m_pBufferTail = m_pBuffer;
m_nStoredSize = 0;
m_nRemainSize = m_nBufferSize;
}
inline int MemCmp(const void * p, size_t n)
{
return memcmp(m_pBufferHead, p, n);
}
inline int Find(const char ch, size_t offset, size_t n = 0)
{
if (n == 0)
n = m_nStoredSize;
for (size_t i = offset; i < n; i++)
{
if (m_pBufferHead[i] == ch)
return (int)i;
}
return -1;
}
protected:
char * m_pBuffer;
char * m_pBufferHead;
char * m_pBufferTail;
size_t m_nBufferSize;
size_t m_nStoredSize;
size_t m_nRemainSize;
};
#endif // STREAM_BUFFER__H_