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>
94template <
typename BlockType>
109 static constexpr auto MakeAddPredicate(
size_t inner_size);
112 const BlockType* DoFindLargest()
const;
122template <
typename BlockType>
137 static constexpr auto MakeAddPredicate(
size_t inner_size);
140 const BlockType* DoFindLargest()
const;
149template <
typename Derived,
typename BlockType>
151 auto* item_to_add =
new (block.UsableSpace())
SortedItem();
152 auto prev = Base::FindPrevIf(items_.before_begin(),
154 Derived::MakeAddPredicate(block.InnerSize()));
155 items_.insert_after(prev, *item_to_add);
158template <
typename Derived,
typename BlockType>
162 return BlockType::FromUsableSpace(&item);
165template <
typename Derived,
typename BlockType>
168 auto prev = Base::FindPrevIf(
169 items_.before_begin(), items_.end(), Base::MakeCanAllocPredicate(layout));
170 auto* block = Base::GetBlockFromPrev(prev, items_.end());
171 if (block !=
nullptr) {
172 items_.erase_after(prev);
179template <
typename BlockType>
183 auto* block = BlockType::FromUsableSpace(&item);
184 return inner_size < block->InnerSize();
188template <
typename BlockType>
189const BlockType* ForwardSortedBucket<BlockType>::DoFindLargest()
const {
190 const auto& items = Base::items();
194 auto iter = items.before_begin();
198 }
while (iter != items.end());
199 return BlockType::FromUsableSpace(&(*prev));
202template <
typename BlockType>
203constexpr auto ReverseSortedBucket<BlockType>::MakeAddPredicate(
205 return [inner_size](SortedItem& item) {
206 auto* block = BlockType::FromUsableSpace(&item);
207 return block->InnerSize() < inner_size;
211template <
typename BlockType>
212const BlockType* ReverseSortedBucket<BlockType>::DoFindLargest()
const {
213 const auto& items = Base::items();
214 auto iter = items.begin();
215 return BlockType::FromUsableSpace(&(*iter));
Definition: intrusive_forward_list.h:99
void Clear()
Removes all blocks from this bucket.
Definition: base.h:118
static ItemType & GetItemFrom(BlockType &block)
Definition: base.h:169
BlockType * DoRemoveCompatible(Layout layout)
Definition: sorted.h:166
bool DoRemove(BlockType &block)
Definition: sorted.h:74
BlockType * DoRemoveAny()
Definition: sorted.h:159
void DoAdd(BlockType &block)
Definition: sorted.h:150
SmallBlock BlockType
Default block type to use for tests.
Definition: size_report.h:32