首页 > 其他 > 详细

网络收发之cycleBuf

时间:2014-07-09 00:35:54      阅读:498      评论:0      收藏:0      [点我收藏+]
  1 #pragma once
  2 
  3 #include <iostream>
  4 #include <string>
  5 
  6 class cyclebuffer
  7 {
  8 protected:
  9     volatile int32_t  m_nReadIndex;
 10     volatile int32_t  m_nWriteIndex;
 11     volatile int32_t  m_nDataSize;  //有效数据大小
 12     volatile int32_t  m_nBufSize;   //总buf大小
 13     uint_8            *m_pBuf;
 14 
 15 public:
 16     //剩余空间数
 17     int32_t Space()
 18     {   
 19         return m_nBufSize-m_nDataSize;
 20     }   
 21 
 22     //获取buf的总大小
 23     int32_t  Capatity()
 24     {   
 25         return m_nBufSize;
 26     }   
 27        
 28     //获取有效数据长度
 29     int32_t Size()
 30     {   
 31         return m_nDataSize;
 32     }   
 33     //清空
 34     void Reset()
 35     {
 36         m_nReadIndex = 0;
 37         m_nwriteIndex = 0;
 38         m_nDataSize   = 0;
 39     }
 40    
 41     //增加nSize个字节
 42     int32_t  Grow(int32_t nSize)
 43     {
 44 
 45     }
 46 
 47     //写到写列表的头部---针对新数据
 48     int32_t WriteToHead(const uint8_t *pBuf, int32_t nDataSize)
 49     {
 50         if(nDataSize < 0 || pBuf == NULL)
 51         {
 52             return 0;
 53         }
 54    
 55         //空间不够
 56         if(m_nDataSize + nDataSize > m_nBufsize)
 57         {
 58             if(Grow((m_nDataSize+nDataSize) - m_nDataSize) <= 0)
 59             {
 60                 return 0;
 61             }
 62         }
 63 
 64         if(m_nWriteIndex < m_nReadIndex)
 65         {
 66             memcpy(&m_pBuf[m_nReadIndex-nDataSize], pBuf, nDataSize);
 67             m_nReadIndex -= nDataSize;
 68         }
 69         else if(m_nWriteIndex == m_nReadIndex)
 70         {
 71             return Write(pBuf, nDataSize);
 72         }
 73         else
 74         {
 75             int32_t nLeftDataSize = (nDataSize-m_nReadIndex<0)?nDataSize:m_nReadIndex;
 76             if(nLeftDataSize < nDataSize)   //此时nLeftDataSize == m_nReadIndex,m_nReadIndex前面的空间不够
 77             {
 78                 int32_t nTailDataSize = nDataSize - nLeftDataSize;
 79                 int32_t nWriteIndex   = m_nBufSize - nTailDatasize;
 80                 memcpy(&m_pBuf[nWriteIndex], pBuf, nDataSize-nLeftDataSize);  //从内存最后向前写
 81                 memcpy(&m_pBuf[0], pBuf+nTailDataSize, nLeftDataSize);
 82                 m_nReadIndex = nWriteIndex;
 83             }
 84             else
 85             {
 86                 if(m_nReadIndex-nDataSize < 0)
 87                 {
 88                     return 0;
 89                 }
 90                 memcpy(&m_pBuf[m_nReadIndex-nDataSize], pBuf, nDataSize);
 91                 m_nReadIndex -= nDataSize;
 92             }
 93         }
 94         m_nDataSize += nDataSize;
 95         return nDataSize;
 96     }
 97 
 98     //写到列表的尾部
 99     int32_t Write(const uint8_t *pBuf, int32_t nDataSize)
100     {
101         if(nDataSize <= 0 || NULL == pBuf)
102         {
103             return 0;
104         }
105 
106         if(nDataSize + m_nDataSize > m_nBufSize)
107         {
108             if(Grow((nDataSize+nBufSize)-m_nDataSize) <= 0)
109             {
110                 return 0;
111             }
112         }
113    
114         if(m_nWriteIndex < m_nReadIndex)
115         {
116             memcpy(&m_pBuf[m_nWriteIndex], pBuf, nDataSize);
117             m_nWriteIndex += nDataSize;
118         }
119         else
120         {
121             int32_t nLeftDataSize = m_nBufSize - m_nWriteIndex;
122             if(nLeftDataSize < nDataSize)
123             {
124         {
125                 memcpy(&m_pBuf[m_nWriteIndex], pBuf, nLeftDataSize);
126                 memcpy(&m_pBuf[0], pBuf+nLeftDataSize, nDataSize-nLeftDataSize);
127                 m_nwriteIndex = nDataSize - nLeftDataSize;
128             }
129             else
130             {
131                 memcpy(&m_pBuf[m_nWriteIndex], pBuf, nDataSize);
132                 m_nWriteIndex += nDataSize;
133             }
134         }
135         m_nDataSize += nDataSize;
136         return nDataSize;
137     }
138 
139     //读取 读列表的头部内存
140     int32_t Read(uint8_t *pBuf, const int32_t nWantSize)
141     {
142         if(nWantSize <= 0 || NULL == pBuf)
143         {
144             return 0;
145         }
146 
147         int32_t nDataSize = ((m_nDataSize < nWantSize)?m_nDataSize : nWantSize);
148         if(nDataSize<=0)
149         {
150             return 0;
151         }
152        if(m_nReadIndex < m_nWriteIndex)
153         {
154             memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
155             m_nReadIndex += nDataSize;
156         }
157         else
158         {
159             int32_t nLeftDataSize = m_nBufSize - m_nReadIndex;
160             if(nLeftDataSize < nDataSize)
161             {
162                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nLeftDataSize);
163                 memcpy(pBuf+nLeftDataSize, &m_pBuf[0], nDataSize-nLeftDataSize);
164                 m_nReadIndex = nDataSize-nLeftDataSize;
165             }
166             else
167             {
168                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
169                 m_nReadIndex += nDataSize;
170             }
171         }
172         m_nDataSize -= nDataSize;
173         return nDataSize;
174     }
175 
176 
177     //读取数据但是不修改读索引
178     int32_t  PeekRead(uint8_t *pBuf, const int32_t nWantSize)
179     {
180         if(nWantSize <= 0 || pBuf == NULL)
181         {
182             return 0;
183    }
184 
185         int32_t  nDataSize = ((m_nDataSize < nWantSize) ? m_nDataSize : nWantSize);
186         if(m_nReadIndex < m_nWriteIndex)
187         {
188             memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
189         }
190         else if(m_nReadIndex == m_nWriteIndex)
191         {
192             return 0;
193         }
194         else
195         {
196             int32_t nLeftDataSize = m_nBufSize - m_nReadIndex;
197             if(nLeftDataSize < nDataSize)
198             {
199                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nLeftDataSize);
200                 memcpy(pBuf+nLeftDataSize, &m_pBuf[0], nDataSize-nLeftDataSize);
201             }
202             else
203             {
204                 memcpy(pBuf, &m_pBuf[m_nReadIndex], nDataSize);
205             }
206         }
207         return  nDataSize;
208     }
209    
210 };

 

网络收发之cycleBuf,布布扣,bubuko.com

网络收发之cycleBuf

原文:http://www.cnblogs.com/chris-cp/p/3830121.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!