00001
00002
00011 #include "RingBuffer.h"
00012
00013
00014 using namespace jbxl;
00015
00016
00017
00018
00019 void CRingBuffer::init_data(void)
00020 {
00021 buf = NULL;
00022 bufsz = 0;
00023 datasz = 0;
00024 spoint = 0;
00025 epoint = 0;
00026 datano = 0;
00027 state = 0;
00028 enable = FALSE;
00029 }
00030
00031
00032
00033 BOOL CRingBuffer::init(int ring_size, int data_size)
00034 {
00035 init_data();
00036
00037 buf = (void**)malloc(ring_size*sizeof(void*));
00038 if (buf==NULL) return FALSE;
00039 memset(buf, 0, ring_size*sizeof(void*));
00040 bufsz = ring_size;
00041 datasz = data_size;
00042
00043 BOOL ret = TRUE;
00044 for (int i=0; i<bufsz; i++) {
00045 buf[i] = (void*)malloc(datasz);
00046 if (buf[i]==NULL) {
00047 this->free();
00048 ret = FALSE;
00049 state = -1;
00050 break;
00051 }
00052 memset(buf[i], 0, datasz);
00053 }
00054
00055 if (ret) enable = TRUE;
00056
00057 return ret;
00058 }
00059
00060
00061
00062 void CRingBuffer::free(void)
00063 {
00064 if (!isNull(buf)) {
00065 for (int i=0; i<bufsz; i++) {
00066 if (!isNull(buf[i])) {
00067 ::free(buf[i]);
00068 }
00069 }
00070 ::free(buf);
00071 }
00072 init_data();
00073
00074 return;
00075 }
00076
00077
00078
00079 void CRingBuffer::clear(void)
00080 {
00081 for (int i=0; i<bufsz; i++) {
00082 memset(buf[i], 0, datasz);
00083 }
00084 spoint = 0;
00085 epoint = 0;
00086 datano = 0;
00087 state = 0;
00088
00089 return;
00090 }
00091
00092
00093
00094 void* CRingBuffer::get(void)
00095 {
00096 void* ptr = NULL;
00097
00098 if (datano>0) {
00099 ptr = buf[spoint];
00100 spoint++;
00101 if (spoint==bufsz) spoint = 0;
00102 datano--;
00103 }
00104
00105 return ptr;
00106 }
00107
00108
00109
00110 void* CRingBuffer::get(int pos)
00111 {
00112 pos = epoint + pos;
00113 if (pos<0) pos = bufsz + pos % bufsz;
00114 else pos = pos % bufsz;
00115
00116 return buf[pos];
00117 }
00118
00119
00120
00121 void CRingBuffer::put(void* ptr)
00122 {
00123 memcpy(buf[epoint], ptr, datasz);
00124 epoint++;
00125 if (epoint==bufsz) epoint = 0;
00126 if (datano<bufsz) datano++;
00127
00128 return;
00129 }
00130
00131
00132
00133 void CRingBuffer::put(void* ptr, int pos)
00134 {
00135 pos = epoint + pos;
00136 if (pos<0) pos = bufsz + pos % bufsz;
00137 else pos = pos % bufsz;
00138
00139 memcpy(buf[pos], ptr, datasz);
00140
00141 return;
00142 }
00143
00144
00145
00146