71 using Element256 = std::array<Element, 256>;
74 template<
typename... Args>
77 if (free !=
Index(-1)) {
82 pool.push_back(std::make_unique<Element256>());
84 idx =
Index(((pool.size() - 1) << 8) + cntr);
88 new(ptr) T(std::forward<Args>(args)...);
96 auto& elem = get(idx);
107 for (
auto i :
xrange(pool.size())) {
108 const auto& elem256 = *pool[i];
109 const T*
begin = &elem256[0].t;
111 if ((
begin <= ptr) && (ptr <
end)) {
120 return 256 * pool.size();
124 [[nodiscard]]
const Element& get(
Index idx)
const {
return (*pool[idx >> 8])[idx & 255]; }
125 [[nodiscard]] Element& get(
Index idx) {
return (*pool[idx >> 8])[idx & 255]; }
128 std::vector<std::unique_ptr<Element256>> pool;
void remove(const T *ptr)
Index ptr2Index(const T *ptr) const
const T & operator[](Index idx) const
T & operator[](Index idx)
EmplaceResult emplace(Args &&...args)
uint32_t next(octet_iterator &it, octet_iterator end)
constexpr auto xrange(T e)
constexpr auto begin(const zstring_view &x)
constexpr auto end(const zstring_view &x)