1 #ifndef __XRDPFC_STABLECHUNKVECTOR_HH__
2 #define __XRDPFC_STABLECHUNKVECTOR_HH__
20 template<
typename T,
unsigned InnerShift = 12,
unsigned MaxChunks = 1024>
24 static constexpr std::size_t
s_chunk_size = std::size_t(1) << InnerShift;
29 static_assert(
s_capacity <= (std::size_t) std::numeric_limits<int>::max(),
30 "StableChunkVector: capacity must be representable as int");
34 std::size_t
size()
const {
return m_size; }
46 if (m_chunks.empty() || m_chunks.back().size() ==
s_chunk_size)
49 m_chunks.emplace_back();
52 m_chunks.back().emplace_back();
53 return (
int) m_size++;
57 std::vector<std::vector<T>> m_chunks;
58 std::size_t m_size = 0;
70 template<
typename T,
unsigned InnerShift = 12,
unsigned MaxChunks = 1024>
80 if ( ! m_free_slots.empty())
82 int i = m_free_slots.back();
83 m_free_slots.pop_back();
93 m_free_slots.push_back(i);
96 std::size_t
n_free()
const {
return m_free_slots.size(); }
101 std::vector<int> m_free_slots;
std::size_t n_free() const
void release(int i)
Clear the slot and return it for reuse. Caller must hold its mutex.
std::size_t n_in_use() const
const T & operator[](std::size_t i) const
static constexpr std::size_t s_chunk_size
static constexpr std::size_t s_chunk_mask
static constexpr std::size_t s_capacity
std::size_t capacity() const
T & operator[](std::size_t i)
int add()
Append a default-constructed T; return its index, or -1 if full.