CircularBuffer
The CircularBuffer class provides APIs to push
and pop
data from a buffer. You should check if the buffer is full
before pushing the data because a full buffer overwrites the data. The empty
API is available to check contents in buffer before performing the pop operation.
CircularBuffer class is interrupt safe; all data operations are performed inside the critical section.
CircularBuffer is a templated class supporting different datatypes. The declaration of the CircularBuffer class must specify datatype and buffer size.
Memory considerations
The actual data buffer is allocated as part of the CircularBuffer object memory.
Declaration example
This is an example of BUF_SIZE
long integer CircularBuffer:
CircularBuffer<int, BUF_SIZE> buf;
CircularBuffer class reference
Public Member Functions | |
void | push (const T &data) |
Push the transaction to the buffer. More... | |
bool | pop (T &data) |
Pop the transaction from the buffer. More... | |
bool | empty () const |
Check if the buffer is empty. More... | |
bool | full () const |
Check if the buffer is full. More... | |
void | reset () |
Reset the buffer. More... | |
CounterType | size () const |
Get the number of elements currently stored in the circular_buffer. More... | |
bool | peek (T &data) const |
Peek into circular buffer without popping. More... |
CircularBuffer example
/*
* Copyright (c) 2016-2016, ARM Limited, All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mbed.h"
#include "platform/CircularBuffer.h"
#define BUF_SIZE 10
CircularBuffer<char, BUF_SIZE> buf;
char data_stream[] = "DataToBeAddedToBuffer";
int main()
{
uint32_t bytes_written = 0;
while (!buf.full()) {
buf.push(data_stream[bytes_written++]);
}
printf("Circular buffer is full: \"%s\" or empty: \"%s\" \n",
(buf.full()? "true":"false"),
(buf.empty()? "true":"false") );
printf ("Bytes written %d \n", bytes_written);
// If buffer is full, contents will be over-written
buf.push(data_stream[bytes_written++]);
char data;
printf ("Buffer contents: ");
while (!buf.empty()) {
buf.pop(data);
printf("%c", data);
}
printf("\n");
printf("Circular buffer is full: \"%s\" or empty: \"%s\" \n",
(buf.full()? "true":"false"),
(buf.empty()? "true":"false") );
return 0;
}