emlabcpp
modern opinionated embedded C++ library
emlabcpp::static_circular_buffer< T, N, Strategy > Struct Template Reference

Class implementing circular buffer of any type for up to N elements. More...

#include <static_circular_buffer.h>

Public Types

using index_type = typename Strategy::index_type
 
using size_type = typename Strategy::size_type
 
using value_type = T
 
using reference = T &
 
using const_reference = T const &
 
using iterator = static_circular_buffer_iterator< T >
 
using const_iterator = static_circular_buffer_iterator< T const >
 

Public Member Functions

 static_circular_buffer () noexcept=default
 Default constructed circular buffer is empty. More...
 
 static_circular_buffer (static_circular_buffer const &other)
 
 static_circular_buffer (static_circular_buffer &&other) noexcept
 
static_circular_bufferoperator= (static_circular_buffer const &other)
 Clears the buffer by destructing all contained elements and copies from other buffer. More...
 
static_circular_bufferoperator= (static_circular_buffer &&other) noexcept
 Clears the buffer by destructing all contained elements and moves from other buffer. More...
 
iterator begin () noexcept
 Iterator to first element. More...
 
const_iterator begin () const noexcept
 Iterator to first element. More...
 
std::reverse_iterator< iteratorrbegin () noexcept
 Reverse iterator to last element. More...
 
std::reverse_iterator< const_iteratorrbegin () const noexcept
 Reverse iterator to last element. More...
 
reference front () noexcept
 Reference to first element. More...
 
const_reference front () const noexcept
 Reference to first element. More...
 
take_front ()
 Removes and returns first element, is safe in SPSC scenario. More...
 
void take_front (auto &&buffer)
 Removes and moves first n elements into provided buffer, is safe in SPSC scenario. More...
 
void pop_front ()
 Removes first element, is safe in SPSC scenario. More...
 
void pop_front (size_type n)
 Removes first n elements, is safe in SPSC scenario. More...
 
iterator end () noexcept
 Iterator to one-past-last element. More...
 
const_iterator end () const noexcept
 Iterator to one-past-last element. More...
 
std::reverse_iterator< iteratorrend () noexcept
 Reverse iterator to one-before-first element. More...
 
std::reverse_iterator< const_iteratorrend () const noexcept
 Reverse iterator to one-before-first element. More...
 
reference back () noexcept
 Reference to last element. More...
 
const_reference back () const noexcept
 Reference to last element. More...
 
void push_back (T item)
 Inserts item at the back, is safe in SPSC scenario. More...
 
template<typename... Args>
T & emplace_back (Args &&... args)
 Inserts item constructed with args... at the back, is safe in SPSC scenario. More...
 
void copy_range_back (auto &&range)
 Inserts range by copy at the back, is safe in SPSC scenario. More...
 
void move_range_back (auto &&range)
 Inserts range by move at the back, is safe in SPSC scenario. More...
 
constexpr size_type capacity () const noexcept
 Returns maximum capacity of the buffer. More...
 
size_type size () const
 Returns current size of the buffer. More...
 
bool empty () const noexcept
 Returns whether the buffer is empty. More...
 
bool full () const noexcept
 Returns whether the buffer is full. More...
 
void clear ()
 Clears the buffer by destructing all contained elements. More...
 
 ~static_circular_buffer ()
 Destructor destructs all contained elements. More...
 

Static Public Attributes

static constexpr std::size_t max_size = Strategy::max_size
 

Friends

template<typename U >
class static_circular_buffer_iterator
 

Detailed Description

template<typename T, std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
struct emlabcpp::static_circular_buffer< T, N, Strategy >

Class implementing circular buffer of any type for up to N elements.

It is safe in "single consumer single producer" scenario between main loop and interrupts. Because of that the behavior is as follows:

  • on insertion, item is inserted and than index is advanced
  • on removal, item is removed and than index is advanced

Member Typedef Documentation

◆ const_iterator

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
using emlabcpp::static_circular_buffer< T, N, Strategy >::const_iterator = static_circular_buffer_iterator< T const >

◆ const_reference

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
using emlabcpp::static_circular_buffer< T, N, Strategy >::const_reference = T const&

◆ index_type

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
using emlabcpp::static_circular_buffer< T, N, Strategy >::index_type = typename Strategy::index_type

◆ iterator

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
using emlabcpp::static_circular_buffer< T, N, Strategy >::iterator = static_circular_buffer_iterator< T >

◆ reference

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
using emlabcpp::static_circular_buffer< T, N, Strategy >::reference = T&

◆ size_type

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
using emlabcpp::static_circular_buffer< T, N, Strategy >::size_type = typename Strategy::size_type

◆ value_type

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
using emlabcpp::static_circular_buffer< T, N, Strategy >::value_type = T

Constructor & Destructor Documentation

◆ static_circular_buffer() [1/3]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
emlabcpp::static_circular_buffer< T, N, Strategy >::static_circular_buffer ( )
defaultnoexcept

Default constructed circular buffer is empty.

◆ static_circular_buffer() [2/3]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
emlabcpp::static_circular_buffer< T, N, Strategy >::static_circular_buffer ( static_circular_buffer< T, N, Strategy > const &  other)
inline

◆ static_circular_buffer() [3/3]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
emlabcpp::static_circular_buffer< T, N, Strategy >::static_circular_buffer ( static_circular_buffer< T, N, Strategy > &&  other)
inlinenoexcept

◆ ~static_circular_buffer()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
emlabcpp::static_circular_buffer< T, N, Strategy >::~static_circular_buffer ( )
inline

Destructor destructs all contained elements.

Member Function Documentation

◆ back() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
const_reference emlabcpp::static_circular_buffer< T, N, Strategy >::back ( ) const
inlinenoexcept

Reference to last element.

◆ back() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
reference emlabcpp::static_circular_buffer< T, N, Strategy >::back ( )
inlinenoexcept

Reference to last element.

◆ begin() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
const_iterator emlabcpp::static_circular_buffer< T, N, Strategy >::begin ( ) const
inlinenoexcept

Iterator to first element.

References emlabcpp::protocol::max_size.

◆ begin() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
iterator emlabcpp::static_circular_buffer< T, N, Strategy >::begin ( )
inlinenoexcept

Iterator to first element.

References emlabcpp::protocol::max_size.

◆ capacity()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
constexpr size_type emlabcpp::static_circular_buffer< T, N, Strategy >::capacity ( ) const
inlineconstexprnoexcept

Returns maximum capacity of the buffer.

References emlabcpp::N.

◆ clear()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
void emlabcpp::static_circular_buffer< T, N, Strategy >::clear ( )
inline

Clears the buffer by destructing all contained elements.

◆ copy_range_back()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
void emlabcpp::static_circular_buffer< T, N, Strategy >::copy_range_back ( auto &&  range)
inline

Inserts range by copy at the back, is safe in SPSC scenario.

References emlabcpp::protocol::max_size, and emlabcpp::range().

◆ emplace_back()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
template<typename... Args>
T& emlabcpp::static_circular_buffer< T, N, Strategy >::emplace_back ( Args &&...  args)
inline

Inserts item constructed with args... at the back, is safe in SPSC scenario.

References emlabcpp::args.

◆ empty()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
bool emlabcpp::static_circular_buffer< T, N, Strategy >::empty ( ) const
inlinenoexcept

Returns whether the buffer is empty.

◆ end() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
const_iterator emlabcpp::static_circular_buffer< T, N, Strategy >::end ( ) const
inlinenoexcept

Iterator to one-past-last element.

References emlabcpp::protocol::max_size.

◆ end() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
iterator emlabcpp::static_circular_buffer< T, N, Strategy >::end ( )
inlinenoexcept

Iterator to one-past-last element.

References emlabcpp::protocol::max_size.

◆ front() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
const_reference emlabcpp::static_circular_buffer< T, N, Strategy >::front ( ) const
inlinenoexcept

Reference to first element.

◆ front() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
reference emlabcpp::static_circular_buffer< T, N, Strategy >::front ( )
inlinenoexcept

Reference to first element.

◆ full()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
bool emlabcpp::static_circular_buffer< T, N, Strategy >::full ( ) const
inlinenoexcept

Returns whether the buffer is full.

◆ move_range_back()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
void emlabcpp::static_circular_buffer< T, N, Strategy >::move_range_back ( auto &&  range)
inline

Inserts range by move at the back, is safe in SPSC scenario.

References emlabcpp::protocol::max_size, and emlabcpp::range().

◆ operator=() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
static_circular_buffer& emlabcpp::static_circular_buffer< T, N, Strategy >::operator= ( static_circular_buffer< T, N, Strategy > &&  other)
inlinenoexcept

Clears the buffer by destructing all contained elements and moves from other buffer.

◆ operator=() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
static_circular_buffer& emlabcpp::static_circular_buffer< T, N, Strategy >::operator= ( static_circular_buffer< T, N, Strategy > const &  other)
inline

Clears the buffer by destructing all contained elements and copies from other buffer.

◆ pop_front() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
void emlabcpp::static_circular_buffer< T, N, Strategy >::pop_front ( )
inline

Removes first element, is safe in SPSC scenario.

◆ pop_front() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
void emlabcpp::static_circular_buffer< T, N, Strategy >::pop_front ( size_type  n)
inline

Removes first n elements, is safe in SPSC scenario.

References emlabcpp::protocol::max_size.

◆ push_back()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
void emlabcpp::static_circular_buffer< T, N, Strategy >::push_back ( item)
inline

Inserts item at the back, is safe in SPSC scenario.

◆ rbegin() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
std::reverse_iterator< const_iterator > emlabcpp::static_circular_buffer< T, N, Strategy >::rbegin ( ) const
inlinenoexcept

Reverse iterator to last element.

◆ rbegin() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
std::reverse_iterator< iterator > emlabcpp::static_circular_buffer< T, N, Strategy >::rbegin ( )
inlinenoexcept

Reverse iterator to last element.

◆ rend() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
std::reverse_iterator< const_iterator > emlabcpp::static_circular_buffer< T, N, Strategy >::rend ( ) const
inlinenoexcept

Reverse iterator to one-before-first element.

◆ rend() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
std::reverse_iterator< iterator > emlabcpp::static_circular_buffer< T, N, Strategy >::rend ( )
inlinenoexcept

Reverse iterator to one-before-first element.

◆ size()

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
size_type emlabcpp::static_circular_buffer< T, N, Strategy >::size ( ) const
inline

Returns current size of the buffer.

◆ take_front() [1/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
T emlabcpp::static_circular_buffer< T, N, Strategy >::take_front ( )
inline

Removes and returns first element, is safe in SPSC scenario.

◆ take_front() [2/2]

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
void emlabcpp::static_circular_buffer< T, N, Strategy >::take_front ( auto &&  buffer)
inline

Removes and moves first n elements into provided buffer, is safe in SPSC scenario.

References emlabcpp::protocol::max_size.

Friends And Related Function Documentation

◆ static_circular_buffer_iterator

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
template<typename U >
friend class static_circular_buffer_iterator
friend

Member Data Documentation

◆ max_size

template<typename T , std::size_t N, typename Strategy = decltype( _select_strategy< T, N >() )>
constexpr std::size_t emlabcpp::static_circular_buffer< T, N, Strategy >::max_size = Strategy::max_size
staticconstexpr

The documentation for this struct was generated from the following file: