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);
90 const BlockType* DoFindLargest()
const;
93 BlockType* DoRemoveAny();
96 bool DoRemove(BlockType& block);
99 BlockType* DoRemoveCompatible(
Layout layout);
101 template <
typename Iterator>
102 BlockType* RemoveImpl(Iterator iter,
Layout layout);
110template <
typename BlockType>
114 FastSortedItem<BlockType>> {
123 : impl_(std::greater<>()), items_(impl_.items_) {}
127 void DoAdd(BlockType& block);
130 const BlockType* DoFindLargest()
const;
133 BlockType* DoRemoveAny();
136 bool DoRemove(BlockType& block) {
return impl_.DoRemove(block); }
139 BlockType* DoRemoveCompatible(
Layout layout) {
140 return impl_.RemoveImpl(impl_.items_.begin(), layout);
151template <
typename BlockType>
156template <
typename BlockType>
157void FastSortedBucket<BlockType>::DoAdd(BlockType& block) {
158 auto* item =
new (block.UsableSpace()) FastSortedItem<BlockType>();
159 items_.insert(*item);
162template <
typename BlockType>
163const BlockType* FastSortedBucket<BlockType>::DoFindLargest()
const {
164 auto iter = items_.end();
166 return BlockType::FromUsableSpace(&(*iter));
169template <
typename BlockType>
170BlockType* FastSortedBucket<BlockType>::DoRemoveAny() {
171 auto iter = items_.begin();
172 FastSortedItem<BlockType>& item = *iter;
174 return BlockType::FromUsableSpace(&item);
177template <
typename BlockType>
178bool FastSortedBucket<BlockType>::DoRemove(BlockType& block) {
179 FastSortedItem<BlockType>& item_to_remove = Base::GetItemFrom(block);
180 auto iters = items_.equal_range(block.InnerSize());
181 auto iter = std::find_if(iters.first,
183 [&item_to_remove](FastSortedItem<BlockType>& item) {
184 return &item_to_remove == &item;
186 if (iter == items_.end()) {
193template <
typename BlockType>
194BlockType* FastSortedBucket<BlockType>::DoRemoveCompatible(Layout layout) {
195 auto iter = items_.lower_bound(layout.size());
196 return RemoveImpl(iter, layout);
199template <
typename BlockType>
200template <
typename Iterator>
201BlockType* FastSortedBucket<BlockType>::RemoveImpl(Iterator iter,
203 iter = std::find_if(iter, items_.end(), Base::MakeCanAllocPredicate(layout));
204 auto* block = Base::GetBlockFromIterator(iter, items_.end());
205 if (block !=
nullptr) {
211template <
typename BlockType>
212void ReverseFastSortedBucket<BlockType>::DoAdd(BlockType& block) {
216template <
typename BlockType>
217const BlockType* ReverseFastSortedBucket<BlockType>::DoFindLargest()
const {
218 auto iter = impl_.items_.begin();
219 return BlockType::FromUsableSpace(&(*iter));
222template <
typename BlockType>
223BlockType* ReverseFastSortedBucket<BlockType>::DoRemoveAny() {
224 auto iter = items_.begin();
225 FastSortedItem<BlockType>& item = *iter;
227 return BlockType::FromUsableSpace(&item);
Definition: intrusive_multimap.h:65
Definition: fast_sorted.h:65
Definition: fast_sorted.h:35
Definition: fast_sorted.h:114
SmallBlock BlockType
Default block type to use for tests.
Definition: size_report.h:32
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