19#include "pw_allocator/hardening.h"
20#include "pw_assert/assert.h"
21#include "pw_status/status.h"
22#include "pw_status/status_with_size.h"
24namespace pw::allocator {
34 static constexpr size_t kPrevBits = 5;
35 static constexpr size_t kPrevShift = 0;
37 static constexpr size_t kNextBits = 5;
38 static constexpr size_t kNextShift = kPrevBits;
40 static constexpr size_t kSizeBits = 10;
41 static constexpr size_t kSizeShift = kPrevBits + kNextBits;
44 enum class Prev : uint8_t {
51 enum class Next : uint8_t {
58 [[nodiscard]]
constexpr Prev prev()
const {
59 return static_cast<Prev
>(Decode(kPrevBits, kPrevShift));
62 [[nodiscard]]
constexpr Next next()
const {
63 return static_cast<Next
>(Decode(kNextBits, kNextShift));
66 [[nodiscard]]
constexpr size_t size()
const {
67 return Decode(kSizeBits, kSizeShift);
70 [[nodiscard]]
constexpr bool ok()
const {
return encoded_.
ok(); }
72 [[nodiscard]]
constexpr Status status()
const {
return encoded_.status(); }
77 if constexpr (Hardening::kIncludesDebugChecks) {
85 Encode(size_t(prev), kPrevBits, kPrevShift) |
86 Encode(size_t(next), kNextBits, kNextShift) |
87 Encode(size, kSizeBits, kSizeShift)) {}
90 static constexpr size_t Encode(
size_t value,
size_t bits,
size_t shift) {
91 if constexpr (Hardening::kIncludesDebugChecks) {
92 PW_ASSERT(value < (1U << bits));
94 return value << shift;
97 constexpr size_t Decode(
size_t bits,
size_t shift)
const {
98 return (encoded_.
size() >> shift) & ~(~static_cast<size_t>(0) << bits);
101 StatusWithSize encoded_;
113template <
typename BlockType>
121 status, Prev::kUnchanged, Next::kUnchanged, 0),
127 constexpr BlockResult(BlockType* block, Prev prev,
size_t shifted_to_prev)
128 :
BlockResult(block, prev, Next::kUnchanged, shifted_to_prev) {}
133 constexpr BlockResult(BlockType* block, Prev prev, Next next)
139 size_t shifted_to_prev)
142 if constexpr (Hardening::kIncludesDebugChecks) {
143 block->CheckInvariants();
147 [[nodiscard]]
constexpr BlockType* block()
const {
return block_; }
150 BlockType* block_ =
nullptr;
constexpr bool ok() const
True if status() == OkStatus().
Definition: status_with_size.h:152
constexpr size_t size() const
Definition: status_with_size.h:146
constexpr void IgnoreUnlessStrict() const
Definition: result.h:76
constexpr Status OkStatus()
Definition: status.h:234