1 #include "All.h"
2 #include "CircleBuffer.h"
3
4 namespace APE
5 {
6
CCircleBuffer()7 CCircleBuffer::CCircleBuffer()
8 {
9 m_pBuffer = NULL;
10 m_nTotal = 0;
11 m_nHead = 0;
12 m_nTail = 0;
13 m_nEndCap = 0;
14 m_nMaxDirectWriteBytes = 0;
15 }
16
~CCircleBuffer()17 CCircleBuffer::~CCircleBuffer()
18 {
19 SAFE_ARRAY_DELETE(m_pBuffer)
20 }
21
CreateBuffer(intn nBytes,intn nMaxDirectWriteBytes)22 void CCircleBuffer::CreateBuffer(intn nBytes, intn nMaxDirectWriteBytes)
23 {
24 SAFE_ARRAY_DELETE(m_pBuffer)
25
26 m_nMaxDirectWriteBytes = nMaxDirectWriteBytes;
27 m_nTotal = nBytes + 1 + nMaxDirectWriteBytes;
28 m_pBuffer = new unsigned char [m_nTotal];
29 m_nHead = 0;
30 m_nTail = 0;
31 m_nEndCap = m_nTotal;
32 }
33
MaxAdd()34 intn CCircleBuffer::MaxAdd()
35 {
36 intn nMaxAdd = (m_nTail >= m_nHead) ? (m_nTotal - 1 - m_nMaxDirectWriteBytes) - (m_nTail - m_nHead) : m_nHead - m_nTail - 1;
37 return nMaxAdd;
38 }
39
MaxGet()40 intn CCircleBuffer::MaxGet()
41 {
42 return (m_nTail >= m_nHead) ? m_nTail - m_nHead : (m_nEndCap - m_nHead) + m_nTail;
43 }
44
Get(unsigned char * pBuffer,intn nBytes)45 intn CCircleBuffer::Get(unsigned char * pBuffer, intn nBytes)
46 {
47 intn nTotalGetBytes = 0;
48
49 if (pBuffer != NULL && nBytes > 0)
50 {
51 intn nHeadBytes = ape_min(m_nEndCap - m_nHead, nBytes);
52 intn nFrontBytes = nBytes - nHeadBytes;
53
54 memcpy(&pBuffer[0], &m_pBuffer[m_nHead], nHeadBytes);
55 nTotalGetBytes = nHeadBytes;
56
57 if (nFrontBytes > 0)
58 {
59 memcpy(&pBuffer[nHeadBytes], &m_pBuffer[0], nFrontBytes);
60 nTotalGetBytes += nFrontBytes;
61 }
62
63 RemoveHead(nBytes);
64 }
65
66 return nTotalGetBytes;
67 }
68
Empty()69 void CCircleBuffer::Empty()
70 {
71 m_nHead = 0;
72 m_nTail = 0;
73 m_nEndCap = m_nTotal;
74 }
75
RemoveHead(intn nBytes)76 intn CCircleBuffer::RemoveHead(intn nBytes)
77 {
78 nBytes = ape_min(MaxGet(), nBytes);
79 m_nHead += nBytes;
80 if (m_nHead >= m_nEndCap)
81 m_nHead -= m_nEndCap;
82 return nBytes;
83 }
84
RemoveTail(intn nBytes)85 intn CCircleBuffer::RemoveTail(intn nBytes)
86 {
87 nBytes = ape_min(MaxGet(), nBytes);
88 m_nTail -= nBytes;
89 if (m_nTail < 0)
90 m_nTail += m_nEndCap;
91 return nBytes;
92 }
93
94 }