A simple list of objects of type <T> that is intended to be used as a circular buffer (eg, a FIFO) when the alloc/free overhead associated with a linked-list approach is to be avoided. More...
Classes | |
class | const_iterator |
A simple forward const iterator for a circular buffer. More... | |
Public Types | |
typedef T | value_type |
The value type the list contains. More... | |
typedef T * | pointer |
The pointer type for non-const access to value_type items. More... | |
typedef const T * | const_pointer |
The pointer type for const access to value_type items. More... | |
typedef T & | reference |
The type used for storing into value_type objects. More... | |
typedef const T & | const_reference |
The type used for reading from constant value_type objects. More... | |
typedef label | size_type |
The type to represent the size of a buffer. More... | |
typedef label | difference_type |
The difference between iterator objects. More... | |
Public Member Functions | |
constexpr | CircularBuffer () noexcept |
Default construct, empty buffer without allocation. More... | |
CircularBuffer (const label len) | |
Construct an empty buffer with given reserve size. More... | |
CircularBuffer (const CircularBuffer< T > &list) | |
Copy construct. More... | |
CircularBuffer (CircularBuffer< T > &&list) | |
Move construct. More... | |
CircularBuffer (Istream &is) | |
Construct from Istream - uses readList. More... | |
label | capacity () const noexcept |
Size of the underlying storage. More... | |
bool | empty () const noexcept |
Empty or exhausted buffer. More... | |
label | size () const noexcept |
The current number of buffer items. More... | |
label | space () const noexcept |
The nominal space available to fill. Subtract 1 for the number to append before re-balancing is needed. More... | |
labelRange | range_one () const noexcept |
The addressing range covered by array_one() More... | |
labelRange | range_two () const noexcept |
The addressing range covered by array_two() More... | |
SubList< T > | array_one () |
The contents of the first internal array. More... | |
SubList< T > | array_two () |
The contents of the second internal array. More... | |
const SubList< T > | array_one () const |
The contents of the first internal array. More... | |
const SubList< T > | array_two () const |
The contents of the second internal array. More... | |
T & | front () |
Access the first element (front). Requires !empty(). More... | |
T & | back () |
Access the last element (back). Requires !empty(). More... | |
const T & | front () const |
Const access to the first element (front). Requires !empty(). More... | |
const T & | back () const |
Const access to the last element (back). Requires !empty(). More... | |
void | reserve (const label len) |
Reserve allocation space for at least this size, allocating new space if required and retaining old content. More... | |
void | reserve_nocopy (const label len) |
Reserve allocation space for at least this size, allocating new space if required without retaining old content. More... | |
void | clear () noexcept |
Clear the addressed buffer, does not change allocation. More... | |
void | clearStorage () |
Clear the buffer and delete storage. More... | |
void | swap (CircularBuffer< T > &other) |
Swap content, independent of sizing parameter. More... | |
bool | contains (const T &val) const |
True if the value is contained in the list. More... | |
bool | contains (const T &val, label pos) const |
Is the value contained in the list? More... | |
label | find (const T &val, label pos=0) const |
Find index of the first occurrence of the value. More... | |
void | push_front (const T &val) |
Copy prepend an element to the front of the buffer. More... | |
void | push_front (T &&val) |
Move prepend an element to the front of the buffer. More... | |
template<class... Args> | |
T & | emplace_front (Args &&... args) |
Construct an element at the front of the buffer, return reference to the new element. More... | |
void | push_back (const T &val) |
Copy append an element to the end of the buffer. More... | |
void | push_back (T &&val) |
Move append an element to the end of the buffer. More... | |
template<class... Args> | |
T & | emplace_back (Args &&... args) |
Construct an element at the end of the buffer, return reference to the new element. More... | |
void | pop_front (label n=1) |
Shrink by moving the front of the buffer 1 or more times. More... | |
void | pop_back (label n=1) |
Shrink by moving the end of the buffer 1 or more times. More... | |
void | push_back (const UList< T > &list) |
Copy append multiple elements the end of the buffer. More... | |
template<class Addr > | |
void | push_back (const IndirectListBase< T, Addr > &list) |
Copy append IndirectList elements the end of the buffer. More... | |
label | push_uniq (const T &val) |
Append an element if not already in the buffer. More... | |
List< T > | list () const |
Return a copy of the buffer flattened into a single List. Use sparingly! More... | |
void | reverse () |
Reverse the buffer order, swapping elements. More... | |
T & | operator[] (const label i) |
Non-const access to an element in the list. More... | |
const T & | operator[] (const label i) const |
Const access to an element in the list. More... | |
void | operator= (const CircularBuffer< T > &list) |
Copy construct. More... | |
void | operator= (CircularBuffer< T > &&list) |
Move construct. More... | |
void | operator= (const T &val) |
Assign all addressed elements to the given value. More... | |
void | operator= (const Foam::zero) |
Assignment of all entries to zero. More... | |
void | operator= (const UList< T > &rhs) |
Deep copy values from a list of the addressed elements. More... | |
template<class AnyAddr > | |
void | operator= (const IndirectListBase< T, AnyAddr > &rhs) |
Deep copy values from a list of the addressed elements. More... | |
Ostream & | info (Ostream &os) const |
Print information. More... | |
Istream & | readList (Istream &is) |
Read buffer contents from Istream. More... | |
Ostream & | writeList (Ostream &os, const label shortLen=0) const |
Write buffer contents with line-breaks in ASCII when length exceeds shortLen. More... | |
const_iterator | cbegin () const |
Return a const_iterator at begin of buffer. More... | |
const_iterator | cend () const |
Return a const_iterator at end of buffer. More... | |
const_iterator | begin () const |
Return a const_iterator at begin of buffer. More... | |
const_iterator | end () const |
Return a const_iterator at end of buffer. More... | |
Static Public Member Functions | |
static constexpr label | min_size () noexcept |
Lower capacity limit. More... | |
Friends | |
Istream & | operator>> (Istream &is, CircularBuffer< T > &list) |
Use the readList() method to read contents from Istream. More... | |
Ostream & | operator (Ostream &os, const CircularBuffer< T > &list) |
Write to Ostream. More... | |
A simple list of objects of type <T> that is intended to be used as a circular buffer (eg, a FIFO) when the alloc/free overhead associated with a linked-list approach is to be avoided.
The internal storage is addressed by independent begin/end markers.
This results in a variety ofr different possible buffer states:
|.|.|.|a|b|c|d|.|.|.| beg ___^ end ___________^
|f|g|h|i|.|.|.|a|b|c|d|e| end _____^ beg ___________^
The methods range_one(), range_two() return the internal indexing and the methods array_one(), array_two() provide direct access to the internal contents.
When filling the buffer, the internal storage will be resized (doubling strategy) as required. When this occurs, the new list will be linearized with begin = 0.
Simultaneously when filling, the storage buffer will be over-allocated to avoid ambiguity when (begin == end), which represents an empty buffer and not a full buffer. Eg,
|c|d|.|a|b| end _^ beg ___^
after appending one more, it would be incorrect to simply fill the available space:
|c|d|e|a|b| end ___^ WRONG : would represent empty! beg ___^
the storage is instead increased (doubled) and rebalanced before the append occurs (old capacity 5, new capacity 10):
|a|b|c|d|e|.|.|.|.|.| _^_ beg end _______^
Definition at line 102 of file CircularBuffer.H.
typedef T value_type |
The value type the list contains.
Definition at line 175 of file CircularBuffer.H.
The pointer type for non-const access to value_type items.
Definition at line 180 of file CircularBuffer.H.
typedef const T* const_pointer |
The pointer type for const access to value_type items.
Definition at line 185 of file CircularBuffer.H.
The type used for storing into value_type objects.
Definition at line 190 of file CircularBuffer.H.
typedef const T& const_reference |
The type used for reading from constant value_type objects.
Definition at line 195 of file CircularBuffer.H.
typedef label size_type |
The type to represent the size of a buffer.
Definition at line 200 of file CircularBuffer.H.
typedef label difference_type |
The difference between iterator objects.
Definition at line 205 of file CircularBuffer.H.
|
inlinenoexcept |
Default construct, empty buffer without allocation.
Definition at line 107 of file CircularBufferI.H.
|
inlineexplicit |
Construct an empty buffer with given reserve size.
Definition at line 116 of file CircularBufferI.H.
|
inline |
Copy construct.
Definition at line 126 of file CircularBufferI.H.
|
inline |
Move construct.
Definition at line 138 of file CircularBufferI.H.
|
explicit |
Construct from Istream - uses readList.
Definition at line 28 of file CircularBufferIO.C.
|
inlinestaticnoexcept |
Lower capacity limit.
Definition at line 248 of file CircularBuffer.H.
|
inlinenoexcept |
Size of the underlying storage.
Definition at line 154 of file CircularBufferI.H.
Referenced by Foam::meshTools::bandCompression().
|
inlinenoexcept |
Empty or exhausted buffer.
Definition at line 162 of file CircularBufferI.H.
Referenced by Foam::meshTools::bandCompression().
|
inlinenoexcept |
The current number of buffer items.
Definition at line 169 of file CircularBufferI.H.
References Foam::diff().
Referenced by CircularBuffer< T >::cend(), and Foam::polyMeshZipUpCells().
|
inlinenoexcept |
The nominal space available to fill. Subtract 1 for the number to append before re-balancing is needed.
Definition at line 183 of file CircularBufferI.H.
|
inlinenoexcept |
The addressing range covered by array_one()
Definition at line 190 of file CircularBufferI.H.
|
inlinenoexcept |
The addressing range covered by array_two()
Definition at line 202 of file CircularBufferI.H.
Foam::SubList< T > array_one | ( | ) |
The contents of the first internal array.
Definition at line 70 of file CircularBuffer.C.
Referenced by CircularBuffer< T >::operator=().
Foam::SubList< T > array_two | ( | ) |
The contents of the second internal array.
Definition at line 78 of file CircularBuffer.C.
Referenced by CircularBuffer< T >::operator=().
const Foam::SubList< T > array_one | ( | ) | const |
The contents of the first internal array.
Definition at line 86 of file CircularBuffer.C.
const Foam::SubList< T > array_two | ( | ) | const |
The contents of the second internal array.
Definition at line 94 of file CircularBuffer.C.
|
inline |
Access the first element (front). Requires !empty().
Definition at line 267 of file CircularBufferI.H.
References Foam::abort(), Foam::FatalError, and FatalErrorInFunction.
Referenced by Foam::meshTools::bandCompression(), and Foam::polyMeshZipUpCells().
|
inline |
Access the last element (back). Requires !empty().
Definition at line 291 of file CircularBufferI.H.
References Foam::abort(), Foam::FatalError, and FatalErrorInFunction.
Referenced by Foam::polyMeshZipUpCells().
|
inline |
Const access to the first element (front). Requires !empty().
Definition at line 279 of file CircularBufferI.H.
References Foam::abort(), Foam::FatalError, and FatalErrorInFunction.
|
inline |
Const access to the last element (back). Requires !empty().
Definition at line 303 of file CircularBufferI.H.
References Foam::abort(), Foam::FatalError, and FatalErrorInFunction.
|
inline |
Reserve allocation space for at least this size, allocating new space if required and retaining old content.
Never shrinks.
Definition at line 239 of file CircularBufferI.H.
|
inline |
Reserve allocation space for at least this size, allocating new space if required without retaining old content.
Never shrinks.
Definition at line 246 of file CircularBufferI.H.
|
inlinenoexcept |
Clear the addressed buffer, does not change allocation.
Definition at line 209 of file CircularBufferI.H.
Referenced by Foam::polyMeshZipUpCells().
|
inline |
Clear the buffer and delete storage.
Definition at line 216 of file CircularBufferI.H.
|
inline |
Swap content, independent of sizing parameter.
Definition at line 224 of file CircularBufferI.H.
|
inline |
True if the value is contained in the list.
Definition at line 253 of file CircularBufferI.H.
|
inline |
Is the value contained in the list?
val | The value to search for |
pos | The first position to examine (no-op if -ve) |
Definition at line 260 of file CircularBufferI.H.
References Foam::ListOps::find(), and Foam::pos().
Foam::label find | ( | const T & | val, |
label | pos = 0 |
||
) | const |
Find index of the first occurrence of the value.
Any occurrences before the start pos are ignored. Linear search.
Definition at line 102 of file CircularBuffer.C.
References Foam::pos().
|
inline |
Copy prepend an element to the front of the buffer.
Definition at line 315 of file CircularBufferI.H.
References reserve().
Referenced by Foam::polyMeshZipUpCells().
|
inline |
Move prepend an element to the front of the buffer.
Definition at line 327 of file CircularBufferI.H.
References reserve().
|
inline |
Construct an element at the front of the buffer, return reference to the new element.
Definition at line 340 of file CircularBufferI.H.
References args, reserve(), and Foam::T().
|
inline |
Copy append an element to the end of the buffer.
Definition at line 354 of file CircularBufferI.H.
References reserve().
Referenced by Foam::meshTools::bandCompression(), and Foam::polyMeshZipUpCells().
|
inline |
Move append an element to the end of the buffer.
Definition at line 366 of file CircularBufferI.H.
References reserve().
|
inline |
Construct an element at the end of the buffer, return reference to the new element.
Definition at line 379 of file CircularBufferI.H.
References args, reserve(), and Foam::T().
|
inline |
Shrink by moving the front of the buffer 1 or more times.
Definition at line 394 of file CircularBufferI.H.
References n.
Referenced by Foam::meshTools::bandCompression(), and Foam::polyMeshZipUpCells().
|
inline |
Shrink by moving the end of the buffer 1 or more times.
Definition at line 411 of file CircularBufferI.H.
References n.
Copy append multiple elements the end of the buffer.
Definition at line 443 of file CircularBufferI.H.
References UList< T >::fcIndex(), reserve(), and UList< T >::size().
|
inline |
Copy append IndirectList elements the end of the buffer.
Definition at line 465 of file CircularBufferI.H.
References IndirectListBase< T, Addr >::fcIndex(), reserve(), and IndirectListBase< T, Addr >::size().
|
inline |
Append an element if not already in the buffer.
Definition at line 428 of file CircularBufferI.H.
Foam::List< T > list | ( | ) | const |
Return a copy of the buffer flattened into a single List. Use sparingly!
Definition at line 156 of file CircularBuffer.C.
References UList< T >::slice().
Referenced by Foam::polyMeshZipUpCells().
void reverse | ( | ) |
Reverse the buffer order, swapping elements.
Definition at line 143 of file CircularBuffer.C.
References n, and Foam::Swap().
Non-const access to an element in the list.
The index is allowed to wrap in both directions
Definition at line 489 of file CircularBufferI.H.
Const access to an element in the list.
The index is allowed to wrap in both directions
Definition at line 497 of file CircularBufferI.H.
|
inline |
Copy construct.
Definition at line 505 of file CircularBufferI.H.
References CircularBuffer< T >::array_one(), CircularBuffer< T >::array_two(), clear(), reserve(), and Foam::T().
|
inline |
Move construct.
Definition at line 542 of file CircularBufferI.H.
Assign all addressed elements to the given value.
Definition at line 555 of file CircularBufferI.H.
|
inline |
Assignment of all entries to zero.
Definition at line 563 of file CircularBufferI.H.
Deep copy values from a list of the addressed elements.
Definition at line 571 of file CircularBufferI.H.
|
inline |
Deep copy values from a list of the addressed elements.
Definition at line 580 of file CircularBufferI.H.
Foam::Ostream & info | ( | Ostream & | os | ) | const |
Print information.
Definition at line 37 of file CircularBufferIO.C.
References Foam::nl, and os().
Foam::Istream & readList | ( | Istream & | is | ) |
Read buffer contents from Istream.
Definition at line 51 of file CircularBufferIO.C.
References DynamicList< T, SizeMin >::capacity(), UList< T >::empty(), DynamicList< T, SizeMin >::readList(), DynamicList< T, SizeMin >::resize(), DynamicList< T, SizeMin >::setCapacity(), and UList< T >::size().
Referenced by Foam::operator>>().
Foam::Ostream & writeList | ( | Ostream & | os, |
const label | shortLen = 0 |
||
) | const |
Write buffer contents with line-breaks in ASCII when length exceeds shortLen.
Using '0' suppresses line-breaks entirely.
Definition at line 81 of file CircularBufferIO.C.
References Foam::abort(), Foam::FatalError, FatalErrorInFunction, FUNCTION_NAME, Foam::nl, os(), and T.
|
inline |
Return a const_iterator at begin of buffer.
Definition at line 620 of file CircularBuffer.H.
Referenced by CircularBuffer< T >::begin().
|
inline |
Return a const_iterator at end of buffer.
Definition at line 628 of file CircularBuffer.H.
References CircularBuffer< T >::size().
Referenced by CircularBuffer< T >::end().
|
inline |
Return a const_iterator at begin of buffer.
Definition at line 636 of file CircularBuffer.H.
References CircularBuffer< T >::cbegin().
|
inline |
Return a const_iterator at end of buffer.
Definition at line 641 of file CircularBuffer.H.
References CircularBuffer< T >::cend().
|
friend |
Use the readList() method to read contents from Istream.
Definition at line 651 of file CircularBuffer.H.
|
friend |
Write to Ostream.