20#include "pw_allocator/bucket/base.h"
21#include "pw_containers/intrusive_list.h"
23namespace pw::allocator {
41template <
typename BlockType>
46 using Base = internal::
47 BucketBase<SequencedBucket<BlockType>, BlockType,
SequencedItem>;
53 constexpr size_t threshold()
const {
return threshold_; }
65 void DoAdd(BlockType& block) {
66 auto* item_to_add =
new (block.UsableSpace())
SequencedItem();
67 containers::future::IntrusiveList<SequencedItem>::iterator iter;
68 if (block.InnerSize() < threshold_) {
70 auto r_iter = std::find_if(
71 items_.rbegin(), items_.rend(), [item_to_add](
SequencedItem& item) {
72 return &item < item_to_add;
83 items_.begin(), items_.end(), [item_to_add](SequencedItem& item) {
84 return item_to_add < &item;
87 items_.insert(iter, *item_to_add);
91 BlockType* DoRemoveAny() {
92 SequencedItem& item = items_.front();
94 return BlockType::FromUsableSpace(&item);
98 bool DoRemove(BlockType& block) {
100 if (block.InnerSize() >= threshold_) {
102 return items_.remove(item_to_remove);
105 auto iter = std::find_if(
106 items_.rbegin(), items_.rend(), [&item_to_remove](SequencedItem& item) {
107 return &item_to_remove == &item;
109 if (iter == items_.rend()) {
117 BlockType* DoRemoveCompatible(Layout layout) {
119 SequencedItem* item =
nullptr;
120 if (layout.size() < threshold_) {
122 auto iter = std::find_if(items_.rbegin(), items_.rend(), predicate);
123 item = iter != items_.rend() ? &(*iter) :
nullptr;
126 auto iter = std::find_if(items_.begin(), items_.end(), predicate);
127 item = iter != items_.end() ? &(*iter) :
nullptr;
129 if (item ==
nullptr) {
132 auto* block = BlockType::FromUsableSpace(item);
137 containers::future::IntrusiveList<SequencedItem> items_;
138 size_t threshold_ = 0;
Definition: sequenced.h:44
void set_threshold(size_t threshold)
Definition: sequenced.h:61
Definition: sequenced.h:33
static auto MakeCanAllocPredicate(Layout layout)
Definition: base.h:157
void Clear()
Removes all blocks from this bucket.
Definition: base.h:124
static ItemType & GetItemFrom(BlockType &block)
Definition: base.h:185
Definition: intrusive_list.h:82