- Notifications
You must be signed in to change notification settings - Fork34
circular buffer, circular queue, cyclic buffer, ring buffer
License
Roen-Ro/CircularBuffer
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
The difinition ofcircular buffer from Wikipedia:
A circular buffer, circular queue, cyclic buffer or ring buffer is a data structure that uses a single, fixed-size buffer as if it were connected end-to-end. This structure lends itself easily to buffering data streams.
A circular buffer first starts empty and of some predefined length. For example, this is a 7-element buffer:
Assume that a 1 is written into the middle of the buffer (exact starting location does not matter in a circular buffer):
Then assume that two more elements are added — 2 & 3 — which get appended after the 1:
If two elements are then removed from the buffer, the oldest values inside the buffer are removed. The two elements removed, in this case, are 1 & 2, leaving the buffer with just a 3:
If the buffer has 7 elements then it is completely full:
A consequence of the circular buffer is that when it is full and a subsequent write is performed, then it starts overwriting the oldest data. In this case, two more elements — A & B — are added and they overwrite the 3 & 4:
Alternatively, the routines that manage the buffer could prevent overwriting the data and return an error or raise an exception. Whether or not data is overwritten is up to the semantics of the buffer routines or the application using the circular buffer.
Finally, if two elements are now removed then what would be returned is not 3 & 4 but 5 & 6 because A & B overwrote the 3 & the 4 yielding the buffer with:
typedefstructs_circularBuffer*CircularBuffer;// Construct CircularBuffer with ‘size' in byte. You must call CircularBufferFree() in balance for destruction.externCircularBufferCircularBufferCreate(size_tsize);// Destruct CircularBufferexternvoidCircularBufferFree(CircularBuffercBuf);// Reset the CircularBufferexternvoidCircularBufferReset(CircularBuffercBuf);// get the buffer capacityexternsize_tCircularBufferGetCapacity(CircularBuffercBuf);//get occupied data size of CircularBufferexternsize_tCircularBufferGetDataSize(CircularBuffercBuf);// Push data to the tail of a circular buffer from 'src' with 'length' size in byte.externvoidCircularBufferPush(CircularBuffercBuf,void*src,size_tlength);// Pop data from a circular buffer to 'dataOut' with wished 'length' size in byte,return the actual data size in byte popped out,which is less or equal to the input 'length parameter.externsize_tCircularBufferPop(CircularBuffercBuf,size_tlength,void*dataOut);// Read data from a circular buffer to 'dataOut' with wished 'length' size in byte,return the actual data size in byte popped out,which is less or equal to the input 'length parameter.externsize_tCircularBufferRead(CircularBuffercBuf,size_tlength,void*dataOut);//for test purpose, print the circular buffer's data content by printf(...); the 'hex' parameters indicates that if the data should be printed in asscii string or hex data format.externvoidCircularBufferPrint(CircularBuffercBuf,boolhex);
Roen(罗亮富),zxllf23@163.com
All source code is licensed under the MIT License