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>
112 static constexpr auto MakeAddPredicate(
size_t inner_size);
115 const BlockType* DoFindLargest()
const;
125template <
typename BlockType>
143 static constexpr auto MakeAddPredicate(
size_t inner_size);
146 const BlockType* DoFindLargest()
const;
155template <
typename Derived,
typename BlockType>
157 auto* item_to_add =
new (block.UsableSpace())
SortedItem();
158 auto prev = Base::FindPrevIf(items_.before_begin(),
160 Derived::MakeAddPredicate(block.InnerSize()));
161 items_.insert_after(prev, *item_to_add);
164template <
typename Derived,
typename BlockType>
168 return BlockType::FromUsableSpace(&item);
171template <
typename Derived,
typename BlockType>
174 auto prev = Base::FindPrevIf(
175 items_.before_begin(), items_.end(), Base::MakeCanAllocPredicate(layout));
176 auto* block = Base::GetBlockFromPrev(prev, items_.end());
177 if (block !=
nullptr) {
178 items_.erase_after(prev);
185template <
typename BlockType>
189 auto* block = BlockType::FromUsableSpace(&item);
190 return inner_size < block->InnerSize();
194template <
typename BlockType>
195const BlockType* ForwardSortedBucket<BlockType>::DoFindLargest()
const {
196 const auto& items = Base::items();
200 auto iter = items.before_begin();
204 }
while (iter != items.end());
205 return BlockType::FromUsableSpace(&(*prev));
208template <
typename BlockType>
209constexpr auto ReverseSortedBucket<BlockType>::MakeAddPredicate(
211 return [inner_size](SortedItem& item) {
212 auto* block = BlockType::FromUsableSpace(&item);
213 return block->InnerSize() < inner_size;
217template <
typename BlockType>
218const BlockType* ReverseSortedBucket<BlockType>::DoFindLargest()
const {
219 const auto& items = Base::items();
220 auto iter = items.begin();
221 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:172
bool DoRemove(BlockType &block)
Definition: sorted.h:74
BlockType * DoRemoveAny()
Definition: sorted.h:165
void DoAdd(BlockType &block)
Definition: sorted.h:156
SmallBlock BlockType
Default block type to use for tests.
Definition: size_report.h:32