00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "stdafx.h"
00033 #include <libOOOgg/CircularBuffer.h>
00034
00035
00036 CircularBuffer::CircularBuffer(unsigned long inBufferSize)
00037 : mBufferSize(inBufferSize)
00038 , mBuffer(NULL)
00039 , mReadPtr(0)
00040 , mWritePtr(0)
00041
00042 {
00043 mBuffer = new unsigned char[inBufferSize + 1];
00044 }
00045
00046 CircularBuffer::~CircularBuffer(void)
00047 {
00048 delete[] mBuffer;
00049 }
00050
00051 unsigned long CircularBuffer::read(unsigned char* outData, unsigned long inBytesToRead) {
00052
00053
00054 if (inBytesToRead > spaceLeft()) {
00055 return 0;
00056 }
00057
00058 unsigned long locBytesToRead = inBytesToRead;
00059
00060 bufASSERT(locBytesToRead <= mBufferSize);
00061
00062
00063
00064 bufASSERT(locBytesToRead <= inBytesToRead);
00065 bufASSERT(locBytesToRead <= numBytesAvail());
00066
00067
00068
00069
00070
00071
00072
00073 unsigned long locEndDistance = (mBufferSize + 1 - mReadPtr);
00074
00075
00076 if (locEndDistance >= locBytesToRead) {
00077
00078 bufASSERT(mReadPtr <= mBufferSize);
00079
00080 memcpy((void*)outData, (const void*)(mBuffer + mReadPtr), locBytesToRead);
00081 } else {
00082 bufASSERT(locEndDistance <= mBufferSize);
00083
00084
00085 memcpy((void*)outData, (const void*)(mBuffer + mReadPtr), locEndDistance);
00086
00087
00088 memcpy((void*)(outData + locEndDistance), (const void*)(mBuffer), locBytesToRead - locEndDistance);
00089 }
00090 mReadPtr = (mReadPtr + locBytesToRead) % (mBufferSize + 1);
00091
00092 return locBytesToRead;
00093 }
00094
00095 unsigned long CircularBuffer::write(const unsigned char* inData, unsigned long inBytesToWrite) {
00096 if (inBytesToWrite > spaceLeft()) {
00097 return 0;
00098 }
00099
00100 unsigned long locBytesToWrite = inBytesToWrite;
00101
00102
00103
00104
00105 bufASSERT(locBytesToWrite <= spaceLeft());
00106 bufASSERT(locBytesToWrite <= inBytesToWrite);
00107 bufASSERT(locBytesToWrite <= mBufferSize);
00108 bufASSERT(mWritePtr <= mBufferSize);
00109
00110 unsigned long locEndDistance = (mBufferSize + 1 - mWritePtr);
00111
00112
00113
00114
00115
00116
00117
00118 if (locEndDistance >= locBytesToWrite) {
00119
00120 memcpy((void*)(mBuffer + mWritePtr), ((const void*)inData), locBytesToWrite);
00121 } else {
00122 bufASSERT(locEndDistance <= mBufferSize);
00123
00124
00125 memcpy((void*)(mBuffer + mWritePtr), (const void*)inData, locEndDistance);
00126
00127
00128 memcpy((void*)(mBuffer), (const void*)(inData + locEndDistance), locBytesToWrite - locEndDistance);
00129
00130
00131
00132 }
00133 mWritePtr = (mWritePtr + locBytesToWrite) % (mBufferSize + 1);
00134
00135 return locBytesToWrite;
00136
00137
00138
00139 }
00140
00141 unsigned long CircularBuffer::spaceLeft() {
00142 bufASSERT(mReadPtr <= mBufferSize);
00143 bufASSERT(mWritePtr <= mBufferSize);
00144
00145
00146
00147 if (mReadPtr > mWritePtr) {
00148
00149
00150
00151
00152
00154
00155 bufASSERT(mReadPtr > mWritePtr);
00156 return (mReadPtr - mWritePtr - 1);
00157 } else {
00158 bufASSERT(mReadPtr <= mWritePtr);
00159 return mBufferSize + mReadPtr - mWritePtr ;
00160 }
00161 }
00162 unsigned long CircularBuffer::numBytesAvail() {
00163 bufASSERT(mReadPtr <= mBufferSize);
00164 bufASSERT(mWritePtr <= mBufferSize);
00165
00166 if (mReadPtr > mWritePtr) {
00167
00168
00169
00170
00171
00173
00174 bufASSERT(mReadPtr > mWritePtr);
00175
00176
00177 return (mBufferSize + 1 + mWritePtr - mReadPtr);
00178 } else {
00179
00180 return mWritePtr - mReadPtr;
00181 }
00182 }
00183
00184 void CircularBuffer::reset() {
00185 mWritePtr = 0;
00186 mReadPtr = 0;
00187 }
00188