C++——一个封装好的环形缓冲区

/*-------------------------
002 * Author: XadillaX       |
003 * Data: 2010/10/3        |
004 * Class: CircleBuffer    |
005 *------------------------|---*/
006  
007#ifndef CircleBuffer_H
008#define CircleBuffer_H
009  
010#ifndef SAFEDEL(p)
011  #define SAFEDEL(p) { delete p; p = NULL; }
012#endif
013  
014/*
015 * 类:环形缓冲区
016 */
017template<typename ElemType>
018class CircleBuffer {
019private:
020    ElemType *Arr;
021    int _l;
022    int _c;
023    int _size;
024    int _cnt;
025  
026    int conv(int i);
027public:
028    CircleBuffer(int MaxSize = 65535);
029    ~CircleBuffer();
030  
031    bool push(ElemType ele);
032    void clear();
033    bool pop(ElemType &ele);
034    bool empty();
035    int count();
036    int GetSize();
037};
038  
039/*
040 * 实现环形缓冲区
041 */
042template<typename ElemType>
043CircleBuffer<ElemType>::CircleBuffer(int MaxSize) : _size(MaxSize)
044{
045    if(_size < 1) _size = 1;
046    Arr = new ElemType[MaxSize];
047    _l = _c = _size - 1;
048    _cnt = 0;
049}
050  
051template<typename ElemType>
052CircleBuffer<ElemType>::~CircleBuffer()
053{
054    delete []Arr;
055    Arr = NULL;
056}
057  
058template<typename ElemType>
059int CircleBuffer<ElemType>::conv(int i)
060{
061    return (i < _size) ? i : 0;
062}
063  
064template<typename ElemType>
065bool CircleBuffer<ElemType>::push(ElemType ele)
066{
067    if(_cnt < _size)
068    {
069        _l = conv(_l + 1);
070        Arr[_l] = ele;
071        _cnt++;
072  
073        return true;
074    }
075    else return false;
076}
077  
078template<typename ElemType>
079bool CircleBuffer<ElemType>::pop(ElemType &ele)
080{
081    if(_cnt == 0) return false;
082    else
083    {
084        _cnt--;
085        _c = conv(_c + 1);
086        ele = Arr[_c];
087        return true;
088    }
089}
090  
091template<typename ElemType>
092int CircleBuffer<ElemType>::count()
093{
094    return _cnt;
095}
096  
097template<typename ElemType>
098bool CircleBuffer<ElemType>::empty()
099{
100    if(!_cnt) return true;
101    else return false;
102}
103  
104template<typename ElemType>
105int CircleBuffer<ElemType>::GetSize()
106{
107    return _size;
108}
109  
110template<typename ElemType>
111void CircleBuffer<ElemType>::clear()
112{
113    _l = _c = _size - 1;
114    _cnt = 0;
115}
116#endif
/*-------------------------
002 * Author: XadillaX       |
003 * Data: 2010/10/3        |
004 * Class: CircleBuffer    |
005 *------------------------|---*/
006  
007#ifndef CircleBuffer_H
008#define CircleBuffer_H
009  
010#ifndef SAFEDEL(p)
011  #define SAFEDEL(p) { delete p; p = NULL; }
012#endif
013  
014/*
015 * 类:环形缓冲区
016 */
017template<typename ElemType>
018class CircleBuffer {
019private:
020    ElemType *Arr;
021    int _l;
022    int _c;
023    int _size;
024    int _cnt;
025  
026    int conv(int i);
027public:
028    CircleBuffer(int MaxSize = 65535);
029    ~CircleBuffer();
030  
031    bool push(ElemType ele);
032    void clear();
033    bool pop(ElemType &ele);
034    bool empty();
035    int count();
036    int GetSize();
037};
038  
039/*
040 * 实现环形缓冲区
041 */
042template<typename ElemType>
043CircleBuffer<ElemType>::CircleBuffer(int MaxSize) : _size(MaxSize)
044{
045    if(_size < 1) _size = 1;
046    Arr = new ElemType[MaxSize];
047    _l = _c = _size - 1;
048    _cnt = 0;
049}
050  
051template<typename ElemType>
052CircleBuffer<ElemType>::~CircleBuffer()
053{
054    delete []Arr;
055    Arr = NULL;
056}
057  
058template<typename ElemType>
059int CircleBuffer<ElemType>::conv(int i)
060{
061    return (i < _size) ? i : 0;
062}
063  
064template<typename ElemType>
065bool CircleBuffer<ElemType>::push(ElemType ele)
066{
067    if(_cnt < _size)
068    {
069        _l = conv(_l + 1);
070        Arr[_l] = ele;
071        _cnt++;
072  
073        return true;
074    }
075    else return false;
076}
077  
078template<typename ElemType>
079bool CircleBuffer<ElemType>::pop(ElemType &ele)
080{
081    if(_cnt == 0) return false;
082    else
083    {
084        _cnt--;
085        _c = conv(_c + 1);
086        ele = Arr[_c];
087        return true;
088    }
089}
090  
091template<typename ElemType>
092int CircleBuffer<ElemType>::count()
093{
094    return _cnt;
095}
096  
097template<typename ElemType>
098bool CircleBuffer<ElemType>::empty()
099{
100    if(!_cnt) return true;
101    else return false;
102}
103  
104template<typename ElemType>
105int CircleBuffer<ElemType>::GetSize()
106{
107    return _size;
108}
109  
110template<typename ElemType>
111void CircleBuffer<ElemType>::clear()
112{
113    _l = _c = _size - 1;
114    _cnt = 0;
115}
116#endif
/*-------------------------
002 * Author: XadillaX       |
003 * Data: 2010/10/3        |
004 * Class: CircleBuffer    |
005 *------------------------|---*/
006  
007#ifndef CircleBuffer_H
008#define CircleBuffer_H
009  
010#ifndef SAFEDEL(p)
011  #define SAFEDEL(p) { delete p; p = NULL; }
012#endif
013  
014/*
015 * 类:环形缓冲区
016 */
017template<typename ElemType>
018class CircleBuffer {
019private:
020    ElemType *Arr;
021    int _l;
022    int _c;
023    int _size;
024    int _cnt;
025  
026    int conv(int i);
027public:
028    CircleBuffer(int MaxSize = 65535);
029    ~CircleBuffer();
030  
031    bool push(ElemType ele);
032    void clear();
033    bool pop(ElemType &ele);
034    bool empty();
035    int count();
036    int GetSize();
037};
038  
039/*
040 * 实现环形缓冲区
041 */
042template<typename ElemType>
043CircleBuffer<ElemType>::CircleBuffer(int MaxSize) : _size(MaxSize)
044{
045    if(_size < 1) _size = 1;
046    Arr = new ElemType[MaxSize];
047    _l = _c = _size - 1;
048    _cnt = 0;
049}
050  
051template<typename ElemType>
052CircleBuffer<ElemType>::~CircleBuffer()
053{
054    delete []Arr;
055    Arr = NULL;
056}
057  
058template<typename ElemType>
059int CircleBuffer<ElemType>::conv(int i)
060{
061    return (i < _size) ? i : 0;
062}
063  
064template<typename ElemType>
065bool CircleBuffer<ElemType>::push(ElemType ele)
066{
067    if(_cnt < _size)
068    {
069        _l = conv(_l + 1);
070        Arr[_l] = ele;
071        _cnt++;
072  
073        return true;
074    }
075    else return false;
076}
077  
078template<typename ElemType>
079bool CircleBuffer<ElemType>::pop(ElemType &ele)
080{
081    if(_cnt == 0) return false;
082    else
083    {
084        _cnt--;
085        _c = conv(_c + 1);
086        ele = Arr[_c];
087        return true;
088    }
089}
090  
091template<typename ElemType>
092int CircleBuffer<ElemType>::count()
093{
094    return _cnt;
095}
096  
097template<typename ElemType>
098bool CircleBuffer<ElemType>::empty()
099{
100    if(!_cnt) return true;
101    else return false;
102}
103  
104template<typename ElemType>
105int CircleBuffer<ElemType>::GetSize()
106{
107    return _size;
108}
109  
110template<typename ElemType>
111void CircleBuffer<ElemType>::clear()
112{
113    _l = _c = _size - 1;
114    _cnt = 0;
115}
116#endif

相当于队列。但是因为要涉及不断的创建、释放指针,所以会导致系统不稳定。环形缓冲区就事先创建好一片缓冲区。适用于网

络服务器被连接。

/*------------------------- 

002  * Author: XadillaX       | 

003  * Data: 2010/10/3        | 

004  * Class: CircleBuffer    | 

005  *------------------------|---*/

006   

007 #ifndef CircleBuffer_H 

008 #define CircleBuffer_H 

009   

010 #ifndef SAFEDEL(p) 

011   #define SAFEDEL(p) { delete p; p = NULL; } 

012 #endif 

013   

014 /* 

015  * 类:环形缓冲区 

016  */

017 template<typename ElemType> 

018 class CircleBuffer { 

019 private: 

020     ElemType *Arr; 

021     int _l; 

022     int _c; 

023     int _size; 

024     int _cnt; 

025   

026     int conv(int i); 

027 public: 

028     CircleBuffer(int MaxSize = 65535); 

029     ~CircleBuffer(); 

030   

031     bool push(ElemType ele); 

032     void clear(); 

033     bool pop(ElemType &ele); 

034     bool empty(); 

035     int count(); 

036     int GetSize(); 

037 }; 

038   

039 /* 

040  * 实现环形缓冲区 

041  */

042 template<typename ElemType> 

043 CircleBuffer<ElemType>::CircleBuffer(int MaxSize) : _size

(MaxSize) 

044 { 

045     if(_size < 1) _size = 1; 

046     Arr = new ElemType[MaxSize]; 

047     _l = _c = _size - 1; 

048     _cnt = 0; 

049 } 

050   

051 template<typename ElemType> 

052 CircleBuffer<ElemType>::~CircleBuffer() 

053 { 

054     delete []Arr; 

055     Arr = NULL; 

056 } 

057   

058 template<typename ElemType> 

059 int CircleBuffer<ElemType>::conv(int i) 

060 { 

061     return (i < _size) ? i : 0; 

062 } 

063   

064 template<typename ElemType> 

065 bool CircleBuffer<ElemType>::push(ElemType ele) 

066 { 

067     if(_cnt < _size) 

068     { 

069         _l = conv(_l + 1); 

070         Arr[_l] = ele; 

071         _cnt++; 

072   

073         return true; 

074     } 

075     else return false; 

076 } 

077   

078 template<typename ElemType> 

079 bool CircleBuffer<ElemType>::pop(ElemType &ele) 

080 { 

081     if(_cnt == 0) return false; 

082     else

083     { 

084         _cnt--; 

085         _c = conv(_c + 1); 

086         ele = Arr[_c]; 

087         return true; 

088     } 

089 } 

090   

091 template<typename ElemType> 

092 int CircleBuffer<ElemType>::count() 

093 { 

094     return _cnt; 

095 } 

096   

097 template<typename ElemType> 

098 bool CircleBuffer<ElemType>::empty() 

099 { 

100     if(!_cnt) return true; 

101     else return false; 

102 } 

103   

104 template<typename ElemType> 

105 int CircleBuffer<ElemType>::GetSize() 

106 { 

107     return _size; 

108 } 

109   

110 template<typename ElemType> 

111 void CircleBuffer<ElemType>::clear() 

112 { 

113     _l = _c = _size - 1; 

114     _cnt = 0; 

115 } 

116 #endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值