18#include "pw_allocator/bucket/base.h"
19#include "pw_containers/intrusive_forward_list.h"
21namespace pw::allocator {
36template <
typename BlockType>
39template <
typename BlockType>
54template <
typename Derived,
typename BlockType>
69 auto* item_to_add =
new (block.UsableSpace())
SortedItem();
72 Derived::MakeAddPredicate(block.InnerSize()));
73 items_.insert_after(prev, *item_to_add);
80 return BlockType::FromUsableSpace(&item);
94 if (block !=
nullptr) {
95 items_.erase_after(prev);
113template <
typename BlockType>
128 static constexpr auto MakeAddPredicate(
size_t inner_size) {
130 auto* block = BlockType::FromUsableSpace(&item);
131 return inner_size < block->InnerSize();
136 const BlockType* DoFindLargest()
const {
137 const auto& items = Base::items();
141 auto iter = items.before_begin();
145 }
while (iter != items.end());
146 return BlockType::FromUsableSpace(&(*prev));
157template <
typename BlockType>
172 static constexpr auto MakeAddPredicate(
size_t inner_size) {
174 auto* block = BlockType::FromUsableSpace(&item);
175 return block->InnerSize() < inner_size;
180 const BlockType* DoFindLargest()
const {
181 const auto& items = Base::items();
182 auto iter = items.begin();
183 return BlockType::FromUsableSpace(&(*iter));
Definition: intrusive_forward_list.h:91
static constexpr BlockType * GetBlockFromPrev(Iterator prev, Iterator last)
Definition: base.h:195
static auto MakeCanAllocPredicate(Layout layout)
Definition: base.h:169
void Clear()
Removes all blocks from this bucket.
Definition: base.h:134
static ItemType & GetItemFrom(BlockType &block)
Definition: base.h:205
static Iterator FindPrevIf(Iterator before_first, Iterator last, Predicate predicate)
Definition: base.h:150
BlockType * DoRemoveCompatible(Layout layout)
Definition: sorted.h:89
bool DoRemove(BlockType &block)
Definition: sorted.h:84
BlockType * DoRemoveAny()
Definition: sorted.h:77
void DoAdd(BlockType &block)
Definition: sorted.h:68