XRootD
Loading...
Searching...
No Matches
XrdPfc::StableChunkVector< T, InnerShift, MaxChunks > Class Template Reference

#include <XrdPfcStableChunkVector.hh>

Collaboration diagram for XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >:

Public Member Functions

 StableChunkVector ()
int add ()
 Append a default-constructed T; return its index, or -1 if full.
std::size_t capacity () const
bool full () const
T & operator[] (std::size_t i)
const T & operator[] (std::size_t i) const
std::size_t size () const

Static Public Attributes

static constexpr std::size_t s_capacity = std::size_t(MaxChunks) * s_chunk_size
static constexpr std::size_t s_chunk_mask = s_chunk_size - 1
static constexpr std::size_t s_chunk_size = std::size_t(1) << InnerShift

Detailed Description

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
class XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >

Append-only container whose element addresses never change: an outer vector reserved once to MaxChunks, of chunks reserved to 2^InnerShift and never grown. operator[] needs no lock, provided the index reached the reader through a release/acquire, as a queue under a mutex provides. The price is a hard capacity: add() returns -1 when full.

Definition at line 21 of file XrdPfcStableChunkVector.hh.

Constructor & Destructor Documentation

◆ StableChunkVector()

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::StableChunkVector ( )
inline

Member Function Documentation

◆ add()

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
int XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::add ( )
inline

Append a default-constructed T; return its index, or -1 if full.

Definition at line 42 of file XrdPfcStableChunkVector.hh.

43 {
44 if (full())
45 return -1;
46 if (m_chunks.empty() || m_chunks.back().size() == s_chunk_size)
47 {
48 // ! full() keeps this within the reserved outer capacity.
49 m_chunks.emplace_back();
50 m_chunks.back().reserve(s_chunk_size);
51 }
52 m_chunks.back().emplace_back();
53 return (int) m_size++;
54 }

◆ capacity()

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
std::size_t XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::capacity ( ) const
inline

Definition at line 35 of file XrdPfcStableChunkVector.hh.

35{ return s_capacity; }

◆ full()

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
bool XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::full ( ) const
inline

Definition at line 36 of file XrdPfcStableChunkVector.hh.

36{ return m_size >= s_capacity; }

Referenced by add().

Here is the caller graph for this function:

◆ operator[]() [1/2]

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
T & XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::operator[] ( std::size_t i)
inline

Definition at line 38 of file XrdPfcStableChunkVector.hh.

38{ return m_chunks[i >> InnerShift][i & s_chunk_mask]; }

◆ operator[]() [2/2]

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
const T & XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::operator[] ( std::size_t i) const
inline

Definition at line 39 of file XrdPfcStableChunkVector.hh.

39{ return m_chunks[i >> InnerShift][i & s_chunk_mask]; }

◆ size()

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
std::size_t XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::size ( ) const
inline

Definition at line 34 of file XrdPfcStableChunkVector.hh.

34{ return m_size; }

Member Data Documentation

◆ s_capacity

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
std::size_t XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::s_capacity = std::size_t(MaxChunks) * s_chunk_size
staticconstexpr

Definition at line 26 of file XrdPfcStableChunkVector.hh.

◆ s_chunk_mask

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
std::size_t XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::s_chunk_mask = s_chunk_size - 1
staticconstexpr

Definition at line 25 of file XrdPfcStableChunkVector.hh.

◆ s_chunk_size

template<typename T, unsigned InnerShift = 12, unsigned MaxChunks = 1024>
std::size_t XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::s_chunk_size = std::size_t(1) << InnerShift
staticconstexpr

Definition at line 24 of file XrdPfcStableChunkVector.hh.


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