18#include "pw_allocator/bucket/base.h"
19#include "pw_containers/intrusive_multimap.h"
20#include "pw_function/function.h"
22namespace pw::allocator {
33template <
typename BlockType>
38 const auto* block = BlockType::FromUsableSpace(
this);
39 return block->InnerSize();
61template <
typename BlockType>
65 FastSortedItem<BlockType>> {
75 using Compare =
Function<bool(
size_t,
size_t)>;
84 : items_(std::move(compare)) {}
87 void DoAdd(BlockType& block) {
93 const BlockType* DoFindLargest()
const {
94 auto iter = items_.end();
96 return BlockType::FromUsableSpace(&(*iter));
100 BlockType* DoRemoveAny() {
101 auto iter = items_.begin();
104 return BlockType::FromUsableSpace(&item);
108 bool DoRemove(BlockType& block) {
110 auto iters = items_.equal_range(block.InnerSize());
112 std::find_if(iters.first,
115 return &item_to_remove == &item;
117 if (iter == items_.end()) {
125 BlockType* DoRemoveCompatible(
Layout layout) {
126 auto iter = items_.lower_bound(layout.size());
127 return RemoveImpl(iter, layout);
130 template <
typename Iterator>
131 BlockType* RemoveImpl(Iterator iter,
Layout layout) {
135 if (block !=
nullptr) {
147template <
typename BlockType>
151 FastSortedItem<BlockType>> {
160 : impl_(std::greater<>()), items_(impl_.items_) {}
164 void DoAdd(BlockType& block) { impl_.DoAdd(block); }
167 const BlockType* DoFindLargest()
const {
168 auto iter = impl_.items_.begin();
169 return BlockType::FromUsableSpace(&(*iter));
173 BlockType* DoRemoveAny() {
174 auto iter = items_.begin();
177 return BlockType::FromUsableSpace(&item);
181 bool DoRemove(BlockType& block) {
return impl_.DoRemove(block); }
184 BlockType* DoRemoveCompatible(
Layout layout) {
185 return impl_.RemoveImpl(impl_.items_.begin(), layout);
Definition: intrusive_multimap.h:65
Definition: fast_sorted.h:65
Definition: fast_sorted.h:35
Definition: fast_sorted.h:151
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
static constexpr BlockType * GetBlockFromIterator(Iterator iter, Iterator last)
Definition: base.h:187
fit::function_impl< function_internal::config::kInlineCallableSize, !function_internal::config::kEnableDynamicAllocation, FunctionType, PW_FUNCTION_DEFAULT_ALLOCATOR_TYPE > Function
Definition: function.h:73
Definition: fast_sorted.h:53