18#include "pw_allocator/bucket/base.h"
19#include "pw_containers/intrusive_forward_list.h"
21namespace pw::allocator {
41template <
typename BlockType>
44 BucketBase<UnorderedBucket<BlockType>, BlockType, UnorderedItem> {
46 using Base = internal::
47 BucketBase<UnorderedBucket<BlockType>, BlockType,
UnorderedItem>;
55 void DoAdd(BlockType& block);
58 BlockType* DoRemoveAny();
61 const BlockType* DoFindLargest()
const;
64 bool DoRemove(BlockType& block) {
69 BlockType* DoRemoveCompatible(
Layout layout);
78template <
typename BlockType>
81 items_.push_front(*item);
84template <
typename BlockType>
85BlockType* UnorderedBucket<BlockType>::DoRemoveAny() {
86 UnorderedItem& item = items_.front();
88 return BlockType::FromUsableSpace(&item);
91template <
typename BlockType>
92const BlockType* UnorderedBucket<BlockType>::DoFindLargest()
const {
93 auto iter = std::max_element(items_.begin(), items_.end(), Base::Compare);
94 return BlockType::FromUsableSpace(&(*iter));
97template <
typename BlockType>
98BlockType* UnorderedBucket<BlockType>::DoRemoveCompatible(Layout layout) {
99 auto prev = Base::FindPrevIf(
100 items_.before_begin(), items_.end(), Base::MakeCanAllocPredicate(layout));
101 auto* block = Base::GetBlockFromPrev(prev, items_.end());
102 if (block !=
nullptr) {
103 items_.erase_after(prev);
Definition: intrusive_forward_list.h:99
Definition: unordered.h:44
Definition: unordered.h:32
void Clear()
Removes all blocks from this bucket.
Definition: base.h:118
static ItemType & GetItemFrom(BlockType &block)
Definition: base.h:169
SmallBlock BlockType
Default block type to use for tests.
Definition: size_report.h:32