C++——一个封装好的环形缓冲区
来源:互联网 发布:python 列表元组结合 编辑:程序博客网 时间:2024/05/11 00:40
/*-------------------------
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
/*-------------------------
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
/*-------------------------
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
相当于队列。但是因为要涉及不断的创建、释放指针,所以会导致系统不稳定。环形缓冲区就事先创建好一片缓冲区。适用于网
络服务器被连接。
/*-------------------------
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
- C++——一个封装好的环形缓冲区
- 环形缓冲区的c实现
- 一个简单的环形缓冲区的实现
- 一个免锁环形缓冲区的实现
- 环形缓冲区的C语言实现
- C语言 环形缓冲区
- 环形缓冲区的实现
- 环形缓冲区的实现
- 环形缓冲区的实现
- 环形缓冲区的实现
- 环形缓冲区和c笔记
- 环形缓冲区(通俗讲:生产者消费者的一个案例)
- linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)
- 环形缓冲区的实现原理
- 环形缓冲区的实现原理
- 环形缓冲区的实现原理
- 环形缓冲区的实现原理
- FIFO环形缓冲区的实现
- 如何找到新窗口并定位
- WORD的简单替换
- JavaScript 拖放效果
- ubuntu手动安装JDK
- 让Erlang服务器后台运行
- C++——一个封装好的环形缓冲区
- ubuntu自动和手动安装jdk
- IOS教程二-----IOS SDK 5 有哪些新东西
- 快速操作SVN
- 在MFC的View窗口中显示IplImage之二
- LCS-最长公共子序列
- 《『若水新闻』客户端开发教程》——03.设计新闻分类UI(1)
- 第一篇日志
- 去百度还是去创新工厂? 信开复还是信彦宏?