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_;
 
  115template <
typename BlockType>
 
  123            status, Prev::kUnchanged, Next::kUnchanged, 0),
 
  129  constexpr BlockResult(BlockType* block, Prev prev, 
size_t shifted_to_prev)
 
  130      : 
BlockResult(block, prev, Next::kUnchanged, shifted_to_prev) {}
 
  135  constexpr BlockResult(BlockType* block, Prev prev, Next next)
 
  141                        size_t shifted_to_prev)
 
  144    if constexpr (Hardening::kIncludesDebugChecks) {
 
  145      block->CheckInvariants();
 
  149  [[nodiscard]] 
constexpr BlockType* block()
 const { 
return block_; }
 
  152  BlockType* block_ = 
nullptr;
 
constexpr bool ok() const
True if status() == OkStatus().
Definition: status_with_size.h:154
 
constexpr size_t size() const
Definition: status_with_size.h:148
 
constexpr void IgnoreUnlessStrict() const
Definition: result.h:76
 
constexpr Status OkStatus()
Definition: status.h:450