20#include "pw_allocator/bucket/base.h"
21#include "pw_containers/intrusive_list.h"
23namespace pw::allocator {
43template <
typename BlockType>
48 using Base = internal::
49 BucketBase<SequencedBucket<BlockType>, BlockType,
SequencedItem>;
55 constexpr size_t threshold()
const {
return threshold_; }
67 void DoAdd(BlockType& block) {
68 auto* item_to_add =
new (block.UsableSpace())
SequencedItem();
69 containers::future::IntrusiveList<SequencedItem>::iterator iter;
70 if (block.InnerSize() < threshold_) {
72 auto r_iter = std::find_if(
73 items_.rbegin(), items_.rend(), [item_to_add](
SequencedItem& item) {
74 return &item < item_to_add;
85 items_.begin(), items_.end(), [item_to_add](SequencedItem& item) {
86 return item_to_add < &item;
89 items_.insert(iter, *item_to_add);
94 auto iter = std::max_element(items_.begin(), items_.end(),
Base::Compare);
95 return BlockType::FromUsableSpace(&(*iter));
100 SequencedItem& item = items_.front();
102 return BlockType::FromUsableSpace(&item);
106 bool DoRemove(BlockType& block) {
108 if (block.InnerSize() >= threshold_) {
110 return items_.remove(item_to_remove);
113 auto iter = std::find_if(
114 items_.rbegin(), items_.rend(), [&item_to_remove](SequencedItem& item) {
115 return &item_to_remove == &item;
117 if (iter == items_.rend()) {
125 BlockType* DoRemoveCompatible(Layout layout) {
127 SequencedItem* item =
nullptr;
128 if (layout.size() < threshold_) {
130 auto iter = std::find_if(items_.rbegin(), items_.rend(), predicate);
131 item = iter != items_.rend() ? &(*iter) :
nullptr;
134 auto iter = std::find_if(items_.begin(), items_.end(), predicate);
135 item = iter != items_.end() ? &(*iter) :
nullptr;
137 if (item ==
nullptr) {
140 auto* block = BlockType::FromUsableSpace(item);
145 containers::future::IntrusiveList<SequencedItem> items_;
146 size_t threshold_ = 0;
Definition: sequenced.h:46
void set_threshold(size_t threshold)
Definition: sequenced.h:63
Definition: sequenced.h:35
static bool Compare(const ItemType &item1, const ItemType &item2)
Definition: base.h:178
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
Definition: intrusive_list.h:88
SmallBlock BlockType
Default block type to use for tests.
Definition: size_report.h:32