Skip to content

A ring_span implementation that allows zero construction and destruction

License

Notifications You must be signed in to change notification settings

janwilmans/ring_span

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ring_span

Another search for the one ring. Thanks to Björn Fahller for writing the original code, I modified it to fit my use cases and extended it to make it have 'the usual methods' like capacity() and clear().

Usage:

    std::vector<int> v;
    v.resize(256);
    nostd::ring_span rs(v);
    rs.push_back(1);  // 'normal' push_back
    class Foo{ std::vector<int> values; } ;
    std::vector<Foo> v;
    v.resize(16);
    nostd::ring_span rs(v);
    Foo & foo = rs.push_back(); // modify / re-use existing elements without re-construction

features:

  • mostly constrexpr (with some obvious exceptions)
  • works on top of an existing container of choice, it must have .data() and .size()
  • allows insertion and removal without construction or destruction of contained objects
  • pushing a value beyond the capacity of the span overwrites the oldest value

restrictions:

  • requires to be used on memory area where the size is a power of 2

The restriction allows the span to be slightly more efficient.

design considerations:

  • keep the span simple
  • the span overwrites the oldest value if a value is pushed in when its full
  • minimal error handling, if needed it can layered on top, see safe_push
// example added exceptions for error handling
template <typename T>
void safe_push(nostd::ring_span<T> rs, T v)
{
    if (rs.size() == rs.capacity())
    {
        throw std::runtime_error("safe_push exceeds span capacity");
    }
    rs.push_back(v);
}

About

A ring_span implementation that allows zero construction and destruction

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published