XRootD
XrdPfc::StableChunkVector< T, InnerShift, MaxChunks > Class Template Reference

#include <XrdPfcStableChunkVector.hh>

+ Inheritance diagram for XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >:
+ 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. More...
 
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

Definition at line 32 of file XrdPfcStableChunkVector.hh.

32 { m_chunks.reserve(MaxChunks); }

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  }
static constexpr std::size_t s_chunk_size

References XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::full(), and XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::s_chunk_size.

Referenced by XrdPfc::StableChunkPool< T, InnerShift, MaxChunks >::acquire().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ 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; }
static constexpr std::size_t s_capacity

References XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::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; }

References XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::s_capacity.

Referenced by XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::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]; }
static constexpr std::size_t s_chunk_mask

References XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::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]; }

References XrdPfc::StableChunkVector< T, InnerShift, MaxChunks >::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; }

Referenced by XrdPfc::StableChunkPool< T, InnerShift, MaxChunks >::n_in_use().

+ Here is the caller graph for this function:

Member Data Documentation

◆ s_capacity

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

◆ s_chunk_mask

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

◆ s_chunk_size

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

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