30 std::atomic<std::size_t>
used{0};
31 explicit state(std::size_t bytes) noexcept :
limit(bytes) {}
39 :
state_(std::move(other.state_)),
bytes_(std::exchange(other.bytes_, 0)) {}
42 reset();
state_ = std::move(other.state_);
bytes_ = std::exchange(other.bytes_, 0);
55 if (
bytes >
bytes_)
throw std::invalid_argument(
"output lease cannot grow");
63 lease(std::shared_ptr<state> value, std::size_t
bytes) noexcept
70 std::size_t
used() const noexcept {
return state_->used.load(std::memory_order_relaxed); }
71 std::optional<lease>
try_acquire(std::size_t bytes)
const noexcept {
72 auto used =
state_->used.load(std::memory_order_relaxed);
74 if (bytes >
state_->limit -
used)
return std::nullopt;
75 if (
state_->used.compare_exchange_weak(
used,
used + bytes, std::memory_order_relaxed))
83 template <
class T>
static std::shared_ptr<T const>
attach(T value,
lease allocation) {
84 auto owner = std::make_shared<retained<T>>(std::move(allocation), std::move(value));
85 auto address = &owner->value;
86 return std::shared_ptr<T const>(std::move(owner), address);
Definition active_engine.h:18
Definition output_budget.h:34
std::size_t bytes_
Definition output_budget.h:62
lease(lease &&other) noexcept
Definition output_budget.h:38
void reset() noexcept
Definition output_budget.h:48
lease(std::shared_ptr< state > value, std::size_t bytes) noexcept
Definition output_budget.h:63
lease & operator=(lease &&other) noexcept
Definition output_budget.h:40
std::shared_ptr< state > state_
Definition output_budget.h:61
lease(lease const &)=delete
~lease()
Definition output_budget.h:46
std::size_t bytes() const noexcept
Definition output_budget.h:47
void shrink(std::size_t bytes)
Definition output_budget.h:54
lease & operator=(lease const &)=delete
Definition output_budget.h:89
retained(lease &&charge, T &&item)
Definition output_budget.h:92
T value
Definition output_budget.h:91
lease allocation
Definition output_budget.h:90
Definition output_budget.h:28
state(std::size_t bytes) noexcept
Definition output_budget.h:31
std::atomic< std::size_t > used
Definition output_budget.h:30
std::size_t const limit
Definition output_budget.h:29
Definition output_budget.h:26
std::size_t limit() const noexcept
Definition output_budget.h:69
std::shared_ptr< state > state_
Definition output_budget.h:94
std::size_t used() const noexcept
Definition output_budget.h:70
std::optional< lease > try_acquire(std::size_t bytes) const noexcept
Definition output_budget.h:71
static std::shared_ptr< T const > attach(T value, lease allocation)
Definition output_budget.h:83
output_budget(std::size_t limit)
Definition output_budget.h:67