Circular Buffer

Circular buffer constructor.

Usage

var circularBuffer = require( '@stdlib/utils/circular-buffer' );

circularBuffer( buffer )

Returns a new circular buffer instance.

var buf = circularBuffer( 3 );
// returns <CircularBuffer>

The buffer argument may either be a integer which specifies the buffer size or an array-like object to use as the underlying buffer.

var Float64Array = require( '@stdlib/array/float64' );

// Use a typed array as the underlying buffer:
var buf = circularBuffer( new Float64Array( 3 ) );
// returns <CircularBuffer>
circularBuffer.prototype.clear()

Clears a buffer.

var buf = circularBuffer( 3 );
// returns <CircularBuffer>

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );
buf.push( 'beep' );

// Get the number of elements currently in the buffer:
var n = buf.count;
// returns 3

// Clear all buffer items:
buf.clear();

// Get the number of elements in the buffer:
n = buf.count;
// returns 0
circularBuffer.prototype.count

Read-only property which returns the number of elements currently in the buffer.

var buf = circularBuffer( 3 );
// returns <CircularBuffer>

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );

// Determine how many elements are in the buffer:
var n = buf.count;
// returns 2
circularBuffer.prototype.full

Read-only property which returns a boolean indicating if a buffer is full.

var buf = circularBuffer( 3 );
// returns <CircularBuffer>

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );

// Determine if the buffer is full:
var bool = buf.full;
// returns false

// Add another value to the buffer:
buf.push( 'beep' );

// Determine if the buffer is full:
bool = buf.full;
// returns true
circularBuffer.prototype.iterator( [niters] )

Returns an iterator for iterating over a buffer. If an environment supports Symbol.iterator, the returned iterator is iterable.

var buf = circularBuffer( 2 );

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );
buf.push( 'beep' );
buf.push( 'boop' );

// Create an iterator:
var it = buf.iterator();

// Iterate over the buffer...
var v = it.next().value;
// returns 'beep'

v = it.next().value;
// returns 'boop'

v = it.next().value;
// returns 'beep'

v = it.next().value;
// returns 'boop'

v = it.next().value;
// returns 'beep'

By default, provided a buffer is full, the method returns an infinite iterator. To limit the number of iterations, provide an niters argument.

var buf = circularBuffer( 2 );

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );
buf.push( 'beep' );
buf.push( 'boop' );

// Create an iterator:
var it = buf.iterator( buf.length );

// Iterate over the buffer...
var v = it.next().value;
// returns 'beep'

v = it.next().value;
// returns 'boop'

var bool = it.next().done;
// returns true

A returned iterator does not iterate over partially full circular buffers.

var buf = circularBuffer( 5 );

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );

// Create an iterator:
var it = buf.iterator();

// Determine if the buffer is full:
var bool = buf.full;
// returns false

// Iterate over the buffer...
bool = it.next().done;
// returns true

If iterating over a partially full circular buffer is necessary, use buf.toArray() and iterate over the returned array.

circularBuffer.prototype.length

Read-only property returning the buffer length (i.e., capacity).

var buf = circularBuffer( [ 0, 0, 0 ] );

// Get the buffer length:
var len = buf.length;
// returns 3
circularBuffer.prototype.push( value )

Adds a value to the buffer.

var buf = circularBuffer( 3 );

// Fill the buffer...
var v = buf.push( 'foo' );
// returns undefined

v = buf.push( 'bar' );
// returns undefined

v = buf.push( 'beep' );
// returns undefined

// Now that the buffer is full, each push will cause a value to be removed:
v = buf.push( 'boop' );
// returns 'foo'

When a circular buffer is empty or partially full, this method returns undefined. Once a circular buffer is full, the method returns removed values.

circularBuffer.prototype.toArray()

Returns an array of buffer values.

var buf = circularBuffer( 3 );

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );
buf.push( 'beep' );
buf.push( 'boop' );

// Get an array of buffer values:
var vals = buf.toArray();
// returns [ 'bar', 'beep', 'boop' ]
circularBuffer.prototype.toJSON()

Serializes a circular buffer as JSON.

var buf = circularBuffer( 3 );

// Add values to the buffer:
buf.push( 'foo' );
buf.push( 'bar' );
buf.push( 'beep' );
buf.push( 'boop' );

// Serialize to JSON:
var o = buf.toJSON();
// returns { 'type': 'circular-buffer', 'length': 3, 'data': [ 'bar', 'beep', 'boop' ] }

Note: JSON.stringify() implicitly calls this method when stringifying a circular buffer instance.

Notes

  • The constructor supports array-like object buffer arguments which use getter and setter accessors for element access (e.g., Complex64Array, Complex128Array, etc).

Examples

var circularBuffer = require( '@stdlib/utils/circular-buffer' );

// Create a circular buffer capable of holding 5 elements:
var buf = circularBuffer( 5 );
console.log( 'Buffer length: %s', buf.length );

// Continuously add values to the buffer...
var v;
var i;
for ( i = 0; i < 100; i++ ) {
    v = buf.push( i );
    console.log( 'Count: %d. Added value: %s. Removed value: %s.', buf.count, i, ( v === void 0 ) ? '(none)' : v );
}
Did you find this page helpful?