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 }